diff --git a/src/Jackett.Test/Indexers/BakaBTTests.cs b/src/Jackett.Test/Indexers/BakaBTTests.cs index 0b9b471eb..13c7c26b3 100644 --- a/src/Jackett.Test/Indexers/BakaBTTests.cs +++ b/src/Jackett.Test/Indexers/BakaBTTests.cs @@ -158,20 +158,20 @@ namespace JackettTest.Indexers indexer.LoadFromSavedConfiguration(JObject.Parse("{\"cookies\":\"bbtid=c\"}")); var results = await indexer.PerformQuery(new Jackett.Models.TorznabQuery() { SanitizedSearchTerm = "Series S1", Season = 1 }); - results.Length.Should().Be(44); - results[0].Title.Should().Be("Golden Time Season 1 (BD 720p) [FFF]"); - results[0].Guid.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff"); - results[0].Comments.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff"); - results[0].Size.Should().Be(10307921920); - results[0].Description.Should().Be("Golden Time Season 1 (BD 720p) [FFF]"); - results[0].Link.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff"); - results[0].Peers.Should().Be(161); - results[0].Seeders.Should().Be(151); - results[0].MinimumRatio.Should().Be(1); + results.Count().Should().Be(44); + results.First().Title.Should().Be("Golden Time Season 1 (BD 720p) [FFF]"); + results.First().Guid.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff"); + results.First().Comments.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff"); + results.First().Size.Should().Be(10307921920); + results.First().Description.Should().Be("Golden Time Season 1 (BD 720p) [FFF]"); + results.First().Link.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff"); + results.First().Peers.Should().Be(161); + results.First().Seeders.Should().Be(151); + results.First().MinimumRatio.Should().Be(1); - results[1].Title.Should().Be("Yowamushi Pedal Season 1 (BD 720p) [Commie]"); - results[4].Title.Should().Be("Dungeon ni Deai o Motomeru no wa Machigatte Iru Darouka: Familia Myth Season 1 (480p) [HorribleSubs]"); - results[5].Title.Should().Be("Is It Wrong to Try to Pick Up Girls in a Dungeon? Season 1 (480p) [HorribleSubs]"); + results.ElementAt(1).Title.Should().Be("Yowamushi Pedal Season 1 (BD 720p) [Commie]"); + results.ElementAt(4).Title.Should().Be("Dungeon ni Deai o Motomeru no wa Machigatte Iru Darouka: Familia Myth Season 1 (480p) [HorribleSubs]"); + results.ElementAt(5).Title.Should().Be("Is It Wrong to Try to Pick Up Girls in a Dungeon? Season 1 (480p) [HorribleSubs]"); } } } diff --git a/src/Jackett/Content/index.html b/src/Jackett/Content/index.html index a94688fd7..7a4cfd93b 100644 --- a/src/Jackett/Content/index.html +++ b/src/Jackett/Content/index.html @@ -38,6 +38,7 @@ First Seen Tracker Name + Category Seeds Leechers Download @@ -52,6 +53,7 @@ {{formatRelative FirstSeen}} {{Tracker}} {{Title}} + {{CategoryDesc}} {{Seeders}} {{Peers}} diff --git a/src/Jackett/Content/logos/immortalseed.png b/src/Jackett/Content/logos/immortalseed.png new file mode 100644 index 000000000..7e8503e11 Binary files /dev/null and b/src/Jackett/Content/logos/immortalseed.png differ diff --git a/src/Jackett/Controllers/APIController.cs b/src/Jackett/Controllers/APIController.cs index 4b73d7dad..064bdc133 100644 --- a/src/Jackett/Controllers/APIController.cs +++ b/src/Jackett/Controllers/APIController.cs @@ -69,14 +69,16 @@ namespace Jackett.Controllers cacheService.CacheRssResults(indexer.DisplayName, releases); } + releases = indexer.FilterResults(torznabQuery, releases); + // Log info if (string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm)) { - logger.Info(string.Format("Found {0} releases from {1}", releases.Length, indexer.DisplayName)); + logger.Info(string.Format("Found {0} releases from {1}", releases.Count(), indexer.DisplayName)); } else { - logger.Info(string.Format("Found {0} releases from {1} for: {2}", releases.Length, indexer.DisplayName, torznabQuery.SanitizedSearchTerm)); + logger.Info(string.Format("Found {0} releases from {1} for: {2}", releases.Count(), indexer.DisplayName, torznabQuery.SanitizedSearchTerm)); } var severUrl = string.Format("{0}://{1}:{2}/", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port); diff --git a/src/Jackett/Indexers/AlphaRatio.cs b/src/Jackett/Indexers/AlphaRatio.cs index 7effde082..92d8f96e9 100644 --- a/src/Jackett/Indexers/AlphaRatio.cs +++ b/src/Jackett/Indexers/AlphaRatio.cs @@ -74,7 +74,7 @@ namespace Jackett.Indexers release.Link = new Uri(DownloadUrl + id); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); @@ -122,7 +122,7 @@ namespace Jackett.Indexers OnParseError(response.Content, ex); } - return releases.ToArray(); + return releases; } static DateTime UnixTimestampToDateTime(double unixTime) diff --git a/src/Jackett/Indexers/AnimeBytes.cs b/src/Jackett/Indexers/AnimeBytes.cs index 61b5223cc..8815e820f 100644 --- a/src/Jackett/Indexers/AnimeBytes.cs +++ b/src/Jackett/Indexers/AnimeBytes.cs @@ -33,7 +33,7 @@ namespace Jackett.Indexers description: "Powered by Tentacles", manager: i, client: client, - caps: new TorznabCapabilities(TorznabCategory.Anime), + caps: new TorznabCapabilities(TorznabCatType.Anime), logger: l) { } @@ -114,7 +114,7 @@ namespace Jackett.Indexers } } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { // The result list var releases = new List(); @@ -127,7 +127,7 @@ namespace Jackett.Indexers return releases.ToArray(); } - public async Task GetResults(string searchTerm) + public async Task> GetResults(string searchTerm) { // This tracker only deals with full seasons so chop off the episode/season number if we have it D: if (!string.IsNullOrWhiteSpace(searchTerm)) @@ -327,7 +327,7 @@ namespace Jackett.Indexers cache.Add(new CachedQueryResult(searchTerm, releases)); } - return releases.Select(s => (ReleaseInfo)s.Clone()).ToArray(); + return releases.Select(s => (ReleaseInfo)s.Clone()); } diff --git a/src/Jackett/Indexers/BB.cs b/src/Jackett/Indexers/BB.cs index edc9e3ca0..c652a4d6f 100644 --- a/src/Jackett/Indexers/BB.cs +++ b/src/Jackett/Indexers/BB.cs @@ -68,7 +68,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { List releases = new List(); @@ -113,7 +113,7 @@ namespace Jackett.Indexers { OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/BakaBT.cs b/src/Jackett/Indexers/BakaBT.cs index 46ccee3f9..8906664fa 100644 --- a/src/Jackett/Indexers/BakaBT.cs +++ b/src/Jackett/Indexers/BakaBT.cs @@ -25,7 +25,7 @@ namespace Jackett.Indexers : base(name: "BakaBT", description: "Anime Community", link: "http://bakabt.me/", - caps: new TorznabCapabilities(TorznabCategory.Anime), + caps: new TorznabCapabilities(TorznabCatType.Anime), manager: i, client: wc, logger: l) @@ -65,7 +65,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { // This tracker only deals with full seasons so chop off the episode/season number if we have it D: @@ -170,7 +170,7 @@ namespace Jackett.Indexers OnParseError(response.Content, ex); } - return releases.ToArray(); + return releases; } public override async Task Download(Uri link) diff --git a/src/Jackett/Indexers/BaseIndexer.cs b/src/Jackett/Indexers/BaseIndexer.cs index 105d96796..5c54451b9 100644 --- a/src/Jackett/Indexers/BaseIndexer.cs +++ b/src/Jackett/Indexers/BaseIndexer.cs @@ -29,6 +29,8 @@ namespace Jackett.Indexers protected IWebClient webclient; protected string cookieHeader = ""; + private List categoryMapping = new List(); + public BaseIndexer(string name, string link, string description, IIndexerManagerService manager, IWebClient client, Logger logger, TorznabCapabilities caps = null) { if (!link.EndsWith("/")) @@ -46,6 +48,19 @@ namespace Jackett.Indexers TorznabCaps = caps; } + protected int MapTrackerCatToNewznab(string input) + { + if (null != input) { + input = input.ToLowerInvariant(); + var mapping = categoryMapping.Where(m => m.TrackerCategory == input).FirstOrDefault(); + if(mapping!= null) + { + return mapping.NewzNabCategory; + } + } + return 0; + } + public static string GetIndexerID(Type type) { return StringUtil.StripNonAlphaNumeric(type.Name.ToLowerInvariant()); @@ -239,5 +254,40 @@ namespace Jackett.Indexers onError(); } } + + public virtual IEnumerable FilterResults(TorznabQuery query, IEnumerable results) + { + foreach(var result in results) + { + if(query.Categories.Length == 0 || query.Categories.Contains(result.Category) || result.Category == 0 || TorznabCatType.QueryContainsParentCategory(query.Categories, result.Category)) + { + yield return result; + } + } + } + + protected void AddCategoryMapping(string trackerCategory, int newznabCategory) + { + categoryMapping.Add(new CategoryMapping(trackerCategory, newznabCategory)); + } + + protected void AddCategoryMapping(int trackerCategory, TorznabCategory newznabCategory) + { + categoryMapping.Add(new CategoryMapping(trackerCategory.ToString(), newznabCategory.ID)); + if (!TorznabCaps.Categories.Contains(newznabCategory)) + TorznabCaps.Categories.Add(newznabCategory); + } + + protected void AddCategoryMapping(string trackerCategory, TorznabCategory newznabCategory) + { + categoryMapping.Add(new CategoryMapping(trackerCategory.ToString(), newznabCategory.ID)); + if (!TorznabCaps.Categories.Contains(newznabCategory)) + TorznabCaps.Categories.Add(newznabCategory); + } + + protected void AddCategoryMapping(int trackerCategory, int newznabCategory) + { + categoryMapping.Add(new CategoryMapping(trackerCategory.ToString(), newznabCategory)); + } } } diff --git a/src/Jackett/Indexers/BeyondHD.cs b/src/Jackett/Indexers/BeyondHD.cs index d4827561d..bf41d902e 100644 --- a/src/Jackett/Indexers/BeyondHD.cs +++ b/src/Jackett/Indexers/BeyondHD.cs @@ -56,7 +56,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { List releases = new List(); @@ -105,7 +105,7 @@ namespace Jackett.Indexers OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/BitHdtv.cs b/src/Jackett/Indexers/BitHdtv.cs index c64af764f..199754edf 100644 --- a/src/Jackett/Indexers/BitHdtv.cs +++ b/src/Jackett/Indexers/BitHdtv.cs @@ -61,10 +61,9 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString); var results = await RequestStringWithCookies(episodeSearchUrl); @@ -107,7 +106,7 @@ namespace Jackett.Indexers OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/BitMeTV.cs b/src/Jackett/Indexers/BitMeTV.cs index bb1b981ce..8de331ef3 100644 --- a/src/Jackett/Indexers/BitMeTV.cs +++ b/src/Jackett/Indexers/BitMeTV.cs @@ -74,10 +74,9 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(searchString)); var results = await RequestStringWithCookies(episodeSearchUrl); @@ -129,7 +128,7 @@ namespace Jackett.Indexers OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/FrenchTorrentDb.cs b/src/Jackett/Indexers/FrenchTorrentDb.cs index 698250440..e435cb0f5 100644 --- a/src/Jackett/Indexers/FrenchTorrentDb.cs +++ b/src/Jackett/Indexers/FrenchTorrentDb.cs @@ -55,7 +55,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { List releases = new List(); @@ -94,7 +94,7 @@ namespace Jackett.Indexers OnParseError(response.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/Freshon.cs b/src/Jackett/Indexers/Freshon.cs index 697eb9f8e..f936046f6 100644 --- a/src/Jackett/Indexers/Freshon.cs +++ b/src/Jackett/Indexers/Freshon.cs @@ -65,10 +65,9 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); string episodeSearchUrl; if (string.IsNullOrEmpty(query.SanitizedSearchTerm)) @@ -125,7 +124,7 @@ namespace Jackett.Indexers OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/HDSpace.cs b/src/Jackett/Indexers/HDSpace.cs index e942726dc..82f7bfb0c 100644 --- a/src/Jackett/Indexers/HDSpace.cs +++ b/src/Jackett/Indexers/HDSpace.cs @@ -62,10 +62,9 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var response = await RequestStringWithCookies(episodeSearchUrl); @@ -117,7 +116,7 @@ namespace Jackett.Indexers { OnParseError(results, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/HDTorrents.cs b/src/Jackett/Indexers/HDTorrents.cs index 053c38998..2d25b7686 100644 --- a/src/Jackett/Indexers/HDTorrents.cs +++ b/src/Jackett/Indexers/HDTorrents.cs @@ -59,11 +59,10 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { var releases = new List(); var searchurls = new List(); - var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString.Trim())); var results = await RequestStringWithCookies(searchUrl); @@ -132,7 +131,7 @@ namespace Jackett.Indexers OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/IIndexer.cs b/src/Jackett/Indexers/IIndexer.cs index dc92bc3be..c768591eb 100644 --- a/src/Jackett/Indexers/IIndexer.cs +++ b/src/Jackett/Indexers/IIndexer.cs @@ -31,7 +31,9 @@ namespace Jackett.Indexers // Called on startup when initializing indexers from saved configuration void LoadFromSavedConfiguration(JToken jsonConfig); - Task PerformQuery(TorznabQuery query); + Task> PerformQuery(TorznabQuery query); + + IEnumerable FilterResults(TorznabQuery query, IEnumerable input); Task Download(Uri link); } diff --git a/src/Jackett/Indexers/IPTorrents.cs b/src/Jackett/Indexers/IPTorrents.cs index 6cc8dd13c..3ec755e94 100644 --- a/src/Jackett/Indexers/IPTorrents.cs +++ b/src/Jackett/Indexers/IPTorrents.cs @@ -30,7 +30,7 @@ namespace Jackett.Indexers client: wc, logger: l) { - TorznabCaps.Categories.Add(new TorznabCategory { ID = "5070", Name = "TV/Anime" }); + TorznabCaps.Categories.Add(TorznabCatType.Anime); } public Task GetConfigurationForSetup() @@ -67,7 +67,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); @@ -134,7 +134,7 @@ namespace Jackett.Indexers OnParseError(results, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/ImmortalSeed.cs b/src/Jackett/Indexers/ImmortalSeed.cs new file mode 100644 index 000000000..060b17820 --- /dev/null +++ b/src/Jackett/Indexers/ImmortalSeed.cs @@ -0,0 +1,156 @@ +using CsQuery; +using Jackett.Models; +using Jackett.Services; +using Jackett.Utils; +using Jackett.Utils.Clients; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using System.Web; + +namespace Jackett.Indexers +{ + public class ImmortalSeed : BaseIndexer, IIndexer + { + private string BrowsePage { get { return SiteLink + "browse.php"; } } + private string LoginUrl { get { return SiteLink + "takelogin.php"; } } + private string QueryString { get { return "?do=search&keywords={0}&search_type=t_name&category=0&include_dead_torrents=no"; } } + + public ImmortalSeed(IIndexerManagerService i, IWebClient wc, Logger l) + : base(name: "ImmortalSeed", + description: "ImmortalSeed", + link: "http://immortalseed.me/", + caps: TorznabCapsUtil.CreateDefaultTorznabTVCaps(), + manager: i, + client: wc, + logger: l) + { + AddCategoryMapping(32, TorznabCatType.Anime); + AddCategoryMapping(47, TorznabCatType.TVSD); + AddCategoryMapping(8, TorznabCatType.TVHD); + AddCategoryMapping(48, TorznabCatType.TVHD); + AddCategoryMapping(9, TorznabCatType.TVSD); + AddCategoryMapping(4, TorznabCatType.TVHD); + AddCategoryMapping(6, TorznabCatType.TVSD); + + AddCategoryMapping(22, TorznabCatType.Books); + AddCategoryMapping(41, TorznabCatType.Comic); + AddCategoryMapping(23, TorznabCatType.Apps); + + AddCategoryMapping(16, TorznabCatType.MoviesHD); + AddCategoryMapping(17, TorznabCatType.MoviesSD); + AddCategoryMapping(14, TorznabCatType.MoviesSD); + AddCategoryMapping(34, TorznabCatType.MoviesForeign); + AddCategoryMapping(18, TorznabCatType.MoviesForeign); + AddCategoryMapping(33, TorznabCatType.MoviesForeign); + + AddCategoryMapping(34, TorznabCatType.Audio); + AddCategoryMapping(37, TorznabCatType.AudioLossless); + AddCategoryMapping(35, TorznabCatType.AudioBooks); + AddCategoryMapping(36, TorznabCatType.AudioLossy); + + } + + public Task GetConfigurationForSetup() + { + return Task.FromResult(new ConfigurationDataBasicLogin()); + } + + public async Task ApplyConfiguration(JToken configJson) + { + var incomingConfig = new ConfigurationDataBasicLogin(); + incomingConfig.LoadValuesFromJson(configJson); + var pairs = new Dictionary { + { "username", incomingConfig.Username.Value }, + { "password", incomingConfig.Password.Value } + }; + var request = new Utils.Clients.WebRequest() + { + Url = LoginUrl, + Type = RequestType.POST, + Referer = SiteLink, + PostData = pairs + }; + var response = await webclient.GetString(request); + CQ splashDom = response.Content; + var link = splashDom[".trow2 a"].First(); + var resultPage = await RequestStringWithCookies(link.Attr("href"), response.Cookies); + CQ resultDom = resultPage.Content; + + ConfigureIfOK(response.Cookies, resultPage.Content.Contains("/logout.php"), () => + { + var tries = resultDom["#main tr:eq(1) td font"].First().Text(); + var errorMessage = "Incorrect username or password! " + tries + " tries remaining."; + throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)incomingConfig); + }); + } + + public async Task> PerformQuery(TorznabQuery query) + { + var releases = new List(); + var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); + var searchUrl = BrowsePage; + + if (!string.IsNullOrWhiteSpace(searchString)) + { + searchUrl += string.Format(QueryString, HttpUtility.UrlEncode(searchString)); + } + + var results = await RequestStringWithCookies(searchUrl); + + try + { + CQ dom = results.Content; + + var rows = dom["#sortabletable tr"]; + foreach (var row in rows.Skip(1)) + { + var release = new ReleaseInfo(); + var qRow = row.Cq(); + release.Title = qRow.Find(".tooltip-content div").First().Text(); + release.Description = qRow.Find(".tooltip-content div").Get(1).InnerText.Trim(); + + var qLink = row.Cq().Find("td:eq(2) a:eq(1)"); + release.Link = new Uri(qLink.Attr("href")); + release.Guid = release.Link; + release.Comments = new Uri(qRow.Find(".tooltip-target a").First().Attr("href")); + + // 07-22-2015 11:08 AM + var dateString = qRow.Find("td:eq(1) div").Last().Children().Remove().End().Text().Trim(); + release.PublishDate = DateTime.ParseExact(dateString, "MM-dd-yyyy hh:mm tt", CultureInfo.InvariantCulture); + + var sizeStr = qRow.Find("td:eq(4)").Text().Trim(); + release.Size = ReleaseInfo.GetBytes(sizeStr); + + release.Seeders = ParseUtil.CoerceInt(qRow.Find("td:eq(6)").Text().Trim()); + release.Peers = ParseUtil.CoerceInt(qRow.Find("td:eq(7)").Text().Trim()) + release.Seeders; + + var catLink = row.Cq().Find("td:eq(0) a").First().Attr("href"); + var catSplit = catLink.IndexOf("category="); + if (catSplit > -1) + { + catLink = catLink.Substring(catSplit + 9); + } + + release.Category = MapTrackerCatToNewznab(catLink); + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results.Content, ex); + } + + return releases; + } + + + } +} diff --git a/src/Jackett/Indexers/MoreThanTV.cs b/src/Jackett/Indexers/MoreThanTV.cs index 23039992d..0622374b6 100644 --- a/src/Jackett/Indexers/MoreThanTV.cs +++ b/src/Jackett/Indexers/MoreThanTV.cs @@ -72,10 +72,9 @@ namespace Jackett.Indexers release.Link = new Uri(DownloadUrl + id); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString); WebClientStringResult response = null; @@ -136,7 +135,7 @@ namespace Jackett.Indexers OnParseError(response.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/Pretome.cs b/src/Jackett/Indexers/Pretome.cs index 671498464..ced0ee55f 100644 --- a/src/Jackett/Indexers/Pretome.cs +++ b/src/Jackett/Indexers/Pretome.cs @@ -69,10 +69,9 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); @@ -119,7 +118,7 @@ namespace Jackett.Indexers { OnParseError(response.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/PrivateHD.cs b/src/Jackett/Indexers/PrivateHD.cs index e895bba23..a8fb3caad 100644 --- a/src/Jackett/Indexers/PrivateHD.cs +++ b/src/Jackett/Indexers/PrivateHD.cs @@ -61,10 +61,9 @@ namespace Jackett.Indexers return Task.FromResult(new ConfigurationDataBasicLogin()); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); @@ -106,7 +105,7 @@ namespace Jackett.Indexers { OnParseError(response.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/Rarbg.cs b/src/Jackett/Indexers/Rarbg.cs index f60f31d1c..9ec9cf48f 100644 --- a/src/Jackett/Indexers/Rarbg.cs +++ b/src/Jackett/Indexers/Rarbg.cs @@ -71,12 +71,12 @@ namespace Jackett.Indexers return (string)obj["token"]; } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { return await PerformQuery(query, BaseUrl); } - async Task PerformQuery(TorznabQuery query, string baseUrl) + async Task> PerformQuery(TorznabQuery query, string baseUrl) { var releases = new List(); string token = await GetToken(baseUrl); @@ -109,7 +109,7 @@ namespace Jackett.Indexers { OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } public override Task Download(Uri link) diff --git a/src/Jackett/Indexers/SceneAccess.cs b/src/Jackett/Indexers/SceneAccess.cs index a3752c409..7b8062154 100644 --- a/src/Jackett/Indexers/SceneAccess.cs +++ b/src/Jackett/Indexers/SceneAccess.cs @@ -57,7 +57,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); @@ -104,7 +104,7 @@ namespace Jackett.Indexers OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/SceneTime.cs b/src/Jackett/Indexers/SceneTime.cs index fc3405b99..af3f16f2d 100644 --- a/src/Jackett/Indexers/SceneTime.cs +++ b/src/Jackett/Indexers/SceneTime.cs @@ -66,7 +66,7 @@ namespace Jackett.Indexers }; } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); @@ -111,7 +111,7 @@ namespace Jackett.Indexers { OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/ShowRSS.cs b/src/Jackett/Indexers/ShowRSS.cs index 84aad0787..8443fa6bd 100644 --- a/src/Jackett/Indexers/ShowRSS.cs +++ b/src/Jackett/Indexers/ShowRSS.cs @@ -45,7 +45,7 @@ namespace Jackett.Indexers var formattedUrl = config.GetFormattedHostUrl(); var releases = await PerformQuery(new TorznabQuery(), formattedUrl); - if (releases.Length == 0) + if (releases.Count() == 0) throw new Exception("Could not find releases from this URL"); BaseUrl = formattedUrl; @@ -62,7 +62,7 @@ namespace Jackett.Indexers IsConfigured = true; } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { return await PerformQuery(query, BaseUrl); } @@ -72,7 +72,7 @@ namespace Jackett.Indexers throw new NotImplementedException(); } - async Task PerformQuery(TorznabQuery query, string baseUrl) + async Task> PerformQuery(TorznabQuery query, string baseUrl) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); @@ -97,7 +97,9 @@ namespace Jackett.Indexers release.Title = serie_title; release.Comments = new Uri(node.SelectSingleNode("link").InnerText); - release.Category = node.SelectSingleNode("title").InnerText; + int category = 0; + int.TryParse(node.SelectSingleNode("title").InnerText, out category); + release.Category = category; var test = node.SelectSingleNode("enclosure"); release.Guid = new Uri(test.Attributes["url"].Value); release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture); @@ -116,7 +118,7 @@ namespace Jackett.Indexers OnParseError(result.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/SpeedCD.cs b/src/Jackett/Indexers/SpeedCD.cs index 47d8a76cc..9873f1206 100644 --- a/src/Jackett/Indexers/SpeedCD.cs +++ b/src/Jackett/Indexers/SpeedCD.cs @@ -60,7 +60,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { var releases = new List(); var formData = HttpUtility.ParseQueryString(SearchFormData); @@ -101,7 +101,7 @@ namespace Jackett.Indexers { OnParseError(response.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/Strike.cs b/src/Jackett/Indexers/Strike.cs index 1dea1605b..e3937744f 100644 --- a/src/Jackett/Indexers/Strike.cs +++ b/src/Jackett/Indexers/Strike.cs @@ -56,7 +56,7 @@ namespace Jackett.Indexers IsConfigured = !string.IsNullOrEmpty(baseUrl); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { List releases = new List(); @@ -105,7 +105,7 @@ namespace Jackett.Indexers OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } public override Task Download(Uri link) diff --git a/src/Jackett/Indexers/T411.cs b/src/Jackett/Indexers/T411.cs index 797ecdcd4..17b2a6d67 100644 --- a/src/Jackett/Indexers/T411.cs +++ b/src/Jackett/Indexers/T411.cs @@ -118,10 +118,9 @@ namespace Jackett.Indexers IsConfigured = true; } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); var searchTerm = string.IsNullOrEmpty(query.SanitizedSearchTerm) ? "%20" : query.SanitizedSearchTerm; var searchString = searchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); @@ -166,7 +165,7 @@ namespace Jackett.Indexers { OnParseError(results, ex); } - return releases.ToArray(); + return releases; } public override async Task Download(Uri link) diff --git a/src/Jackett/Indexers/ThePirateBay.cs b/src/Jackett/Indexers/ThePirateBay.cs index 598022251..c854b7ec0 100644 --- a/src/Jackett/Indexers/ThePirateBay.cs +++ b/src/Jackett/Indexers/ThePirateBay.cs @@ -48,7 +48,7 @@ namespace Jackett.Indexers var formattedUrl = config.GetFormattedHostUrl(); var releases = await PerformQuery(new TorznabQuery(), formattedUrl); - if (releases.Length == 0) + if (releases.Count() == 0) throw new Exception("Could not find releases from this URL"); BaseUrl = formattedUrl; @@ -65,12 +65,12 @@ namespace Jackett.Indexers IsConfigured = true; } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { return await PerformQuery(query, BaseUrl); } - async Task PerformQuery(TorznabQuery query, string baseUrl) + async Task> PerformQuery(TorznabQuery query, string baseUrl) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); diff --git a/src/Jackett/Indexers/TorrentDay.cs b/src/Jackett/Indexers/TorrentDay.cs index 529c814a6..5f850cfbc 100644 --- a/src/Jackett/Indexers/TorrentDay.cs +++ b/src/Jackett/Indexers/TorrentDay.cs @@ -63,7 +63,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); @@ -103,7 +103,7 @@ namespace Jackett.Indexers { OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/TorrentLeech.cs b/src/Jackett/Indexers/TorrentLeech.cs index 131bc3e52..b0ecae6bb 100644 --- a/src/Jackett/Indexers/TorrentLeech.cs +++ b/src/Jackett/Indexers/TorrentLeech.cs @@ -59,10 +59,9 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { - List releases = new List(); - + var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var results = await RequestStringWithCookies(episodeSearchUrl); @@ -111,7 +110,7 @@ namespace Jackett.Indexers OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/TorrentShack.cs b/src/Jackett/Indexers/TorrentShack.cs index a01aa47fb..c8b04c45e 100644 --- a/src/Jackett/Indexers/TorrentShack.cs +++ b/src/Jackett/Indexers/TorrentShack.cs @@ -61,7 +61,7 @@ namespace Jackett.Indexers }); } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); @@ -99,7 +99,7 @@ namespace Jackett.Indexers { OnParseError(results.Content, ex); } - return releases.ToArray(); + return releases; } } } diff --git a/src/Jackett/Indexers/Torrentz.cs b/src/Jackett/Indexers/Torrentz.cs index da7b6f57d..365db306a 100644 --- a/src/Jackett/Indexers/Torrentz.cs +++ b/src/Jackett/Indexers/Torrentz.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using System.Web; using System.Windows.Forms; using System.Xml; +using System.Linq; namespace Jackett.Indexers { @@ -43,8 +44,8 @@ namespace Jackett.Indexers config.LoadValuesFromJson(configJson); var formattedUrl = config.GetFormattedHostUrl(); - var releases = await PerformQuery(new TorznabQuery(), formattedUrl); - if (releases.Length == 0) + IEnumerable releases = await PerformQuery(new TorznabQuery(), formattedUrl); + if (releases.Count() == 0) throw new Exception("Could not find releases from this URL"); BaseUrl = formattedUrl; @@ -52,10 +53,9 @@ namespace Jackett.Indexers configSaveData["base_url"] = BaseUrl; SaveConfig(configSaveData); IsConfigured = true; - } - async Task PerformQuery(TorznabQuery query, string baseUrl) + async Task> PerformQuery(TorznabQuery query, string baseUrl) { var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); @@ -82,7 +82,9 @@ namespace Jackett.Indexers release.Title = serie_title; release.Comments = new Uri(node.SelectSingleNode("link").InnerText); - release.Category = node.SelectSingleNode("category").InnerText; + int category = 0; + int.TryParse(node.SelectSingleNode("category").InnerText, out category); + release.Category = category; release.Guid = new Uri(node.SelectSingleNode("guid").InnerText); release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture); @@ -101,7 +103,7 @@ namespace Jackett.Indexers OnParseError(xml, ex); } - return releases.ToArray(); + return releases; } @@ -111,7 +113,7 @@ namespace Jackett.Indexers IsConfigured = true; } - public async Task PerformQuery(TorznabQuery query) + public async Task> PerformQuery(TorznabQuery query) { return await PerformQuery(query, BaseUrl); } diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 15c99e613..c3aa3e18f 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -175,6 +175,7 @@ + @@ -192,6 +193,7 @@ + @@ -199,6 +201,7 @@ + diff --git a/src/Jackett/JackettModule.cs b/src/Jackett/JackettModule.cs index 0f1978581..96d4de638 100644 --- a/src/Jackett/JackettModule.cs +++ b/src/Jackett/JackettModule.cs @@ -9,6 +9,7 @@ using Jackett.Indexers; using Jackett.Utils; using Jackett.Utils.Clients; using AutoMapper; +using Jackett.Models; namespace Jackett { @@ -58,6 +59,11 @@ namespace Jackett Mapper.CreateMap(); Mapper.CreateMap(); + + Mapper.CreateMap().AfterMap((r, t) => + { + t.CategoryDesc = TorznabCatType.GetCatDesc(r.Category); + }); } } } diff --git a/src/Jackett/Models/CategoryMapping.cs b/src/Jackett/Models/CategoryMapping.cs new file mode 100644 index 000000000..6ab314c48 --- /dev/null +++ b/src/Jackett/Models/CategoryMapping.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Jackett.Models +{ + class CategoryMapping + { + public CategoryMapping(string trackerCat, int newzCat) + { + TrackerCategory = trackerCat.ToLowerInvariant(); + NewzNabCategory = newzCat; + } + + public string TrackerCategory { get; private set; } + public int NewzNabCategory { get; private set; } + } +} diff --git a/src/Jackett/Models/ReleaseInfo.cs b/src/Jackett/Models/ReleaseInfo.cs index a12dac0bf..2e24293b3 100644 --- a/src/Jackett/Models/ReleaseInfo.cs +++ b/src/Jackett/Models/ReleaseInfo.cs @@ -16,7 +16,7 @@ namespace Jackett.Models public Uri Link { get; set; } public Uri Comments { get; set; } public DateTime PublishDate { get; set; } - public string Category { get; set; } + public int Category { get; set; } public long? Size { get; set; } public string Description { get; set; } public long? RageID { get; set; } diff --git a/src/Jackett/Models/ResultPage.cs b/src/Jackett/Models/ResultPage.cs index fe238e225..7593ea0b6 100644 --- a/src/Jackett/Models/ResultPage.cs +++ b/src/Jackett/Models/ResultPage.cs @@ -63,8 +63,6 @@ namespace Jackett.Models new XElement("link", ChannelInfo.ImageLink.ToString()), new XElement("description", ChannelInfo.ImageDescription) ), - - from r in Releases select new XElement("item", new XElement("title", r.Title), @@ -74,7 +72,7 @@ namespace Jackett.Models r.Size == null ? null : new XElement("size", r.Size), new XElement("description", r.Description), new XElement("link", r.Link ?? r.MagnetUri), - r.Category == null ? null : new XElement("category", r.Category), + r.Category == 0 ? null : new XElement("category", r.Category), new XElement( "enclosure", new XAttribute("url", r.Link ?? r.MagnetUri), diff --git a/src/Jackett/Models/TorznabCatType.cs b/src/Jackett/Models/TorznabCatType.cs new file mode 100644 index 000000000..8270a2566 --- /dev/null +++ b/src/Jackett/Models/TorznabCatType.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Jackett.Models +{ + class TorznabCatType + { + private static Dictionary cats = new Dictionary(); + + static TorznabCatType() + { + cats.Add(5000, "TV"); + cats.Add(5030, "TV/SD"); + cats.Add(5040, "TV/HD"); + cats.Add(5070, "TV/Anime"); + cats.Add(8000, "Books"); + cats.Add(8020, "Books/Comics"); + cats.Add(4000, "PC"); + cats.Add(3030, "Audio/Audiobook"); + cats.Add(2040, "Movies/HD"); + cats.Add(2030, "Movies/SD"); + cats.Add(2010, "Movies/Foreign"); + cats.Add(3000, "Audio"); + cats.Add(3040, "Audio/Lossless"); + cats.Add(3010, "Audio/MP3"); + } + + public static bool QueryContainsParentCategory(int[] queryCats, int releaseCat) + { + if (cats.ContainsKey(releaseCat) && queryCats!=null) + { + var ncab = cats[releaseCat]; + var split = ncab.IndexOf("/"); + if (split > -1) + { + string parentCatName = ncab.Substring(0,split); + if (cats.ContainsValue(parentCatName)) + { + var parentCat = cats.Where(c => c.Value == parentCatName).First().Key; + return queryCats.Contains(parentCat); + } + } + } + + return false; + } + + public static string GetCatDesc(int newznabcat) + { + if (cats.ContainsKey(newznabcat)) + { + return cats[newznabcat]; + } + + return string.Empty; + } + + private static TorznabCategory GetCat(int id) + { + return new TorznabCategory() + { + ID = id, + Name = cats[id] + }; + } + + public static TorznabCategory Anime + { + get { return GetCat(5070); } + } + + public static TorznabCategory TV + { + get { return GetCat(5000); } + } + + public static TorznabCategory TVSD + { + get { return GetCat(5030); } + } + + public static TorznabCategory TVHD + { + get { return GetCat(5040); } + } + + public static TorznabCategory Books + { + get { return GetCat(8000); } + } + + public static TorznabCategory Comic + { + get { return GetCat(8020); } + } + + public static TorznabCategory Apps + { + get { return GetCat(4000); } + } + + public static TorznabCategory AudioBooks + { + get { return GetCat(3030); } + } + + public static TorznabCategory MoviesHD + { + get { return GetCat(2040); } + } + + public static TorznabCategory MoviesSD + { + get { return GetCat(2040); } + } + + public static TorznabCategory MoviesForeign + { + get { return GetCat(2040); } + } + + public static TorznabCategory Audio + { + get { return GetCat(3000); } + } + + public static TorznabCategory AudioLossless + { + get { return GetCat(3040); } + } + + public static TorznabCategory AudioLossy + { + get { return GetCat(3010); } + } + } +} diff --git a/src/Jackett/Models/TorznabCategory.cs b/src/Jackett/Models/TorznabCategory.cs index f1e059aa8..c65c3d784 100644 --- a/src/Jackett/Models/TorznabCategory.cs +++ b/src/Jackett/Models/TorznabCategory.cs @@ -8,7 +8,7 @@ namespace Jackett.Models { public class TorznabCategory { - public string ID { get; set; } + public int ID { get; set; } public string Name { get; set; } public List SubCategories { get; private set; } @@ -17,53 +17,5 @@ namespace Jackett.Models { SubCategories = new List(); } - - public static TorznabCategory Anime - { - get - { - return new TorznabCategory() - { - ID = "5070", - Name = "TV/Anime" - }; - } - } - - public static TorznabCategory TV - { - get - { - return new TorznabCategory() - { - ID = "5000", - Name = "TV" - }; - } - } - - public static TorznabCategory TVSD - { - get - { - return new TorznabCategory() - { - ID = "5030", - Name = "TV/SD" - }; - } - } - - public static TorznabCategory TVHD - { - get - { - return new TorznabCategory() - { - ID = "5040", - Name = "TV/HD" - }; - } - } } } diff --git a/src/Jackett/Models/TorznabQuery.cs b/src/Jackett/Models/TorznabQuery.cs index d27698517..449b3af96 100644 --- a/src/Jackett/Models/TorznabQuery.cs +++ b/src/Jackett/Models/TorznabQuery.cs @@ -12,7 +12,7 @@ namespace Jackett.Models public class TorznabQuery { public string QueryType { get; set; } - public string[] Categories { get; set; } + public int[] Categories { get; set; } public int Extended { get; set; } public string ApiKey { get; set; } public int Limit { get; set; } @@ -74,7 +74,10 @@ namespace Jackett.Models if (query["cat"] != null) { - q.Categories = query["cat"].Split(','); + q.Categories = query["cat"].Split(',').Select(s => int.Parse(s)).ToArray(); + }else + { + q.Categories = new int[0]; } if (query["extended"] != null) diff --git a/src/Jackett/Models/TrackerCacheResult.cs b/src/Jackett/Models/TrackerCacheResult.cs index 0ea9af650..13b1569e8 100644 --- a/src/Jackett/Models/TrackerCacheResult.cs +++ b/src/Jackett/Models/TrackerCacheResult.cs @@ -10,5 +10,6 @@ namespace Jackett.Models { public DateTime FirstSeen { get; set; } public string Tracker { get; set; } + public string CategoryDesc { get; set; } } } diff --git a/src/Jackett/Services/CacheService.cs b/src/Jackett/Services/CacheService.cs index 400649f38..1289a393d 100644 --- a/src/Jackett/Services/CacheService.cs +++ b/src/Jackett/Services/CacheService.cs @@ -10,7 +10,7 @@ namespace Jackett.Services { public interface ICacheService { - void CacheRssResults(string trackerId, ReleaseInfo[] releases); + void CacheRssResults(string trackerId, IEnumerable releases); List GetCachedResults(); } @@ -20,12 +20,7 @@ namespace Jackett.Services private readonly int MAX_RESULTS_PER_TRACKER = 100; private readonly TimeSpan AGE_LIMIT = new TimeSpan(2, 0, 0, 0); - static CacheService() - { - Mapper.CreateMap(); - } - - public void CacheRssResults(string trackerId, ReleaseInfo[] releases) + public void CacheRssResults(string trackerId, IEnumerable releases) { lock (cache) { diff --git a/src/Jackett/Services/IndexerManagerService.cs b/src/Jackett/Services/IndexerManagerService.cs index fe6ed4f06..28b855f43 100644 --- a/src/Jackett/Services/IndexerManagerService.cs +++ b/src/Jackett/Services/IndexerManagerService.cs @@ -77,8 +77,8 @@ namespace Jackett.Services var indexer = GetIndexer(name); var browseQuery = new TorznabQuery(); var results = await indexer.PerformQuery(browseQuery); - logger.Info(string.Format("Found {0} releases from {1}", results.Length, indexer.DisplayName)); - if (results.Length == 0) + logger.Info(string.Format("Found {0} releases from {1}", results.Count(), indexer.DisplayName)); + if (results.Count() == 0) throw new Exception("Found no results while trying to browse this tracker"); } diff --git a/src/Jackett/Utils/TorznabCapsUtil.cs b/src/Jackett/Utils/TorznabCapsUtil.cs index d9a25b23e..3dbe0db83 100644 --- a/src/Jackett/Utils/TorznabCapsUtil.cs +++ b/src/Jackett/Utils/TorznabCapsUtil.cs @@ -16,9 +16,9 @@ namespace Jackett.Utils caps.TVSearchAvailable = true; caps.SupportsTVRageSearch = false; caps.Categories.AddRange(new[] { - TorznabCategory.TV, - TorznabCategory.TVSD, - TorznabCategory.TVHD + TorznabCatType.TV, + TorznabCatType.TVSD, + TorznabCatType.TVHD }); return caps; }