mirror of
https://github.com/Radarr/Radarr
synced 2025-12-08 01:15:15 +01:00
New: Watch list sorting and rate limit for Trakt Import Lists
This commit is contained in:
parent
553645a07c
commit
554e15d438
6 changed files with 69 additions and 28 deletions
|
|
@ -25,10 +25,7 @@ public TraktUserImport(IImportListRepository importListRepository,
|
||||||
|
|
||||||
public override IImportListRequestGenerator GetRequestGenerator()
|
public override IImportListRequestGenerator GetRequestGenerator()
|
||||||
{
|
{
|
||||||
return new TraktUserRequestGenerator(_traktProxy)
|
return new TraktUserRequestGenerator(_traktProxy, Settings);
|
||||||
{
|
|
||||||
Settings = Settings
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
using System.Runtime.Serialization;
|
using NzbDrone.Core.Annotations;
|
||||||
|
|
||||||
namespace NzbDrone.Core.ImportLists.Trakt.User
|
namespace NzbDrone.Core.ImportLists.Trakt.User
|
||||||
{
|
{
|
||||||
public enum TraktUserListType
|
public enum TraktUserListType
|
||||||
{
|
{
|
||||||
[EnumMember(Value = "User Watch List")]
|
[FieldOption(Label = "ImportListsTraktSettingsUserListTypeWatch")]
|
||||||
UserWatchList = 0,
|
UserWatchList = 0,
|
||||||
[EnumMember(Value = "User Watched List")]
|
[FieldOption(Label = "ImportListsTraktSettingsUserListTypeWatched")]
|
||||||
UserWatchedList = 1,
|
UserWatchedList = 1,
|
||||||
[EnumMember(Value = "User Collection List")]
|
[FieldOption(Label = "ImportListsTraktSettingsUserListTypeCollection")]
|
||||||
UserCollectionList = 2
|
UserCollectionList = 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Notifications.Trakt;
|
using NzbDrone.Core.Notifications.Trakt;
|
||||||
|
|
||||||
namespace NzbDrone.Core.ImportLists.Trakt.User
|
namespace NzbDrone.Core.ImportLists.Trakt.User
|
||||||
|
|
@ -8,11 +8,12 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
|
||||||
public class TraktUserRequestGenerator : IImportListRequestGenerator
|
public class TraktUserRequestGenerator : IImportListRequestGenerator
|
||||||
{
|
{
|
||||||
private readonly ITraktProxy _traktProxy;
|
private readonly ITraktProxy _traktProxy;
|
||||||
public TraktUserSettings Settings { get; set; }
|
private readonly TraktUserSettings _settings;
|
||||||
|
|
||||||
public TraktUserRequestGenerator(ITraktProxy traktProxy)
|
public TraktUserRequestGenerator(ITraktProxy traktProxy, TraktUserSettings settings)
|
||||||
{
|
{
|
||||||
_traktProxy = traktProxy;
|
_traktProxy = traktProxy;
|
||||||
|
_settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual ImportListPageableRequestChain GetMovies()
|
public virtual ImportListPageableRequestChain GetMovies()
|
||||||
|
|
@ -26,25 +27,39 @@ public virtual ImportListPageableRequestChain GetMovies()
|
||||||
|
|
||||||
private IEnumerable<ImportListRequest> GetMoviesRequest()
|
private IEnumerable<ImportListRequest> GetMoviesRequest()
|
||||||
{
|
{
|
||||||
var link = string.Empty;
|
var requestBuilder = new HttpRequestBuilder(_settings.Link.Trim());
|
||||||
var userName = Settings.Username.IsNotNullOrWhiteSpace() ? Settings.Username.Trim() : Settings.AuthUser.Trim();
|
|
||||||
|
|
||||||
switch (Settings.TraktListType)
|
switch (_settings.TraktListType)
|
||||||
{
|
{
|
||||||
case (int)TraktUserListType.UserWatchList:
|
case (int)TraktUserListType.UserWatchList:
|
||||||
link += $"users/{userName}/watchlist/movies?limit={Settings.Limit}";
|
var watchSorting = _settings.TraktWatchSorting switch
|
||||||
|
{
|
||||||
|
(int)TraktUserWatchSorting.Added => "added",
|
||||||
|
(int)TraktUserWatchSorting.Title => "title",
|
||||||
|
(int)TraktUserWatchSorting.Released => "released",
|
||||||
|
_ => "rank"
|
||||||
|
};
|
||||||
|
|
||||||
|
requestBuilder
|
||||||
|
.Resource("/users/{userName}/watchlist/movies/{sorting}")
|
||||||
|
.SetSegment("sorting", watchSorting);
|
||||||
break;
|
break;
|
||||||
case (int)TraktUserListType.UserWatchedList:
|
case (int)TraktUserListType.UserWatchedList:
|
||||||
link += $"users/{userName}/watched/movies?limit={Settings.Limit}";
|
requestBuilder.Resource("/users/{userName}/watched/movies");
|
||||||
break;
|
break;
|
||||||
case (int)TraktUserListType.UserCollectionList:
|
case (int)TraktUserListType.UserCollectionList:
|
||||||
link += $"users/{userName}/collection/movies?limit={Settings.Limit}";
|
requestBuilder.Resource("/users/{userName}/collection/movies");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
var request = new ImportListRequest(_traktProxy.BuildRequest(link, HttpMethod.Get, Settings.AccessToken));
|
var userName = _settings.Username.IsNotNullOrWhiteSpace() ? _settings.Username.Trim() : _settings.AuthUser.Trim();
|
||||||
|
|
||||||
yield return request;
|
requestBuilder
|
||||||
|
.SetSegment("userName", userName)
|
||||||
|
.WithRateLimit(4)
|
||||||
|
.AddQueryParam("limit", _settings.Limit.ToString());
|
||||||
|
|
||||||
|
yield return new ImportListRequest(_traktProxy.BuildRequest(requestBuilder.Build(), _settings.AccessToken));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,12 +20,16 @@ public class TraktUserSettings : TraktSettingsBase<TraktUserSettings>
|
||||||
public TraktUserSettings()
|
public TraktUserSettings()
|
||||||
{
|
{
|
||||||
TraktListType = (int)TraktUserListType.UserWatchList;
|
TraktListType = (int)TraktUserListType.UserWatchList;
|
||||||
|
TraktWatchSorting = (int)TraktUserWatchSorting.Rank;
|
||||||
}
|
}
|
||||||
|
|
||||||
[FieldDefinition(1, Label = "List Type", Type = FieldType.Select, SelectOptions = typeof(TraktUserListType), HelpText = "Type of list you're seeking to import from")]
|
[FieldDefinition(1, Label = "List Type", Type = FieldType.Select, SelectOptions = typeof(TraktUserListType), HelpText = "ImportListsTraktSettingsListTypeHelpText")]
|
||||||
public int TraktListType { get; set; }
|
public int TraktListType { get; set; }
|
||||||
|
|
||||||
[FieldDefinition(2, Label = "Username", HelpText = "Username for the List to import from (empty to use Auth User)")]
|
[FieldDefinition(2, Label = "ImportListsTraktSettingsWatchListSorting", Type = FieldType.Select, SelectOptions = typeof(TraktUserWatchSorting), HelpText = "ImportListsTraktSettingsWatchListSortingHelpText")]
|
||||||
|
public int TraktWatchSorting { get; set; }
|
||||||
|
|
||||||
|
[FieldDefinition(3, Label = "Username", HelpText = "ImportListsTraktSettingsUserListUsernameHelpText")]
|
||||||
public string Username { get; set; }
|
public string Username { get; set; }
|
||||||
|
|
||||||
public override NzbDroneValidationResult Validate()
|
public override NzbDroneValidationResult Validate()
|
||||||
|
|
@ -33,4 +37,12 @@ public override NzbDroneValidationResult Validate()
|
||||||
return new NzbDroneValidationResult(Validator.Validate(this));
|
return new NzbDroneValidationResult(Validator.Validate(this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum TraktUserWatchSorting
|
||||||
|
{
|
||||||
|
Rank = 0,
|
||||||
|
Added = 1,
|
||||||
|
Title = 2,
|
||||||
|
Released = 3
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -792,6 +792,12 @@
|
||||||
"ImportListsTraktSettingsPopularListTypeTrendingMovies": "Trending Movies",
|
"ImportListsTraktSettingsPopularListTypeTrendingMovies": "Trending Movies",
|
||||||
"ImportListsTraktSettingsRating": "Rating",
|
"ImportListsTraktSettingsRating": "Rating",
|
||||||
"ImportListsTraktSettingsRatingMovieHelpText": "Filter movies by rating range (0-100)",
|
"ImportListsTraktSettingsRatingMovieHelpText": "Filter movies by rating range (0-100)",
|
||||||
|
"ImportListsTraktSettingsUserListTypeCollection": "User Collection List",
|
||||||
|
"ImportListsTraktSettingsUserListTypeWatch": "User Watch List",
|
||||||
|
"ImportListsTraktSettingsUserListTypeWatched": "User Watched List",
|
||||||
|
"ImportListsTraktSettingsUserListUsernameHelpText": "Username for the List to import from (leave empty to use Auth User)",
|
||||||
|
"ImportListsTraktSettingsWatchListSorting": "Watch List Sorting",
|
||||||
|
"ImportListsTraktSettingsWatchListSortingHelpText": "If List Type is Watch, select the order to sort the list",
|
||||||
"ImportListsTraktSettingsYears": "Years",
|
"ImportListsTraktSettingsYears": "Years",
|
||||||
"ImportListsTraktSettingsYearsMovieHelpText": "Filter movies by year or year range",
|
"ImportListsTraktSettingsYearsMovieHelpText": "Filter movies by year or year range",
|
||||||
"ImportMechanismHealthCheckMessage": "Enable Completed Download Handling",
|
"ImportMechanismHealthCheckMessage": "Enable Completed Download Handling",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using NLog;
|
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Common.Serializer;
|
using NzbDrone.Common.Serializer;
|
||||||
|
|
@ -16,6 +15,7 @@ public interface ITraktProxy
|
||||||
void AddToCollection(TraktCollectMoviesResource payload, string accessToken);
|
void AddToCollection(TraktCollectMoviesResource payload, string accessToken);
|
||||||
void RemoveFromCollection(TraktCollectMoviesResource payload, string accessToken);
|
void RemoveFromCollection(TraktCollectMoviesResource payload, string accessToken);
|
||||||
HttpRequest BuildRequest(string resource, HttpMethod method, string accessToken);
|
HttpRequest BuildRequest(string resource, HttpMethod method, string accessToken);
|
||||||
|
HttpRequest BuildRequest(HttpRequest request, string accessToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TraktProxy : ITraktProxy
|
public class TraktProxy : ITraktProxy
|
||||||
|
|
@ -27,12 +27,12 @@ public class TraktProxy : ITraktProxy
|
||||||
private const string ClientId = "64508a8bf370cee550dde4806469922fd7cd70afb2d5690e3ee7f75ae784b70e";
|
private const string ClientId = "64508a8bf370cee550dde4806469922fd7cd70afb2d5690e3ee7f75ae784b70e";
|
||||||
|
|
||||||
private readonly IHttpClient _httpClient;
|
private readonly IHttpClient _httpClient;
|
||||||
private readonly Logger _logger;
|
|
||||||
|
|
||||||
public TraktProxy(IHttpClient httpClient, Logger logger)
|
private static TimeSpan DefaultRateLimit => TimeSpan.FromSeconds(2);
|
||||||
|
|
||||||
|
public TraktProxy(IHttpClient httpClient)
|
||||||
{
|
{
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
_logger = logger;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddToCollection(TraktCollectMoviesResource payload, string accessToken)
|
public void AddToCollection(TraktCollectMoviesResource payload, string accessToken)
|
||||||
|
|
@ -87,16 +87,27 @@ public HttpRequest BuildRequest(string resource, HttpMethod method, string acces
|
||||||
{
|
{
|
||||||
var request = new HttpRequestBuilder(URL).Resource(resource).Build();
|
var request = new HttpRequestBuilder(URL).Resource(resource).Build();
|
||||||
|
|
||||||
request.RateLimit = TimeSpan.FromSeconds(2);
|
request.RateLimit = DefaultRateLimit;
|
||||||
request.Headers.Accept = HttpAccept.Json.Value;
|
|
||||||
request.Method = method;
|
request.Method = method;
|
||||||
|
|
||||||
|
return BuildRequest(request, accessToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpRequest BuildRequest(HttpRequest request, string accessToken)
|
||||||
|
{
|
||||||
|
if (request.RateLimit < DefaultRateLimit)
|
||||||
|
{
|
||||||
|
request.RateLimit = DefaultRateLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
request.Headers.Accept = HttpAccept.Json.Value;
|
||||||
|
|
||||||
request.Headers.Add("trakt-api-version", "2");
|
request.Headers.Add("trakt-api-version", "2");
|
||||||
request.Headers.Add("trakt-api-key", ClientId);
|
request.Headers.Add("trakt-api-key", ClientId);
|
||||||
|
|
||||||
if (accessToken.IsNotNullOrWhiteSpace())
|
if (accessToken.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
request.Headers.Add("Authorization", "Bearer " + accessToken);
|
request.Headers.Add("Authorization", $"Bearer {accessToken}");
|
||||||
}
|
}
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue