diff --git a/src/Jackett/Indexers/FrenchTorrentDb.cs b/src/Jackett/Indexers/FrenchTorrentDb.cs new file mode 100644 index 000000000..7aaa1f1ad --- /dev/null +++ b/src/Jackett/Indexers/FrenchTorrentDb.cs @@ -0,0 +1,172 @@ +using CsQuery; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using System.Web; + +namespace Jackett.Indexers +{ + class FrenchTorrentDb : IndexerInterface + { + public event Action OnSaveConfigurationRequested; + + public event Action OnResultParsingError; + + class ConfigurationDataBasicLoginFrenchTorrentDb : ConfigurationData + { + public StringItem Cookie { get; private set; } + + public ConfigurationDataBasicLoginFrenchTorrentDb() + { + Cookie = new StringItem { Name = "Cookie" }; + } + + public override Item[] GetItems() + { + return new Item[] { Cookie }; + } + } + + public string DisplayName + { + get { return "FrenchTorrentDb"; } + } + + public string DisplayDescription + { + get { return "One the biggest French Torrent Tracker"; } + } + + public Uri SiteLink + { + get { return new Uri(BaseUrl); } + + } + + public bool IsConfigured { get; private set; } + const string BaseUrl = "http://www.frenchtorrentdb.com/"; + const string MainUrl = BaseUrl + "?section=INDEX"; + const string SearchUrl = BaseUrl + "?section=TORRENTS&exact=1&name={0}&submit=GO"; + static string chromeUserAgent = BrowserUtil.ChromeUserAgent; + + string cookie = string.Empty; + + CookieContainer cookies; + HttpClientHandler handler; + HttpClient client; + + public FrenchTorrentDb() + { + IsConfigured = false; + cookies = new CookieContainer(); + handler = new HttpClientHandler + { + CookieContainer = cookies, + AllowAutoRedirect = true, + UseCookies = true, + }; + client = new HttpClient(handler); + client.DefaultRequestHeaders.UserAgent.ParseAdd(chromeUserAgent); + } + + public Task GetConfigurationForSetup() + { + var config = new ConfigurationDataUrl(BaseUrl); + return Task.FromResult(config); + } + + public async Task ApplyConfiguration(Newtonsoft.Json.Linq.JToken configJson) + { + var config = new ConfigurationDataBasicLoginFrenchTorrentDb(); + config.LoadValuesFromJson(configJson); + cookies.SetCookies(new Uri(BaseUrl), "WebsiteID=" + config.Cookie.Value); + var mainPage = await client.GetAsync(MainUrl); + string responseContent = await mainPage.Content.ReadAsStringAsync(); + + if (!responseContent.Contains("/?section=LOGOUT")) + { + throw new ExceptionWithConfigData("Failed to login", (ConfigurationData)config); + } + else + { + var configSaveData = new JObject(); + configSaveData["cookie"] = config.Cookie.Value; + + if (OnSaveConfigurationRequested != null) + OnSaveConfigurationRequested(this, configSaveData); + + IsConfigured = true; + } + } + + public void LoadFromSavedConfiguration(Newtonsoft.Json.Linq.JToken jsonConfig) + { + cookie = (string)jsonConfig["cookie"]; + cookies.SetCookies(new Uri(BaseUrl), "WebsiteID=" + cookie); + IsConfigured = true; + } + + public async Task PerformQuery(TorznabQuery query) + { + List releases = new List(); + + foreach (var title in query.ShowTitles ?? new string[] { string.Empty }) + { + var searchString = title + " " + query.GetEpisodeSearchString(); + var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); + + var message = new HttpRequestMessage(); + message.Method = HttpMethod.Get; + message.RequestUri = new Uri(episodeSearchUrl); + + var response = await client.SendAsync(message); + var results = await response.Content.ReadAsStringAsync(); + try + { + + CQ dom = results; + var rows = dom[".results_index ul"]; + foreach (var row in rows) + { + var release = new ReleaseInfo(); + CQ qRow = row.Cq(); + CQ qLink = qRow.Find("li.torrents_name > .torrents_name_link").First(); + CQ qDlLink = qRow.Find("li.torrents_download > a").First(); + + release.MinimumRatio = 1; + release.MinimumSeedTime = 172800; + release.Title = qLink.Text().Trim(); + release.Description = release.Title; + release.Comments = new Uri(BaseUrl + "/" + qLink.Attr("href").TrimStart('/')); + release.Guid = release.Comments; + release.Link = new Uri(BaseUrl + "/" + qDlLink.Attr("href").TrimStart('/')); + release.PublishDate = DateTime.Now; + release.Seeders = ParseUtil.CoerceInt(qRow.Find("li.torrents_seeders").Text()); + release.Peers = ParseUtil.CoerceInt(qRow.Find("li.torrents_leechers").Text()) + release.Seeders; + var sizeParts = qRow.Find("li.torrents_size").Text().Split(' '); + var sizeVal = ParseUtil.CoerceFloat(sizeParts[0]); + var sizeUnit = sizeParts[1]; + release.Size = ReleaseInfo.GetBytes(sizeUnit, sizeVal); + + releases.Add(release); + } + } + catch (Exception ex) + { + OnResultParsingError(this, results, ex); + throw ex; + } + } + return releases.ToArray(); + } + + public Task Download(Uri link) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index e53951a72..83ec8f5d6 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -1,324 +1,329 @@ - - - - - Debug - AnyCPU - {E636D5F8-68B4-4903-B4ED-CCFD9C9E899F} - WinExe - Properties - Jackett - Jackett - v4.5.1 - 512 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - jacket_large.ico - - - Jackett.Program - - - - ..\packages\CsQuery.1.3.4\lib\net40\CsQuery.dll - - - ..\packages\NLog.Windows.Forms.2.0.0.0\lib\net35\NLog.Windows.Forms.dll - True - - - - - - - - - - - - - - - ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll - - - ..\packages\NLog.4.0.1\lib\net45\NLog.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Form - - - Main.cs - - - - - - True - True - Resources.resx - - - - - - - - - - - - - - - - PreserveNewest - - - - - - - - Main.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - PreserveNewest - - - - - {74420A79-CC16-442C-8B1E-7C1B913844F0} - CurlSharp - - - - - False - Microsoft .NET Framework 4.5.1 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - - - {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} - 1 - 0 - 0 - tlbimp - False - True - - - + + + + + Debug + AnyCPU + {E636D5F8-68B4-4903-B4ED-CCFD9C9E899F} + WinExe + Properties + Jackett + Jackett + v4.5.1 + 512 + + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + jacket_large.ico + + + Jackett.Program + + + + ..\packages\CsQuery.1.3.4\lib\net40\CsQuery.dll + + + ..\packages\NLog.Windows.Forms.2.0.0.0\lib\net35\NLog.Windows.Forms.dll + True + + + + + + + + + + + + + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NLog.4.0.1\lib\net45\NLog.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + Main.cs + + + + + + True + True + Resources.resx + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + Main.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + PreserveNewest + + + + + {74420A79-CC16-442C-8B1E-7C1B913844F0} + CurlSharp + + + + + False + Microsoft .NET Framework 4.5.1 %28x86 et x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + + + {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} + 1 + 0 + 0 + tlbimp + False + True + + + - - - - - - - - - - + --> + + + + + + + + + + \ No newline at end of file diff --git a/src/Jackett/WebContent/logos/frenchtorrentdb.png b/src/Jackett/WebContent/logos/frenchtorrentdb.png new file mode 100644 index 000000000..ac7ef2011 Binary files /dev/null and b/src/Jackett/WebContent/logos/frenchtorrentdb.png differ diff --git a/src/Jackett/packages.config b/src/Jackett/packages.config index efab650c9..447a7b81f 100644 --- a/src/Jackett/packages.config +++ b/src/Jackett/packages.config @@ -1,7 +1,8 @@ - - - - - - + + + + + + + \ No newline at end of file