From fdb990b1ad2d12bdcac4864e84e5302e3e4e909b Mon Sep 17 00:00:00 2001 From: Jesper Utoft Date: Thu, 21 Oct 2021 21:09:03 +0200 Subject: [PATCH 1/4] Introduced tribler as a download client. The client is based on the structure of Rargb downloader. Tribler Api calls are in TriblerDownloadClientProxy --- .../Models/TriblerDownloadClientApi.cs | 257 ++++++++++++++ .../Tribler/Models/TriblerSettingsApi.cs | 129 +++++++ .../Clients/Tribler/TriblerDownloadClient.cs | 327 ++++++++++++++++++ .../Tribler/TriblerDownloadClientProxy.cs | 137 ++++++++ .../Tribler/TriblerDownloadSettings.cs | 77 +++++ 5 files changed, 927 insertions(+) create mode 100644 src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs create mode 100644 src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs create mode 100644 src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs create mode 100644 src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs create mode 100644 src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs new file mode 100644 index 000000000..9f075eef4 --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs @@ -0,0 +1,257 @@ +namespace NzbDrone.Core.Download.Clients.Tribler +{ + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public enum DownloadStatus + { + [System.Runtime.Serialization.EnumMember(Value = @"WAITING4HASHCHECK")] + WAITING4HASHCHECK = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"HASHCHECKING")] + HASHCHECKING = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"METADATA")] + METADATA = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"DOWNLOADING")] + DOWNLOADING = 3, + + [System.Runtime.Serialization.EnumMember(Value = @"SEEDING")] + SEEDING = 4, + + [System.Runtime.Serialization.EnumMember(Value = @"STOPPED")] + STOPPED = 5, + + [System.Runtime.Serialization.EnumMember(Value = @"ALLOCATING_DISKSPACE")] + ALLOCATING_DISKSPACE = 6, + + [System.Runtime.Serialization.EnumMember(Value = @"EXIT_NODES")] + EXIT_NODES = 7, + + [System.Runtime.Serialization.EnumMember(Value = @"CIRCUITS")] + CIRCUITS = 8, + + [System.Runtime.Serialization.EnumMember(Value = @"STOPPED_ON_ERROR")] + STOPPED_ON_ERROR = 9, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Trackers + { + /// url of tracker + [Newtonsoft.Json.JsonProperty("url", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Url { get; set; } + + /// number of peers + [Newtonsoft.Json.JsonProperty("peers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object Peers { get; set; } + + /// If the tracker is working or not. + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Status { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Download + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("progress", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public float? Progress { get; set; } + + [Newtonsoft.Json.JsonProperty("anon_download", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Anon_download { get; set; } + + [Newtonsoft.Json.JsonProperty("availability", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public float? Availability { get; set; } + + [Newtonsoft.Json.JsonProperty("eta", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public double? Eta { get; set; } + + [Newtonsoft.Json.JsonProperty("total_pieces", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Total_pieces { get; set; } + + [Newtonsoft.Json.JsonProperty("num_seeds", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Num_seeds { get; set; } + + [Newtonsoft.Json.JsonProperty("total_up", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Total_up { get; set; } + + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public DownloadStatus? Status { get; set; } + + [Newtonsoft.Json.JsonProperty("infohash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Infohash { get; set; } + + [Newtonsoft.Json.JsonProperty("ratio", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public float? Ratio { get; set; } + + [Newtonsoft.Json.JsonProperty("vod_mode", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Vod_mode { get; set; } + + [Newtonsoft.Json.JsonProperty("time_added", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Time_added { get; set; } + + [Newtonsoft.Json.JsonProperty("max_upload_speed", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Max_upload_speed { get; set; } + + [Newtonsoft.Json.JsonProperty("max_download_speed", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Max_download_speed { get; set; } + + [Newtonsoft.Json.JsonProperty("hops", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Hops { get; set; } + + [Newtonsoft.Json.JsonProperty("safe_seeding", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Safe_seeding { get; set; } + + [Newtonsoft.Json.JsonProperty("error", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Error { get; set; } + + [Newtonsoft.Json.JsonProperty("total_down", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Total_down { get; set; } + + [Newtonsoft.Json.JsonProperty("vod_prebuffering_progress", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public float? Vod_prebuffering_progress { get; set; } + + [Newtonsoft.Json.JsonProperty("trackers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Trackers { get; set; } + + [Newtonsoft.Json.JsonProperty("size", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Size { get; set; } + + [Newtonsoft.Json.JsonProperty("peers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Peers { get; set; } + + [Newtonsoft.Json.JsonProperty("destination", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Destination { get; set; } + + [Newtonsoft.Json.JsonProperty("speed_down", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public float? Speed_down { get; set; } + + [Newtonsoft.Json.JsonProperty("speed_up", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public float? Speed_up { get; set; } + + [Newtonsoft.Json.JsonProperty("vod_prebuffering_progress_consec", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public float? Vod_prebuffering_progress_consec { get; set; } + + [Newtonsoft.Json.JsonProperty("files", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Files { get; set; } + + [Newtonsoft.Json.JsonProperty("num_peers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Num_peers { get; set; } + + [Newtonsoft.Json.JsonProperty("channel_download", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? ChannelDownload { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class DownloadsResponse + { + [Newtonsoft.Json.JsonProperty("downloads", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Downloads { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class AddDownloadRequest + { + /// Number of hops for the anonymous download. No hops is equivalent to a plain download + [Newtonsoft.Json.JsonProperty("anon_hops", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Anon_hops { get; set; } + + /// Whether the seeding of the download should be anonymous or not + [Newtonsoft.Json.JsonProperty("safe_seeding", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Safe_seeding { get; set; } + + /// the download destination path of the torrent + [Newtonsoft.Json.JsonProperty("destination", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Destination { get; set; } + + /// The URI of the torrent file that should be downloaded. This URI can either represent a file location, a magnet link or a HTTP(S) url. + [Newtonsoft.Json.JsonProperty("uri", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Uri { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class AddDownloadResponse + { + [Newtonsoft.Json.JsonProperty("infohash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Infohash { get; set; } + + [Newtonsoft.Json.JsonProperty("started", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Started { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class RemoveDownloadRequest + { + /// Whether or not to remove the associated data + [Newtonsoft.Json.JsonProperty("remove_data", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Remove_data { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class DeleteDownloadResponse + { + [Newtonsoft.Json.JsonProperty("removed", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Removed { get; set; } + + [Newtonsoft.Json.JsonProperty("infohash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Infohash { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class UpdateDownloadRequest + { + /// The anonymity of a download can be changed at runtime by passing the anon_hops parameter, however, this must be the only parameter in this request. + [Newtonsoft.Json.JsonProperty("anon_hops", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Anon_hops { get; set; } + + [Newtonsoft.Json.JsonProperty("selected_files", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Selected_files { get; set; } + + /// State parameter to be passed to modify the state of the download (resume/stop/recheck) + [Newtonsoft.Json.JsonProperty("state", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string State { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class UpdateDownloadResponse + { + [Newtonsoft.Json.JsonProperty("modified", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Modified { get; set; } + + [Newtonsoft.Json.JsonProperty("infohash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Infohash { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class File + { + [Newtonsoft.Json.JsonProperty("size", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Size { get; set; } + + [Newtonsoft.Json.JsonProperty("index", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Index { get; set; } + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("progress", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public float? Progress { get; set; } + + [Newtonsoft.Json.JsonProperty("included", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Included { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class GetFilesResponse + { + [Newtonsoft.Json.JsonProperty("files", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Files { get; set; } + } +} diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs new file mode 100644 index 000000000..74ae37c74 --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs @@ -0,0 +1,129 @@ +namespace NzbDrone.Core.Indexers.Tribler +{ + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class GetTriblerSettingsResponse + { + [Newtonsoft.Json.JsonProperty("settings", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Settings Settings { get; set; } + } + + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Settings + { + [Newtonsoft.Json.JsonProperty("general", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public General General { get; set; } + + [Newtonsoft.Json.JsonProperty("tunnel_community", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Tunnel_community Tunnel_community { get; set; } + + [Newtonsoft.Json.JsonProperty("dht", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Dht Dht { get; set; } + + [Newtonsoft.Json.JsonProperty("download_defaults", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Download_defaults Download_defaults { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class General + { + [Newtonsoft.Json.JsonProperty("log_dir", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Log_dir { get; set; } + + [Newtonsoft.Json.JsonProperty("version", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Version { get; set; } + + [Newtonsoft.Json.JsonProperty("version_checker_enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Version_checker_enabled { get; set; } + + [Newtonsoft.Json.JsonProperty("testnet", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Testnet { get; set; } + } + + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Tunnel_community + { + [Newtonsoft.Json.JsonProperty("exitnode_enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Exitnode_enabled { get; set; } + + [Newtonsoft.Json.JsonProperty("enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Enabled { get; set; } + + [Newtonsoft.Json.JsonProperty("random_slots", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? Random_slots { get; set; } + + [Newtonsoft.Json.JsonProperty("competing_slots", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? Competing_slots { get; set; } + + [Newtonsoft.Json.JsonProperty("min_circuits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? Min_Circuits { get; set; } + + [Newtonsoft.Json.JsonProperty("max_circuits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? Max_Circuits { get; set; } + + [Newtonsoft.Json.JsonProperty("testnet", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Testnet { get; set; } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Dht + { + [Newtonsoft.Json.JsonProperty("enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Enabled { get; set; } + + + } + + + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Download_defaults + { + [Newtonsoft.Json.JsonProperty("anonymity_enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Anonymity_enabled { get; set; } + + [Newtonsoft.Json.JsonProperty("number_hops", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? Number_hops { get; set; } + + [Newtonsoft.Json.JsonProperty("safeseeding_enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? Safeseeding_enabled { get; set; } + + [Newtonsoft.Json.JsonProperty("saveas", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Saveas { get; set; } + + [Newtonsoft.Json.JsonProperty("seeding_mode", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public Download_defaultsSeeding_mode? Seeding_mode { get; set; } + + /// Seeding ratio download/upload + [Newtonsoft.Json.JsonProperty("seeding_ratio", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public double? Seeding_ratio { get; set; } + + /// Seeding time in seconds + [Newtonsoft.Json.JsonProperty("seeding_time", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public double? Seeding_time { get; set; } + + + } + + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public enum Download_defaultsSeeding_mode + { + [System.Runtime.Serialization.EnumMember(Value = @"ratio")] + Ratio = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"forever")] + Forever = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"time")] + Time = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"never")] + Never = 3, + + } +} diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs new file mode 100644 index 000000000..df3608639 --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs @@ -0,0 +1,327 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using FluentValidation.Results; +using MonoTorrent; +using NLog; +using NzbDrone.Common.Disk; +using NzbDrone.Common.Extensions; +using NzbDrone.Common.Http; + +using NzbDrone.Core.Blocklisting; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.Indexers.Tribler; +using NzbDrone.Core.Localization; +using NzbDrone.Core.MediaFiles.TorrentInfo; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.RemotePathMappings; +using NzbDrone.Core.Validation; + +namespace NzbDrone.Core.Download.Clients.Tribler +{ + public class TriblerDownloadClient : TorrentClientBase + { + private readonly ITriblerDownloadClientProxy _proxy; + + public TriblerDownloadClient( + ITriblerDownloadClientProxy triblerDownloadClientProxy, + ITorrentFileInfoReader torrentFileInfoReader, + IHttpClient httpClient, + IConfigService configService, + IDiskProvider diskProvider, + IRemotePathMappingService remotePathMappingService, + ILocalizationService localizationService, + IBlocklistService blocklistService, + Logger logger) + : base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger) + { + _proxy = triblerDownloadClientProxy; + } + + public override string Name => "Tribler"; + + public override bool PreferTorrentFile => false; + + public override IEnumerable GetItems() + { + var configAsync = _proxy.GetConfig(Settings); + + var items = new List(); + + var downloads = _proxy.GetDownloads(Settings); + + foreach (var download in downloads) + { + // If totalsize == 0 the torrent is a magnet downloading metadata + if (download.Size == null || download.Size == 0) + { + continue; + } + + // skip channel downloads + if (download.ChannelDownload == true) + { + continue; + } + + var item = new DownloadClientItem + { + DownloadId = InfoHash.FromHex(download.Infohash).ToHex(), + Title = download.Name, + + DownloadClientInfo = DownloadClientItemClientInfo.FromDownloadClient(this, false) // TODO: WHAT IS POST-IMPORT + }; + + // some concurrency could make this faster. + var files = _proxy.GetDownloadFiles(Settings, download); + + item.OutputPath = new OsPath(download.Destination); + + if (files.Count == 1) + { + item.OutputPath += files.First().Name; + } + else + { + item.OutputPath += item.Title; + } + + item.TotalSize = (long)download.Size; + item.RemainingSize = (long)(download.Size * (1 - download.Progress)); // TODO: i expect progress to be between 0 and 1 + item.SeedRatio = download.Ratio; + + if (download.Eta.HasValue) + { + if (download.Eta.Value >= TimeSpan.FromDays(365).TotalSeconds) + { + item.RemainingTime = TimeSpan.FromDays(365); + } + else if (download.Eta.Value < 0) + { + item.RemainingTime = TimeSpan.FromSeconds(0); + } + else + { + item.RemainingTime = TimeSpan.FromSeconds(download.Eta.Value); + } + } + + // TODO: the item's message should not be equal to Error + item.Message = download.Error; + + // tribler always saves files unencrypted to disk. + item.IsEncrypted = false; + + // state handling + + // TODO: impossible states? + // Failed = 4, + // Warning = 5 + + // Queued = 0, + // Completed = 3, + // Downloading = 2, + + // Paused is guesstimated + // Paused = 1, + + switch (download.Status) + { + case DownloadStatus.HASHCHECKING: + case DownloadStatus.WAITING4HASHCHECK: + case DownloadStatus.CIRCUITS: + case DownloadStatus.EXIT_NODES: + case DownloadStatus.DOWNLOADING: + item.Status = DownloadItemStatus.Downloading; + break; + case DownloadStatus.METADATA: + case DownloadStatus.ALLOCATING_DISKSPACE: + item.Status = DownloadItemStatus.Queued; + break; + case DownloadStatus.SEEDING: + case DownloadStatus.STOPPED: + item.Status = DownloadItemStatus.Completed; + break; + case DownloadStatus.STOPPED_ON_ERROR: + item.Status = DownloadItemStatus.Failed; + break; + default: // new status in API? default to downloading + item.Message = "Unknown download state: " + download.Status; + _logger.Info(item.Message); + item.Status = DownloadItemStatus.Downloading; + break; + } + + // override status' if completed but progress is not finished + if (download.Status == DownloadStatus.STOPPED && download.Progress < 1) + { + item.Status = DownloadItemStatus.Paused; + } + + // override status if error is set + if (download.Error != null && download.Error.Length > 0) + { + item.Status = DownloadItemStatus.Warning; // maybe this should be an error? + } + + // done (finished seeding & stopped, guessed) + item.CanBeRemoved = HasReachedSeedLimit(download, configAsync); + + // seeding or done, or stopped + item.CanMoveFiles = download.Progress == 1.0; + + items.Add(item); + } + + return items; + } + + public override void RemoveItem(DownloadClientItem item, bool deleteData) + { + _proxy.RemoveDownload(Settings, item, deleteData); + } + + public override DownloadClientInfo GetStatus() + { + var config = _proxy.GetConfig(Settings); + var destDir = config.Settings.Download_defaults.Saveas; + + if (Settings.TvCategory.IsNotNullOrWhiteSpace()) + { + destDir = string.Format("{0}/.{1}", destDir, Settings.TvCategory); + } + + return new DownloadClientInfo + { + IsLocalhost = Settings.Host == "127.0.0.1" || Settings.Host == "localhost", + OutputRootFolders = new List { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, new OsPath(destDir)) } + }; + } + + /** + * this basically checks if torrent is stopped because of seeding has finished + */ + protected static bool HasReachedSeedLimit(Download torrent, GetTriblerSettingsResponse config) + { + if (config == null) + { + throw new ArgumentNullException(nameof(config)); + } + + if (torrent == null) + { + throw new ArgumentNullException(nameof(torrent)); + } + + // if download is still running then it's not finished. + if (torrent.Status != DownloadStatus.STOPPED) + { + return false; + } + + switch (config.Settings.Download_defaults.Seeding_mode) + { + // if in ratio mode, wait for ratio to become larger than expeced. Tribler's DownloadStatus will switch from SEEDING to STOPPED + case Download_defaultsSeeding_mode.Ratio: + + return torrent.Ratio.HasValue + && torrent.Ratio >= config.Settings.Download_defaults.Seeding_ratio; + + case Download_defaultsSeeding_mode.Time: + var downloadStarted = DateTimeOffset.FromUnixTimeSeconds(torrent.Time_added.Value); + var maxSeedingTime = TimeSpan.FromSeconds(config.Settings.Download_defaults.Seeding_time ?? 0); + + return torrent.Time_added.HasValue + && downloadStarted.Add(maxSeedingTime) < DateTimeOffset.Now; + + case Download_defaultsSeeding_mode.Never: + return true; + + case Download_defaultsSeeding_mode.Forever: + default: + return false; + } + } + + protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink) + { + var addDownloadRequestObject = new AddDownloadRequest + { + Destination = GetDownloadDirectory(), + Uri = magnetLink, + Safe_seeding = Settings.SafeSeeding, + Anon_hops = Settings.AnonymityLevel + }; + + return _proxy.AddFromMagnetLink(Settings, addDownloadRequestObject); + } + + protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent) + { + // tribler api currently do not support recieving a torrent file direcly. + throw new NotSupportedException("Tribler download client only support magnet links currently"); + } + + protected override void Test(List failures) + { + failures.AddIfNotNull(TestConnection()); + if (failures.HasErrors()) + { + return; + } + + // failures.AddIfNotNull(TestGetTorrents()); + } + + protected string GetDownloadDirectory() + { + if (Settings.TvDirectory.IsNotNullOrWhiteSpace()) + { + return Settings.TvDirectory; + } + + if (!Settings.TvCategory.IsNotNullOrWhiteSpace()) + { + return null; + } + + var config = _proxy.GetConfig(Settings); + var destDir = config.Settings.Download_defaults.Saveas; + + return $"{destDir.TrimEnd('/')}/{Settings.TvCategory}"; + } + + protected ValidationFailure TestConnection() + { + try + { + var downloads = GetItems(); + return null; + } + catch (DownloadClientAuthenticationException ex) + { + _logger.Error(ex, ex.Message); + + return new NzbDroneValidationFailure("ApiKey", "Authentication failure") + { + DetailedDescription = string.Format("Please verify your ApiKey is correct. Also verify if the host running Sonarr isn't blocked from accessing {0} by WhiteList limitations in the {0} configuration.", Name) + }; + } + catch (DownloadClientUnavailableException ex) + { + _logger.Error(ex, ex.Message); + + return new NzbDroneValidationFailure("Url", "Unable to connect to Tribler") + { + DetailedDescription = ex.Message + }; + } + catch (Exception ex) + { + _logger.Error(ex, "Failed to test"); + + return new NzbDroneValidationFailure(string.Empty, "Unknown exception: " + ex.Message); + } + } + } +} diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs new file mode 100644 index 000000000..c77c4da70 --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs @@ -0,0 +1,137 @@ +using System.Collections.Generic; +using NLog; +using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Indexers.Tribler; + +namespace NzbDrone.Core.Download.Clients.Tribler +{ + public interface ITriblerDownloadClientProxy + { + ICollection GetDownloads(TriblerDownloadSettings settings); + + ICollection GetDownloadFiles(TriblerDownloadSettings settings, Download downloadItem); + + GetTriblerSettingsResponse GetConfig(TriblerDownloadSettings settings); + + void RemoveDownload(TriblerDownloadSettings settings, DownloadClientItem item, bool deleteData); + + string AddFromMagnetLink(TriblerDownloadSettings settings, AddDownloadRequest downloadRequest); + } + + public class TriblerDownloadClientProxy : ITriblerDownloadClientProxy + { + protected readonly IHttpClient _httpClient; + private readonly Logger _logger; + + public TriblerDownloadClientProxy(IHttpClient httpClient, Logger logger) + { + _httpClient = httpClient; + _logger = logger; + } + + private HttpRequestBuilder getRequestBuilder(TriblerDownloadSettings settings, string relativePath = null) + { + var requestBuilder = new HttpRequestBuilder(GetBaseUrl(settings, relativePath)) + .Accept(HttpAccept.Json); + + requestBuilder.Headers.Add("X-Api-Key", settings.ApiKey); + + requestBuilder.LogResponseContent = true; + + return requestBuilder; + } + + public string GetBaseUrl(TriblerDownloadSettings settings, string relativePath = null) + { + var baseUrl = HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase); + baseUrl = HttpUri.CombinePath(baseUrl, relativePath); + + return baseUrl; + } + + private T ProcessRequest(HttpRequestBuilder requestBuilder) + where T : new() + { + return ProcessRequest(requestBuilder.Build()); + } + + private T ProcessRequest(HttpRequest requestBuilder) + where T : new() + { + var httpRequest = requestBuilder; + + HttpResponse response; + + _logger.Debug("Url: {0}", httpRequest.Url); + + try + { + response = _httpClient.Execute(httpRequest); + } + catch (HttpException ex) + { + if (ex.Response.StatusCode == System.Net.HttpStatusCode.Unauthorized) + { + throw new DownloadClientAuthenticationException("Unauthorized - AuthToken is invalid", ex); + } + + throw new DownloadClientUnavailableException("Unable to connect to Tribler. Status Code: {0}", ex.Response.StatusCode, ex); + } + + return Json.Deserialize(response.Content); + } + + public GetTriblerSettingsResponse GetConfig(TriblerDownloadSettings settings) + { + var configRequest = getRequestBuilder(settings, "settings"); + return ProcessRequest(configRequest); + } + + public ICollection GetDownloadFiles(TriblerDownloadSettings settings, Download downloadItem) + { + var filesRequest = getRequestBuilder(settings, "downloads/" + downloadItem.Infohash + "/files"); + return ProcessRequest(filesRequest).Files; + } + + public ICollection GetDownloads(TriblerDownloadSettings settings) + { + var downloadRequest = getRequestBuilder(settings, "downloads"); + var downloads = ProcessRequest(downloadRequest); + return downloads.Downloads; + } + + public void RemoveDownload(TriblerDownloadSettings settings, DownloadClientItem item, bool deleteData) + { + var deleteDownloadRequestObject = new RemoveDownloadRequest + { + Remove_data = deleteData + }; + + var deleteRequestBuilder = getRequestBuilder(settings, "downloads/" + item.DownloadId.ToLower()); + deleteRequestBuilder.Method = System.Net.Http.HttpMethod.Delete; + + // manually set content of delete request. + var deleteRequest = deleteRequestBuilder.Build(); + deleteRequest.SetContent(Json.ToJson(deleteDownloadRequestObject)); + + ProcessRequest(deleteRequest); + } + + public string AddFromMagnetLink(TriblerDownloadSettings settings, AddDownloadRequest downloadRequest) + { + // run hash through InfoHash class to ensure the correct casing. + var addDownloadRequestBuilder = getRequestBuilder(settings, "downloads"); + addDownloadRequestBuilder.Method = System.Net.Http.HttpMethod.Put; + + // manually set content of delete request. + var addDownloadRequest = addDownloadRequestBuilder.Build(); + addDownloadRequest.SetContent(Json.ToJson(downloadRequest)); + + var infoHashAsString = ProcessRequest(addDownloadRequest).Infohash; + + var infoHash = MonoTorrent.InfoHash.FromHex(infoHashAsString); + return infoHash.ToHex(); + } + } +} diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs new file mode 100644 index 000000000..fc12d9f9c --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs @@ -0,0 +1,77 @@ +using System.Text.RegularExpressions; +using FluentValidation; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Annotations; +using NzbDrone.Core.ThingiProvider; +using NzbDrone.Core.Validation; + +namespace NzbDrone.Core.Download.Clients.Tribler +{ + public class TriblerSettingsValidator : AbstractValidator + { + public TriblerSettingsValidator() + { + RuleFor(c => c.Host).ValidHost(); + RuleFor(c => c.Port).InclusiveBetween(1, 65535); + + RuleFor(c => c.UrlBase).ValidUrlBase(); + + RuleFor(c => c.ApiKey).NotEmpty(); + + RuleFor(c => c.TvCategory).Matches(@"^\.?[-a-z]*$", RegexOptions.IgnoreCase).WithMessage("Allowed characters a-z and -"); + + RuleFor(c => c.TvCategory).Empty() + .When(c => c.TvDirectory.IsNotNullOrWhiteSpace()) + .WithMessage("Cannot use Category and Directory"); + + RuleFor(c => c.AnonymityLevel).GreaterThanOrEqualTo(0).WithMessage("Should be greater than or equal to zero"); + } + } + + public class TriblerDownloadSettings : IProviderConfig + { + private static readonly TriblerSettingsValidator Validator = new TriblerSettingsValidator(); + + public TriblerDownloadSettings() + { + Host = "localhost"; + Port = 20100; + UrlBase = ""; + + AnonymityLevel = 1; + SafeSeeding = true; + } + + [FieldDefinition(1, Label = "Host", Type = FieldType.Textbox)] + public string Host { get; set; } + + [FieldDefinition(2, Label = "Port", Type = FieldType.Textbox)] + public int Port { get; set; } + + [FieldDefinition(3, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to Tribler")] + public bool UseSsl { get; set; } + + [FieldDefinition(4, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the tribler url, eg http://[host]:[port]/[urlBase], defaults to ''")] + public string UrlBase { get; set; } + + [FieldDefinition(5, Label = "ApiKey", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey, HelpText = "Api key, found in %APPDATA%\\Roaming\\.Tribler\\7.10\\triblerd.conf, the api key is [api].key, NOT [http_api].key")] + public string ApiKey { get; set; } + + [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Sonarr avoids conflicts with unrelated downloads, but it's optional. Creates a [category] subdirectory in the output directory.")] + public string TvCategory { get; set; } + + [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Transmission location")] + public string TvDirectory { get; set; } + + [FieldDefinition(8, Label = "AnonymityLevel", Type = FieldType.Number, HelpText = "Number of proxies to use when downloading content. To disable set to 0. Proxies reduce download/upload speed. See https://www.tribler.org/anonymity.html")] + public int AnonymityLevel { get; set; } + + [FieldDefinition(9, Label = "SafeSeeding", Type = FieldType.Checkbox, HelpText = "If seeding only should be done through proxies. The Anonymity level defines the number of proxies used. See https://www.tribler.org/anonymity.html")] + public bool SafeSeeding { get; set; } + + public NzbDroneValidationResult Validate() + { + return new NzbDroneValidationResult(Validator.Validate(this)); + } + } +} From 7c99a79757105a6f87c349f5372753aad0964e0d Mon Sep 17 00:00:00 2001 From: Jesper Utoft Date: Mon, 12 Aug 2024 20:36:06 +0200 Subject: [PATCH 2/4] Switch to PascalCase in generated code. Use translations for Settings api. Remove partial from dto classes. --- .../Models/TriblerDownloadClientApi.cs | 267 +++++++++--------- .../Tribler/Models/TriblerSettingsApi.cs | 150 +++++----- .../Clients/Tribler/TriblerDownloadClient.cs | 50 ++-- .../Tribler/TriblerDownloadClientProxy.cs | 4 +- .../Tribler/TriblerDownloadSettings.cs | 17 +- src/NzbDrone.Core/Localization/Core/en.json | 6 + 6 files changed, 250 insertions(+), 244 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs index 9f075eef4..272c2122b 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs @@ -1,257 +1,254 @@ +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + namespace NzbDrone.Core.Download.Clients.Tribler { - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum DownloadStatus { - [System.Runtime.Serialization.EnumMember(Value = @"WAITING4HASHCHECK")] - WAITING4HASHCHECK = 0, + [EnumMember(Value = @"WAITING4HASHCHECK")] + Waiting4HashCheck = 0, - [System.Runtime.Serialization.EnumMember(Value = @"HASHCHECKING")] - HASHCHECKING = 1, + [EnumMember(Value = @"HASHCHECKING")] + Hashchecking = 1, - [System.Runtime.Serialization.EnumMember(Value = @"METADATA")] - METADATA = 2, + [EnumMember(Value = @"METADATA")] + Metadata = 2, - [System.Runtime.Serialization.EnumMember(Value = @"DOWNLOADING")] - DOWNLOADING = 3, + [EnumMember(Value = @"DOWNLOADING")] + Downloading = 3, - [System.Runtime.Serialization.EnumMember(Value = @"SEEDING")] - SEEDING = 4, + [EnumMember(Value = @"SEEDING")] + Seeding = 4, - [System.Runtime.Serialization.EnumMember(Value = @"STOPPED")] - STOPPED = 5, + [EnumMember(Value = @"STOPPED")] + Stopped = 5, - [System.Runtime.Serialization.EnumMember(Value = @"ALLOCATING_DISKSPACE")] - ALLOCATING_DISKSPACE = 6, + [EnumMember(Value = @"ALLOCATING_DISKSPACE")] + AllocatingDiskspace = 6, - [System.Runtime.Serialization.EnumMember(Value = @"EXIT_NODES")] - EXIT_NODES = 7, + [EnumMember(Value = @"EXIT_NODES")] + Exitnodes = 7, - [System.Runtime.Serialization.EnumMember(Value = @"CIRCUITS")] - CIRCUITS = 8, + [EnumMember(Value = @"CIRCUITS")] + Circuits = 8, + + [EnumMember(Value = @"STOPPED_ON_ERROR")] + StoppedOnError = 9, - [System.Runtime.Serialization.EnumMember(Value = @"STOPPED_ON_ERROR")] - STOPPED_ON_ERROR = 9, - } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Trackers + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class Trackers { - /// url of tracker - [Newtonsoft.Json.JsonProperty("url", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("url", NullValueHandling = NullValueHandling.Ignore)] public string Url { get; set; } - /// number of peers - [Newtonsoft.Json.JsonProperty("peers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("peers", NullValueHandling = NullValueHandling.Ignore)] public object Peers { get; set; } - /// If the tracker is working or not. - [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)] public string Status { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Download + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class Download { - [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)] public string Name { get; set; } - [Newtonsoft.Json.JsonProperty("progress", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("progress", NullValueHandling = NullValueHandling.Ignore)] public float? Progress { get; set; } - [Newtonsoft.Json.JsonProperty("anon_download", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Anon_download { get; set; } + [JsonProperty("anon_download", NullValueHandling = NullValueHandling.Ignore)] + public bool? AnonDownload { get; set; } - [Newtonsoft.Json.JsonProperty("availability", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("availability", NullValueHandling = NullValueHandling.Ignore)] public float? Availability { get; set; } - [Newtonsoft.Json.JsonProperty("eta", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("eta", NullValueHandling = NullValueHandling.Ignore)] public double? Eta { get; set; } - [Newtonsoft.Json.JsonProperty("total_pieces", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Total_pieces { get; set; } + [JsonProperty("total_pieces", NullValueHandling = NullValueHandling.Ignore)] + public long? TotalPieces { get; set; } - [Newtonsoft.Json.JsonProperty("num_seeds", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Num_seeds { get; set; } + [JsonProperty("num_seeds", NullValueHandling = NullValueHandling.Ignore)] + public long? NumSeeds { get; set; } - [Newtonsoft.Json.JsonProperty("total_up", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Total_up { get; set; } + [JsonProperty("total_up", NullValueHandling = NullValueHandling.Ignore)] + public long? TotalUp { get; set; } - [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)] + [JsonConverter(typeof(StringEnumConverter))] public DownloadStatus? Status { get; set; } - [Newtonsoft.Json.JsonProperty("infohash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("infohash", NullValueHandling = NullValueHandling.Ignore)] public string Infohash { get; set; } - [Newtonsoft.Json.JsonProperty("ratio", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("ratio", NullValueHandling = NullValueHandling.Ignore)] public float? Ratio { get; set; } - [Newtonsoft.Json.JsonProperty("vod_mode", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Vod_mode { get; set; } + [JsonProperty("vod_mode", NullValueHandling = NullValueHandling.Ignore)] + public bool? VideoOnDemandMode { get; set; } - [Newtonsoft.Json.JsonProperty("time_added", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Time_added { get; set; } + [JsonProperty("time_added", NullValueHandling = NullValueHandling.Ignore)] + public long? TimeAdded { get; set; } - [Newtonsoft.Json.JsonProperty("max_upload_speed", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Max_upload_speed { get; set; } + [JsonProperty("max_upload_speed", NullValueHandling = NullValueHandling.Ignore)] + public long? MaxUploadSpeed { get; set; } - [Newtonsoft.Json.JsonProperty("max_download_speed", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Max_download_speed { get; set; } + [JsonProperty("max_download_speed", NullValueHandling = NullValueHandling.Ignore)] + public long? MaxDownloadSpeed { get; set; } - [Newtonsoft.Json.JsonProperty("hops", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("hops", NullValueHandling = NullValueHandling.Ignore)] public long? Hops { get; set; } - [Newtonsoft.Json.JsonProperty("safe_seeding", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Safe_seeding { get; set; } + [JsonProperty("safe_seeding", NullValueHandling = NullValueHandling.Ignore)] + public bool? SafeSeeding { get; set; } - [Newtonsoft.Json.JsonProperty("error", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("error", NullValueHandling = NullValueHandling.Ignore)] public string Error { get; set; } - [Newtonsoft.Json.JsonProperty("total_down", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Total_down { get; set; } + [JsonProperty("total_down", NullValueHandling = NullValueHandling.Ignore)] + public long? TotalDown { get; set; } - [Newtonsoft.Json.JsonProperty("vod_prebuffering_progress", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public float? Vod_prebuffering_progress { get; set; } + [JsonProperty("vod_prebuffering_progress", NullValueHandling = NullValueHandling.Ignore)] + public float? VideoOnDemandPrebufferingProgress { get; set; } - [Newtonsoft.Json.JsonProperty("trackers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection Trackers { get; set; } + [JsonProperty("trackers", NullValueHandling = NullValueHandling.Ignore)] + public ICollection Trackers { get; set; } - [Newtonsoft.Json.JsonProperty("size", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("size", NullValueHandling = NullValueHandling.Ignore)] public long? Size { get; set; } - [Newtonsoft.Json.JsonProperty("peers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection Peers { get; set; } + [JsonProperty("peers", NullValueHandling = NullValueHandling.Ignore)] + public ICollection Peers { get; set; } - [Newtonsoft.Json.JsonProperty("destination", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("destination", NullValueHandling = NullValueHandling.Ignore)] public string Destination { get; set; } - [Newtonsoft.Json.JsonProperty("speed_down", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public float? Speed_down { get; set; } + [JsonProperty("speed_down", NullValueHandling = NullValueHandling.Ignore)] + public float? SpeedDown { get; set; } - [Newtonsoft.Json.JsonProperty("speed_up", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public float? Speed_up { get; set; } + [JsonProperty("speed_up", NullValueHandling = NullValueHandling.Ignore)] + public float? SpeedUp { get; set; } - [Newtonsoft.Json.JsonProperty("vod_prebuffering_progress_consec", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public float? Vod_prebuffering_progress_consec { get; set; } + [JsonProperty("vod_prebuffering_progress_consec", NullValueHandling = NullValueHandling.Ignore)] + public float? VideoOnDemandPrebufferingProgressConsec { get; set; } - [Newtonsoft.Json.JsonProperty("files", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection Files { get; set; } + [JsonProperty("files", NullValueHandling = NullValueHandling.Ignore)] + public ICollection Files { get; set; } - [Newtonsoft.Json.JsonProperty("num_peers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Num_peers { get; set; } + [JsonProperty("num_peers", NullValueHandling = NullValueHandling.Ignore)] + public long? NumPeers { get; set; } - [Newtonsoft.Json.JsonProperty("channel_download", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("channel_download", NullValueHandling = NullValueHandling.Ignore)] public bool? ChannelDownload { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class DownloadsResponse + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class DownloadsResponse { - [Newtonsoft.Json.JsonProperty("downloads", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection Downloads { get; set; } + [JsonProperty("downloads", NullValueHandling = NullValueHandling.Ignore)] + public ICollection Downloads { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class AddDownloadRequest + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class AddDownloadRequest { - /// Number of hops for the anonymous download. No hops is equivalent to a plain download - [Newtonsoft.Json.JsonProperty("anon_hops", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Anon_hops { get; set; } + [JsonProperty("anon_hops", NullValueHandling = NullValueHandling.Ignore)] + public long? AnonymityHops { get; set; } - /// Whether the seeding of the download should be anonymous or not - [Newtonsoft.Json.JsonProperty("safe_seeding", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Safe_seeding { get; set; } + [JsonProperty("safe_seeding", NullValueHandling = NullValueHandling.Ignore)] + public bool? SafeSeeding { get; set; } - /// the download destination path of the torrent - [Newtonsoft.Json.JsonProperty("destination", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("destination", NullValueHandling = NullValueHandling.Ignore)] public string Destination { get; set; } - /// The URI of the torrent file that should be downloaded. This URI can either represent a file location, a magnet link or a HTTP(S) url. - [Newtonsoft.Json.JsonProperty("uri", Required = Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [JsonProperty("uri", Required = Newtonsoft.Json.Required.Always)] + [Required(AllowEmptyStrings = true)] public string Uri { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class AddDownloadResponse + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class AddDownloadResponse { - [Newtonsoft.Json.JsonProperty("infohash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("infohash", NullValueHandling = NullValueHandling.Ignore)] public string Infohash { get; set; } - [Newtonsoft.Json.JsonProperty("started", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("started", NullValueHandling = NullValueHandling.Ignore)] public bool? Started { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class RemoveDownloadRequest + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class RemoveDownloadRequest { - /// Whether or not to remove the associated data - [Newtonsoft.Json.JsonProperty("remove_data", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Remove_data { get; set; } + [JsonProperty("remove_data", NullValueHandling = NullValueHandling.Ignore)] + public bool? RemoveData { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class DeleteDownloadResponse + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class DeleteDownloadResponse { - [Newtonsoft.Json.JsonProperty("removed", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("removed", NullValueHandling = NullValueHandling.Ignore)] public bool? Removed { get; set; } - [Newtonsoft.Json.JsonProperty("infohash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("infohash", NullValueHandling = NullValueHandling.Ignore)] public string Infohash { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class UpdateDownloadRequest + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class UpdateDownloadRequest { - /// The anonymity of a download can be changed at runtime by passing the anon_hops parameter, however, this must be the only parameter in this request. - [Newtonsoft.Json.JsonProperty("anon_hops", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? Anon_hops { get; set; } + [JsonProperty("anon_hops", NullValueHandling = NullValueHandling.Ignore)] + public long? AnonHops { get; set; } - [Newtonsoft.Json.JsonProperty("selected_files", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection Selected_files { get; set; } + [JsonProperty("selected_files", NullValueHandling = NullValueHandling.Ignore)] + public ICollection Selected_files { get; set; } - /// State parameter to be passed to modify the state of the download (resume/stop/recheck) - [Newtonsoft.Json.JsonProperty("state", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("state", NullValueHandling = NullValueHandling.Ignore)] public string State { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class UpdateDownloadResponse + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class UpdateDownloadResponse { - [Newtonsoft.Json.JsonProperty("modified", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("modified", NullValueHandling = NullValueHandling.Ignore)] public bool? Modified { get; set; } - [Newtonsoft.Json.JsonProperty("infohash", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("infohash", NullValueHandling = NullValueHandling.Ignore)] public string Infohash { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class File + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class File { - [Newtonsoft.Json.JsonProperty("size", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("size", NullValueHandling = NullValueHandling.Ignore)] public long? Size { get; set; } - [Newtonsoft.Json.JsonProperty("index", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("index", NullValueHandling = NullValueHandling.Ignore)] public long? Index { get; set; } - [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)] public string Name { get; set; } - [Newtonsoft.Json.JsonProperty("progress", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("progress", NullValueHandling = NullValueHandling.Ignore)] public float? Progress { get; set; } - [Newtonsoft.Json.JsonProperty("included", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("included", NullValueHandling = NullValueHandling.Ignore)] public bool? Included { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class GetFilesResponse + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class GetFilesResponse { - [Newtonsoft.Json.JsonProperty("files", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public System.Collections.Generic.ICollection Files { get; set; } + [JsonProperty("files", NullValueHandling = NullValueHandling.Ignore)] + public ICollection Files { get; set; } } } diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs index 74ae37c74..fce9d936e 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs @@ -1,128 +1,128 @@ +using System.CodeDom.Compiler; +using System.Runtime.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + namespace NzbDrone.Core.Indexers.Tribler { - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class GetTriblerSettingsResponse { - [Newtonsoft.Json.JsonProperty("settings", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("settings", NullValueHandling = NullValueHandling.Ignore)] public Settings Settings { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Settings + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class Settings { - [Newtonsoft.Json.JsonProperty("general", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("general", NullValueHandling = NullValueHandling.Ignore)] public General General { get; set; } - [Newtonsoft.Json.JsonProperty("tunnel_community", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public Tunnel_community Tunnel_community { get; set; } + [JsonProperty("tunnel_community", NullValueHandling = NullValueHandling.Ignore)] + public TunnelCommunity TunnelCommunity { get; set; } - [Newtonsoft.Json.JsonProperty("dht", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("dht", NullValueHandling = NullValueHandling.Ignore)] public Dht Dht { get; set; } - [Newtonsoft.Json.JsonProperty("download_defaults", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public Download_defaults Download_defaults { get; set; } + [JsonProperty("download_defaults", NullValueHandling = NullValueHandling.Ignore)] + public DownloadDefaults DownloadDefaults { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class General + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class General { - [Newtonsoft.Json.JsonProperty("log_dir", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string Log_dir { get; set; } + [JsonProperty("log_dir", NullValueHandling = NullValueHandling.Ignore)] + public string LogDir { get; set; } - [Newtonsoft.Json.JsonProperty("version", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("version", NullValueHandling = NullValueHandling.Ignore)] public string Version { get; set; } - [Newtonsoft.Json.JsonProperty("version_checker_enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Version_checker_enabled { get; set; } + [JsonProperty("version_checker_enabled", NullValueHandling = NullValueHandling.Ignore)] + public bool? VersionCheckerEnabled { get; set; } - [Newtonsoft.Json.JsonProperty("testnet", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Testnet { get; set; } + [JsonProperty("testnet", NullValueHandling = NullValueHandling.Ignore)] + public bool? TestNet { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Tunnel_community + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class TunnelCommunity { - [Newtonsoft.Json.JsonProperty("exitnode_enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Exitnode_enabled { get; set; } + [JsonProperty("exitnode_enabled", NullValueHandling = NullValueHandling.Ignore)] + public bool? ExitNodeEnabled { get; set; } - [Newtonsoft.Json.JsonProperty("enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] public bool? Enabled { get; set; } - [Newtonsoft.Json.JsonProperty("random_slots", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public int? Random_slots { get; set; } + [JsonProperty("random_slots", NullValueHandling = NullValueHandling.Ignore)] + public int? RandomSlots { get; set; } - [Newtonsoft.Json.JsonProperty("competing_slots", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public int? Competing_slots { get; set; } + [JsonProperty("competing_slots", NullValueHandling = NullValueHandling.Ignore)] + public int? CompetingSlots { get; set; } - [Newtonsoft.Json.JsonProperty("min_circuits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public int? Min_Circuits { get; set; } + [JsonProperty("min_circuits", NullValueHandling = NullValueHandling.Ignore)] + public int? MinCircuits { get; set; } - [Newtonsoft.Json.JsonProperty("max_circuits", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public int? Max_Circuits { get; set; } + [JsonProperty("max_circuits", NullValueHandling = NullValueHandling.Ignore)] + public int? MaxCircuits { get; set; } - [Newtonsoft.Json.JsonProperty("testnet", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Testnet { get; set; } + [JsonProperty("testnet", NullValueHandling = NullValueHandling.Ignore)] + public bool? TestNet { get; set; } } - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Dht + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class Dht { - [Newtonsoft.Json.JsonProperty("enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] public bool? Enabled { get; set; } + } + + + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public class DownloadDefaults + { + [JsonProperty("anonymity_enabled", NullValueHandling = NullValueHandling.Ignore)] + public bool? AnonymityEnabled { get; set; } + + [JsonProperty("number_hops", NullValueHandling = NullValueHandling.Ignore)] + public int? NumberHops { get; set; } + + [JsonProperty("safeseeding_enabled", NullValueHandling = NullValueHandling.Ignore)] + public bool? SafeSeedingEnabled { get; set; } + + [JsonProperty("saveas", NullValueHandling = NullValueHandling.Ignore)] + public string SaveAS { get; set; } + + [JsonProperty("seeding_mode", NullValueHandling = NullValueHandling.Ignore)] + [JsonConverter(typeof(StringEnumConverter))] + public DownloadDefaultsSeedingMode? SeedingMode { get; set; } + + [JsonProperty("seeding_ratio", NullValueHandling = NullValueHandling.Ignore)] + public double? SeedingRatio { get; set; } + + [JsonProperty("seeding_time", NullValueHandling = NullValueHandling.Ignore)] + public double? SeedingTime { get; set; } } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Download_defaults + [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] + public enum DownloadDefaultsSeedingMode { - [Newtonsoft.Json.JsonProperty("anonymity_enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Anonymity_enabled { get; set; } - - [Newtonsoft.Json.JsonProperty("number_hops", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public int? Number_hops { get; set; } - - [Newtonsoft.Json.JsonProperty("safeseeding_enabled", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public bool? Safeseeding_enabled { get; set; } - - [Newtonsoft.Json.JsonProperty("saveas", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public string Saveas { get; set; } - - [Newtonsoft.Json.JsonProperty("seeding_mode", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public Download_defaultsSeeding_mode? Seeding_mode { get; set; } - - /// Seeding ratio download/upload - [Newtonsoft.Json.JsonProperty("seeding_ratio", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public double? Seeding_ratio { get; set; } - - /// Seeding time in seconds - [Newtonsoft.Json.JsonProperty("seeding_time", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public double? Seeding_time { get; set; } - - - } - - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public enum Download_defaultsSeeding_mode - { - [System.Runtime.Serialization.EnumMember(Value = @"ratio")] + [EnumMember(Value = @"ratio")] Ratio = 0, - [System.Runtime.Serialization.EnumMember(Value = @"forever")] + [EnumMember(Value = @"forever")] Forever = 1, - [System.Runtime.Serialization.EnumMember(Value = @"time")] + [EnumMember(Value = @"time")] Time = 2, - [System.Runtime.Serialization.EnumMember(Value = @"never")] + [EnumMember(Value = @"never")] Never = 3, } diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs index df3608639..fe8e54241 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs @@ -127,22 +127,22 @@ namespace NzbDrone.Core.Download.Clients.Tribler switch (download.Status) { - case DownloadStatus.HASHCHECKING: - case DownloadStatus.WAITING4HASHCHECK: - case DownloadStatus.CIRCUITS: - case DownloadStatus.EXIT_NODES: - case DownloadStatus.DOWNLOADING: + case DownloadStatus.Hashchecking: + case DownloadStatus.Waiting4HashCheck: + case DownloadStatus.Circuits: + case DownloadStatus.Exitnodes: + case DownloadStatus.Downloading: item.Status = DownloadItemStatus.Downloading; break; - case DownloadStatus.METADATA: - case DownloadStatus.ALLOCATING_DISKSPACE: + case DownloadStatus.Metadata: + case DownloadStatus.AllocatingDiskspace: item.Status = DownloadItemStatus.Queued; break; - case DownloadStatus.SEEDING: - case DownloadStatus.STOPPED: + case DownloadStatus.Seeding: + case DownloadStatus.Stopped: item.Status = DownloadItemStatus.Completed; break; - case DownloadStatus.STOPPED_ON_ERROR: + case DownloadStatus.StoppedOnError: item.Status = DownloadItemStatus.Failed; break; default: // new status in API? default to downloading @@ -153,7 +153,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler } // override status' if completed but progress is not finished - if (download.Status == DownloadStatus.STOPPED && download.Progress < 1) + if (download.Status == DownloadStatus.Stopped && download.Progress < 1) { item.Status = DownloadItemStatus.Paused; } @@ -184,7 +184,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler public override DownloadClientInfo GetStatus() { var config = _proxy.GetConfig(Settings); - var destDir = config.Settings.Download_defaults.Saveas; + var destDir = config.Settings.DownloadDefaults.SaveAS; if (Settings.TvCategory.IsNotNullOrWhiteSpace()) { @@ -214,30 +214,30 @@ namespace NzbDrone.Core.Download.Clients.Tribler } // if download is still running then it's not finished. - if (torrent.Status != DownloadStatus.STOPPED) + if (torrent.Status != DownloadStatus.Stopped) { return false; } - switch (config.Settings.Download_defaults.Seeding_mode) + switch (config.Settings.DownloadDefaults.SeedingMode) { // if in ratio mode, wait for ratio to become larger than expeced. Tribler's DownloadStatus will switch from SEEDING to STOPPED - case Download_defaultsSeeding_mode.Ratio: + case DownloadDefaultsSeedingMode.Ratio: return torrent.Ratio.HasValue - && torrent.Ratio >= config.Settings.Download_defaults.Seeding_ratio; + && torrent.Ratio >= config.Settings.DownloadDefaults.SeedingRatio; - case Download_defaultsSeeding_mode.Time: - var downloadStarted = DateTimeOffset.FromUnixTimeSeconds(torrent.Time_added.Value); - var maxSeedingTime = TimeSpan.FromSeconds(config.Settings.Download_defaults.Seeding_time ?? 0); + case DownloadDefaultsSeedingMode.Time: + var downloadStarted = DateTimeOffset.FromUnixTimeSeconds(torrent.TimeAdded.Value); + var maxSeedingTime = TimeSpan.FromSeconds(config.Settings.DownloadDefaults.SeedingTime ?? 0); - return torrent.Time_added.HasValue + return torrent.TimeAdded.HasValue && downloadStarted.Add(maxSeedingTime) < DateTimeOffset.Now; - case Download_defaultsSeeding_mode.Never: + case DownloadDefaultsSeedingMode.Never: return true; - case Download_defaultsSeeding_mode.Forever: + case DownloadDefaultsSeedingMode.Forever: default: return false; } @@ -249,8 +249,8 @@ namespace NzbDrone.Core.Download.Clients.Tribler { Destination = GetDownloadDirectory(), Uri = magnetLink, - Safe_seeding = Settings.SafeSeeding, - Anon_hops = Settings.AnonymityLevel + SafeSeeding = Settings.SafeSeeding, + AnonymityHops = Settings.AnonymityLevel }; return _proxy.AddFromMagnetLink(Settings, addDownloadRequestObject); @@ -286,7 +286,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler } var config = _proxy.GetConfig(Settings); - var destDir = config.Settings.Download_defaults.Saveas; + var destDir = config.Settings.DownloadDefaults.SaveAS; return $"{destDir.TrimEnd('/')}/{Settings.TvCategory}"; } diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs index c77c4da70..d141dc2f2 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs @@ -105,7 +105,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler { var deleteDownloadRequestObject = new RemoveDownloadRequest { - Remove_data = deleteData + RemoveData = deleteData }; var deleteRequestBuilder = getRequestBuilder(settings, "downloads/" + item.DownloadId.ToLower()); @@ -124,7 +124,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler var addDownloadRequestBuilder = getRequestBuilder(settings, "downloads"); addDownloadRequestBuilder.Method = System.Net.Http.HttpMethod.Put; - // manually set content of delete request. + // manually set content of download request. var addDownloadRequest = addDownloadRequestBuilder.Build(); addDownloadRequest.SetContent(Json.ToJson(downloadRequest)); diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs index fc12d9f9c..7bfea43e4 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs @@ -48,25 +48,28 @@ namespace NzbDrone.Core.Download.Clients.Tribler [FieldDefinition(2, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(3, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to Tribler")] + [FieldDefinition(3, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] public bool UseSsl { get; set; } - [FieldDefinition(4, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the tribler url, eg http://[host]:[port]/[urlBase], defaults to ''")] + [FieldDefinition(4, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "clientName", "Tribler")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]")] + public string UrlBase { get; set; } - [FieldDefinition(5, Label = "ApiKey", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey, HelpText = "Api key, found in %APPDATA%\\Roaming\\.Tribler\\7.10\\triblerd.conf, the api key is [api].key, NOT [http_api].key")] + [FieldDefinition(5, Label = "ApiKey", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey, HelpText = "DownloadClientTriblerSettingsApiKeyHelpText")] public string ApiKey { get; set; } - [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Sonarr avoids conflicts with unrelated downloads, but it's optional. Creates a [category] subdirectory in the output directory.")] + [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsCategoryHelpText")] public string TvCategory { get; set; } - [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Transmission location")] + [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientTriblerSettingsDirectoryHelpText")] public string TvDirectory { get; set; } - [FieldDefinition(8, Label = "AnonymityLevel", Type = FieldType.Number, HelpText = "Number of proxies to use when downloading content. To disable set to 0. Proxies reduce download/upload speed. See https://www.tribler.org/anonymity.html")] + [FieldDefinition(8, Label = "DownloadClientTriblerSettingsAnonymityLevel", Type = FieldType.Number, HelpText = "DownloadClientTriblerSettingsAnonymityLevelHelpText")] public int AnonymityLevel { get; set; } - [FieldDefinition(9, Label = "SafeSeeding", Type = FieldType.Checkbox, HelpText = "If seeding only should be done through proxies. The Anonymity level defines the number of proxies used. See https://www.tribler.org/anonymity.html")] + [FieldDefinition(9, Label = "DownloadClientTriblerSettingsSafeSeeding", Type = FieldType.Checkbox, HelpText = "DownloadClientTriblerSettingsSafeSeedingHelpText")] public bool SafeSeeding { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 8d7d90087..ec953721c 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -534,6 +534,12 @@ "DownloadClientStatusSingleClientHealthCheckMessage": "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}'", + "DownloadClientTriblerSettingsAnonymityLevel": "Anonymity level", + "DownloadClientTriblerSettingsAnonymityLevelHelpText": "Number of proxies to use when downloading content. To disable set to 0. Proxies reduce download/upload speed. See https://www.tribler.org/anonymity.html", + "DownloadClientTriblerSettingsApiKeyHelpText": "Api key, found in %APPDATA%\\Roaming\\.Tribler\\7.14\\triblerd.conf, the api key is [api].key, NOT [http_api].key", + "DownloadClientTriblerSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Tribler location", + "DownloadClientTriblerSettingsSafeSeeding": "Safe Seeding", + "DownloadClientTriblerSettingsSafeSeedingHelpText": "If seeding only should be done through proxies. The Anonymity level defines the number of proxies used. See https://www.tribler.org/anonymity.html", "DownloadClientUTorrentTorrentStateError": "uTorrent is reporting an error", "DownloadClientValidationApiKeyIncorrect": "API Key Incorrect", "DownloadClientValidationApiKeyRequired": "API Key Required", From 9e0d39b2473847f170ad781775afcb68f6fa511c Mon Sep 17 00:00:00 2001 From: Jesper Utoft Date: Mon, 12 Aug 2024 20:44:59 +0200 Subject: [PATCH 3/4] Remove GeneratedCode annotations. --- .../Tribler/Models/TriblerDownloadClientApi.cs | 16 ---------------- .../Tribler/Models/TriblerSettingsApi.cs | 17 ----------------- .../Tribler/TriblerDownloadClientProxy.cs | 2 +- 3 files changed, 1 insertion(+), 34 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs index 272c2122b..be336754a 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerDownloadClientApi.cs @@ -1,4 +1,3 @@ -using System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; @@ -7,7 +6,6 @@ using Newtonsoft.Json.Converters; namespace NzbDrone.Core.Download.Clients.Tribler { - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum DownloadStatus { [EnumMember(Value = @"WAITING4HASHCHECK")] @@ -39,10 +37,8 @@ namespace NzbDrone.Core.Download.Clients.Tribler [EnumMember(Value = @"STOPPED_ON_ERROR")] StoppedOnError = 9, - } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class Trackers { [JsonProperty("url", NullValueHandling = NullValueHandling.Ignore)] @@ -53,11 +49,8 @@ namespace NzbDrone.Core.Download.Clients.Tribler [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)] public string Status { get; set; } - - } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class Download { [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)] @@ -152,14 +145,12 @@ namespace NzbDrone.Core.Download.Clients.Tribler public bool? ChannelDownload { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class DownloadsResponse { [JsonProperty("downloads", NullValueHandling = NullValueHandling.Ignore)] public ICollection Downloads { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class AddDownloadRequest { [JsonProperty("anon_hops", NullValueHandling = NullValueHandling.Ignore)] @@ -176,7 +167,6 @@ namespace NzbDrone.Core.Download.Clients.Tribler public string Uri { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class AddDownloadResponse { [JsonProperty("infohash", NullValueHandling = NullValueHandling.Ignore)] @@ -186,14 +176,12 @@ namespace NzbDrone.Core.Download.Clients.Tribler public bool? Started { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class RemoveDownloadRequest { [JsonProperty("remove_data", NullValueHandling = NullValueHandling.Ignore)] public bool? RemoveData { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class DeleteDownloadResponse { [JsonProperty("removed", NullValueHandling = NullValueHandling.Ignore)] @@ -203,7 +191,6 @@ namespace NzbDrone.Core.Download.Clients.Tribler public string Infohash { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class UpdateDownloadRequest { [JsonProperty("anon_hops", NullValueHandling = NullValueHandling.Ignore)] @@ -216,7 +203,6 @@ namespace NzbDrone.Core.Download.Clients.Tribler public string State { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class UpdateDownloadResponse { [JsonProperty("modified", NullValueHandling = NullValueHandling.Ignore)] @@ -226,7 +212,6 @@ namespace NzbDrone.Core.Download.Clients.Tribler public string Infohash { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class File { [JsonProperty("size", NullValueHandling = NullValueHandling.Ignore)] @@ -245,7 +230,6 @@ namespace NzbDrone.Core.Download.Clients.Tribler public bool? Included { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class GetFilesResponse { [JsonProperty("files", NullValueHandling = NullValueHandling.Ignore)] diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs index fce9d936e..ca51d6cd4 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/Models/TriblerSettingsApi.cs @@ -1,19 +1,15 @@ -using System.CodeDom.Compiler; using System.Runtime.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; namespace NzbDrone.Core.Indexers.Tribler { - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class GetTriblerSettingsResponse { [JsonProperty("settings", NullValueHandling = NullValueHandling.Ignore)] public Settings Settings { get; set; } } - - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class Settings { [JsonProperty("general", NullValueHandling = NullValueHandling.Ignore)] @@ -27,11 +23,8 @@ namespace NzbDrone.Core.Indexers.Tribler [JsonProperty("download_defaults", NullValueHandling = NullValueHandling.Ignore)] public DownloadDefaults DownloadDefaults { get; set; } - - } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class General { [JsonProperty("log_dir", NullValueHandling = NullValueHandling.Ignore)] @@ -47,8 +40,6 @@ namespace NzbDrone.Core.Indexers.Tribler public bool? TestNet { get; set; } } - - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class TunnelCommunity { [JsonProperty("exitnode_enabled", NullValueHandling = NullValueHandling.Ignore)] @@ -73,16 +64,12 @@ namespace NzbDrone.Core.Indexers.Tribler public bool? TestNet { get; set; } } - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class Dht { [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] public bool? Enabled { get; set; } - } - - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public class DownloadDefaults { [JsonProperty("anonymity_enabled", NullValueHandling = NullValueHandling.Ignore)] @@ -106,11 +93,8 @@ namespace NzbDrone.Core.Indexers.Tribler [JsonProperty("seeding_time", NullValueHandling = NullValueHandling.Ignore)] public double? SeedingTime { get; set; } - } - - [GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum DownloadDefaultsSeedingMode { [EnumMember(Value = @"ratio")] @@ -124,6 +108,5 @@ namespace NzbDrone.Core.Indexers.Tribler [EnumMember(Value = @"never")] Never = 3, - } } diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs index d141dc2f2..5e8f37d5c 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClientProxy.cs @@ -120,7 +120,6 @@ namespace NzbDrone.Core.Download.Clients.Tribler public string AddFromMagnetLink(TriblerDownloadSettings settings, AddDownloadRequest downloadRequest) { - // run hash through InfoHash class to ensure the correct casing. var addDownloadRequestBuilder = getRequestBuilder(settings, "downloads"); addDownloadRequestBuilder.Method = System.Net.Http.HttpMethod.Put; @@ -130,6 +129,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler var infoHashAsString = ProcessRequest(addDownloadRequest).Infohash; + // run hash through InfoHash class to ensure the correct casing. var infoHash = MonoTorrent.InfoHash.FromHex(infoHashAsString); return infoHash.ToHex(); } From d646af2f884461c6263931bbe41d6a64c4ecc0ae Mon Sep 17 00:00:00 2001 From: Jesper Utoft Date: Tue, 13 Aug 2024 19:44:23 +0200 Subject: [PATCH 4/4] Fix translations for Tribler. --- .../Download/Clients/Tribler/TriblerDownloadClient.cs | 9 +++------ .../Download/Clients/Tribler/TriblerDownloadSettings.cs | 3 ++- src/NzbDrone.Core/Localization/Core/en.json | 6 +++--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs index fe8e54241..5ecdc4b49 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadClient.cs @@ -302,16 +302,13 @@ namespace NzbDrone.Core.Download.Clients.Tribler { _logger.Error(ex, ex.Message); - return new NzbDroneValidationFailure("ApiKey", "Authentication failure") - { - DetailedDescription = string.Format("Please verify your ApiKey is correct. Also verify if the host running Sonarr isn't blocked from accessing {0} by WhiteList limitations in the {0} configuration.", Name) - }; + return new ValidationFailure("APIKey", _localizationService.GetLocalizedString("DownloadClientValidationApiKeyIncorrect")); } catch (DownloadClientUnavailableException ex) { _logger.Error(ex, ex.Message); - return new NzbDroneValidationFailure("Url", "Unable to connect to Tribler") + return new NzbDroneValidationFailure("Host", _localizationService.GetLocalizedString("DownloadClientValidationUnableToConnect", new Dictionary { { "clientName", Name } })) { DetailedDescription = ex.Message }; @@ -320,7 +317,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler { _logger.Error(ex, "Failed to test"); - return new NzbDroneValidationFailure(string.Empty, "Unknown exception: " + ex.Message); + return new NzbDroneValidationFailure(string.Empty, _localizationService.GetLocalizedString("DownloadClientValidationUnknownException", new Dictionary { { "exception", ex.Message } })); } } } diff --git a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs index 7bfea43e4..cb9405112 100644 --- a/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Tribler/TriblerDownloadSettings.cs @@ -24,7 +24,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler .When(c => c.TvDirectory.IsNotNullOrWhiteSpace()) .WithMessage("Cannot use Category and Directory"); - RuleFor(c => c.AnonymityLevel).GreaterThanOrEqualTo(0).WithMessage("Should be greater than or equal to zero"); + RuleFor(c => c.AnonymityLevel).GreaterThanOrEqualTo(0); } } @@ -67,6 +67,7 @@ namespace NzbDrone.Core.Download.Clients.Tribler public string TvDirectory { get; set; } [FieldDefinition(8, Label = "DownloadClientTriblerSettingsAnonymityLevel", Type = FieldType.Number, HelpText = "DownloadClientTriblerSettingsAnonymityLevelHelpText")] + [FieldToken(TokenField.HelpText, "DownloadClientTriblerSettingsAnonymityLevel", "url", "https://www.tribler.org/anonymity.html")] public int AnonymityLevel { get; set; } [FieldDefinition(9, Label = "DownloadClientTriblerSettingsSafeSeeding", Type = FieldType.Checkbox, HelpText = "DownloadClientTriblerSettingsSafeSeedingHelpText")] diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index ec953721c..60bce7cc5 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -535,11 +535,11 @@ "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}'", "DownloadClientTriblerSettingsAnonymityLevel": "Anonymity level", - "DownloadClientTriblerSettingsAnonymityLevelHelpText": "Number of proxies to use when downloading content. To disable set to 0. Proxies reduce download/upload speed. See https://www.tribler.org/anonymity.html", - "DownloadClientTriblerSettingsApiKeyHelpText": "Api key, found in %APPDATA%\\Roaming\\.Tribler\\7.14\\triblerd.conf, the api key is [api].key, NOT [http_api].key", + "DownloadClientTriblerSettingsAnonymityLevelHelpText": "Number of proxies to use when downloading content. To disable set to 0. Proxies reduce download/upload speed. See {url}", + "DownloadClientTriblerSettingsApiKeyHelpText": "[api].key from triblerd.conf", "DownloadClientTriblerSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Tribler location", "DownloadClientTriblerSettingsSafeSeeding": "Safe Seeding", - "DownloadClientTriblerSettingsSafeSeedingHelpText": "If seeding only should be done through proxies. The Anonymity level defines the number of proxies used. See https://www.tribler.org/anonymity.html", + "DownloadClientTriblerSettingsSafeSeedingHelpText": "Only Seed through proxies.", "DownloadClientUTorrentTorrentStateError": "uTorrent is reporting an error", "DownloadClientValidationApiKeyIncorrect": "API Key Incorrect", "DownloadClientValidationApiKeyRequired": "API Key Required",