1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-14 20:55:01 -04:00

Compare commits

...

4 Commits

17 changed files with 133 additions and 39 deletions

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '5.19.2'
majorVersion: '5.19.3'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'

View File

@@ -14,6 +14,7 @@ using NzbDrone.Core.Localization;
using NzbDrone.Core.MediaFiles.TorrentInfo;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.RemotePathMappings;
using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Validation;
namespace NzbDrone.Core.Download.Clients.UTorrent
@@ -104,6 +105,8 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
public override string Name => "uTorrent";
public override ProviderMessage Message => new (_localizationService.GetLocalizedString("DownloadClientUTorrentProviderMessage"), ProviderMessageType.Warning);
public override IEnumerable<DownloadClientItem> GetItems()
{
var torrents = GetTorrents();

View File

@@ -25,10 +25,7 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
public override IImportListRequestGenerator GetRequestGenerator()
{
return new TraktUserRequestGenerator(_traktProxy)
{
Settings = Settings
};
return new TraktUserRequestGenerator(_traktProxy, Settings);
}
}
}

View File

@@ -1,14 +1,14 @@
using System.Runtime.Serialization;
using NzbDrone.Core.Annotations;
namespace NzbDrone.Core.ImportLists.Trakt.User
{
public enum TraktUserListType
{
[EnumMember(Value = "User Watch List")]
[FieldOption(Label = "ImportListsTraktSettingsUserListTypeWatch")]
UserWatchList = 0,
[EnumMember(Value = "User Watched List")]
[FieldOption(Label = "ImportListsTraktSettingsUserListTypeWatched")]
UserWatchedList = 1,
[EnumMember(Value = "User Collection List")]
[FieldOption(Label = "ImportListsTraktSettingsUserListTypeCollection")]
UserCollectionList = 2
}
}

View File

@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Net.Http;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Core.Notifications.Trakt;
namespace NzbDrone.Core.ImportLists.Trakt.User
@@ -8,11 +8,12 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
public class TraktUserRequestGenerator : IImportListRequestGenerator
{
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;
_settings = settings;
}
public virtual ImportListPageableRequestChain GetMovies()
@@ -26,25 +27,39 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
private IEnumerable<ImportListRequest> GetMoviesRequest()
{
var link = string.Empty;
var userName = Settings.Username.IsNotNullOrWhiteSpace() ? Settings.Username.Trim() : Settings.AuthUser.Trim();
var requestBuilder = new HttpRequestBuilder(_settings.Link.Trim());
switch (Settings.TraktListType)
switch (_settings.TraktListType)
{
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;
case (int)TraktUserListType.UserWatchedList:
link += $"users/{userName}/watched/movies?limit={Settings.Limit}";
requestBuilder.Resource("/users/{userName}/watched/movies");
break;
case (int)TraktUserListType.UserCollectionList:
link += $"users/{userName}/collection/movies?limit={Settings.Limit}";
requestBuilder.Resource("/users/{userName}/collection/movies");
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));
}
}
}

View File

@@ -20,12 +20,16 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
public TraktUserSettings()
{
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; }
[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 override NzbDroneValidationResult Validate()
@@ -33,4 +37,12 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
return new NzbDroneValidationResult(Validator.Validate(this));
}
}
public enum TraktUserWatchSorting
{
Rank = 0,
Added = 1,
Title = 2,
Released = 3
}
}

View File

@@ -1299,5 +1299,12 @@
"ImportListsTraktSettingsAdditionalParameters": "Dodatečné parametry",
"ImportListsTraktSettingsRating": "Hodnocení",
"ImportListsTraktSettingsCertification": "Osvědčení",
"ImportListsTraktSettingsGenres": "Žánry"
"ImportListsTraktSettingsGenres": "Žánry",
"DownloadClientDelugeValidationLabelPluginInactive": "Plugin pro štítky není aktivován",
"DownloadClientDelugeTorrentStateError": "Deluge hlásí chybu",
"DownloadClientDelugeSettingsDirectoryCompleted": "Adresář kam přesunout po dokončení",
"DownloadClientDelugeSettingsDirectoryHelpText": "Nepovinné - umístění stahovaných souborů, pokud ponecháte prázné, použije se výchozí umístění Deluge",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Nepovinné - umístění kam přesunout dokončená stahování, pokud ponecháte prázné, použije se výchozí umístění Deluge",
"DownloadClientDelugeValidationLabelPluginInactiveDetail": "Pro použití kategorií je nutné mít v {clientName} aktivovaný plugin pro štítky.",
"DownloadClientDownloadStationProviderMessage": "Pokud je ve vašem účtu DSM zapnuto dvoufázové ověření, {appName} se nebude moci připojit k Download station"
}

View File

@@ -1903,5 +1903,10 @@
"ImportListsTraktSettingsYears": "Jahre",
"ImportListsTraktSettingsAuthenticateWithTrakt": "Mit Trakt authentifizieren",
"ImportListsTraktSettingsCertification": "Zertifizierung",
"ImportListsTraktSettingsLimit": "Limit"
"ImportListsTraktSettingsLimit": "Limit",
"ImportListsTraktSettingsUserListTypeCollection": "Benutzer-Sammlungs-Liste",
"ImportListsTraktSettingsUserListTypeWatch": "Benutzer-Watch-Liste",
"ImportListsTraktSettingsUserListTypeWatched": "Benutzer-Gesehene-Liste",
"ImportListsTraktSettingsWatchListSorting": "Sortierung der Gesehenen Liste",
"ImportListsTraktSettingsUserListUsernameHelpText": "Benutzername für die Liste, von der du importieren möchtest (leer lassen, um den Authentifizierten Benutzer zu verwenden)"
}

View File

@@ -537,6 +537,7 @@
"DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {downloadClientNames}",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Transmission location",
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Adds a prefix to the {clientName} rpc url, eg {url}, defaults to '{defaultUrl}'",
"DownloadClientUTorrentProviderMessage": "Because uTorrent is known for cryptoware, malware and ads we'd suggest switching to a better client like qBittorrent, Deluge or ruTorrent.",
"DownloadClientUTorrentTorrentStateError": "uTorrent is reporting an error",
"DownloadClientUnavailable": "Download Client Unavailable",
"DownloadClientValidationApiKeyIncorrect": "API Key Incorrect",
@@ -792,6 +793,12 @@
"ImportListsTraktSettingsPopularListTypeTrendingMovies": "Trending Movies",
"ImportListsTraktSettingsRating": "Rating",
"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",
"ImportListsTraktSettingsYearsMovieHelpText": "Filter movies by year or year range",
"ImportMechanismHealthCheckMessage": "Enable Completed Download Handling",

View File

@@ -1921,5 +1921,10 @@
"ImportListsTraktSettingsRatingMovieHelpText": "Filtrar películas por rango de calificación (0-100)",
"ImportListsTraktSettingsYearsMovieHelpText": "Filtras películas por año o rango de años",
"MovieRequested": "Películas solicitadas",
"ReleasePush": "Lanzamiento"
"ReleasePush": "Lanzamiento",
"ImportListsTraktSettingsUserListTypeCollection": "Lista de colecciones de usuario",
"ImportListsTraktSettingsUserListTypeWatch": "Lista de seguimiento de usuario",
"ImportListsTraktSettingsUserListTypeWatched": "Lista de vistos de usuario",
"ImportListsTraktSettingsUserListUsernameHelpText": "Usuario para la lista de la que importar (dejar vacío para usar Autenticación de usuario)",
"ImportListsTraktSettingsWatchListSorting": "Ordenar la lista de vistos"
}

View File

@@ -1922,5 +1922,10 @@
"ImportListsTraktSettingsRatingMovieHelpText": "Suodata elokuvia arvioden perusteella (alue 0100).",
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesOfAllTime": "Kaikkien aikojen katsotuimmat elokuvat",
"ImportListsTraktSettingsPopularListTypeTrendingMovies": "Trendaavat elokuvat",
"ImportListsTraktSettingsGenresMovieHelpText": "Suodata elokuvia Trakt-lajityyppien slug-arvojen perusteella (pilkuin eroteltuna). Koskee vain suosituimpia listoja."
"ImportListsTraktSettingsGenresMovieHelpText": "Suodata elokuvia Trakt-lajityyppien slug-arvojen perusteella (pilkuin eroteltuna). Koskee vain suosituimpia listoja.",
"ImportListsTraktSettingsUserListTypeCollection": "Käyttäjän kokoelmat",
"ImportListsTraktSettingsUserListTypeWatch": "Käyttäjän katselulista",
"ImportListsTraktSettingsUserListTypeWatched": "Käyttäjän katseltujen lista",
"ImportListsTraktSettingsUserListUsernameHelpText": "Listan tuontiin käytettävä käyttäjänimi. Käytä tunnistautunutta käyttäjää jättämällä tyhjäksi.",
"ImportListsTraktSettingsWatchListSorting": "Katselulistan järjestys"
}

View File

@@ -1903,5 +1903,10 @@
"ImportListsTraktSettingsGenres": "Genres",
"ImportListsTraktSettingsLimit": "Limite",
"ImportListsTraktSettingsListType": "Type de liste",
"ImportListsTraktSettingsListTypeHelpText": "Type de liste à partir de laquelle vous cherchez à importer"
"ImportListsTraktSettingsListTypeHelpText": "Type de liste à partir de laquelle vous cherchez à importer",
"ImportListsTraktSettingsUserListTypeCollection": "Liste des collections d'utilisateurs",
"ImportListsTraktSettingsUserListUsernameHelpText": "Nom d'utilisateur pour la liste à importer (laisser vide pour utiliser Auth User)",
"ImportListsTraktSettingsWatchListSorting": "Tri de la liste de surveillance",
"ImportListsTraktSettingsUserListTypeWatch": "Liste de surveillance des utilisateurs",
"ImportListsTraktSettingsUserListTypeWatched": "Liste des utilisateurs surveillés"
}

View File

@@ -1471,5 +1471,10 @@
"ImportListsTraktSettingsListType": "Lista típus",
"ImportListsTraktSettingsListTypeHelpText": "Az importálni kívánt lista típusa",
"ImportListsTraktSettingsRating": "Értékelés",
"ImportListsTraktSettingsYears": "Évek"
"ImportListsTraktSettingsYears": "Évek",
"ImportListsTraktSettingsUserListTypeCollection": "Felhasználói gyűjtőlista",
"ImportListsTraktSettingsUserListTypeWatch": "Felhasználói figyelőlista",
"ImportListsTraktSettingsUserListTypeWatched": "Felhasználói figyelt lista",
"ImportListsTraktSettingsUserListUsernameHelpText": "Felhasználónév az importálandó listához (hagyja üresen az Auth User használatához)",
"ImportListsTraktSettingsWatchListSorting": "Figyelőlista rendezése"
}

View File

@@ -1518,7 +1518,7 @@
"NotificationsEmailSettingsUseEncryptionHelpText": "Se preferir usar criptografia se configurado no servidor, usar sempre criptografia via SSL (somente porta 465) ou StartTLS (qualquer outra porta) ou nunca usar criptografia",
"ChangeCategoryMultipleHint": "Altera os downloads para a \"Categoria pós-importação' do cliente de download",
"BlackholeFolderHelpText": "Pasta na qual o {appName} armazenará o arquivo {extension}",
"BlackholeWatchFolder": "Pasta de monitoramento",
"BlackholeWatchFolder": "Pasta de Monitoramento",
"BlackholeWatchFolderHelpText": "Pasta da qual o {appName} deve importar os downloads concluídos",
"Category": "Categoria",
"Destination": "Destino",
@@ -1922,5 +1922,11 @@
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesOfAllTime": "Filmes Mais Assistidos de Todos os Tempos",
"ImportListsTraktSettingsPopularListTypeTrendingMovies": "Filmes em Alta",
"ImportListsTraktSettingsRatingMovieHelpText": "Filtrar filmes por faixa de avaliação (0-100)",
"ImportListsTraktSettingsYearsMovieHelpText": "Filtrar filmes por ano ou faixa de ano"
"ImportListsTraktSettingsYearsMovieHelpText": "Filtrar filmes por ano ou faixa de ano",
"ImportListsTraktSettingsWatchListSortingHelpText": "Se o Tipo de Lista estiver Monitorar, selecione o pedido para classificar a lista",
"ImportListsTraktSettingsUserListTypeCollection": "Lista de coleção do usuário",
"ImportListsTraktSettingsUserListTypeWatch": "Lista para Assistir do Usuário",
"ImportListsTraktSettingsUserListTypeWatched": "Lista de Assistidos do Usuário",
"ImportListsTraktSettingsUserListUsernameHelpText": "Nome de usuário da lista a importar (deixe em branco para usar o Usuário autenticado)",
"ImportListsTraktSettingsWatchListSorting": "Classificação da Lista para Assistir"
}

View File

@@ -1823,5 +1823,10 @@
"ImportListsTraktSettingsRating": "Рейтинг",
"ImportListsTraktSettingsYears": "Годы",
"ImportListsTraktSettingsAdditionalParametersHelpText": "Дополнительные параметры Trakt API",
"ImportListsTraktSettingsAuthenticateWithTrakt": "Аутентификация с помощью Trakt"
"ImportListsTraktSettingsAuthenticateWithTrakt": "Аутентификация с помощью Trakt",
"ImportListsTraktSettingsUserListTypeCollection": "Список коллекций пользователей",
"ImportListsTraktSettingsUserListTypeWatch": "Список наблюдения пользователя",
"ImportListsTraktSettingsUserListTypeWatched": "Список просмотренного пользователем",
"ImportListsTraktSettingsUserListUsernameHelpText": "Имя пользователя для импорта списка (оставьте пустым, чтобы использовать пользователя с аутентификацией)",
"ImportListsTraktSettingsWatchListSorting": "Сортировка списка просмотра"
}

View File

@@ -1922,5 +1922,11 @@
"ImportListsTraktSettingsPopularListTypeTrendingMovies": "Trend Filmler",
"ImportListsTraktSettingsRatingMovieHelpText": "Filmleri derecelendirme aralığına göre filtrele (0-100)",
"ImportListsTraktSettingsYearsMovieHelpText": "Filmleri yıla veya yıl aralığına göre filtrele",
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesByMonth": "Aylara Göre En Çok İzlenen Filmler"
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesByMonth": "Aylara Göre En Çok İzlenen Filmler",
"ImportListsTraktSettingsUserListTypeCollection": "Kullanıcı Koleksiyon Listesi",
"ImportListsTraktSettingsUserListTypeWatch": "Kullanıcı İzleme Listesi",
"ImportListsTraktSettingsUserListTypeWatched": "Kullanıcının İzlediği Liste",
"ImportListsTraktSettingsUserListUsernameHelpText": "İçe aktarılacak Liste için Kullanıcı Adı (Yetkili Kullanıcı için boş bırakın)",
"ImportListsTraktSettingsWatchListSorting": "İzleme Listesi Sıralaması",
"ImportListsTraktSettingsWatchListSortingHelpText": "Liste Türü İzleme ise, listeyi sıralama sırasını seçin"
}

View File

@@ -1,6 +1,5 @@
using System;
using System.Net.Http;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
@@ -16,6 +15,7 @@ namespace NzbDrone.Core.Notifications.Trakt
void AddToCollection(TraktCollectMoviesResource payload, string accessToken);
void RemoveFromCollection(TraktCollectMoviesResource payload, string accessToken);
HttpRequest BuildRequest(string resource, HttpMethod method, string accessToken);
HttpRequest BuildRequest(HttpRequest request, string accessToken);
}
public class TraktProxy : ITraktProxy
@@ -27,12 +27,12 @@ namespace NzbDrone.Core.Notifications.Trakt
private const string ClientId = "64508a8bf370cee550dde4806469922fd7cd70afb2d5690e3ee7f75ae784b70e";
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;
_logger = logger;
}
public void AddToCollection(TraktCollectMoviesResource payload, string accessToken)
@@ -87,16 +87,27 @@ namespace NzbDrone.Core.Notifications.Trakt
{
var request = new HttpRequestBuilder(URL).Resource(resource).Build();
request.RateLimit = TimeSpan.FromSeconds(2);
request.Headers.Accept = HttpAccept.Json.Value;
request.RateLimit = DefaultRateLimit;
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-key", ClientId);
if (accessToken.IsNotNullOrWhiteSpace())
{
request.Headers.Add("Authorization", "Bearer " + accessToken);
request.Headers.Add("Authorization", $"Bearer {accessToken}");
}
return request;