using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Indexers; using NzbDrone.Core.Languages; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Qualities; using Radarr.Http.REST; namespace NzbDrone.Api.Indexers { public class ReleaseResource : RestResource { public string Guid { get; set; } public QualityModel Quality { get; set; } public int QualityWeight { get; set; } public int Age { get; set; } public double AgeHours { get; set; } public double AgeMinutes { get; set; } public long Size { get; set; } public int IndexerId { get; set; } public string Indexer { get; set; } public string ReleaseGroup { get; set; } public string ReleaseHash { get; set; } public string Edition { get; set; } public string Title { get; set; } public bool FullSeason { get; set; } public int SeasonNumber { get; set; } public List Languages { get; set; } public int Year { get; set; } public string MovieTitle { get; set; } public int[] EpisodeNumbers { get; set; } public int[] AbsoluteEpisodeNumbers { get; set; } public bool Approved { get; set; } public bool TemporarilyRejected { get; set; } public bool Rejected { get; set; } public int TvdbId { get; set; } public int TvRageId { get; set; } public IEnumerable Rejections { get; set; } public DateTime PublishDate { get; set; } public string CommentUrl { get; set; } public string DownloadUrl { get; set; } public string InfoUrl { get; set; } public MappingResultType MappingResult { get; set; } public int ReleaseWeight { get; set; } public int SuspectedMovieId { get; set; } public IEnumerable IndexerFlags { get; set; } public string MagnetUrl { get; set; } public string InfoHash { get; set; } public int? Seeders { get; set; } public int? Leechers { get; set; } public DownloadProtocol Protocol { get; set; } // TODO: Remove in v3 // Used to support the original Release Push implementation // JsonIgnore so we don't serialize it, but can still parse it [JsonIgnore] public DownloadProtocol DownloadProtocol { get { return Protocol; } set { if (value > 0 && Protocol == 0) { Protocol = value; } } } public bool IsDaily { get; set; } public bool IsAbsoluteNumbering { get; set; } public bool IsPossibleSpecialEpisode { get; set; } public bool Special { get; set; } } public static class ReleaseResourceMapper { public static ReleaseResource ToResource(this DownloadDecision model) { var releaseInfo = model.RemoteMovie.Release; var remoteMovie = model.RemoteMovie; var torrentInfo = (model.RemoteMovie.Release as TorrentInfo) ?? new TorrentInfo(); var mappingResult = MappingResultType.Success; mappingResult = model.RemoteMovie.MappingResult; var parsedMovieInfo = model.RemoteMovie.ParsedMovieInfo; var movieId = model.RemoteMovie.Movie?.Id ?? 0; //Why not pull this out in frontend instead of passing another variable return new ReleaseResource { Guid = releaseInfo.Guid, Quality = parsedMovieInfo.Quality, QualityWeight = parsedMovieInfo.Quality.Quality.Id, //Id kinda hacky for wheight, but what you gonna do? TODO: Fix this shit! Age = releaseInfo.Age, AgeHours = releaseInfo.AgeHours, AgeMinutes = releaseInfo.AgeMinutes, Size = releaseInfo.Size, IndexerId = releaseInfo.IndexerId, Indexer = releaseInfo.Indexer, ReleaseGroup = parsedMovieInfo.ReleaseGroup, ReleaseHash = parsedMovieInfo.ReleaseHash, Title = releaseInfo.Title, Languages = parsedMovieInfo.Languages, Year = parsedMovieInfo.Year, MovieTitle = parsedMovieInfo.MovieTitle, Approved = model.Approved, TemporarilyRejected = model.TemporarilyRejected, Rejected = model.Rejected, TvdbId = releaseInfo.TvdbId, TvRageId = releaseInfo.TvRageId, Rejections = model.Rejections.Select(r => r.Reason).ToList(), PublishDate = releaseInfo.PublishDate, CommentUrl = releaseInfo.CommentUrl, DownloadUrl = releaseInfo.DownloadUrl, InfoUrl = releaseInfo.InfoUrl, MappingResult = mappingResult, //ReleaseWeight SuspectedMovieId = movieId, MagnetUrl = torrentInfo.MagnetUrl, InfoHash = torrentInfo.InfoHash, Seeders = torrentInfo.Seeders, Leechers = (torrentInfo.Peers.HasValue && torrentInfo.Seeders.HasValue) ? (torrentInfo.Peers.Value - torrentInfo.Seeders.Value) : (int?)null, Protocol = releaseInfo.DownloadProtocol, IndexerFlags = torrentInfo.IndexerFlags.ToString().Split(new string[] { ", " }, StringSplitOptions.None), Edition = parsedMovieInfo.Edition, //Special = parsedMovieInfo.Special, }; } public static ReleaseInfo ToModel(this ReleaseResource resource) { ReleaseInfo model; if (resource.Protocol == DownloadProtocol.Torrent) { model = new TorrentInfo { MagnetUrl = resource.MagnetUrl, InfoHash = resource.InfoHash, Seeders = resource.Seeders, Peers = (resource.Seeders.HasValue && resource.Leechers.HasValue) ? (resource.Seeders + resource.Leechers) : null }; } else { model = new ReleaseInfo(); } model.Guid = resource.Guid; model.Title = resource.Title; model.Size = resource.Size; model.DownloadUrl = resource.DownloadUrl; model.InfoUrl = resource.InfoUrl; model.CommentUrl = resource.CommentUrl; model.IndexerId = resource.IndexerId; model.Indexer = resource.Indexer; model.DownloadProtocol = resource.DownloadProtocol; model.TvdbId = resource.TvdbId; model.TvRageId = resource.TvRageId; model.PublishDate = resource.PublishDate; return model; } } }