diff --git a/src/Jackett/Controllers/AdminController.cs b/src/Jackett/Controllers/AdminController.cs index 47d49fa86..3a091f2ab 100644 --- a/src/Jackett/Controllers/AdminController.cs +++ b/src/Jackett/Controllers/AdminController.cs @@ -67,7 +67,7 @@ namespace Jackett.Controllers result.Content = new StreamContent(stream); result.Content.Headers.ContentType = new MediaTypeHeaderValue(MimeMapping.GetMimeMapping(mappedPath)); - + return result; } @@ -86,7 +86,7 @@ namespace Jackett.Controllers [AllowAnonymous] public async Task Dashboard() { - if(Request.RequestUri.Query!=null && Request.RequestUri.Query.Contains("logout")) + if (Request.RequestUri.Query != null && Request.RequestUri.Query.Contains("logout")) { var file = GetFile("login.html"); securityService.Logout(file); @@ -98,16 +98,18 @@ namespace Jackett.Controllers { return GetFile("index.html"); - } else + } + else { var formData = await Request.Content.ReadAsFormDataAsync(); - - if (formData!=null && securityService.HashPassword(formData["password"]) == serverService.Config.AdminPassword) + + if (formData != null && securityService.HashPassword(formData["password"]) == serverService.Config.AdminPassword) { var file = GetFile("index.html"); securityService.Login(file); return file; - } else + } + else { return GetFile("login.html"); } @@ -180,8 +182,15 @@ namespace Jackett.Controllers string indexerString = (string)postData["indexer"]; indexer = indexerService.GetIndexer((string)postData["indexer"]); jsonReply["name"] = indexer.DisplayName; - await indexer.ApplyConfiguration(postData["config"]); - await indexerService.TestIndexer((string)postData["indexer"]); + var configurationResult = await indexer.ApplyConfiguration(postData["config"]); + if (configurationResult == IndexerConfigurationStatus.RequiresTesting) + { + await indexerService.TestIndexer((string)postData["indexer"]); + } + else if (configurationResult == IndexerConfigurationStatus.Failed) + { + throw new Exception("Configuration Failed"); + } jsonReply["result"] = "success"; } catch (Exception ex) @@ -194,10 +203,11 @@ namespace Jackett.Controllers if (ex is ExceptionWithConfigData) { jsonReply["config"] = ((ExceptionWithConfigData)ex).ConfigData.ToJson(null); - } else + } + else { logger.Error(ex, "Exception in Configure"); - } + } } return Json(jsonReply); } @@ -293,12 +303,13 @@ namespace Jackett.Controllers cfg["external"] = serverService.Config.AllowExternal; cfg["api_key"] = serverService.Config.APIKey; cfg["blackholedir"] = serverService.Config.BlackholeDir; - cfg["password"] = string.IsNullOrEmpty(serverService.Config.AdminPassword )? string.Empty:serverService.Config.AdminPassword.Substring(0,10); + cfg["password"] = string.IsNullOrEmpty(serverService.Config.AdminPassword) ? string.Empty : serverService.Config.AdminPassword.Substring(0, 10); jsonReply["config"] = cfg; jsonReply["app_version"] = config.GetVersion(); jsonReply["result"] = "success"; - }catch (Exception ex) + } + catch (Exception ex) { logger.Error(ex, "Exception in get_jackett_config"); jsonReply["result"] = "error"; @@ -360,7 +371,8 @@ namespace Jackett.Controllers } } - (new Thread(() => { + (new Thread(() => + { Thread.Sleep(500); serverService.Stop(); Engine.BuildContainer(); @@ -370,7 +382,7 @@ namespace Jackett.Controllers } - if(saveDir != Engine.Server.Config.BlackholeDir) + if (saveDir != Engine.Server.Config.BlackholeDir) { if (!string.IsNullOrEmpty(saveDir)) { @@ -435,12 +447,12 @@ namespace Jackett.Controllers var query = new TorznabQuery() { SearchTerm = value.Query, - Categories = value.Category ==0?new int[0]: new int[1] { value.Category } + Categories = value.Category == 0 ? new int[0] : new int[1] { value.Category } }; query.ExpandCatsToSubCats(); - var trackers = indexerService.GetAllIndexers().Where(t=>t.IsConfigured).ToList(); + var trackers = indexerService.GetAllIndexers().Where(t => t.IsConfigured).ToList(); if (!string.IsNullOrWhiteSpace(value.Tracker)) { trackers = trackers.Where(t => t.ID == value.Tracker).ToList(); @@ -453,7 +465,8 @@ namespace Jackett.Controllers Parallel.ForEach(trackers.ToList(), indexer => { - try { + try + { var searchResults = indexer.PerformQuery(query).Result; cacheService.CacheRssResults(indexer, searchResults); searchResults = indexer.FilterResults(query, searchResults); @@ -470,7 +483,7 @@ namespace Jackett.Controllers } } } - catch(Exception e) + catch (Exception e) { logger.Error(e, "An error occured during manual search on " + indexer.DisplayName + ": " + e.Message); } @@ -483,10 +496,10 @@ namespace Jackett.Controllers results = results.OrderByDescending(d => d.PublishDate).ToList(); } - var manualResult = new ManualSearchResult() + var manualResult = new ManualSearchResult() { Results = results, - Indexers = trackers.Select(t=>t.DisplayName).ToList() + Indexers = trackers.Select(t => t.DisplayName).ToList() }; diff --git a/src/Jackett/Indexers/AlphaRatio.cs b/src/Jackett/Indexers/AlphaRatio.cs index f466a50a2..2b1e825f4 100644 --- a/src/Jackett/Indexers/AlphaRatio.cs +++ b/src/Jackett/Indexers/AlphaRatio.cs @@ -56,7 +56,7 @@ namespace Jackett.Indexers AddCategoryMapping(23, TorznabCatType.Audio); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { var incomingConfig = new ConfigurationDataBasicLogin(); incomingConfig.LoadValuesFromJson(configJson); @@ -76,6 +76,7 @@ namespace Jackett.Indexers var errorMessage = dom["#loginform"].Text().Trim().Replace("\n\t", " "); throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)incomingConfig); }); + return IndexerConfigurationStatus.RequiresTesting; } void FillReleaseInfoFromJson(ReleaseInfo release, JObject r) diff --git a/src/Jackett/Indexers/AnimeBytes.cs b/src/Jackett/Indexers/AnimeBytes.cs index 71bc47b5a..6875324da 100644 --- a/src/Jackett/Indexers/AnimeBytes.cs +++ b/src/Jackett/Indexers/AnimeBytes.cs @@ -49,10 +49,10 @@ namespace Jackett.Indexers p: ps, configData: new ConfigurationDataAnimeBytes()) { - + } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -99,6 +99,8 @@ namespace Jackett.Indexers // Their login page appears to be broken and just gives a 500 error. throw new ExceptionWithConfigData("Failed to login, 6 failed attempts will get you banned for 6 hours.", configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } // Override to load legacy config format diff --git a/src/Jackett/Indexers/BB.cs b/src/Jackett/Indexers/BB.cs index 8a657bfe9..e1d0cbbb9 100644 --- a/src/Jackett/Indexers/BB.cs +++ b/src/Jackett/Indexers/BB.cs @@ -57,7 +57,7 @@ namespace Jackett.Indexers AddCategoryMapping(11, TorznabCatType.PCGames); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -80,8 +80,9 @@ namespace Jackett.Indexers } var message = string.Join(" ", messages); throw new ExceptionWithConfigData(message, configData); - }); + + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/BakaBT.cs b/src/Jackett/Indexers/BakaBT.cs index 4112dd18a..5c89fd31c 100644 --- a/src/Jackett/Indexers/BakaBT.cs +++ b/src/Jackett/Indexers/BakaBT.cs @@ -41,7 +41,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -66,6 +66,8 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/BeyondHD.cs b/src/Jackett/Indexers/BeyondHD.cs index 39eca461f..e89ad5930 100644 --- a/src/Jackett/Indexers/BeyondHD.cs +++ b/src/Jackett/Indexers/BeyondHD.cs @@ -78,7 +78,7 @@ namespace Jackett.Indexers } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -93,6 +93,7 @@ namespace Jackett.Indexers CQ dom = response.Content; throw new ExceptionWithConfigData("Invalid cookie header", configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/BitHdtv.cs b/src/Jackett/Indexers/BitHdtv.cs index b01f3f37a..5f50abcea 100644 --- a/src/Jackett/Indexers/BitHdtv.cs +++ b/src/Jackett/Indexers/BitHdtv.cs @@ -43,7 +43,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -62,6 +62,7 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/BitMeTV.cs b/src/Jackett/Indexers/BitMeTV.cs index 8be342237..bc117d070 100644 --- a/src/Jackett/Indexers/BitMeTV.cs +++ b/src/Jackett/Indexers/BitMeTV.cs @@ -58,7 +58,7 @@ namespace Jackett.Indexers return configData; } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -80,6 +80,7 @@ namespace Jackett.Indexers configData.CaptchaCookie.Value = captchaImage.Cookies; throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/Demonoid.cs b/src/Jackett/Indexers/Demonoid.cs index c99fcbcbe..53400d26f 100644 --- a/src/Jackett/Indexers/Demonoid.cs +++ b/src/Jackett/Indexers/Demonoid.cs @@ -40,7 +40,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -58,6 +58,7 @@ namespace Jackett.Indexers var errorMessage = dom[".red"].ElementAt(1).Cq().Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/FileList.cs b/src/Jackett/Indexers/FileList.cs index 0b03887f5..9ca4e219f 100644 --- a/src/Jackett/Indexers/FileList.cs +++ b/src/Jackett/Indexers/FileList.cs @@ -66,7 +66,7 @@ namespace Jackett.Indexers AddCategoryMapping(7, TorznabCatType.XXX); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -81,6 +81,7 @@ namespace Jackett.Indexers var errorMessage = dom[".main"].Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) @@ -99,7 +100,7 @@ namespace Jackett.Indexers if (!string.IsNullOrWhiteSpace(searchString) || cat != "0") searchUrl += string.Format("?search={0}&cat={1}&searchin=0&sort=0", HttpUtility.UrlEncode(searchString), cat); - + var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl); var results = response.Content; diff --git a/src/Jackett/Indexers/FrenchTorrentDb.cs b/src/Jackett/Indexers/FrenchTorrentDb.cs index 00d1e835a..da7538d93 100644 --- a/src/Jackett/Indexers/FrenchTorrentDb.cs +++ b/src/Jackett/Indexers/FrenchTorrentDb.cs @@ -37,7 +37,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var response = await webclient.GetString(new Utils.Clients.WebRequest() @@ -51,6 +51,7 @@ namespace Jackett.Indexers { throw new ExceptionWithConfigData("Failed to login", configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/Freshon.cs b/src/Jackett/Indexers/Freshon.cs index 0b298543b..62a4ee61f 100644 --- a/src/Jackett/Indexers/Freshon.cs +++ b/src/Jackett/Indexers/Freshon.cs @@ -46,7 +46,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -65,6 +65,7 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/HDSpace.cs b/src/Jackett/Indexers/HDSpace.cs index 0b455b78f..cfb4f57ee 100644 --- a/src/Jackett/Indexers/HDSpace.cs +++ b/src/Jackett/Indexers/HDSpace.cs @@ -41,7 +41,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -63,6 +63,7 @@ namespace Jackett.Indexers var errorMessage = string.Format(errorStr, attempts); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/HDTorrents.cs b/src/Jackett/Indexers/HDTorrents.cs index 7963d4658..294eafda4 100644 --- a/src/Jackett/Indexers/HDTorrents.cs +++ b/src/Jackett/Indexers/HDTorrents.cs @@ -65,7 +65,7 @@ namespace Jackett.Indexers AddCategoryMapping("47", TorznabCatType.XXX);//XXX/720p } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty); @@ -82,6 +82,7 @@ namespace Jackett.Indexers var errorMessage = "Couldn't login"; throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) @@ -104,7 +105,7 @@ namespace Jackett.Indexers queryCollection.Add("search", searchString); } - + queryCollection.Add("active", "1"); queryCollection.Add("options", "0"); diff --git a/src/Jackett/Indexers/IIndexer.cs b/src/Jackett/Indexers/IIndexer.cs index e3dd527dd..c73588910 100644 --- a/src/Jackett/Indexers/IIndexer.cs +++ b/src/Jackett/Indexers/IIndexer.cs @@ -27,7 +27,7 @@ namespace Jackett.Indexers Task GetConfigurationForSetup(); // Called when web API wants to apply setup configuration via web API, usually this is where login and storing cookie happens - Task ApplyConfiguration(JToken configJson); + Task ApplyConfiguration(JToken configJson); // Called on startup when initializing indexers from saved configuration void LoadFromSavedConfiguration(JToken jsonConfig); diff --git a/src/Jackett/Indexers/IPTorrents.cs b/src/Jackett/Indexers/IPTorrents.cs index ebbef2c7d..705576168 100644 --- a/src/Jackett/Indexers/IPTorrents.cs +++ b/src/Jackett/Indexers/IPTorrents.cs @@ -83,7 +83,7 @@ namespace Jackett.Indexers AddCategoryMapping(94, TorznabCatType.BooksComics); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -109,6 +109,7 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/ImmortalSeed.cs b/src/Jackett/Indexers/ImmortalSeed.cs index e246b03b8..0bb675bf4 100644 --- a/src/Jackett/Indexers/ImmortalSeed.cs +++ b/src/Jackett/Indexers/ImmortalSeed.cs @@ -67,7 +67,7 @@ namespace Jackett.Indexers } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -93,6 +93,8 @@ namespace Jackett.Indexers var errorMessage = "Incorrect username or password! " + tries + " tries remaining."; throw new ExceptionWithConfigData(errorMessage, configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/MoreThanTV.cs b/src/Jackett/Indexers/MoreThanTV.cs index 8a6111516..e8a809273 100644 --- a/src/Jackett/Indexers/MoreThanTV.cs +++ b/src/Jackett/Indexers/MoreThanTV.cs @@ -45,7 +45,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -63,6 +63,8 @@ namespace Jackett.Indexers var errorMessage = dom["#loginform"].Text().Trim().Replace("\n\t", " "); throw new ExceptionWithConfigData(errorMessage, configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } private void FillReleaseInfoFromJson(ReleaseInfo release, JObject r) diff --git a/src/Jackett/Indexers/Pretome.cs b/src/Jackett/Indexers/Pretome.cs index 98aaca00a..e4cc4127f 100644 --- a/src/Jackett/Indexers/Pretome.cs +++ b/src/Jackett/Indexers/Pretome.cs @@ -169,7 +169,7 @@ namespace Jackett.Indexers TorznabCaps.Categories.Add(newznabCategory); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -198,6 +198,8 @@ namespace Jackett.Indexers CookieHeader = string.Empty; throw new ExceptionWithConfigData("Failed", configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) @@ -292,7 +294,7 @@ namespace Jackett.Indexers release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(9).InnerText); 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); + var cat = row.ChildElements.ElementAt(0).ChildElements.ElementAt(0).GetAttribute("href").Replace("browse.php?", string.Empty); release.Category = MapTrackerResultCatToNewznab(cat); releases.Add(release); diff --git a/src/Jackett/Indexers/PrivateHD.cs b/src/Jackett/Indexers/PrivateHD.cs index 2bcd15e2d..48393fc65 100644 --- a/src/Jackett/Indexers/PrivateHD.cs +++ b/src/Jackett/Indexers/PrivateHD.cs @@ -48,7 +48,7 @@ namespace Jackett.Indexers AddCategoryMapping(3, TorznabCatType.Audio); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty); @@ -68,6 +68,8 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) @@ -119,7 +121,7 @@ namespace Jackett.Indexers .Replace("gi gi-film", "1") .Replace("gi gi-tv", "2") .Replace("gi gi-music", "3") - .Replace("text-pink",string.Empty); + .Replace("text-pink", string.Empty); release.Category = MapTrackerCatToNewznab(cat.Trim()); releases.Add(release); } diff --git a/src/Jackett/Indexers/RUTor.cs b/src/Jackett/Indexers/RUTor.cs index 128847a52..91b136437 100644 --- a/src/Jackett/Indexers/RUTor.cs +++ b/src/Jackett/Indexers/RUTor.cs @@ -49,7 +49,7 @@ namespace Jackett.Indexers TorznabCaps.Categories.Add(TorznabCatType.Books); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var oldConfig = configData; @@ -60,6 +60,8 @@ namespace Jackett.Indexers configData = oldConfig; throw new Exception("Could not find releases from this URL"); }); + + return IndexerConfigurationStatus.RequiresTesting; } diff --git a/src/Jackett/Indexers/Rarbg.cs b/src/Jackett/Indexers/Rarbg.cs index b2a8683f9..e1a021394 100644 --- a/src/Jackett/Indexers/Rarbg.cs +++ b/src/Jackett/Indexers/Rarbg.cs @@ -94,7 +94,7 @@ namespace Jackett.Indexers } } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var releases = await PerformQuery(new TorznabQuery()); @@ -103,6 +103,8 @@ namespace Jackett.Indexers { throw new Exception("Could not find releases from this URL"); }); + + return IndexerConfigurationStatus.Completed; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/SceneAccess.cs b/src/Jackett/Indexers/SceneAccess.cs index bdad51cf3..2c595e609 100644 --- a/src/Jackett/Indexers/SceneAccess.cs +++ b/src/Jackett/Indexers/SceneAccess.cs @@ -40,7 +40,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -60,6 +60,8 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/SceneTime.cs b/src/Jackett/Indexers/SceneTime.cs index d03e186fc..e517bd323 100644 --- a/src/Jackett/Indexers/SceneTime.cs +++ b/src/Jackett/Indexers/SceneTime.cs @@ -43,7 +43,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -58,6 +58,8 @@ namespace Jackett.Indexers var errorMessage = dom["td.text"].Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } private Dictionary GetSearchFormData(string searchString) diff --git a/src/Jackett/Indexers/ShowRSS.cs b/src/Jackett/Indexers/ShowRSS.cs index 3d29157ad..58d0b52d0 100644 --- a/src/Jackett/Indexers/ShowRSS.cs +++ b/src/Jackett/Indexers/ShowRSS.cs @@ -49,7 +49,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var releases = await PerformQuery(new TorznabQuery()); @@ -58,6 +58,8 @@ namespace Jackett.Indexers { throw new Exception("Could not find releases from this URL"); }); + + return IndexerConfigurationStatus.RequiresTesting; } // Override to load legacy config format diff --git a/src/Jackett/Indexers/SpeedCD.cs b/src/Jackett/Indexers/SpeedCD.cs index d6b7f67ca..8c7d456f1 100644 --- a/src/Jackett/Indexers/SpeedCD.cs +++ b/src/Jackett/Indexers/SpeedCD.cs @@ -46,7 +46,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -61,6 +61,8 @@ namespace Jackett.Indexers var errorMessage = dom["h5"].First().Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/Strike.cs b/src/Jackett/Indexers/Strike.cs index ff3817351..5b3e5bd4d 100644 --- a/src/Jackett/Indexers/Strike.cs +++ b/src/Jackett/Indexers/Strike.cs @@ -50,7 +50,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var releases = await PerformQuery(new TorznabQuery()); @@ -59,6 +59,8 @@ namespace Jackett.Indexers { throw new Exception("Could not find releases from this URL"); }); + + return IndexerConfigurationStatus.Completed; } // Override to load legacy config format diff --git a/src/Jackett/Indexers/T411.cs b/src/Jackett/Indexers/T411.cs index a0fc25573..887ad221e 100644 --- a/src/Jackett/Indexers/T411.cs +++ b/src/Jackett/Indexers/T411.cs @@ -81,7 +81,7 @@ namespace Jackett.Indexers return configData.ApiToken.Value; } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -99,6 +99,8 @@ namespace Jackett.Indexers { throw tokenFetchEx; }); + + return IndexerConfigurationStatus.RequiresTesting; } // Override to load legacy config format diff --git a/src/Jackett/Indexers/TVChaosUK.cs b/src/Jackett/Indexers/TVChaosUK.cs index 3d42a570b..0d439592a 100644 --- a/src/Jackett/Indexers/TVChaosUK.cs +++ b/src/Jackett/Indexers/TVChaosUK.cs @@ -103,7 +103,7 @@ namespace Jackett.Indexers AddCategoryMapping("HD Factual/Reality", TorznabCatType.TVHD); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -139,6 +139,7 @@ namespace Jackett.Indexers IsConfigured = false; throw e; } + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/ThePirateBay.cs b/src/Jackett/Indexers/ThePirateBay.cs index 871d268e0..2135442cd 100644 --- a/src/Jackett/Indexers/ThePirateBay.cs +++ b/src/Jackett/Indexers/ThePirateBay.cs @@ -51,7 +51,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var releases = await PerformQuery(new TorznabQuery()); @@ -60,6 +60,8 @@ namespace Jackett.Indexers { throw new Exception("Could not find releases from this URL"); }); + + return IndexerConfigurationStatus.Completed; } // Override to load legacy config format diff --git a/src/Jackett/Indexers/TorrentBytes.cs b/src/Jackett/Indexers/TorrentBytes.cs index 4e161ac4e..7ee384627 100644 --- a/src/Jackett/Indexers/TorrentBytes.cs +++ b/src/Jackett/Indexers/TorrentBytes.cs @@ -71,7 +71,7 @@ namespace Jackett.Indexers AddCategoryMapping(24, TorznabCatType.XXXImageset); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -91,6 +91,7 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/TorrentDay.cs b/src/Jackett/Indexers/TorrentDay.cs index c41511770..c67779d83 100644 --- a/src/Jackett/Indexers/TorrentDay.cs +++ b/src/Jackett/Indexers/TorrentDay.cs @@ -94,7 +94,7 @@ namespace Jackett.Indexers return result; } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -140,6 +140,7 @@ namespace Jackett.Indexers throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/TorrentLeech.cs b/src/Jackett/Indexers/TorrentLeech.cs index b1edcd967..10171ecb3 100644 --- a/src/Jackett/Indexers/TorrentLeech.cs +++ b/src/Jackett/Indexers/TorrentLeech.cs @@ -79,7 +79,7 @@ namespace Jackett.Indexers AddCategoryMapping(33, TorznabCatType.PC0day); } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var pairs = new Dictionary { @@ -97,6 +97,7 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) @@ -107,7 +108,7 @@ namespace Jackett.Indexers if (!string.IsNullOrWhiteSpace(searchString)) { - searchUrl += "query/" + HttpUtility.UrlEncode(searchString) + "/"; + searchUrl += "query/" + HttpUtility.UrlEncode(searchString) + "/"; } string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); @@ -160,7 +161,7 @@ namespace Jackett.Indexers release.Seeders = ParseUtil.CoerceInt(qRow.Find(".seeders").Text()); release.Peers = release.Seeders + ParseUtil.CoerceInt(qRow.Find(".leechers").Text()); - var category = qRow.Find(".category a").Attr("href").Replace("/torrents/browse/index/categories/",string.Empty); + var category = qRow.Find(".category a").Attr("href").Replace("/torrents/browse/index/categories/", string.Empty); release.Category = MapTrackerCatToNewznab(category); releases.Add(release); diff --git a/src/Jackett/Indexers/TorrentShack.cs b/src/Jackett/Indexers/TorrentShack.cs index e79b7cae6..b34daa839 100644 --- a/src/Jackett/Indexers/TorrentShack.cs +++ b/src/Jackett/Indexers/TorrentShack.cs @@ -42,7 +42,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -62,6 +62,7 @@ namespace Jackett.Indexers var errorMessage = messageEl.Text().Trim(); throw new ExceptionWithConfigData(errorMessage, configData); }); + return IndexerConfigurationStatus.RequiresTesting; } public async Task> PerformQuery(TorznabQuery query) diff --git a/src/Jackett/Indexers/Torrentz.cs b/src/Jackett/Indexers/Torrentz.cs index e68b5efef..ed7640726 100644 --- a/src/Jackett/Indexers/Torrentz.cs +++ b/src/Jackett/Indexers/Torrentz.cs @@ -50,7 +50,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); var releases = await PerformQuery(new TorznabQuery()); @@ -59,6 +59,7 @@ namespace Jackett.Indexers { throw new Exception("Could not find releases from this URL"); }); + return IndexerConfigurationStatus.Completed; } // Override to load legacy config format diff --git a/src/Jackett/Indexers/nCore.cs b/src/Jackett/Indexers/nCore.cs index b86176e30..8f4979896 100644 --- a/src/Jackett/Indexers/nCore.cs +++ b/src/Jackett/Indexers/nCore.cs @@ -43,7 +43,7 @@ namespace Jackett.Indexers { } - public async Task ApplyConfiguration(JToken configJson) + public async Task ApplyConfiguration(JToken configJson) { configData.LoadValuesFromJson(configJson); @@ -69,6 +69,8 @@ namespace Jackett.Indexers var errorMessage = msgContainer != null ? msgContainer.InnerText : "Error while trying to login."; throw new ExceptionWithConfigData(errorMessage, configData); }); + + return IndexerConfigurationStatus.RequiresTesting; } List> CreateKeyValueList(params string[][] keyValues) diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 4ea72ab0a..bcc8f5e3a 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -215,6 +215,7 @@ + diff --git a/src/Jackett/Models/IndexerConfigurationStatus.cs b/src/Jackett/Models/IndexerConfigurationStatus.cs new file mode 100644 index 000000000..2c232f7c9 --- /dev/null +++ b/src/Jackett/Models/IndexerConfigurationStatus.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Jackett.Models +{ + public enum IndexerConfigurationStatus + { + Completed, + RequiresTesting, + Failed + } +}