Fixed: Search fails for many artist and albums with specials (#466)

* Fixed: Search fails for many artist/albums with specials

* fixup! Replace & with space

* fixup! Add two more test cases

* fixup! Add last test case

* fixup: Newznab test case
This commit is contained in:
Qstick 2018-09-04 22:55:08 -04:00 committed by GitHub
parent 23bc5b11cf
commit 812af82fae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 51 additions and 36 deletions

View File

@ -3,22 +3,36 @@ using System.Linq;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Music;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.IndexerSearchTests
{
public class SearchDefinitionFixture : CoreTest<AlbumSearchCriteria>
{
public class AlbumSearchDefinitionFixture : CoreTest<AlbumSearchCriteria>
{
[TestCase("Betty White's Off Their Rockers", "Betty+Whites+Off+Their+Rockers")]
[TestCase("Star Wars: The Clone Wars", "Star+Wars+The+Clone+Wars")]
[TestCase("Hawaii Five-0", "Hawaii+Five+0")]
[TestCase("Franklin & Bash", "Franklin+and+Bash")]
[TestCase("Chicago P.D.", "Chicago+PD")]
[TestCase("Kourtney And Khlo\u00E9 Take The Hamptons", "Kourtney+And+Khloe+Take+The+Hamptons")]
public void should_replace_some_special_characters(string input, string expected)
[TestCase("Mötley Crüe", "Motley+Crue")]
[TestCase("방탄소년단", "방탄소년단")]
public void should_replace_some_special_characters_artist(string artist, string expected)
{
Subject.SceneTitles = new List<string> { input };
Subject.QueryTitles.First().Should().Be(expected);
Subject.Artist = new Artist { Name = artist };
Subject.ArtistQuery.Should().Be(expected);
}
[TestCase("…and Justice for All", "and+Justice+for+All")]
[TestCase("American III: Solitary Man", "American+III+Solitary+Man")]
[TestCase("Sad Clowns & Hillbillies", "Sad+Clowns+Hillbillies")]
[TestCase("¿Quién sabe?", "Quien+sabe")]
public void should_replace_some_special_characters(string album, string expected)
{
Subject.AlbumTitle = album;
Subject.AlbumQuery.Should().Be(expected);
}
[TestCase("+", "+")]
public void should_not_replace_some_special_characters_if_result_empty_string(string album, string expected)
{
Subject.AlbumTitle = album;
Subject.AlbumQuery.Should().Be(expected);
}
}
}

View File

@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using FluentAssertions;
using Moq;
@ -60,7 +60,7 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests
var page = results.GetAllTiers().First().First();
page.Url.Query.Should().Contain("artist=Alien Ant Farm");
page.Url.Query.Should().Contain("artist=Alien%20Ant%20Farm");
page.Url.Query.Should().Contain("album=TruANT");
}
}

View File

@ -1,4 +1,4 @@
using System;
using System;
namespace NzbDrone.Core.IndexerSearch.Definitions
{
@ -8,6 +8,8 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
public string AlbumTitle { get; set; }
public int AlbumYear { get; set; }
public string AlbumQuery => GetQueryTitle(AlbumTitle);
public override string ToString()
{
return string.Format("[{0} - {1} ({2})]", Artist.Name, AlbumTitle, AlbumYear);

View File

@ -13,9 +13,6 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
private static readonly Regex NonWord = new Regex(@"[\W]", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex BeginningThe = new Regex(@"^the\s", RegexOptions.IgnoreCase | RegexOptions.Compiled);
[System.Obsolete("Sonarr TV Stuff -- Shouldn't be needed for Lidarr")]
public List<string> SceneTitles { get; set; }
public virtual bool MonitoredEpisodesOnly { get; set; }
public virtual bool UserInvokedSearch { get; set; }
public virtual bool InteractiveSearch { get; set; }
@ -24,7 +21,7 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
public List<Album> Albums { get; set; }
public List<Track> Tracks { get; set; }
public List<string> QueryTitles => SceneTitles.Select(GetQueryTitle).ToList();
public string ArtistQuery => GetQueryTitle(Artist.Name);
public static string GetQueryTitle(string title)
{
@ -32,14 +29,16 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
var cleanTitle = BeginningThe.Replace(title, string.Empty);
cleanTitle = cleanTitle.Replace("&", "and");
cleanTitle = cleanTitle.Replace(" & ", " ");
cleanTitle = SpecialCharacter.Replace(cleanTitle, "");
cleanTitle = NonWord.Replace(cleanTitle, "+");
//remove any repeating +s
cleanTitle = Regex.Replace(cleanTitle, @"\+{2,}", "+");
cleanTitle = cleanTitle.RemoveAccent();
return cleanTitle.Trim('+', ' ');
cleanTitle = cleanTitle.Trim('+', ' ');
return cleanTitle.Length == 0 ? title : cleanTitle;
}
}
}

View File

@ -30,14 +30,14 @@ namespace NzbDrone.Core.Indexers.Gazelle
public IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(string.Format("&artistname={0}&groupname={1}", searchCriteria.Artist.Name, searchCriteria.AlbumTitle)));
pageableRequests.Add(GetRequest(string.Format("&artistname={0}&groupname={1}", searchCriteria.ArtistQuery, searchCriteria.AlbumQuery)));
return pageableRequests;
}
public IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(string.Format("&artistname={0}",searchCriteria.Artist.Name)));
pageableRequests.Add(GetRequest(string.Format("&artistname={0}",searchCriteria.ArtistQuery)));
return pageableRequests;
}

View File

@ -40,8 +40,8 @@ namespace NzbDrone.Core.Indexers.Headphones
pageableRequests.Add(GetPagedRequests(MaxPages, Settings.Categories, "search",
string.Format("&q={0}",
NewsnabifyTitle(string.Format("{0} {1}",
searchCriteria.Artist.Name,
searchCriteria.AlbumTitle)))));
searchCriteria.ArtistQuery,
searchCriteria.AlbumQuery)))));
return pageableRequests;
}
@ -54,7 +54,7 @@ namespace NzbDrone.Core.Indexers.Headphones
pageableRequests.Add(GetPagedRequests(MaxPages, Settings.Categories, "search",
string.Format("&q={0}",
NewsnabifyTitle(searchCriteria.Artist.Name))));
NewsnabifyTitle(searchCriteria.ArtistQuery))));
return pageableRequests;
}

View File

@ -71,8 +71,8 @@ namespace NzbDrone.Core.Indexers.Newznab
{
AddAudioPageableRequests(pageableRequests, searchCriteria,
string.Format("&artist={0}&album={1}",
NewsnabifyTitle(searchCriteria.Artist.Name),
NewsnabifyTitle(searchCriteria.AlbumTitle)));
NewsnabifyTitle(searchCriteria.ArtistQuery),
NewsnabifyTitle(searchCriteria.AlbumQuery)));
}
if (SupportsSearch)
@ -82,8 +82,8 @@ namespace NzbDrone.Core.Indexers.Newznab
pageableRequests.Add(GetPagedRequests(MaxPages, Settings.Categories, "search",
string.Format("&q={0}",
NewsnabifyTitle(string.Format("{0} {1}",
searchCriteria.Artist.Name,
searchCriteria.AlbumTitle)))));
searchCriteria.ArtistQuery,
searchCriteria.AlbumQuery)))));
}

View File

@ -31,8 +31,8 @@ namespace NzbDrone.Core.Indexers.Omgwtfnzbs
pageableRequests.Add(GetPagedRequests(string.Format("{0}+{1}",
searchCriteria.Artist.Name,
searchCriteria.AlbumTitle)));
searchCriteria.ArtistQuery,
searchCriteria.AlbumQuery)));
return pageableRequests;
@ -44,7 +44,7 @@ namespace NzbDrone.Core.Indexers.Omgwtfnzbs
pageableRequests.Add(GetPagedRequests(string.Format("{0}",
searchCriteria.Artist.Name)));
searchCriteria.ArtistQuery)));
return pageableRequests;

View File

@ -29,7 +29,7 @@ namespace NzbDrone.Core.Indexers.Rarbg
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetPagedRequests("search", null, "{0}+{1}", searchCriteria.Artist.Name, searchCriteria.AlbumTitle));
pageableRequests.Add(GetPagedRequests("search", null, "{0}+{1}", searchCriteria.ArtistQuery, searchCriteria.AlbumQuery));
return pageableRequests;
}
@ -38,7 +38,7 @@ namespace NzbDrone.Core.Indexers.Rarbg
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetPagedRequests("search", null, "{0}", searchCriteria.Artist.Name));
pageableRequests.Add(GetPagedRequests("search", null, "{0}", searchCriteria.ArtistQuery));
return pageableRequests;
}

View File

@ -30,7 +30,7 @@ namespace NzbDrone.Core.Indexers.Waffles
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetPagedRequests(MaxPages, string.Format("&q=artist:{0} album:{1}",searchCriteria.Artist.Name,searchCriteria.AlbumTitle)));
pageableRequests.Add(GetPagedRequests(MaxPages, string.Format("&q=artist:{0} album:{1}",searchCriteria.ArtistQuery,searchCriteria.AlbumQuery)));
return pageableRequests;
}
@ -39,7 +39,7 @@ namespace NzbDrone.Core.Indexers.Waffles
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetPagedRequests(MaxPages, string.Format("&q=artist:{0}", searchCriteria.Artist.Name)));
pageableRequests.Add(GetPagedRequests(MaxPages, string.Format("&q=artist:{0}", searchCriteria.ArtistQuery)));
return pageableRequests;
}