New: Newznab Improvements (Misc Failures, Music Support, Book Support)

This commit is contained in:
Qstick
2021-02-28 22:34:08 -05:00
parent 59e30805a2
commit 57780ce3db
3 changed files with 136 additions and 26 deletions

View File

@@ -2,5 +2,7 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
{ {
public class BookSearchCriteria : SearchCriteriaBase public class BookSearchCriteria : SearchCriteriaBase
{ {
public string Author { get; set; }
public string Title { get; set; }
} }
} }

View File

@@ -93,6 +93,9 @@ namespace NzbDrone.Core.IndexerSearch
{ {
var searchSpec = Get<BookSearchCriteria>(request, indexerIds, interactiveSearch); var searchSpec = Get<BookSearchCriteria>(request, indexerIds, interactiveSearch);
searchSpec.Author = request.author;
searchSpec.Title = request.title;
return new NewznabResults { Releases = Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; return new NewznabResults { Releases = Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) };
} }

View File

@@ -1,9 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq; using System.Linq;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser;
namespace NzbDrone.Core.Indexers.Newznab namespace NzbDrone.Core.Indexers.Newznab
{ {
@@ -27,26 +29,39 @@ namespace NzbDrone.Core.Indexers.Newznab
var capabilities = _capabilitiesProvider.GetCapabilities(Settings); var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
var pageableRequests = new IndexerPageableRequestChain(); var pageableRequests = new IndexerPageableRequestChain();
var parameters = string.Empty; var parameters = new NameValueCollection();
if (searchCriteria.TmdbId.HasValue && capabilities.MovieSearchTmdbAvailable) if (searchCriteria.TmdbId.HasValue && capabilities.MovieSearchTmdbAvailable)
{ {
parameters += string.Format("&tmdbid={0}", searchCriteria.TmdbId.Value); parameters.Add("tmdbid", searchCriteria.TmdbId.Value.ToString());
} }
if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace() && capabilities.MovieSearchImdbAvailable) if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace() && capabilities.MovieSearchImdbAvailable)
{ {
parameters += string.Format("&imdbid={0}", searchCriteria.ImdbId); parameters.Add("imdbid}", searchCriteria.ImdbId);
} }
if (searchCriteria.TraktId.HasValue && capabilities.MovieSearchTraktAvailable) if (searchCriteria.TraktId.HasValue && capabilities.MovieSearchTraktAvailable)
{ {
parameters += string.Format("&traktid={0}", searchCriteria.ImdbId); parameters.Add("traktid", searchCriteria.ImdbId);
} }
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace()) //Workaround issue with Sphinx search returning garbage results on some indexers. If we don't use id parameters, fallback to t=search
if (parameters.Count == 0)
{ {
parameters += string.Format("&q={0}", searchCriteria.SearchTerm); searchCriteria.SearchType = "search";
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.SearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
}
else
{
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.MovieSearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
} }
pageableRequests.Add(GetPagedRequests(searchCriteria, pageableRequests.Add(GetPagedRequests(searchCriteria,
@@ -57,7 +72,43 @@ namespace NzbDrone.Core.Indexers.Newznab
public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria)
{ {
return new IndexerPageableRequestChain(); var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
var pageableRequests = new IndexerPageableRequestChain();
var parameters = new NameValueCollection();
if (searchCriteria.Artist.IsNotNullOrWhiteSpace() && capabilities.MusicSearchArtistAvailable)
{
parameters.Add("artist", searchCriteria.Artist);
}
if (searchCriteria.Album.IsNotNullOrWhiteSpace() && capabilities.MusicSearchAlbumAvailable)
{
parameters.Add("album", searchCriteria.Album);
}
//Workaround issue with Sphinx search returning garbage results on some indexers. If we don't use id parameters, fallback to t=search
if (parameters.Count == 0)
{
searchCriteria.SearchType = "search";
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.SearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
}
else
{
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.MusicSearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
}
pageableRequests.Add(GetPagedRequests(searchCriteria,
parameters));
return pageableRequests;
} }
public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria)
@@ -65,41 +116,54 @@ namespace NzbDrone.Core.Indexers.Newznab
var capabilities = _capabilitiesProvider.GetCapabilities(Settings); var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
var pageableRequests = new IndexerPageableRequestChain(); var pageableRequests = new IndexerPageableRequestChain();
var parameters = string.Empty; var parameters = new NameValueCollection();
if (searchCriteria.TvdbId.HasValue && capabilities.TvSearchTvdbAvailable) if (searchCriteria.TvdbId.HasValue && capabilities.TvSearchTvdbAvailable)
{ {
parameters += string.Format("&tvdbid={0}", searchCriteria.TvdbId.Value); parameters.Add("tvdbid", searchCriteria.TvdbId.Value.ToString());
} }
if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace() && capabilities.TvSearchImdbAvailable) if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace() && capabilities.TvSearchImdbAvailable)
{ {
parameters += string.Format("&imdbid={0}", searchCriteria.ImdbId); parameters.Add("imdbid", searchCriteria.ImdbId);
} }
if (searchCriteria.TvMazeId.HasValue && capabilities.TvSearchTvMazeAvailable) if (searchCriteria.TvMazeId.HasValue && capabilities.TvSearchTvMazeAvailable)
{ {
parameters += string.Format("&tvmazeid={0}", searchCriteria.TvMazeId); parameters.Add("tvmazeid", searchCriteria.TvMazeId.ToString());
} }
if (searchCriteria.RId.HasValue && capabilities.TvSearchTvRageAvailable) if (searchCriteria.RId.HasValue && capabilities.TvSearchTvRageAvailable)
{ {
parameters += string.Format("&rid={0}", searchCriteria.RId); parameters.Add("rid", searchCriteria.RId.ToString());
} }
if (searchCriteria.Season.HasValue && capabilities.TvSearchSeasonAvailable) if (searchCriteria.Season.HasValue && capabilities.TvSearchSeasonAvailable)
{ {
parameters += string.Format("&season={0}", searchCriteria.Season); parameters.Add("season", searchCriteria.Season.ToString());
} }
if (searchCriteria.Episode.IsNotNullOrWhiteSpace() && capabilities.TvSearchEpAvailable) if (searchCriteria.Episode.IsNotNullOrWhiteSpace() && capabilities.TvSearchEpAvailable)
{ {
parameters += string.Format("&ep={0}", searchCriteria.Episode); parameters.Add("ep", searchCriteria.Episode);
} }
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace()) //Workaround issue with Sphinx search returning garbage results on some indexers. If we don't use id parameters, fallback to t=search
if (parameters.Count == 0)
{ {
parameters += string.Format("&q={0}", searchCriteria.SearchTerm); searchCriteria.SearchType = "search";
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.SearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
}
else
{
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.TvSearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
} }
pageableRequests.Add(GetPagedRequests(searchCriteria, pageableRequests.Add(GetPagedRequests(searchCriteria,
@@ -110,22 +174,63 @@ namespace NzbDrone.Core.Indexers.Newznab
public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria)
{ {
return new IndexerPageableRequestChain(); var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
}
public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain(); var pageableRequests = new IndexerPageableRequestChain();
var parameters = new NameValueCollection();
var searchQuery = searchCriteria.SearchTerm; if (searchCriteria.Author.IsNotNullOrWhiteSpace() && capabilities.BookSearchAuthorAvailable)
{
parameters.Add("author", searchCriteria.Author);
}
if (searchCriteria.Title.IsNotNullOrWhiteSpace() && capabilities.BookSearchTitleAvailable)
{
parameters.Add("title", searchCriteria.Title);
}
//Workaround issue with Sphinx search returning garbage results on some indexers. If we don't use id parameters, fallback to t=search
if (parameters.Count == 0)
{
searchCriteria.SearchType = "search";
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.SearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
}
else
{
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.BookSearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
}
pageableRequests.Add(GetPagedRequests(searchCriteria, pageableRequests.Add(GetPagedRequests(searchCriteria,
searchQuery.IsNotNullOrWhiteSpace() ? string.Format("&q={0}", NewsnabifyTitle(searchCriteria.SearchTerm)) : string.Empty)); parameters));
return pageableRequests; return pageableRequests;
} }
private IEnumerable<IndexerRequest> GetPagedRequests(SearchCriteriaBase searchCriteria, string parameters) public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria)
{
var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
var pageableRequests = new IndexerPageableRequestChain();
var parameters = new NameValueCollection();
if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace() && capabilities.SearchAvailable)
{
parameters.Add("q", NewsnabifyTitle(searchCriteria.SearchTerm));
}
pageableRequests.Add(GetPagedRequests(searchCriteria, parameters));
return pageableRequests;
}
private IEnumerable<IndexerRequest> GetPagedRequests(SearchCriteriaBase searchCriteria, NameValueCollection parameters)
{ {
var baseUrl = string.Format("{0}{1}?t={2}&extended=1", Settings.BaseUrl.TrimEnd('/'), Settings.ApiPath.TrimEnd('/'), searchCriteria.SearchType); var baseUrl = string.Format("{0}{1}?t={2}&extended=1", Settings.BaseUrl.TrimEnd('/'), Settings.ApiPath.TrimEnd('/'), searchCriteria.SearchType);
var categories = searchCriteria.Categories; var categories = searchCriteria.Categories;
@@ -143,15 +248,15 @@ namespace NzbDrone.Core.Indexers.Newznab
if (searchCriteria.Limit.HasValue) if (searchCriteria.Limit.HasValue)
{ {
parameters += string.Format("&limit={0}", searchCriteria.Limit); parameters.Add("limit", searchCriteria.Limit.ToString());
} }
if (searchCriteria.Offset.HasValue) if (searchCriteria.Offset.HasValue)
{ {
parameters += string.Format("&offset={0}", searchCriteria.Offset); parameters.Add("offset", searchCriteria.Offset.ToString());
} }
yield return new IndexerRequest(string.Format("{0}{1}", baseUrl, parameters), HttpAccept.Rss); yield return new IndexerRequest(string.Format("{0}&{1}", baseUrl, parameters.GetQueryString()), HttpAccept.Rss);
} }
private static string NewsnabifyTitle(string title) private static string NewsnabifyTitle(string title)