diff --git a/src/Jackett/Indexers/AnimeBytes.cs b/src/Jackett/Indexers/AnimeBytes.cs index 84d41683f..99739e648 100644 --- a/src/Jackett/Indexers/AnimeBytes.cs +++ b/src/Jackett/Indexers/AnimeBytes.cs @@ -336,31 +336,31 @@ namespace Jackett.Indexers { category = seriesCq.Find("a[title=\"View Torrent\"]").Text().Trim(); if (category == "TV Series") - release.Category = TorznabCatType.TVAnime.ID; + release.Category = new List { TorznabCatType.TVAnime.ID }; // Ignore these categories as they'll cause hell with the matcher // TV Special, OVA, ONA, DVD Special, BD Special if (category == "Movie") - release.Category = TorznabCatType.Movies.ID; + release.Category = new List { TorznabCatType.Movies.ID }; if (category == "Manga" || category == "Oneshot" || category == "Anthology" || category == "Manhwa" || category == "Manhua" || category == "Light Novel") - release.Category = TorznabCatType.BooksComics.ID; + release.Category = new List { TorznabCatType.BooksComics.ID }; if (category == "Novel" || category == "Artbook") - release.Category = TorznabCatType.BooksComics.ID; + release.Category = new List { TorznabCatType.BooksComics.ID }; if (category == "Game" || category == "Visual Novel") { var description = rowCq.Find(".torrent_properties a:eq(1)").Text(); if (description.Contains(" PSP ")) - release.Category = TorznabCatType.ConsolePSP.ID; + release.Category = new List { TorznabCatType.ConsolePSP.ID }; if (description.Contains("PSX")) - release.Category = TorznabCatType.ConsoleOther.ID; + release.Category = new List { TorznabCatType.ConsoleOther.ID }; if (description.Contains(" NES ")) - release.Category = TorznabCatType.ConsoleOther.ID; + release.Category = new List { TorznabCatType.ConsoleOther.ID }; if (description.Contains(" PC ")) - release.Category = TorznabCatType.PCGames.ID; + release.Category = new List { TorznabCatType.PCGames.ID }; } } @@ -371,11 +371,11 @@ namespace Jackett.Indexers { var description = rowCq.Find(".torrent_properties a:eq(1)").Text(); if (description.Contains(" Lossless ")) - release.Category = TorznabCatType.AudioLossless.ID; + release.Category = new List { TorznabCatType.AudioLossless.ID }; else if (description.Contains("MP3")) - release.Category = TorznabCatType.AudioMP3.ID; + release.Category = new List { TorznabCatType.AudioMP3.ID }; else - release.Category = TorznabCatType.AudioOther.ID; + release.Category = new List { TorznabCatType.AudioOther.ID }; } } @@ -450,7 +450,7 @@ namespace Jackett.Indexers release.DownloadVolumeFactor = 1; release.UploadVolumeFactor = 1; - if (release.Category != 0) + if (release.Category != null) releases.Add(release); } } diff --git a/src/Jackett/Indexers/BJShare.cs b/src/Jackett/Indexers/BJShare.cs index 6350154f2..c742bf267 100644 --- a/src/Jackett/Indexers/BJShare.cs +++ b/src/Jackett/Indexers/BJShare.cs @@ -219,7 +219,7 @@ namespace Jackett.Indexers var SearchResultDocument = SearchResultParser.Parse(results.Content); var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector); - int GroupCategory = 0; + ICollection GroupCategory = null; string GroupTitle = null; string GroupYearStr = null; Nullable GroupPublishDate = null; @@ -230,7 +230,7 @@ namespace Jackett.Indexers { var qDetailsLink = Row.QuerySelector("a[href^=\"torrents.php?id=\"]"); string Title = qDetailsLink.TextContent; - int Category = 0; + ICollection Category = null; string YearStr = null; Nullable YearPublishDate = null; diff --git a/src/Jackett/Indexers/BaseIndexer.cs b/src/Jackett/Indexers/BaseIndexer.cs index ed185a337..1d25c2c3c 100644 --- a/src/Jackett/Indexers/BaseIndexer.cs +++ b/src/Jackett/Indexers/BaseIndexer.cs @@ -120,30 +120,55 @@ namespace Jackett.Indexers return new Uri(downloadUrlBase + link.ToString(), UriKind.RelativeOrAbsolute); } - protected int MapTrackerCatToNewznab(string input) + protected ICollection MapTrackerCatToNewznab(string input) { + var cats = new List(); if (null != input) { var mapping = categoryMapping.Where(m => m.TrackerCategory != null && m.TrackerCategory.ToLowerInvariant() == input.ToLowerInvariant()).FirstOrDefault(); if (mapping != null) { - return mapping.NewzNabCategory; + cats.Add(mapping.NewzNabCategory); + } + + // 1:1 category mapping + try + { + var trackerCategoryInt = int.Parse(input); + cats.Add(trackerCategoryInt + 100000); + } + catch (FormatException) + { + // input is not an integer, continue } } - return 0; + return cats; } - protected int MapTrackerCatDescToNewznab(string input) + protected ICollection MapTrackerCatDescToNewznab(string input) { + var cats = new List(); if (null != input) { var mapping = categoryMapping.Where(m => m.TrackerCategoryDesc != null && m.TrackerCategoryDesc.ToLowerInvariant() == input.ToLowerInvariant()).FirstOrDefault(); if (mapping != null) { - return mapping.NewzNabCategory; + cats.Add(mapping.NewzNabCategory); + + // 1:1 category mapping + try + { + var trackerCategoryInt = int.Parse(mapping.TrackerCategory); + cats.Add(trackerCategoryInt + 100000); + } + catch (FormatException) + { + // mapping.TrackerCategory is not an integer, continue + } + } } - return 0; + return cats; } public static string GetIndexerID(Type type) @@ -525,7 +550,7 @@ namespace Jackett.Indexers { foreach (var result in results) { - if (query.Categories.Length == 0 || query.Categories.Contains(result.Category) || result.Category == 0 || TorznabCatType.QueryContainsParentCategory(query.Categories, result.Category)) + if (query.Categories.Length == 0 || result.Category == null || result.Category.Count() == 0 || query.Categories.Intersect(result.Category).Any() || TorznabCatType.QueryContainsParentCategory(query.Categories, result.Category)) { yield return result; } @@ -546,6 +571,22 @@ namespace Jackett.Indexers if (TorznabCatType.Movies.Contains(newznabCategory)) TorznabCaps.MovieSearchAvailable = true; } + + // add 1:1 categories + if (trackerCategoryDesc != null && trackerCategory != null) + { + try + { + var trackerCategoryInt = int.Parse(trackerCategory); + var CustomCat = new TorznabCategory(trackerCategoryInt + 100000, trackerCategoryDesc); + if (!TorznabCaps.Categories.Contains(CustomCat)) + TorznabCaps.Categories.Add(CustomCat); + } + catch (FormatException) + { + // trackerCategory is not an integer, continue + } + } } protected void AddCategoryMapping(int trackerCategory, TorznabCategory newznabCategory, string trackerCategoryDesc = null) @@ -566,6 +607,13 @@ namespace Jackett.Indexers var result = new List(); foreach (var cat in query.Categories) { + // use 1:1 mapping to tracker categories for newznab categories >= 100000 + if (cat >= 100000) + { + result.Add((cat - 100000).ToString()); + continue; + } + var queryCats = new List { cat }; var newznabCat = TorznabCatType.AllCats.FirstOrDefault(c => c.ID == cat); if (newznabCat != null) diff --git a/src/Jackett/Indexers/BroadcastTheNet.cs b/src/Jackett/Indexers/BroadcastTheNet.cs index 1f3233d93..a9917ba1b 100644 --- a/src/Jackett/Indexers/BroadcastTheNet.cs +++ b/src/Jackett/Indexers/BroadcastTheNet.cs @@ -106,7 +106,7 @@ namespace Jackett.Indexers var item = new ReleaseInfo(); if (!string.IsNullOrEmpty(btnResult.SeriesBanner)) item.BannerUrl = new Uri(btnResult.SeriesBanner); - item.Category = TorznabCatType.TV.ID; + item.Category = new List { TorznabCatType.TV.ID }; item.Comments = new Uri($"https://broadcasthe.net/torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}"); item.Description = btnResult.ReleaseName; item.Guid = new Uri(btnResult.DownloadURL); diff --git a/src/Jackett/Indexers/DanishBits.cs b/src/Jackett/Indexers/DanishBits.cs index 118a27cb8..316501ebb 100644 --- a/src/Jackett/Indexers/DanishBits.cs +++ b/src/Jackett/Indexers/DanishBits.cs @@ -223,13 +223,13 @@ namespace Jackett.Indexers ? seriesCatsDanish : seriesCatsDanish.Concat(seriesCatsIntl); if (moviesCats.Contains(catNo)) - release.Category = TorznabCatType.Movies.ID; + release.Category = new List { TorznabCatType.Movies.ID }; else if (seriesCats.Contains(catNo)) - release.Category = TorznabCatType.TV.ID; + release.Category = new List { TorznabCatType.TV.ID }; else if (catNo == 12) - release.Category = TorznabCatType.BooksEbook.ID; + release.Category = new List { TorznabCatType.BooksEbook.ID }; else if (catNo == 6) - release.Category = TorznabCatType.AudioAudiobook.ID; + release.Category = new List { TorznabCatType.AudioAudiobook.ID }; else continue; diff --git a/src/Jackett/Indexers/Demonoid.cs b/src/Jackett/Indexers/Demonoid.cs index 679e971dc..444f6b01b 100644 --- a/src/Jackett/Indexers/Demonoid.cs +++ b/src/Jackett/Indexers/Demonoid.cs @@ -131,14 +131,14 @@ namespace Jackett.Indexers release.Title = qLink.Text().Trim(); release.Description = rowB.ChildElements.ElementAt(0).Cq().Text(); - if (release.Category == TorznabCatType.Audio.ID) + if (release.Category != null && release.Category.Contains(TorznabCatType.Audio.ID)) { if (release.Description.Contains("Lossless")) - release.Category = TorznabCatType.AudioLossless.ID; + release.Category = new List { TorznabCatType.AudioLossless.ID }; else if (release.Description.Contains("MP3")) - release.Category = TorznabCatType.AudioMP3.ID; + release.Category = new List { TorznabCatType.AudioMP3.ID }; else - release.Category = TorznabCatType.AudioOther.ID; + release.Category = new List { TorznabCatType.AudioOther.ID }; } release.Comments = new Uri(SiteLink + qLink.Attr("href")); diff --git a/src/Jackett/Indexers/FileList.cs b/src/Jackett/Indexers/FileList.cs index 55d9ff5c0..5999de00f 100644 --- a/src/Jackett/Indexers/FileList.cs +++ b/src/Jackett/Indexers/FileList.cs @@ -169,7 +169,7 @@ namespace Jackett.Indexers release.UploadVolumeFactor = 1; // Skip Romanian releases - if (release.Category == TorznabCatType.MoviesForeign.ID && !configData.IncludeRomanianReleases.Value) + if (release.Category.Contains(TorznabCatType.MoviesForeign.ID) && !configData.IncludeRomanianReleases.Value) continue; releases.Add(release); diff --git a/src/Jackett/Indexers/Freshon.cs b/src/Jackett/Indexers/Freshon.cs index ddcd08ee5..5e3125cbb 100644 --- a/src/Jackett/Indexers/Freshon.cs +++ b/src/Jackett/Indexers/Freshon.cs @@ -114,7 +114,7 @@ namespace Jackett.Indexers release.Guid = new Uri(SiteLink + qLink.Attr("href").TrimStart('/')); release.Comments = release.Guid; release.Link = new Uri(SiteLink + qRow.Find("td.table_links > a").First().Attr("href").TrimStart('/')); - release.Category = TvCategoryParser.ParseTvShowQuality(release.Title); + release.Category = new List { TvCategoryParser.ParseTvShowQuality(release.Title) }; release.Seeders = ParseUtil.CoerceInt(qRow.Find("td.table_seeders").Text().Trim()); release.Peers = ParseUtil.CoerceInt(qRow.Find("td.table_leechers").Text().Trim()) + release.Seeders; diff --git a/src/Jackett/Indexers/Hardbay.cs b/src/Jackett/Indexers/Hardbay.cs index 19e69f83c..ea84d49f7 100644 --- a/src/Jackett/Indexers/Hardbay.cs +++ b/src/Jackett/Indexers/Hardbay.cs @@ -99,7 +99,7 @@ namespace Jackett.Indexers release.MinimumRatio = 0.5; release.MinimumSeedTime = 0; release.Title = row.name; - release.Category = TorznabCatType.Audio.ID; + release.Category = new List { TorznabCatType.Audio.ID }; release.Size = row.size; release.Seeders = row.seeders; release.Peers = row.leechers + release.Seeders; @@ -125,7 +125,7 @@ namespace Jackett.Indexers if ((int)row.flac != 0) { tags.Add("FLAC"); - release.Category = TorznabCatType.AudioLossless.ID; + release.Category = new List { TorznabCatType.AudioLossless.ID }; } if (tags.Count > 0) diff --git a/src/Jackett/Indexers/MoreThanTV.cs b/src/Jackett/Indexers/MoreThanTV.cs index bf50f2d4f..77d6d1c61 100644 --- a/src/Jackett/Indexers/MoreThanTV.cs +++ b/src/Jackett/Indexers/MoreThanTV.cs @@ -71,7 +71,7 @@ namespace Jackett.Indexers public async Task> PerformQuery(TorznabQuery query) { - var isTv = TorznabCatType.QueryContainsParentCategory(query.Categories, TorznabCatType.TV.ID); + var isTv = TorznabCatType.QueryContainsParentCategory(query.Categories, new List { TorznabCatType.TV.ID }); var releases = new List(); var searchQuery = query.GetQueryString(); @@ -229,7 +229,7 @@ namespace Jackett.Indexers { Title = title, Description = title, - Category = category, // Who seasons movies right + Category = new List { category }, // Who seasons movies right Link = new Uri(DownloadUrl + torrentId), PublishDate = publishDate, Seeders = seeders, diff --git a/src/Jackett/Indexers/PassThePopcorn.cs b/src/Jackett/Indexers/PassThePopcorn.cs index 591a52d12..303e2edb5 100644 --- a/src/Jackett/Indexers/PassThePopcorn.cs +++ b/src/Jackett/Indexers/PassThePopcorn.cs @@ -138,7 +138,7 @@ namespace Jackett.Indexers SearchUrl, HttpUtility.UrlEncode((string)torrent["Id"]), HttpUtility.UrlEncode(AuthKey), HttpUtility.UrlEncode(configData.Passkey.Value))); release.MinimumRatio = 1; release.MinimumSeedTime = 345600; - release.Category = 2000; + release.Category = new List { 2000 }; bool golden, scene, check; bool.TryParse((string)torrent["GoldenPopcorn"], out golden); diff --git a/src/Jackett/Indexers/PiXELHD.cs b/src/Jackett/Indexers/PiXELHD.cs index ef458ba8e..614033a74 100644 --- a/src/Jackett/Indexers/PiXELHD.cs +++ b/src/Jackett/Indexers/PiXELHD.cs @@ -181,7 +181,7 @@ namespace Jackett.Indexers var Leechers = Row.QuerySelector("td:nth-child(8)"); release.Title = GroupTitle + " " + title.TextContent; - release.Category = TorznabCatType.MoviesHD.ID; + release.Category = new List { TorznabCatType.MoviesHD.ID }; release.Link = new Uri(SiteLink + link.GetAttribute("href")); release.Comments = new Uri(SiteLink + title.GetAttribute("href")); release.Guid = release.Link; diff --git a/src/Jackett/Indexers/Pretome.cs b/src/Jackett/Indexers/Pretome.cs index 1d8b9553a..d1bdac6db 100644 --- a/src/Jackett/Indexers/Pretome.cs +++ b/src/Jackett/Indexers/Pretome.cs @@ -312,7 +312,7 @@ namespace Jackett.Indexers release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(10).InnerText) + release.Seeders; var cat = row.ChildElements.ElementAt(0).ChildElements.ElementAt(0).GetAttribute("href").Replace("browse.php?", string.Empty); - release.Category = MapTrackerResultCatToNewznab(cat); + release.Category = MapTrackerCatToNewznab(cat); var files = qRow.Find("td:nth-child(4)").Text(); release.Files = ParseUtil.CoerceInt(files); @@ -332,19 +332,5 @@ namespace Jackett.Indexers } return releases; } - - protected int MapTrackerResultCatToNewznab(string input) - { - if (null != input) - { - input = input.ToLowerInvariant(); - var mapping = resultMapping.Where(m => m.TrackerCategory.ToLowerInvariant() == input.ToLowerInvariant()).FirstOrDefault(); - if (mapping != null) - { - return mapping.NewzNabCategory; - } - } - return 0; - } } } diff --git a/src/Jackett/Indexers/RevolutionTT.cs b/src/Jackett/Indexers/RevolutionTT.cs index abb41ed87..5dc4c7e4b 100644 --- a/src/Jackett/Indexers/RevolutionTT.cs +++ b/src/Jackett/Indexers/RevolutionTT.cs @@ -285,8 +285,8 @@ namespace Jackett.Indexers }; // if unknown category, set to "other" - if (release.Category == 0) - release.Category = 7000; + if (release.Category.Count() == 0) + release.Category.Add(7000); release.Peers += release.Seeders; releases.Add(release); diff --git a/src/Jackett/Indexers/Shazbat.cs b/src/Jackett/Indexers/Shazbat.cs index 638b60c18..510f23106 100644 --- a/src/Jackett/Indexers/Shazbat.cs +++ b/src/Jackett/Indexers/Shazbat.cs @@ -209,11 +209,11 @@ namespace Jackett.Indexers { if (release.Title.Contains("1080p") || release.Title.Contains("720p")) { - release.Category = TorznabCatType.TVHD.ID; + release.Category = new List { TorznabCatType.TVHD.ID }; } else { - release.Category = TorznabCatType.TVSD.ID; + release.Category = new List { TorznabCatType.TVSD.ID }; } } diff --git a/src/Jackett/Indexers/TVChaosUK.cs b/src/Jackett/Indexers/TVChaosUK.cs index d1ebcaf7f..223059335 100644 --- a/src/Jackett/Indexers/TVChaosUK.cs +++ b/src/Jackett/Indexers/TVChaosUK.cs @@ -190,8 +190,8 @@ namespace Jackett.Indexers }; // If its not apps or audio we can only mark as general TV - if (release.Category == 0) - release.Category = 5030; + if (release.Category.Count() == 0) + release.Category.Add(5030); release.Peers += release.Seeders; releases.Add(release); @@ -256,8 +256,8 @@ namespace Jackett.Indexers release.Category = MapTrackerCatToNewznab(cat); // If its not apps or audio we can only mark as general TV - if (release.Category == 0) - release.Category = 5030; + if (release.Category.Count() == 0) + release.Category.Add(5030); var grabs = qRow.Find("td:nth-child(6)").Text(); release.Grabs = ParseUtil.CoerceInt(grabs); diff --git a/src/Jackett/Indexers/TVVault.cs b/src/Jackett/Indexers/TVVault.cs index 9e09ebff7..6a3776ce8 100644 --- a/src/Jackett/Indexers/TVVault.cs +++ b/src/Jackett/Indexers/TVVault.cs @@ -121,7 +121,7 @@ namespace Jackett.Indexers release.Description = DescStr.TextContent.Trim(); release.Title = qDetailsLink.TextContent + " " + release.Description; release.PublishDate = DateTimeUtil.FromTimeAgo(Added.TextContent); - release.Category = TvCategoryParser.ParseTvShowQuality(release.Description); + release.Category = new List { TvCategoryParser.ParseTvShowQuality(release.Description) }; release.Link = new Uri(SiteLink + DLLink); release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); diff --git a/src/Jackett/Indexers/TehConnection.cs b/src/Jackett/Indexers/TehConnection.cs index d1f93bfe5..ece1115ef 100644 --- a/src/Jackett/Indexers/TehConnection.cs +++ b/src/Jackett/Indexers/TehConnection.cs @@ -197,7 +197,7 @@ namespace Jackett.Indexers release.Peers = peers; release.MinimumRatio = 1; release.MinimumSeedTime = 345600; - release.Category = 2000; + release.Category = new List { 2000 }; release.Comments = movieReleasesLink; if (imdb_id > 0) { release.Imdb = imdb_id; diff --git a/src/Jackett/Indexers/Torrentech.cs b/src/Jackett/Indexers/Torrentech.cs index 9173eb668..9dd30fe77 100644 --- a/src/Jackett/Indexers/Torrentech.cs +++ b/src/Jackett/Indexers/Torrentech.cs @@ -169,13 +169,13 @@ namespace Jackett.Indexers release.Description = release.Description.Replace("\n", "
"); if (format.Contains("MP3")) - release.Category = TorznabCatType.AudioMP3.ID; + release.Category = new List { TorznabCatType.AudioMP3.ID }; else if (format.Contains("AAC")) - release.Category = TorznabCatType.AudioOther.ID; + release.Category = new List { TorznabCatType.AudioOther.ID }; else if (format.Contains("Lossless")) - release.Category = TorznabCatType.AudioLossless.ID; + release.Category = new List { TorznabCatType.AudioLossless.ID }; else - release.Category = TorznabCatType.AudioOther.ID; + release.Category = new List { TorznabCatType.AudioOther.ID }; var lastAction = Row.QuerySelector("td:nth-child(9) > span").FirstChild.NodeValue; release.PublishDate = DateTimeUtil.FromUnknown(lastAction, "UK"); diff --git a/src/Jackett/Indexers/TransmitheNet.cs b/src/Jackett/Indexers/TransmitheNet.cs index e016f717d..5904659cc 100644 --- a/src/Jackett/Indexers/TransmitheNet.cs +++ b/src/Jackett/Indexers/TransmitheNet.cs @@ -133,7 +133,7 @@ namespace Jackett.Indexers release.Guid = new Uri(SiteLink + row.QuerySelector("a[data-src]").GetAttribute("href")); release.Comments = release.Guid; release.Link = new Uri(SiteLink + row.QuerySelector("a[href*='action=download']").GetAttribute("href")); - release.Category = TvCategoryParser.ParseTvShowQuality(release.Title); + release.Category = new List { TvCategoryParser.ParseTvShowQuality(release.Title) }; var timeAnchor = row.QuerySelector("span[class='time']"); release.PublishDate = DateTime.ParseExact(timeAnchor.GetAttribute("title"), "MMM dd yyyy, HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal); diff --git a/src/Jackett/Indexers/XSpeeds.cs b/src/Jackett/Indexers/XSpeeds.cs index 9db28ca47..76f5ac8ee 100644 --- a/src/Jackett/Indexers/XSpeeds.cs +++ b/src/Jackett/Indexers/XSpeeds.cs @@ -290,8 +290,8 @@ namespace Jackett.Indexers release.Category = MapTrackerCatToNewznab(cat); // If its not apps or audio we can only mark as general TV - if (release.Category == 0) - release.Category = 5030; + if (release.Category != null) + release.Category = new List { 5030 }; var grabs = qRow.Find("td:nth-child(6)").Text(); release.Grabs = ParseUtil.CoerceInt(grabs); diff --git a/src/Jackett/JackettModule.cs b/src/Jackett/JackettModule.cs index e5919ac71..1bfc45ed6 100644 --- a/src/Jackett/JackettModule.cs +++ b/src/Jackett/JackettModule.cs @@ -104,7 +104,15 @@ namespace Jackett Mapper.CreateMap().AfterMap((r, t) => { - t.CategoryDesc = TorznabCatType.GetCatDesc(r.Category); + if (r.Category != null) + { + var CategoryDesc = string.Join(", ", r.Category.Select(x => TorznabCatType.GetCatDesc(x)).Where(x => !string.IsNullOrEmpty(x))); + t.CategoryDesc = CategoryDesc; + } + else + { + t.CategoryDesc = ""; + } }); } } diff --git a/src/Jackett/Models/ReleaseInfo.cs b/src/Jackett/Models/ReleaseInfo.cs index e228dfc0f..b6ca12cc7 100644 --- a/src/Jackett/Models/ReleaseInfo.cs +++ b/src/Jackett/Models/ReleaseInfo.cs @@ -17,7 +17,7 @@ namespace Jackett.Models public Uri Link { get; set; } public Uri Comments { get; set; } public DateTime PublishDate { get; set; } - public int Category { get; set; } + public ICollection Category { get; set; } public long? Size { get; set; } public long? Files { get; set; } public long? Grabs { get; set; } diff --git a/src/Jackett/Models/ResultPage.cs b/src/Jackett/Models/ResultPage.cs index 4e0bed056..45baf688d 100644 --- a/src/Jackett/Models/ResultPage.cs +++ b/src/Jackett/Models/ResultPage.cs @@ -74,7 +74,7 @@ namespace Jackett.Models r.Grabs == null ? null : new XElement("grabs", r.Grabs), new XElement("description", r.Description), new XElement("link", r.Link ?? r.MagnetUri), - r.Category == 0 ? null : new XElement("category", r.Category), + r.Category == null ? null : from c in r.Category select new XElement("category", c), new XElement( "enclosure", new XAttribute("url", r.Link ?? r.MagnetUri), diff --git a/src/Jackett/Models/TorznabCapabilities.cs b/src/Jackett/Models/TorznabCapabilities.cs index 003c21cfd..13264c0d8 100644 --- a/src/Jackett/Models/TorznabCapabilities.cs +++ b/src/Jackett/Models/TorznabCapabilities.cs @@ -69,7 +69,7 @@ namespace Jackett.Models public JArray CapsToJson() { var jArray = new JArray(); - foreach (var cat in Categories.GroupBy(p => p.ID).Select(g => g.First()).OrderBy(c=>c.ID)) + foreach (var cat in Categories.GroupBy(p => p.ID).Select(g => g.First()).OrderBy(c=> c.ID < 100000 ? "z"+c.ID.ToString() : c.Name)) { jArray.Add(cat.ToJson()); } @@ -96,7 +96,7 @@ namespace Jackett.Models ) ), new XElement("categories", - from c in Categories + from c in Categories.OrderBy(x => x.ID < 100000 ? "z" + x.ID.ToString() : x.Name) select new XElement("category", new XAttribute("id", c.ID), new XAttribute("name", c.Name), diff --git a/src/Jackett/Models/TorznabCatType.cs b/src/Jackett/Models/TorznabCatType.cs index 96d44b1aa..154272921 100644 --- a/src/Jackett/Models/TorznabCatType.cs +++ b/src/Jackett/Models/TorznabCatType.cs @@ -1,16 +1,20 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; namespace Jackett.Models { public static partial class TorznabCatType { - public static bool QueryContainsParentCategory(int[] queryCats, int releaseCat) + public static bool QueryContainsParentCategory(int[] queryCats, ICollection releaseCats) { - var cat = AllCats.FirstOrDefault(c => c.ID == releaseCat); - if (cat != null && queryCats != null) + foreach (var releaseCat in releaseCats) { - return cat.SubCategories.Any(c => queryCats.Contains(c.ID)); + var cat = AllCats.FirstOrDefault(c => c.ID == releaseCat); + if (cat != null && queryCats != null) + { + return cat.SubCategories.Any(c => queryCats.Contains(c.ID)); + } } return false; diff --git a/src/Jackett/Models/TorznabCategory.cs b/src/Jackett/Models/TorznabCategory.cs index 61fd74e24..5a068f0b4 100644 --- a/src/Jackett/Models/TorznabCategory.cs +++ b/src/Jackett/Models/TorznabCategory.cs @@ -43,6 +43,19 @@ namespace Jackett.Models t["ID"] = ID; t["Name"] = Name; return t; + } + + public override bool Equals(Object obj) + { + if (obj == null || GetType() != obj.GetType()) + return false; + + return ID == ((TorznabCategory)obj).ID; + } + + public override int GetHashCode() + { + return ID; } } }