mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-14 10:36:54 -07:00
- Improved the RetryHandler.
- Made the tester buttons on the settings pages a bit more robust and added an indication when it's testing (spinner)
This commit is contained in:
parent
96abba49f7
commit
741a4ae75c
20 changed files with 232 additions and 149 deletions
|
@ -62,13 +62,12 @@ namespace PlexRequests.Api
|
|||
request.AddUrlSegment("imdbid", imdbid);
|
||||
request.AddUrlSegment("title", title);
|
||||
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
var obj = RetryHandler.Execute<JObject>(() => Api.ExecuteJson<JObject> (request, baseUrl),new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling AddMovie for CP, Retrying {0}", timespan));
|
||||
TimeSpan.FromSeconds(10)},
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling AddMovie for CP, Retrying {0}", timespan));
|
||||
|
||||
var obj = (JObject)policy.Execute( () => Api.ExecuteJson<JObject>(request, baseUrl));
|
||||
Log.Trace("CP movie Add result count {0}", obj.Count);
|
||||
|
||||
if (obj.Count > 0)
|
||||
|
@ -105,13 +104,15 @@ namespace PlexRequests.Api
|
|||
};
|
||||
|
||||
request.AddUrlSegment("apikey", apiKey);
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
|
||||
|
||||
var obj = RetryHandler.Execute<CouchPotatoStatus>(() => Api.Execute<CouchPotatoStatus> (request, url),new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetStatus for CP, Retrying {0}", timespan));
|
||||
|
||||
return (CouchPotatoStatus)policy.Execute( () => Api.Execute<CouchPotatoStatus>(request,url));
|
||||
TimeSpan.FromSeconds(10)},
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling GetStatus for CP, Retrying {0}", timespan));
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public CouchPotatoProfiles GetProfiles(Uri url, string apiKey)
|
||||
|
@ -125,13 +126,10 @@ namespace PlexRequests.Api
|
|||
|
||||
request.AddUrlSegment("apikey", apiKey);
|
||||
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetProfiles for CP, Retrying {0}", timespan));
|
||||
|
||||
return (CouchPotatoProfiles)policy.Execute( () => Api.Execute<CouchPotatoProfiles>(request,url));
|
||||
var obj = RetryHandler.Execute<CouchPotatoProfiles>(() => Api.Execute<CouchPotatoProfiles> (request, url),null,
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling GetProfiles for CP, Retrying {0}", timespan));
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public CouchPotatoMovies GetMovies(Uri baseUrl, string apiKey, string[] status)
|
||||
|
@ -145,13 +143,15 @@ namespace PlexRequests.Api
|
|||
request.AddUrlSegment("status", string.Join(",", status));
|
||||
try
|
||||
{
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (5),
|
||||
TimeSpan.FromSeconds(10),
|
||||
TimeSpan.FromSeconds(30)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetMovies for CP, Retrying {0}", timespan));
|
||||
|
||||
return (CouchPotatoMovies)policy.Execute( () => Api.Execute<CouchPotatoMovies>(request,baseUrl));
|
||||
var obj = RetryHandler.Execute<CouchPotatoMovies>(() => Api.Execute<CouchPotatoMovies> (request, baseUrl),
|
||||
new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (5),
|
||||
TimeSpan.FromSeconds(10),
|
||||
TimeSpan.FromSeconds(30)
|
||||
},
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling GetMovies for CP, Retrying {0}", timespan));
|
||||
|
||||
return obj;
|
||||
}
|
||||
catch (Exception e) // Request error is already logged in the ApiRequest class
|
||||
{
|
||||
|
|
|
@ -71,7 +71,7 @@ namespace PlexRequests.Api
|
|||
|
||||
return albumResult;
|
||||
}
|
||||
catch (JsonSerializationException jse)
|
||||
catch (Exception jse)
|
||||
{
|
||||
Log.Error(jse);
|
||||
return false; // If there is no matching result we do not get returned a JSON string, it just returns "false".
|
||||
|
@ -94,7 +94,7 @@ namespace PlexRequests.Api
|
|||
|
||||
return result;
|
||||
}
|
||||
catch (JsonSerializationException jse)
|
||||
catch (Exception jse)
|
||||
{
|
||||
Log.Error(jse);
|
||||
return new List<HeadphonesGetIndex>();
|
||||
|
|
|
@ -47,6 +47,17 @@ namespace PlexRequests.Api
|
|||
Version = AssemblyHelper.GetAssemblyVersion();
|
||||
}
|
||||
|
||||
public PlexApi (IApiRequest api)
|
||||
{
|
||||
Api = api;
|
||||
}
|
||||
|
||||
private IApiRequest Api { get; }
|
||||
|
||||
private const string SignInUri = "https://plex.tv/users/sign_in.json";
|
||||
private const string FriendsUri = "https://plex.tv/pms/friends/all";
|
||||
private const string GetAccountUri = "https://plex.tv/users/account";
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
private static string Version { get; }
|
||||
|
||||
|
@ -69,15 +80,11 @@ namespace PlexRequests.Api
|
|||
|
||||
request.AddJsonBody(userModel);
|
||||
|
||||
var api = new ApiRequest();
|
||||
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling SignIn for Plex, Retrying {0}", timespan));
|
||||
|
||||
return (PlexAuthentication)policy.Execute(() => api.Execute<PlexAuthentication>(request, new Uri("https://plex.tv/users/sign_in.json")));
|
||||
var obj = RetryHandler.Execute<PlexAuthentication>(() => Api.Execute<PlexAuthentication> (request, new Uri(SignInUri)),
|
||||
null,
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling SignIn for Plex, Retrying {0}", timespan));
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public PlexFriends GetUsers(string authToken)
|
||||
|
@ -89,14 +96,10 @@ namespace PlexRequests.Api
|
|||
|
||||
AddHeaders(ref request, authToken);
|
||||
|
||||
var api = new ApiRequest();
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetUsers for Plex, Retrying {0}", timespan));
|
||||
|
||||
var users = (PlexFriends)policy.Execute(() =>api.ExecuteXml<PlexFriends>(request, new Uri("https://plex.tv/pms/friends/all")));
|
||||
var users = RetryHandler.Execute<PlexFriends>(() => Api.Execute<PlexFriends> (request, new Uri(FriendsUri)),
|
||||
null,
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling GetUsers for Plex, Retrying {0}", timespan));
|
||||
|
||||
|
||||
return users;
|
||||
}
|
||||
|
@ -119,14 +122,9 @@ namespace PlexRequests.Api
|
|||
request.AddUrlSegment("searchTerm", searchTerm);
|
||||
AddHeaders(ref request, authToken);
|
||||
|
||||
var api = new ApiRequest();
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling SearchContent for Plex, Retrying {0}", timespan));
|
||||
|
||||
var search = (PlexSearch)policy.Execute(() => api.ExecuteXml<PlexSearch>(request, plexFullHost));
|
||||
var search = RetryHandler.Execute<PlexSearch>(() => Api.ExecuteXml<PlexSearch> (request, plexFullHost),
|
||||
null,
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling SearchContent for Plex, Retrying {0}", timespan));
|
||||
|
||||
return search;
|
||||
}
|
||||
|
@ -139,15 +137,11 @@ namespace PlexRequests.Api
|
|||
};
|
||||
|
||||
AddHeaders(ref request, authToken);
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetStatus for Plex, Retrying {0}", timespan));
|
||||
|
||||
var api = new ApiRequest();
|
||||
var users = (PlexStatus)policy.Execute(() => api.ExecuteXml<PlexStatus>(request, uri));
|
||||
|
||||
var users = RetryHandler.Execute<PlexStatus>(() => Api.ExecuteXml<PlexStatus> (request, uri),
|
||||
null,
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling GetStatus for Plex, Retrying {0}", timespan));
|
||||
|
||||
return users;
|
||||
}
|
||||
|
||||
|
@ -160,16 +154,10 @@ namespace PlexRequests.Api
|
|||
|
||||
AddHeaders(ref request, authToken);
|
||||
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetAccount for Plex, Retrying: {0}", timespan));
|
||||
|
||||
|
||||
var api = new ApiRequest();
|
||||
var account = (PlexAccount)policy.Execute(() => api.ExecuteXml<PlexAccount>(request, new Uri("https://plex.tv/users/account")));
|
||||
|
||||
var account = RetryHandler.Execute<PlexAccount>(() => Api.ExecuteXml<PlexAccount> (request, new Uri(GetAccountUri)),
|
||||
null,
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling GetAccount for Plex, Retrying {0}", timespan));
|
||||
|
||||
return account;
|
||||
}
|
||||
|
||||
|
@ -183,16 +171,17 @@ namespace PlexRequests.Api
|
|||
|
||||
AddHeaders(ref request, authToken);
|
||||
|
||||
var api = new ApiRequest();
|
||||
try
|
||||
{
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (5),
|
||||
TimeSpan.FromSeconds(10),
|
||||
TimeSpan.FromSeconds(30)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetLibrarySections for Plex, Retrying {0}", timespan));
|
||||
var lib = RetryHandler.Execute<PlexLibraries>(() => Api.ExecuteXml<PlexLibraries> (request, plexFullHost),
|
||||
new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (5),
|
||||
TimeSpan.FromSeconds(10),
|
||||
TimeSpan.FromSeconds(30)
|
||||
},
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling GetLibrarySections for Plex, Retrying {0}", timespan));
|
||||
|
||||
return (PlexLibraries)policy.Execute(() => api.ExecuteXml<PlexLibraries>(request, plexFullHost));
|
||||
return lib;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -212,16 +201,17 @@ namespace PlexRequests.Api
|
|||
request.AddUrlSegment("libraryId", libraryId);
|
||||
AddHeaders(ref request, authToken);
|
||||
|
||||
var api = new ApiRequest();
|
||||
try
|
||||
{
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (5),
|
||||
TimeSpan.FromSeconds(10),
|
||||
TimeSpan.FromSeconds(30)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetLibrary for Plex, Retrying {0}", timespan));
|
||||
var lib = RetryHandler.Execute<PlexSearch>(() => Api.ExecuteXml<PlexSearch> (request, plexFullHost),
|
||||
new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (5),
|
||||
TimeSpan.FromSeconds(10),
|
||||
TimeSpan.FromSeconds(30)
|
||||
},
|
||||
(exception, timespan) => Log.Error (exception, "Exception when calling GetLibrary for Plex, Retrying {0}", timespan));
|
||||
|
||||
return (PlexSearch)policy.Execute(() => api.ExecuteXml<PlexSearch>(request, plexFullHost));
|
||||
return lib;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
|
@ -1,34 +1,71 @@
|
|||
using System;
|
||||
using Polly.Retry;
|
||||
using Polly;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace PlexRequests.Api
|
||||
{
|
||||
public static class RetryHandler
|
||||
{
|
||||
public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] TimeSpan, Action action)
|
||||
|
||||
private static TimeSpan[] DefaultTime = new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)};
|
||||
|
||||
public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan, Action action)
|
||||
{
|
||||
if(timeSpan == null)
|
||||
{
|
||||
timeSpan = DefaultTime;
|
||||
}
|
||||
var policy = Policy.Handle<Exception> ()
|
||||
.WaitAndRetry(TimeSpan, (exception, timeSpan) => action());
|
||||
.WaitAndRetry(timeSpan, (e, ts) => action());
|
||||
|
||||
return policy;
|
||||
}
|
||||
|
||||
public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] TimeSpan)
|
||||
public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan)
|
||||
{
|
||||
if(timeSpan == null)
|
||||
{
|
||||
timeSpan = DefaultTime;
|
||||
}
|
||||
var policy = Policy.Handle<Exception> ()
|
||||
.WaitAndRetry(TimeSpan);
|
||||
.WaitAndRetry(timeSpan);
|
||||
|
||||
return policy;
|
||||
}
|
||||
|
||||
public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] TimeSpan, Action<Exception, TimeSpan> action)
|
||||
public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan, Action<Exception, TimeSpan> action)
|
||||
{
|
||||
if(timeSpan == null)
|
||||
{
|
||||
timeSpan = DefaultTime;
|
||||
}
|
||||
var policy = Policy.Handle<Exception> ()
|
||||
.WaitAndRetry(TimeSpan, (exception, timeSpan) => action(exception, timeSpan));
|
||||
.WaitAndRetry(timeSpan, (exception, ts) => action(exception, ts));
|
||||
|
||||
return policy;
|
||||
}
|
||||
|
||||
public static T Execute<T>(Func<T> action, TimeSpan[] timeSpan)
|
||||
{
|
||||
var policy = RetryAndWaitPolicy (timeSpan);
|
||||
|
||||
return policy.Execute (action);
|
||||
}
|
||||
|
||||
public static T Execute<T>(Func<T> func, TimeSpan[] timeSpan, Action<Exception, TimeSpan> action)
|
||||
{
|
||||
if(timeSpan == null)
|
||||
{
|
||||
timeSpan = DefaultTime;
|
||||
}
|
||||
var policy = RetryAndWaitPolicy (timeSpan, action);
|
||||
|
||||
return policy.Execute (func);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -83,11 +83,7 @@ namespace PlexRequests.Api
|
|||
request.AddQueryParameter("initial", quality);
|
||||
}
|
||||
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling AddSeries for SR, Retrying {0}", timespan));
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (null,(exception, timespan) => Log.Error (exception, "Exception when calling AddSeries for SR, Retrying {0}", timespan));
|
||||
|
||||
|
||||
var obj = policy.Execute( () => Api.Execute<SickRageTvAdd>(request, baseUrl));
|
||||
|
@ -164,11 +160,7 @@ namespace PlexRequests.Api
|
|||
};
|
||||
|
||||
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling Ping for SR, Retrying {0}", timespan));
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (null,(exception, timespan) => Log.Error (exception, "Exception when calling Ping for SR, Retrying {0}", timespan));
|
||||
|
||||
|
||||
|
||||
|
@ -191,11 +183,8 @@ namespace PlexRequests.Api
|
|||
|
||||
try
|
||||
{
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling VerifyShowHasLoaded for SR, Retrying {0}", timespan));
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (null,(exception, timespan) =>
|
||||
Log.Error (exception, "Exception when calling VerifyShowHasLoaded for SR, Retrying {0}", timespan));
|
||||
|
||||
|
||||
var obj = policy.Execute( () => Api.ExecuteJson<SickRageSeasonList>(request, baseUrl));
|
||||
|
@ -224,12 +213,8 @@ namespace PlexRequests.Api
|
|||
return await Task.Run(() =>
|
||||
{
|
||||
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (new TimeSpan[] {
|
||||
TimeSpan.FromSeconds (2),
|
||||
TimeSpan.FromSeconds(5),
|
||||
TimeSpan.FromSeconds(10)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling AddSeason for SR, Retrying {0}", timespan));
|
||||
|
||||
var policy = RetryHandler.RetryAndWaitPolicy (null,(exception, timespan) =>
|
||||
Log.Error (exception, "Exception when calling AddSeason for SR, Retrying {0}", timespan));
|
||||
|
||||
var result = policy.Execute(() => Api.Execute<SickRageTvAdd>(request, baseUrl));
|
||||
|
||||
|
@ -255,8 +240,8 @@ namespace PlexRequests.Api
|
|||
TimeSpan.FromSeconds (5),
|
||||
TimeSpan.FromSeconds(10),
|
||||
TimeSpan.FromSeconds(30)
|
||||
}, (exception, timespan) => Log.Error (exception, "Exception when calling GetShows for SR, Retrying {0}", timespan));
|
||||
|
||||
}, (exception, timespan) =>
|
||||
Log.Error (exception, "Exception when calling GetShows for SR, Retrying {0}", timespan));
|
||||
|
||||
return policy.Execute(() => Api.Execute<SickrageShows>(request, baseUrl));
|
||||
|
||||
|
|
|
@ -157,10 +157,10 @@ namespace PlexRequests.Api
|
|||
|
||||
return policy.Execute(() => Api.ExecuteJson<List<Series>>(request, baseUrl));
|
||||
}
|
||||
catch (ApiRequestException)
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error("There has been an API exception when getting the Sonarr Series");
|
||||
return null;
|
||||
Log.Error(e, "There has been an API exception when getting the Sonarr Series");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue