using System; using System.Collections.Generic; using System.Text; using System.Text.Json.Serialization; using NzbDrone.Core.Download.Pending; using NzbDrone.Core.Indexers; using NzbDrone.Core.Languages; namespace NzbDrone.Core.Parser.Model { public class ReleaseInfo { public ReleaseInfo() { Languages = new List(); } public string Guid { get; set; } public string Title { get; set; } public long Size { get; set; } public string DownloadUrl { get; set; } public string InfoUrl { get; set; } public string CommentUrl { get; set; } public int IndexerId { get; set; } public string Indexer { get; set; } public int IndexerPriority { get; set; } public DownloadProtocol DownloadProtocol { get; set; } public int TmdbId { get; set; } public int ImdbId { get; set; } public DateTime PublishDate { get; set; } public string Origin { get; set; } public string Source { get; set; } public string Container { get; set; } public string Codec { get; set; } public string Resolution { get; set; } public List Languages { get; set; } [JsonIgnore] public IndexerFlags IndexerFlags { get; set; } // Used to track pending releases that are being reprocessed [JsonIgnore] public PendingReleaseReason? PendingReleaseReason { get; set; } public int Age { get { return DateTime.UtcNow.Subtract(PublishDate).Days; } // This prevents manually downloading a release from blowing up in mono // TODO: Is there a better way? private set { } } public double AgeHours { get { return DateTime.UtcNow.Subtract(PublishDate).TotalHours; } // This prevents manually downloading a release from blowing up in mono // TODO: Is there a better way? private set { } } public double AgeMinutes { get { return DateTime.UtcNow.Subtract(PublishDate).TotalMinutes; } // This prevents manually downloading a release from blowing up in mono // TODO: Is there a better way? private set { } } public override string ToString() { return string.Format("[{0}] {1} [{2}]", PublishDate, Title, Size); } public virtual string ToString(string format) { switch (format.ToUpperInvariant()) { case "L": // Long format var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Guid: " + Guid ?? "Empty"); stringBuilder.AppendLine("Title: " + Title ?? "Empty"); stringBuilder.AppendLine("Size: " + Size ?? "Empty"); stringBuilder.AppendLine("InfoUrl: " + InfoUrl ?? "Empty"); stringBuilder.AppendLine("DownloadUrl: " + DownloadUrl ?? "Empty"); stringBuilder.AppendLine("Indexer: " + Indexer ?? "Empty"); stringBuilder.AppendLine("CommentUrl: " + CommentUrl ?? "Empty"); stringBuilder.AppendLine("DownloadProtocol: " + DownloadProtocol ?? "Empty"); stringBuilder.AppendLine("TmdbId: " + TmdbId ?? "Empty"); stringBuilder.AppendLine("ImdbId: " + ImdbId ?? "Empty"); stringBuilder.AppendLine("PublishDate: " + PublishDate ?? "Empty"); return stringBuilder.ToString(); default: return ToString(); } } } [Flags] public enum IndexerFlags { G_Freeleech = 1, // General G_Halfleech = 2, // General, only 1/2 of download counted G_DoubleUpload = 4, // General PTP_Golden = 8, // PTP PTP_Approved = 16, // PTP G_Internal = 32, // General, internal [Obsolete] AHD_Internal = 64, // AHD, internal G_Scene = 128, // General, the torrent comes from the "scene" G_Freeleech75 = 256, // Currently only used for AHD, signifies a torrent counts towards 75 percent of your download quota. G_Freeleech25 = 512, // Currently only used for AHD, signifies a torrent counts towards 25 percent of your download quota. [Obsolete] AHD_UserRelease = 1024 // AHD, internal } }