diff --git a/src/.idea/.idea.NzbDrone/.idea/vcs.xml b/src/.idea/.idea.NzbDrone/.idea/vcs.xml
new file mode 100644
index 000000000..ea6ca8297
--- /dev/null
+++ b/src/.idea/.idea.NzbDrone/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs
index d193dbea9..9251ffc6e 100644
--- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs
+++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs
@@ -298,7 +298,8 @@ namespace NzbDrone.Core.Indexers
if (releases.Empty())
{
- return new ValidationFailure(string.Empty, "No results were returned from your indexer, please check your settings.");
+ return new ValidationFailure(string.Empty,
+ "No results were returned from your indexer, please check your settings.");
}
}
catch (ApiKeyException)
@@ -319,7 +320,8 @@ namespace NzbDrone.Core.Indexers
}
else
{
- return new ValidationFailure("CaptchaToken", "Site protected by CloudFlare CAPTCHA. Valid CAPTCHA token required.");
+ return new ValidationFailure("CaptchaToken",
+ "Site protected by CloudFlare CAPTCHA. Valid CAPTCHA token required.");
}
}
catch (UnsupportedFeedException ex)
@@ -334,6 +336,21 @@ namespace NzbDrone.Core.Indexers
return new ValidationFailure(string.Empty, "Unable to connect to indexer. " + ex.Message);
}
+ catch (HttpException ex)
+ {
+ if (ex.Response.StatusCode == HttpStatusCode.BadRequest &&
+ ex.Response.Content.Contains("not support the requested query"))
+ {
+ _logger.Warn(ex, "Indexer does not support the query");
+ return new ValidationFailure(string.Empty, "Indexer does not support the current query. Check if the categories and or searching for movies are supported. Check the log for more details.");
+ }
+ else
+ {
+ _logger.Warn(ex, "Unable to connect to indexer");
+
+ return new ValidationFailure(string.Empty, "Unable to connect to indexer, check the log for more details");
+ }
+ }
catch (Exception ex)
{
_logger.Warn(ex, "Unable to connect to indexer");
diff --git a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs
index f0ed6a7f8..573d51937 100644
--- a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs
+++ b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs
@@ -93,25 +93,44 @@ namespace NzbDrone.Core.Indexers.Newznab
failures.AddIfNotNull(TestCapabilities());
}
+ protected static List CategoryIds(List categories)
+ {
+ var l = categories.Select(c => c.Id).ToList();
+
+ foreach (var category in categories)
+ {
+ l.AddRange(CategoryIds(category.Subcategories));
+ }
+
+ return l;
+ }
+
protected virtual ValidationFailure TestCapabilities()
{
try
{
var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
+ var notSupported = Settings.Categories.Except(CategoryIds(capabilities.Categories));
+
+ if (notSupported.Any())
+ {
+ return new ValidationFailure(string.Empty, $"This indexer does not support the following categories: {string.Join(", ", notSupported)}");
+ }
+
if (capabilities.SupportedSearchParameters != null && capabilities.SupportedSearchParameters.Contains("q"))
{
return null;
}
- if (capabilities.SupportedTvSearchParameters != null &&
+ if (capabilities.SupportedMovieSearchParameters != null &&
new[] { "q", "imdbid" }.Any(v => capabilities.SupportedMovieSearchParameters.Contains(v)) &&
new[] { "imdbtitle", "imdbyear" }.All(v => capabilities.SupportedMovieSearchParameters.Contains(v)))
{
return null;
}
- return new ValidationFailure(string.Empty, "Indexer does not support required search parameters");
+ return new ValidationFailure(string.Empty, "This indexer does not support searching for movies :(. Tell your indexer staff to enable this or force add the indexer by disabling search, adding the indexer and then enabling it again.");
}
catch (Exception ex)
{
diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs
index 2adbde4d7..b38929f98 100644
--- a/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs
+++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs
@@ -40,10 +40,15 @@ namespace NzbDrone.Core.Indexers.Newznab
var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
+ // Some indexers might forget to enable movie search, but normal search still works fine. Thus we force a normal search.
if (capabilities.SupportedMovieSearchParameters != null)
{
pageableRequests.Add(GetPagedRequests(MaxPages, Settings.Categories.Concat(Settings.AnimeCategories), "movie", ""));
}
+ else if (capabilities.SupportedSearchParameters != null)
+ {
+ pageableRequests.Add(GetPagedRequests(MaxPages, Settings.Categories.Concat(Settings.AnimeCategories), "search", ""));
+ }
return pageableRequests;
}
diff --git a/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs b/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs
index 0678a12c2..32af77d47 100644
--- a/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs
+++ b/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs
@@ -83,24 +83,47 @@ namespace NzbDrone.Core.Indexers.Torznab
failures.AddIfNotNull(TestCapabilities());
}
+ protected static List CategoryIds(List categories)
+ {
+ var l = categories.Select(c => c.Id).ToList();
+
+ foreach (var category in categories)
+ {
+ if (category.Subcategories != null)
+ l.AddRange(CategoryIds(category.Subcategories));
+ }
+
+ return l;
+ }
+
protected virtual ValidationFailure TestCapabilities()
{
try
{
var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
+ var notSupported = Settings.Categories.Except(CategoryIds(capabilities.Categories));
+
+ if (notSupported.Any())
+ {
+ _logger.Warn($"{Definition.Name} does not support the following categories: {string.Join(", ", notSupported)}");
+ if (notSupported.Count() == Settings.Categories.Count())
+ return new ValidationFailure(string.Empty, $"This indexer does not support any of the selected categories! (You may need to turn on advanced settings to see them)");
+ }
+
if (capabilities.SupportedSearchParameters != null && capabilities.SupportedSearchParameters.Contains("q"))
{
return null;
}
if (capabilities.SupportedMovieSearchParameters != null &&
- new[] { "q", "imdbid" }.Any(v => capabilities.SupportedMovieSearchParameters.Contains(v)))
+ new[] { "q", "imdbid" }.Any(v => capabilities.SupportedMovieSearchParameters.Contains(v)) &&
+ new[] { "imdbtitle", "imdbyear" }.All(v => capabilities.SupportedMovieSearchParameters.Contains(v)))
{
return null;
}
- return new ValidationFailure(string.Empty, "Indexer does not support required search parameters");
+ return new ValidationFailure(string.Empty, "This indexer does not support searching for movies :(. Tell your indexer staff to enable this or force add the indexer by disabling search, adding the indexer and then enabling it again.");
}
catch (Exception ex)
{