diff --git a/src/Jackett/Content/logos/bitsoup.png b/src/Jackett/Content/logos/bitsoup.png new file mode 100644 index 0000000000000000000000000000000000000000..65c0459e16a2347b5af52d88523a7536e7e1b2d1 Binary files /dev/null and b/src/Jackett/Content/logos/bitsoup.png differ diff --git a/src/Jackett/Indexers/BitSoup.cs b/src/Jackett/Indexers/BitSoup.cs new file mode 100644 index 0000000000000000000000000000000000000000..a0229f56ce104b2219a61622862f33702538786e --- /dev/null +++ b/src/Jackett/Indexers/BitSoup.cs @@ -0,0 +1,245 @@ +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.Collections.Specialized; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using Jackett.Models.IndexerConfig; + +namespace Jackett.Indexers +{ + public class BitSoup : BaseIndexer, IIndexer + { + private string BrowseUrl { get { return SiteLink + "browse.php"; } } + private string LoginUrl { get { return SiteLink + "takelogin.php"; } } + + new ConfigurationDataBasicLogin configData + { + get { return (ConfigurationDataBasicLogin)base.configData; } + set { base.configData = value; } + } + + public BitSoup(IIndexerManagerService i, IWebClient wc, Logger l, IProtectionService ps) + : base(name: "BitSoup", + description: "SoupieBits", + link: "https://www.bitsoup.me/", + caps: TorznabUtil.CreateDefaultTorznabTVCaps(), + manager: i, + client: wc, + logger: l, + p: ps, + configData: new ConfigurationDataBasicLogin()) + { + + //AddCategoryMapping("624", TorznabCatType.Console); + //AddCategoryMapping("307", TorznabCatType.ConsoleNDS); + //AddCategoryMapping("308", TorznabCatType.ConsolePSP); + AddCategoryMapping("35", TorznabCatType.ConsoleWii); + //AddCategoryMapping("309", TorznabCatType.ConsoleXbox); + AddCategoryMapping("12", TorznabCatType.ConsoleXbox360); + //AddCategoryMapping("305", TorznabCatType.ConsoleWiiwareVC); + //AddCategoryMapping("309", TorznabCatType.ConsoleXBOX360DLC); + AddCategoryMapping("38", TorznabCatType.ConsolePS3); + //AddCategoryMapping("239", TorznabCatType.ConsoleOther); + //AddCategoryMapping("245", TorznabCatType.ConsoleOther); + //AddCategoryMapping("246", TorznabCatType.ConsoleOther); + //AddCategoryMapping("626", TorznabCatType.ConsoleOther); + //AddCategoryMapping("628", TorznabCatType.ConsoleOther); + //AddCategoryMapping("630", TorznabCatType.ConsoleOther); + //AddCategoryMapping("307", TorznabCatType.Console3DS); + //AddCategoryMapping("308", TorznabCatType.ConsolePSVita); + //AddCategoryMapping("307", TorznabCatType.ConsoleWiiU); + //AddCategoryMapping("309", TorznabCatType.ConsoleXboxOne); + //AddCategoryMapping("308", TorznabCatType.ConsolePS4); + //AddCategoryMapping("631", TorznabCatType.Movies); + //AddCategoryMapping("631", TorznabCatType.MoviesForeign); + //AddCategoryMapping("455", TorznabCatType.MoviesOther); + //AddCategoryMapping("633", TorznabCatType.MoviesOther); + AddCategoryMapping("19", TorznabCatType.MoviesSD); + AddCategoryMapping("41", TorznabCatType.MoviesHD); + AddCategoryMapping("17", TorznabCatType.Movies3D); + AddCategoryMapping("80", TorznabCatType.MoviesBluRay); + AddCategoryMapping("20", TorznabCatType.MoviesDVD); + //AddCategoryMapping("631", TorznabCatType.MoviesWEBDL); + AddCategoryMapping("6", TorznabCatType.Audio); + //AddCategoryMapping("623", TorznabCatType.AudioMP3); + AddCategoryMapping("29", TorznabCatType.AudioVideo); + //AddCategoryMapping("402", TorznabCatType.AudioVideo); + AddCategoryMapping("5", TorznabCatType.AudioAudiobook); + //AddCategoryMapping("1", TorznabCatType.AudioLossless); + //AddCategoryMapping("403", TorznabCatType.AudioOther); + //AddCategoryMapping("642", TorznabCatType.AudioOther); + //AddCategoryMapping("1", TorznabCatType.AudioForeign); + //AddCategoryMapping("233", TorznabCatType.PC); + //AddCategoryMapping("236", TorznabCatType.PC); + //AddCategoryMapping("1", TorznabCatType.PC0day); + AddCategoryMapping("1", TorznabCatType.PCISO); + //AddCategoryMapping("235", TorznabCatType.PCMac); + //AddCategoryMapping("627", TorznabCatType.PCPhoneOther); + AddCategoryMapping("21", TorznabCatType.PCGames); + AddCategoryMapping("4", TorznabCatType.PCGames); + //AddCategoryMapping("625", TorznabCatType.PCPhoneIOS); + //AddCategoryMapping("625", TorznabCatType.PCPhoneAndroid); + AddCategoryMapping("45", TorznabCatType.TV); + //AddCategoryMapping("433", TorznabCatType.TV); + //AddCategoryMapping("639", TorznabCatType.TVWEBDL); + //AddCategoryMapping("433", TorznabCatType.TVWEBDL); + //AddCategoryMapping("639", TorznabCatType.TVFOREIGN); + //AddCategoryMapping("433", TorznabCatType.TVFOREIGN); + AddCategoryMapping("7", TorznabCatType.TVSD); + AddCategoryMapping("49", TorznabCatType.TVSD); + AddCategoryMapping("42", TorznabCatType.TVHD); + //AddCategoryMapping("433", TorznabCatType.TVHD); + //AddCategoryMapping("635", TorznabCatType.TVOTHER); + //AddCategoryMapping("636", TorznabCatType.TVSport); + AddCategoryMapping("23", TorznabCatType.TVAnime); + //AddCategoryMapping("634", TorznabCatType.TVDocumentary); + AddCategoryMapping("9", TorznabCatType.XXX); + //AddCategoryMapping("1", TorznabCatType.XXXDVD); + //AddCategoryMapping("1", TorznabCatType.XXXWMV); + //AddCategoryMapping("1", TorznabCatType.XXXXviD); + //AddCategoryMapping("1", TorznabCatType.XXXx264); + //AddCategoryMapping("1", TorznabCatType.XXXOther); + //AddCategoryMapping("1", TorznabCatType.XXXImageset); + //AddCategoryMapping("1", TorznabCatType.XXXPacks); + //AddCategoryMapping("340", TorznabCatType.Other); + //AddCategoryMapping("342", TorznabCatType.Other); + //AddCategoryMapping("344", TorznabCatType.Other); + //AddCategoryMapping("391", TorznabCatType.Other); + //AddCategoryMapping("392", TorznabCatType.Other); + //AddCategoryMapping("393", TorznabCatType.Other); + //AddCategoryMapping("394", TorznabCatType.Other); + //AddCategoryMapping("234", TorznabCatType.Other); + //AddCategoryMapping("638", TorznabCatType.Other); + //AddCategoryMapping("629", TorznabCatType.Other); + //AddCategoryMapping("1", TorznabCatType.OtherMisc); + //AddCategoryMapping("1", TorznabCatType.OtherHashed); + //AddCategoryMapping("408", TorznabCatType.Books); + AddCategoryMapping("24", TorznabCatType.BooksEbook); + //AddCategoryMapping("406", TorznabCatType.BooksComics); + //AddCategoryMapping("407", TorznabCatType.BooksComics); + //AddCategoryMapping("409", TorznabCatType.BooksComics); + //AddCategoryMapping("410", TorznabCatType.BooksMagazines); + //AddCategoryMapping("1", TorznabCatType.BooksTechnical); + //AddCategoryMapping("1", TorznabCatType.BooksOther); + //AddCategoryMapping("1", TorznabCatType.BooksForeign); + } + + public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + var pairs = new Dictionary<string, string> { + { "username", configData.Username.Value }, + { "password", configData.Password.Value }, + { "returnto", "/" }, + { "login", "Log in!" } + }; + + var loginPage = await RequestStringWithCookies(SiteLink, string.Empty); + + var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, SiteLink, SiteLink, true); + await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () => + { + CQ dom = result.Content; + var messageEl = dom["body > div"].First(); + var errorMessage = messageEl.Text().Trim(); + throw new ExceptionWithConfigData(errorMessage, configData); + }); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) + { + var releases = new List<ReleaseInfo>(); + var searchString = query.GetQueryString(); + var searchUrl = BrowseUrl; + var trackerCats = MapTorznabCapsToTrackers(query); + var queryCollection = new NameValueCollection(); + + + + if (!string.IsNullOrWhiteSpace(searchString)) + { + queryCollection.Add("search", searchString); + queryCollection.Add("incldead", "0"); + queryCollection.Add("cat", "0"); + // Tracker cannot search multi categories + // so we either search "all" + // or do multiple searches + if (trackerCats.Count == 0) + { + searchUrl += "?" + queryCollection.GetQueryString(); + await ProcessPage(releases, searchUrl); + } else + { + foreach (var cat in trackerCats) + { + queryCollection.Remove("cat"); + queryCollection.Add("cat", cat); + searchUrl += "?" + queryCollection.GetQueryString(); + await ProcessPage(releases, searchUrl); + } + } + + } + else + { + queryCollection.Add("search", ""); + queryCollection.Add("cat", "0"); + searchUrl += "?" + queryCollection.GetQueryString(); + await ProcessPage(releases, searchUrl); + } + + return releases; + } + + private async Task ProcessPage(List<ReleaseInfo> releases, string searchUrl) + { + var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl); + var results = response.Content; + try + { + CQ dom = results; + + var rows = dom["table.koptekst tr"]; + foreach (var row in rows.Skip(1)) + { + var release = new ReleaseInfo(); + + release.Title = row.Cq().Find("td:eq(1) a").First().Text().Trim(); + + release.Link = new Uri(SiteLink + row.Cq().Find("td:eq(1) a").First().Attr("href")); + release.Description = release.Title; + var cat = row.Cq().Find("td:eq(0) a").First().Attr("href").Substring(15); + release.Category = MapTrackerCatToNewznab(cat); + + var added = row.Cq().Find("td:eq(7)").First().Text().Trim(); + release.PublishDate = DateTime.ParseExact(added, "yyyy-MM-ddH:mm:ss", CultureInfo.InvariantCulture); + + var sizeStr = row.Cq().Find("td:eq(8)").First().Text().Trim(); + release.Size = ReleaseInfo.GetBytes(sizeStr); + + release.Seeders = ParseUtil.CoerceInt(row.Cq().Find("td:eq(10)").First().Text().Trim()); + release.Peers = ParseUtil.CoerceInt(row.Cq().Find("td:eq(11)").First().Text().Trim()) + release.Seeders; + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results, ex); + } + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 4ed37bc95875f91b95e41d8c9eed8cccc94036f5..ef02e8c346caeeb66fbae11c15ff1c462ce3e790 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -187,6 +187,7 @@ <Compile Include="Controllers\DownloadController.cs" /> <Compile Include="Engine.cs" /> <Compile Include="Indexers\AlphaRatio.cs" /> + <Compile Include="Indexers\BitSoup.cs" /> <Compile Include="Indexers\BlueTigers.cs" /> <Compile Include="Indexers\EuTorrents.cs" /> <Compile Include="Indexers\Avistaz.cs" /> @@ -438,6 +439,7 @@ <Content Include="Content\logos\beyondhd.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="Content\logos\bitsoup.png" /> <Content Include="Content\logos\bluetigers.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>