core: refactor music-search (#9895)

This commit is contained in:
Diego Heras
2020-10-18 23:20:08 +02:00
committed by GitHub
parent 463078ebc0
commit 1e42016546
10 changed files with 86 additions and 28 deletions

View File

@@ -120,7 +120,7 @@ namespace Jackett.Common.Indexers
if (Definition.Caps.Modes.ContainsKey("movie-search")) if (Definition.Caps.Modes.ContainsKey("movie-search"))
TorznabCaps.ParseMovieSearchParams(Definition.Caps.Modes["movie-search"]); TorznabCaps.ParseMovieSearchParams(Definition.Caps.Modes["movie-search"]);
if (Definition.Caps.Modes.ContainsKey("music-search")) if (Definition.Caps.Modes.ContainsKey("music-search"))
TorznabCaps.SupportedMusicSearchParamsList = Definition.Caps.Modes["music-search"]; TorznabCaps.ParseMusicSearchParams(Definition.Caps.Modes["music-search"]);
// init config Data // init config Data
configData = new ConfigurationData(); configData = new ConfigurationData();

View File

@@ -20,7 +20,10 @@ namespace Jackett.Common.Indexers
link: "https://dicmusic.club/", link: "https://dicmusic.club/",
caps: new TorznabCapabilities caps: new TorznabCapabilities
{ {
SupportedMusicSearchParamsList = new List<string> { "q", "album", "artist", "label", "year" } MusicSearchParams = new List<MusicSearchParam>
{
MusicSearchParam.Q, MusicSearchParam.Album, MusicSearchParam.Artist, MusicSearchParam.Label, MusicSearchParam.Year
}
}, },
configService: configService, configService: configService,
client: wc, client: wc,

View File

@@ -63,7 +63,10 @@ namespace Jackett.Common.Indexers
link: "https://libble.me/", link: "https://libble.me/",
caps: new TorznabCapabilities caps: new TorznabCapabilities
{ {
SupportedMusicSearchParamsList = new List<string> { "q", "album", "artist", "label", "year" } MusicSearchParams = new List<MusicSearchParam>
{
MusicSearchParam.Q, MusicSearchParam.Album, MusicSearchParam.Artist, MusicSearchParam.Label, MusicSearchParam.Year
}
}, },
configService: configService, configService: configService,
client: wc, client: wc,

View File

@@ -27,9 +27,9 @@ namespace Jackett.Common.Indexers
{ {
MovieSearchParam.Q MovieSearchParam.Q
}, },
SupportedMusicSearchParamsList = new List<string> MusicSearchParams = new List<MusicSearchParam>
{ {
"q", "album", "artist", "label", "year" MusicSearchParam.Q, MusicSearchParam.Album, MusicSearchParam.Artist, MusicSearchParam.Label, MusicSearchParam.Year
} }
}, },
configService: configService, configService: configService,

View File

@@ -27,9 +27,9 @@ namespace Jackett.Common.Indexers
{ {
MovieSearchParam.Q MovieSearchParam.Q
}, },
SupportedMusicSearchParamsList = new List<string> MusicSearchParams = new List<MusicSearchParam>
{ {
"q", "album", "artist", "label", "year" MusicSearchParam.Q, MusicSearchParam.Album, MusicSearchParam.Artist, MusicSearchParam.Label, MusicSearchParam.Year
} }
}, },
configService: configService, configService: configService,

View File

@@ -31,9 +31,9 @@ namespace Jackett.Common.Indexers
{ {
MovieSearchParam.Q MovieSearchParam.Q
}, },
SupportedMusicSearchParamsList = new List<string> MusicSearchParams = new List<MusicSearchParam>
{ {
"q", "album", "artist", "label", "year" MusicSearchParam.Q, MusicSearchParam.Album, MusicSearchParam.Artist, MusicSearchParam.Label, MusicSearchParam.Year
} }
}, },
configService: configService, configService: configService,

View File

@@ -25,9 +25,9 @@ namespace Jackett.Common.Indexers
{ {
MovieSearchParam.Q, MovieSearchParam.ImdbId MovieSearchParam.Q, MovieSearchParam.ImdbId
}, },
SupportedMusicSearchParamsList = new List<string> MusicSearchParams = new List<MusicSearchParam>
{ {
"q", "album", "artist", "label", "year" MusicSearchParam.Q, MusicSearchParam.Album, MusicSearchParam.Artist, MusicSearchParam.Label, MusicSearchParam.Year
} }
}, },
configService: configService, configService: configService,

View File

@@ -22,6 +22,15 @@ namespace Jackett.Common.Models
TmdbId TmdbId
} }
public enum MusicSearchParam
{
Q,
Album,
Artist,
Label,
Year
}
public class TorznabCapabilities public class TorznabCapabilities
{ {
public int? LimitsMax { get; set; } public int? LimitsMax { get; set; }
@@ -43,8 +52,12 @@ namespace Jackett.Common.Models
public bool MovieSearchImdbAvailable => (MovieSearchParams.Contains(MovieSearchParam.ImdbId)); public bool MovieSearchImdbAvailable => (MovieSearchParams.Contains(MovieSearchParam.ImdbId));
public bool MovieSearchTmdbAvailable => (MovieSearchParams.Contains(MovieSearchParam.TmdbId)); public bool MovieSearchTmdbAvailable => (MovieSearchParams.Contains(MovieSearchParam.TmdbId));
public List<string> SupportedMusicSearchParamsList; public List<MusicSearchParam> MusicSearchParams;
public bool MusicSearchAvailable => (SupportedMusicSearchParamsList.Count > 0); public bool MusicSearchAvailable => (MusicSearchParams.Count > 0);
public bool MusicSearchAlbumAvailable => (MusicSearchParams.Contains(MusicSearchParam.Album));
public bool MusicSearchArtistAvailable => (MusicSearchParams.Contains(MusicSearchParam.Artist));
public bool MusicSearchLabelAvailable => (MusicSearchParams.Contains(MusicSearchParam.Label));
public bool MusicSearchYearAvailable => (MusicSearchParams.Contains(MusicSearchParam.Year));
public bool BookSearchAvailable { get; set; } public bool BookSearchAvailable { get; set; }
@@ -55,7 +68,7 @@ namespace Jackett.Common.Models
SearchAvailable = true; SearchAvailable = true;
TvSearchParams = new List<TvSearchParam>(); TvSearchParams = new List<TvSearchParam>();
MovieSearchParams = new List<MovieSearchParam>(); MovieSearchParams = new List<MovieSearchParam>();
SupportedMusicSearchParamsList = new List<string>(); MusicSearchParams = new List<MusicSearchParam>();
BookSearchAvailable = false; BookSearchAvailable = false;
Categories = new List<TorznabCategory>(); Categories = new List<TorznabCategory>();
} }
@@ -88,6 +101,20 @@ namespace Jackett.Common.Models
throw new Exception($"Not supported movie-search param: {paramStr}"); throw new Exception($"Not supported movie-search param: {paramStr}");
} }
public void ParseMusicSearchParams(IEnumerable<string> paramsList)
{
if (paramsList == null)
return;
foreach (var paramStr in paramsList)
if (Enum.TryParse(paramStr, true, out MusicSearchParam param))
if (!MusicSearchParams.Contains(param))
MusicSearchParams.Add(param);
else
throw new Exception($"Duplicate music-search param: {paramStr}");
else
throw new Exception($"Not supported Music-search param: {paramStr}");
}
private string SupportedTvSearchParams() private string SupportedTvSearchParams()
{ {
var parameters = new List<string> { "q" }; // q is always enabled var parameters = new List<string> { "q" }; // q is always enabled
@@ -114,7 +141,19 @@ namespace Jackett.Common.Models
return string.Join(",", parameters); return string.Join(",", parameters);
} }
private string SupportedMusicSearchParams => string.Join(",", SupportedMusicSearchParamsList); private string SupportedMusicSearchParams()
{
var parameters = new List<string> { "q" }; // q is always enabled
if (MusicSearchAlbumAvailable)
parameters.Add("album");
if (MusicSearchArtistAvailable)
parameters.Add("artist");
if (MusicSearchLabelAvailable)
parameters.Add("label");
if (MusicSearchYearAvailable)
parameters.Add("year");
return string.Join(",", parameters);
}
private string SupportedBookSearchParams private string SupportedBookSearchParams
{ {
@@ -164,12 +203,12 @@ namespace Jackett.Common.Models
), ),
new XElement("music-search", new XElement("music-search",
new XAttribute("available", MusicSearchAvailable ? "yes" : "no"), new XAttribute("available", MusicSearchAvailable ? "yes" : "no"),
new XAttribute("supportedParams", SupportedMusicSearchParams) new XAttribute("supportedParams", SupportedMusicSearchParams())
), ),
// inconsistend but apparently already used by various newznab indexers (see #1896) // inconsistend but apparently already used by various newznab indexers (see #1896)
new XElement("audio-search", new XElement("audio-search",
new XAttribute("available", MusicSearchAvailable ? "yes" : "no"), new XAttribute("available", MusicSearchAvailable ? "yes" : "no"),
new XAttribute("supportedParams", SupportedMusicSearchParams) new XAttribute("supportedParams", SupportedMusicSearchParams())
), ),
new XElement("book-search", new XElement("book-search",
new XAttribute("available", BookSearchAvailable ? "yes" : "no"), new XAttribute("available", BookSearchAvailable ? "yes" : "no"),
@@ -201,7 +240,7 @@ namespace Jackett.Common.Models
lhs.SearchAvailable = lhs.SearchAvailable || rhs.SearchAvailable; lhs.SearchAvailable = lhs.SearchAvailable || rhs.SearchAvailable;
lhs.TvSearchParams = lhs.TvSearchParams.Union(rhs.TvSearchParams).ToList(); lhs.TvSearchParams = lhs.TvSearchParams.Union(rhs.TvSearchParams).ToList();
lhs.MovieSearchParams = lhs.MovieSearchParams.Union(rhs.MovieSearchParams).ToList(); lhs.MovieSearchParams = lhs.MovieSearchParams.Union(rhs.MovieSearchParams).ToList();
// TODO: add music search lhs.MusicSearchParams = lhs.MusicSearchParams.Union(rhs.MusicSearchParams).ToList();
lhs.BookSearchAvailable = lhs.BookSearchAvailable || rhs.BookSearchAvailable; lhs.BookSearchAvailable = lhs.BookSearchAvailable || rhs.BookSearchAvailable;
lhs.Categories.AddRange(rhs.Categories.Where(x => x.ID < 100000).Except(lhs.Categories)); // exclude indexer specific categories (>= 100000) lhs.Categories.AddRange(rhs.Categories.Where(x => x.ID < 100000).Except(lhs.Categories)); // exclude indexer specific categories (>= 100000)
return lhs; return lhs;

View File

@@ -13,7 +13,6 @@ namespace Jackett.Test.Common.Models
[Test] [Test]
public void TestConstructors() public void TestConstructors()
{ {
// TODO: initialize MusicSearchAvailable
var torznabCaps = new TorznabCapabilities(); var torznabCaps = new TorznabCapabilities();
Assert.True(torznabCaps.SearchAvailable); Assert.True(torznabCaps.SearchAvailable);
@@ -30,8 +29,12 @@ namespace Jackett.Test.Common.Models
Assert.False(torznabCaps.MovieSearchImdbAvailable); Assert.False(torznabCaps.MovieSearchImdbAvailable);
Assert.False(torznabCaps.MovieSearchTmdbAvailable); Assert.False(torznabCaps.MovieSearchTmdbAvailable);
Assert.IsEmpty(torznabCaps.SupportedMusicSearchParamsList); Assert.IsEmpty(torznabCaps.MusicSearchParams);
Assert.False(torznabCaps.MusicSearchAvailable); // init Assert.False(torznabCaps.MusicSearchAvailable);
Assert.False(torznabCaps.MusicSearchAlbumAvailable);
Assert.False(torznabCaps.MusicSearchArtistAvailable);
Assert.False(torznabCaps.MusicSearchLabelAvailable);
Assert.False(torznabCaps.MusicSearchYearAvailable);
Assert.False(torznabCaps.BookSearchAvailable); Assert.False(torznabCaps.BookSearchAvailable);
@@ -100,13 +103,12 @@ namespace Jackett.Test.Common.Models
Assert.AreEqual("no", xDoumentSearching?.Element("movie-search")?.Attribute("available")?.Value); Assert.AreEqual("no", xDoumentSearching?.Element("movie-search")?.Attribute("available")?.Value);
Assert.AreEqual("q", xDoumentSearching?.Element("movie-search")?.Attribute("supportedParams")?.Value); Assert.AreEqual("q", xDoumentSearching?.Element("movie-search")?.Attribute("supportedParams")?.Value);
Assert.AreEqual("no", xDoumentSearching?.Element("music-search")?.Attribute("available")?.Value); Assert.AreEqual("no", xDoumentSearching?.Element("music-search")?.Attribute("available")?.Value);
Assert.AreEqual("", xDoumentSearching?.Element("music-search")?.Attribute("supportedParams")?.Value); Assert.AreEqual("q", xDoumentSearching?.Element("music-search")?.Attribute("supportedParams")?.Value);
Assert.AreEqual("no", xDoumentSearching?.Element("audio-search")?.Attribute("available")?.Value); Assert.AreEqual("no", xDoumentSearching?.Element("audio-search")?.Attribute("available")?.Value);
Assert.AreEqual("", xDoumentSearching?.Element("audio-search")?.Attribute("supportedParams")?.Value); Assert.AreEqual("q", xDoumentSearching?.Element("audio-search")?.Attribute("supportedParams")?.Value);
Assert.AreEqual("no", xDoumentSearching?.Element("book-search")?.Attribute("available")?.Value); Assert.AreEqual("no", xDoumentSearching?.Element("book-search")?.Attribute("available")?.Value);
Assert.AreEqual("q", xDoumentSearching?.Element("book-search")?.Attribute("supportedParams")?.Value); Assert.AreEqual("q", xDoumentSearching?.Element("book-search")?.Attribute("supportedParams")?.Value);
// TODO: validate invalid music params
// TODO: book parameters should be configurable? // TODO: book parameters should be configurable?
// test all features enabled // test all features enabled
torznabCaps = new TorznabCapabilities torznabCaps = new TorznabCapabilities
@@ -120,7 +122,10 @@ namespace Jackett.Test.Common.Models
{ {
MovieSearchParam.Q, MovieSearchParam.ImdbId, MovieSearchParam.TmdbId MovieSearchParam.Q, MovieSearchParam.ImdbId, MovieSearchParam.TmdbId
}, },
SupportedMusicSearchParamsList = new List<string>{"q", "album", "artist", "label", "year"}, MusicSearchParams = new List<MusicSearchParam>
{
MusicSearchParam.Q, MusicSearchParam.Album, MusicSearchParam.Artist, MusicSearchParam.Label, MusicSearchParam.Year
},
BookSearchAvailable = true BookSearchAvailable = true
}; };
xDocument = torznabCaps.GetXDocument(); xDocument = torznabCaps.GetXDocument();

View File

@@ -49,8 +49,12 @@ namespace Jackett.Test.Torznab
Assert.False(TorznabCaps.MovieSearchAvailable); Assert.False(TorznabCaps.MovieSearchAvailable);
Assert.False(TorznabCaps.MovieSearchImdbAvailable); Assert.False(TorznabCaps.MovieSearchImdbAvailable);
Assert.False(TorznabCaps.MovieSearchTmdbAvailable); Assert.False(TorznabCaps.MovieSearchTmdbAvailable);
Assert.IsEmpty(TorznabCaps.SupportedMusicSearchParamsList); Assert.IsEmpty(TorznabCaps.MusicSearchParams);
Assert.False(TorznabCaps.MusicSearchAvailable); Assert.False(TorznabCaps.MusicSearchAvailable);
Assert.False(TorznabCaps.MusicSearchAlbumAvailable);
Assert.False(TorznabCaps.MusicSearchArtistAvailable);
Assert.False(TorznabCaps.MusicSearchLabelAvailable);
Assert.False(TorznabCaps.MusicSearchYearAvailable);
Assert.False(TorznabCaps.BookSearchAvailable); Assert.False(TorznabCaps.BookSearchAvailable);
Assert.AreEqual(0, TorznabCaps.Categories.Count); Assert.AreEqual(0, TorznabCaps.Categories.Count);
@@ -261,8 +265,12 @@ namespace Jackett.Test.Torznab
Assert.False(indexer.TorznabCaps.MovieSearchAvailable); Assert.False(indexer.TorznabCaps.MovieSearchAvailable);
Assert.False(indexer.TorznabCaps.MovieSearchImdbAvailable); Assert.False(indexer.TorznabCaps.MovieSearchImdbAvailable);
Assert.False(indexer.TorznabCaps.MovieSearchTmdbAvailable); Assert.False(indexer.TorznabCaps.MovieSearchTmdbAvailable);
Assert.IsEmpty(indexer.TorznabCaps.SupportedMusicSearchParamsList); Assert.IsEmpty(indexer.TorznabCaps.MusicSearchParams);
Assert.False(indexer.TorznabCaps.MusicSearchAvailable); Assert.False(indexer.TorznabCaps.MusicSearchAvailable);
Assert.False(indexer.TorznabCaps.MusicSearchAlbumAvailable);
Assert.False(indexer.TorznabCaps.MusicSearchArtistAvailable);
Assert.False(indexer.TorznabCaps.MusicSearchLabelAvailable);
Assert.False(indexer.TorznabCaps.MusicSearchYearAvailable);
Assert.False(indexer.TorznabCaps.BookSearchAvailable); Assert.False(indexer.TorznabCaps.BookSearchAvailable);
Assert.AreEqual(0, indexer.TorznabCaps.Categories.Count); Assert.AreEqual(0, indexer.TorznabCaps.Categories.Count);
@@ -348,7 +356,7 @@ namespace Jackett.Test.Torznab
Assert.True(indexer.TorznabCaps.MovieSearchImdbAvailable); Assert.True(indexer.TorznabCaps.MovieSearchImdbAvailable);
Assert.True(indexer.TorznabCaps.MovieSearchTmdbAvailable); Assert.True(indexer.TorznabCaps.MovieSearchTmdbAvailable);
// TODO: improve this assert // TODO: improve this assert
Assert.AreEqual(5, indexer.TorznabCaps.SupportedMusicSearchParamsList.Count); Assert.AreEqual(5, indexer.TorznabCaps.MusicSearchParams.Count);
Assert.True(indexer.TorznabCaps.MusicSearchAvailable); Assert.True(indexer.TorznabCaps.MusicSearchAvailable);
Assert.True(indexer.TorznabCaps.BookSearchAvailable); Assert.True(indexer.TorznabCaps.BookSearchAvailable);