diff --git a/NzbDrone.Common/HttpProvider.cs b/NzbDrone.Common/HttpProvider.cs index 1e818c3eb..f60ee48fd 100644 --- a/NzbDrone.Common/HttpProvider.cs +++ b/NzbDrone.Common/HttpProvider.cs @@ -24,7 +24,7 @@ namespace NzbDrone.Common { private readonly Logger _logger; - public const string CONTENT_LENGHT_HEADER = "Content-Length"; + public const string CONTENT_LENGTH_HEADER = "Content-Length"; private readonly string _userAgent; diff --git a/NzbDrone.Common/IEnumerableExtensions.cs b/NzbDrone.Common/IEnumerableExtensions.cs new file mode 100644 index 000000000..cefa4c26b --- /dev/null +++ b/NzbDrone.Common/IEnumerableExtensions.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace NzbDrone.Common +{ + public static class IEnumerableExtensions + { + public static IEnumerable DistinctBy(this IEnumerable source, Func keySelector) + { + var knownKeys = new HashSet(); + + return source.Where(element => knownKeys.Add(keySelector(element))); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index e6d441aa7..42d7d0903 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -89,6 +89,7 @@ + diff --git a/NzbDrone.Core.Test/MediaCoverTests/CoverExistsSpecificationFixture.cs b/NzbDrone.Core.Test/MediaCoverTests/CoverExistsSpecificationFixture.cs index e2a5b68f4..0667832f4 100644 --- a/NzbDrone.Core.Test/MediaCoverTests/CoverExistsSpecificationFixture.cs +++ b/NzbDrone.Core.Test/MediaCoverTests/CoverExistsSpecificationFixture.cs @@ -48,7 +48,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests public void should_return_false_if_file_exists_but_diffrent_size() { GivenExistingFileSize(100); - _headers.Add(HttpProvider.CONTENT_LENGHT_HEADER, "200"); + _headers.Add(HttpProvider.CONTENT_LENGTH_HEADER, "200"); Subject.AlreadyExists("http://url", "c:\\file.exe").Should().BeFalse(); } @@ -58,7 +58,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests public void should_return_ture_if_file_exists_and_same_size() { GivenExistingFileSize(100); - _headers.Add(HttpProvider.CONTENT_LENGHT_HEADER, "100"); + _headers.Add(HttpProvider.CONTENT_LENGTH_HEADER, "100"); Subject.AlreadyExists("http://url", "c:\\file.exe").Should().BeTrue(); } diff --git a/NzbDrone.Core/DecisionEngine/DownloadDecision.cs b/NzbDrone.Core/DecisionEngine/DownloadDecision.cs index 5536445ee..b3037395c 100644 --- a/NzbDrone.Core/DecisionEngine/DownloadDecision.cs +++ b/NzbDrone.Core/DecisionEngine/DownloadDecision.cs @@ -22,5 +22,16 @@ namespace NzbDrone.Core.DecisionEngine RemoteEpisode = episode; Rejections = rejections.ToList(); } + + + public override string ToString() + { + if (Approved) + { + return "[OK] " + RemoteEpisode; + } + + return "[Rejected " + Rejections.Count() + "]" + RemoteEpisode; + } } } \ No newline at end of file diff --git a/NzbDrone.Core/IndexerSearch/Definitions/PartialSeasonSearchCriteria.cs b/NzbDrone.Core/IndexerSearch/Definitions/PartialSeasonSearchCriteria.cs deleted file mode 100644 index c8c46e922..000000000 --- a/NzbDrone.Core/IndexerSearch/Definitions/PartialSeasonSearchCriteria.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace NzbDrone.Core.IndexerSearch.Definitions -{ - public class PartialSeasonSearchCriteria : SeasonSearchCriteria - { - public int Prefix { get; set; } - - public PartialSeasonSearchCriteria(SeasonSearchCriteria seasonSearch, int prefix) - { - Prefix = prefix; - SceneTitle = seasonSearch.SceneTitle; - SeasonNumber = seasonSearch.SeasonNumber; - } - - public override string ToString() - { - return string.Format("[{0} : S{1:00}E{2:0}*]", SceneTitle, SeasonNumber, Prefix); - } - } -} \ No newline at end of file diff --git a/NzbDrone.Core/Indexers/IIndexer.cs b/NzbDrone.Core/Indexers/IIndexer.cs index ddef6db0f..c8e8e950f 100644 --- a/NzbDrone.Core/Indexers/IIndexer.cs +++ b/NzbDrone.Core/Indexers/IIndexer.cs @@ -19,6 +19,6 @@ namespace NzbDrone.Core.Indexers IEnumerable GetEpisodeSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int episodeNumber); IEnumerable GetDailyEpisodeSearchUrls(string seriesTitle, int tvRageId, DateTime date); - IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber); + IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int offset); } } \ No newline at end of file diff --git a/NzbDrone.Core/Indexers/IndexerBase.cs b/NzbDrone.Core/Indexers/IndexerBase.cs index c75eab2f8..4b2cd9f99 100644 --- a/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/NzbDrone.Core/Indexers/IndexerBase.cs @@ -36,6 +36,6 @@ namespace NzbDrone.Core.Indexers public abstract IEnumerable RecentFeed { get; } public abstract IEnumerable GetEpisodeSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int episodeNumber); public abstract IEnumerable GetDailyEpisodeSearchUrls(string seriesTitle, int tvRageId, DateTime date); - public abstract IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber); + public abstract IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int offset); } } \ No newline at end of file diff --git a/NzbDrone.Core/Indexers/IndexerFetchService.cs b/NzbDrone.Core/Indexers/IndexerFetchService.cs index 097214eb6..6c46032b6 100644 --- a/NzbDrone.Core/Indexers/IndexerFetchService.cs +++ b/NzbDrone.Core/Indexers/IndexerFetchService.cs @@ -5,6 +5,7 @@ using NLog; using NzbDrone.Common; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; +using System.Linq; namespace NzbDrone.Core.Indexers { @@ -14,7 +15,6 @@ namespace NzbDrone.Core.Indexers IList Fetch(IIndexer indexer, SeasonSearchCriteria searchCriteria); IList Fetch(IIndexer indexer, SingleEpisodeSearchCriteria searchCriteria); - IList Fetch(IIndexer indexer, PartialSeasonSearchCriteria searchCriteria); IList Fetch(IIndexer indexer, DailyEpisodeSearchCriteria searchCriteria); } @@ -46,11 +46,29 @@ namespace NzbDrone.Core.Indexers { _logger.Debug("Searching for {0}", searchCriteria); - var searchUrls = indexer.GetSeasonSearchUrls(searchCriteria.QueryTitle, searchCriteria.SeriesTvRageId, searchCriteria.SeasonNumber); + var result = Fetch(indexer, searchCriteria, 0).DistinctBy(c => c.NzbUrl).ToList(); + + _logger.Info("Finished searching {0} on {1}. Found {2}", indexer.Name, searchCriteria, result.Count); + + return result; + } + + + private IList Fetch(IIndexer indexer, SeasonSearchCriteria searchCriteria, int offset) + { + _logger.Debug("Searching for {0} offset: {1}", searchCriteria, offset); + + var searchUrls = indexer.GetSeasonSearchUrls(searchCriteria.QueryTitle, searchCriteria.SeriesTvRageId, searchCriteria.SeasonNumber, offset); var result = Fetch(indexer, searchUrls); - _logger.Info("Finished searching {0} on {1}. Found {2}", indexer.Name, searchCriteria, result.Count); + _logger.Info("{0} offset {1}. Found {2}", indexer.Name, searchCriteria, result.Count); + + if (result.Count > 90) + { + result.AddRange(Fetch(indexer, searchCriteria, offset + 90)); + } + return result; } @@ -67,17 +85,6 @@ namespace NzbDrone.Core.Indexers } - public IList Fetch(IIndexer indexer, PartialSeasonSearchCriteria searchCriteria) - { - _logger.Debug("Searching for {0}", searchCriteria); - - var searchUrls = indexer.GetSeasonSearchUrls(searchCriteria.QueryTitle, searchCriteria.SeriesTvRageId, searchCriteria.SeasonNumber); - var result = Fetch(indexer, searchUrls); - - - _logger.Info("Finished searching {0} on {1}. Found {2}", indexer.Name, searchCriteria, result.Count); - return result; - } public IList Fetch(IIndexer indexer, DailyEpisodeSearchCriteria searchCriteria) { diff --git a/NzbDrone.Core/Indexers/Newznab/Newznab.cs b/NzbDrone.Core/Indexers/Newznab/Newznab.cs index d9ebcfbbb..51c49e26d 100644 --- a/NzbDrone.Core/Indexers/Newznab/Newznab.cs +++ b/NzbDrone.Core/Indexers/Newznab/Newznab.cs @@ -104,16 +104,17 @@ namespace NzbDrone.Core.Indexers.Newznab return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2:yyyy}&ep={2:MM/dd}", url, NewsnabifyTitle(seriesTitle), date)).ToList(); } - public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber) + public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int offset) { if (tvRageId > 0) { - return RecentFeed.Select(url => String.Format("{0}&limit=100&rid={1}&season={2}", url, tvRageId, seasonNumber)); + return RecentFeed.Select(url => String.Format("{0}&limit=100&rid={1}&season={2}&offset={3}", url, tvRageId, seasonNumber, offset)); } - return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2}", url, NewsnabifyTitle(seriesTitle), seasonNumber)); + return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2}&offset={3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, offset)); } + public override string Name { get diff --git a/NzbDrone.Core/Indexers/NzbClub/NzbClub.cs b/NzbDrone.Core/Indexers/NzbClub/NzbClub.cs index b070ccad6..cb2bc8a5f 100644 --- a/NzbDrone.Core/Indexers/NzbClub/NzbClub.cs +++ b/NzbDrone.Core/Indexers/NzbClub/NzbClub.cs @@ -47,7 +47,7 @@ namespace NzbDrone.Core.Indexers.NzbClub return searchUrls; } - public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber) + public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int offset) { var searchUrls = new List(); diff --git a/NzbDrone.Core/Indexers/Omgwtfnzbs/Omgwtfnzbs.cs b/NzbDrone.Core/Indexers/Omgwtfnzbs/Omgwtfnzbs.cs index dfdaf8c01..ebc2cf251 100644 --- a/NzbDrone.Core/Indexers/Omgwtfnzbs/Omgwtfnzbs.cs +++ b/NzbDrone.Core/Indexers/Omgwtfnzbs/Omgwtfnzbs.cs @@ -52,7 +52,7 @@ namespace NzbDrone.Core.Indexers.Omgwtfnzbs return searchUrls; } - public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber) + public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int offset) { var searchUrls = new List(); diff --git a/NzbDrone.Core/Indexers/Wombles/Wombles.cs b/NzbDrone.Core/Indexers/Wombles/Wombles.cs index eda0b9e75..adff820ec 100644 --- a/NzbDrone.Core/Indexers/Wombles/Wombles.cs +++ b/NzbDrone.Core/Indexers/Wombles/Wombles.cs @@ -28,7 +28,7 @@ namespace NzbDrone.Core.Indexers.Wombles return new List(); } - public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber) + public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int offset) { return new List(); } diff --git a/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs b/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs index e81ce068f..5ab40e2f2 100644 --- a/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs +++ b/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs @@ -33,7 +33,7 @@ namespace NzbDrone.Core.MediaCover string sizeString; - if (headers.TryGetValue(HttpProvider.CONTENT_LENGHT_HEADER, out sizeString)) + if (headers.TryGetValue(HttpProvider.CONTENT_LENGTH_HEADER, out sizeString)) { int size; int.TryParse(sizeString, out size); diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 25b97bc3e..bc4e017d5 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -249,7 +249,6 @@ -