public List <DownloadDecision> PrioritizeDecisions(List <DownloadDecision> decisions) { return(decisions.Where(c => c.RemoteEpisode.Series != null) .GroupBy(c => c.RemoteEpisode.Series.Id, (seriesId, d) => { var downloadDecisions = d.ToList(); var series = downloadDecisions.First().RemoteEpisode.Series; return downloadDecisions .OrderByDescending(c => c.RemoteEpisode.ParsedEpisodeInfo.Quality, new QualityModelComparer(series.Profile)) .ThenBy(c => c.RemoteEpisode.Episodes.Select(e => e.EpisodeNumber).MinOrDefault()) .ThenBy(c => PrioritizeDownloadProtocol(series, c.RemoteEpisode.Release.DownloadProtocol)) .ThenBy(c => c.RemoteEpisode.Release.Size.Round(200.Megabytes()) / Math.Max(1, c.RemoteEpisode.Episodes.Count)) .ThenByDescending(c => TorrentInfo.GetSeeders(c.RemoteEpisode.Release)) .ThenBy(c => c.RemoteEpisode.Release.Age); }) .SelectMany(c => c) .Union(decisions.Where(c => c.RemoteEpisode.Series == null)) .ToList()); }
private int ComparePeersIfTorrent(DownloadDecision x, DownloadDecision y) { // Different protocols should get caught when checking the preferred protocol, // since we're dealing with the same series in our comparisions if (x.RemoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent || y.RemoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent) { return(0); } return(CompareAll( CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => { var seeders = TorrentInfo.GetSeeders(remoteEpisode.Release); return seeders.HasValue && seeders.Value > 0 ? Math.Round(Math.Log10(seeders.Value)) : 0; }), CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => { var peers = TorrentInfo.GetPeers(remoteEpisode.Release); return peers.HasValue && peers.Value > 0 ? Math.Round(Math.Log10(peers.Value)) : 0; }))); }