using System; using Newtonsoft.Json; namespace NzbDrone.Core.Download.Clients.UTorrent { [JsonConverter(typeof(UTorrentTorrentJsonConverter))] public class UTorrentTorrent { public string Hash { get; set; } public UTorrentTorrentStatus Status { get; set; } public string Name { get; set; } public long Size { get; set; } public double Progress { get; set; } public long Downloaded { get; set; } public long Uploaded { get; set; } public double Ratio { get; set; } public int UploadSpeed { get; set; } public int DownloadSpeed { get; set; } public int Eta { get; set; } public string Label { get; set; } public int PeersConnected { get; set; } public int PeersInSwarm { get; set; } public int SeedsConnected { get; set; } public int SeedsInSwarm { get; set; } public double Availablity { get; set; } public int TorrentQueueOrder { get; set; } public long Remaining { get; set; } public string DownloadUrl { get; set; } public object RssFeedUrl { get; set; } public object StatusMessage { get; set; } public object StreamId { get; set; } public object DateAdded { get; set; } public object DateCompleted { get; set; } public object AppUpdateUrl { get; set; } public string RootDownloadPath { get; set; } public object Unknown27 { get; set; } public object Unknown28 { get; set; } } internal class UTorrentTorrentJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(UTorrentTorrent); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var result = new UTorrentTorrent(); result.Hash = reader.ReadAsString(); result.Status = (UTorrentTorrentStatus)reader.ReadAsInt32(); result.Name = reader.ReadAsString(); reader.Read(); result.Size = (long)reader.Value; result.Progress = (int)reader.ReadAsInt32() / 1000.0; reader.Read(); result.Downloaded = (long)reader.Value; reader.Read(); result.Uploaded = (long)reader.Value; result.Ratio = (int)reader.ReadAsInt32() / 1000.0; result.UploadSpeed = (int)reader.ReadAsInt32(); result.DownloadSpeed = (int)reader.ReadAsInt32(); result.Eta = (int)reader.ReadAsInt32(); result.Label = reader.ReadAsString(); result.PeersConnected = (int)reader.ReadAsInt32(); result.PeersInSwarm = (int)reader.ReadAsInt32(); result.SeedsConnected = (int)reader.ReadAsInt32(); result.SeedsInSwarm = (int)reader.ReadAsInt32(); result.Availablity = (int)reader.ReadAsInt32() / 65536.0; result.TorrentQueueOrder = (int)reader.ReadAsInt32(); reader.Read(); result.Remaining = (long)reader.Value; reader.Read(); // Builds before 25406 don't return the remaining items. if (reader.TokenType != JsonToken.EndArray) { result.DownloadUrl = (string)reader.Value; reader.Read(); result.RssFeedUrl = reader.Value; reader.Read(); result.StatusMessage = reader.Value; reader.Read(); result.StreamId = reader.Value; reader.Read(); result.DateAdded = reader.Value; reader.Read(); result.DateCompleted = reader.Value; reader.Read(); result.AppUpdateUrl = reader.Value; result.RootDownloadPath = reader.ReadAsString(); reader.Read(); result.Unknown27 = reader.Value; reader.Read(); result.Unknown28 = reader.Value; while (reader.TokenType != JsonToken.EndArray) { reader.Read(); } } return result; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotSupportedException(); } } }