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;
            })));
        }