diff --git a/src/Jackett/Indexers/BitMeTV.cs b/src/Jackett/Indexers/BitMeTV.cs index 71fbd9559..947c06216 100644 --- a/src/Jackett/Indexers/BitMeTV.cs +++ b/src/Jackett/Indexers/BitMeTV.cs @@ -135,12 +135,13 @@ namespace Jackett { List releases = new List(); - foreach (var title in query.ShowTitles) + + foreach (var title in query.ShowTitles ?? new string[] { string.Empty }) { var searchString = title + " " + query.GetEpisodeSearchString(); - var searchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(searchString)); - var results = await client.GetStringAsync(searchUrl); + var episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(searchString)); + var results = await client.GetStringAsync(episodeSearchUrl); CQ dom = results; var table = dom["tbody > tr > .latest"].Parent().Parent(); @@ -172,13 +173,7 @@ namespace Jackett var sizeCol = row.ChildElements.ElementAt(6); var sizeVal = float.Parse(sizeCol.ChildNodes[0].NodeValue); var sizeUnit = sizeCol.ChildNodes[2].NodeValue; - - switch (sizeUnit) - { - case "GB": release.Size = ReleaseInfo.BytesFromGB(sizeVal); break; - case "MB": release.Size = ReleaseInfo.BytesFromMB(sizeVal); break; - case "KB": release.Size = ReleaseInfo.BytesFromKB(sizeVal); break; - } + release.Size = ReleaseInfo.GetBytes(sizeUnit, sizeVal); release.Seeders = int.Parse(row.ChildElements.ElementAt(8).Cq().Text()); release.Peers = int.Parse(row.ChildElements.ElementAt(9).Cq().Text()) + release.Seeders; diff --git a/src/Jackett/Indexers/Freshon.cs b/src/Jackett/Indexers/Freshon.cs index 6d3f14b29..a9b75c52b 100644 --- a/src/Jackett/Indexers/Freshon.cs +++ b/src/Jackett/Indexers/Freshon.cs @@ -2,12 +2,14 @@ using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; +using System.Web; using System.Web.UI.WebControls; namespace Jackett @@ -67,12 +69,9 @@ namespace Jackett }; var content = new FormUrlEncodedContent(pairs); - var message = new HttpRequestMessage(); + var message = CreateHttpRequest(new Uri(LoginPostUrl)); message.Method = HttpMethod.Post; message.Content = content; - message.RequestUri = new Uri(LoginPostUrl); - message.Headers.Referrer = new Uri(LoginUrl); - message.Headers.UserAgent.ParseAdd(chromeUserAgent); var response = await client.SendAsync(message); var responseContent = await response.Content.ReadAsStringAsync(); @@ -101,10 +100,7 @@ namespace Jackett public async Task VerifyConnection() { - var message = new HttpRequestMessage(); - message.Method = HttpMethod.Get; - message.RequestUri = new Uri(SearchUrl); - message.Headers.UserAgent.ParseAdd(chromeUserAgent); + var message = CreateHttpRequest(new Uri(SearchUrl)); var response = await client.SendAsync(message); var result = await response.Content.ReadAsStringAsync(); @@ -118,10 +114,77 @@ namespace Jackett IsConfigured = true; } - public Task PerformQuery(TorznabQuery query) + HttpRequestMessage CreateHttpRequest(Uri uri) + { + var message = new HttpRequestMessage(); + message.Method = HttpMethod.Get; + message.RequestUri = uri; + message.Headers.UserAgent.ParseAdd(chromeUserAgent); + return message; + } + + public async Task PerformQuery(TorznabQuery query) { List releases = new List(); - return Task.FromResult(releases.ToArray()); + + foreach (var title in query.ShowTitles ?? new string[] { string.Empty }) + { + string episodeSearchUrl; + + if (string.IsNullOrEmpty(title)) + episodeSearchUrl = SearchUrl; + else + { + var searchString = title + " " + query.GetEpisodeSearchString(); + episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(searchString)); + } + + var request = CreateHttpRequest(new Uri(episodeSearchUrl)); + var response = await client.SendAsync(request); + var results = await response.Content.ReadAsStringAsync(); + + CQ dom = results; + + var rows = dom["#highlight > tbody > tr"]; + + foreach (var row in rows.Skip(1)) + { + var release = new ReleaseInfo(); + + var qRow = row.Cq(); + var qLink = qRow.Find("a.torrent_name_link").First(); + + release.MinimumRatio = 1; + release.MinimumSeedTime = 172800; + release.Title = qLink.Attr("title"); + release.Description = release.Title; + release.Guid = new Uri(BaseUrl + qLink.Attr("href")); + release.Comments = release.Guid; + release.Link = new Uri(BaseUrl + qRow.Find("td.table_links > a").First().Attr("href")); + + DateTime pubDate; + var dateString = qRow.Find("td.table_added").Text().Trim(); + if (dateString.StartsWith("Today ")) + pubDate = (DateTime.UtcNow + TimeSpan.Parse(dateString.Split(' ')[1])).ToLocalTime(); + else if (dateString.StartsWith("Yesterday ")) + pubDate = (DateTime.UtcNow + TimeSpan.Parse(dateString.Split(' ')[1]) - TimeSpan.FromDays(1)).ToLocalTime(); + else + pubDate = DateTime.ParseExact(dateString, "dd-MMM-yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime(); + release.PublishDate = pubDate; + + release.Seeders = int.Parse(qRow.Find("td.table_seeders").Text().Trim()); + release.Peers = int.Parse(qRow.Find("td.table_leechers").Text().Trim()) + release.Seeders; + + var sizeCol = qRow.Find("td.table_size")[0]; + var sizeVal = float.Parse(sizeCol.ChildNodes[0].NodeValue.Trim()); + var sizeUnit = sizeCol.ChildNodes[2].NodeValue.Trim(); + release.Size = ReleaseInfo.GetBytes(sizeUnit, sizeVal); + + releases.Add(release); + } + } + + return releases.ToArray(); } public Task Download(Uri link) diff --git a/src/Jackett/Indexers/ThePirateBay.cs b/src/Jackett/Indexers/ThePirateBay.cs index e6935c5c3..33a2295ba 100644 --- a/src/Jackett/Indexers/ThePirateBay.cs +++ b/src/Jackett/Indexers/ThePirateBay.cs @@ -120,17 +120,17 @@ namespace Jackett.Indexers { List releases = new List(); - foreach (var title in query.ShowTitles) + foreach (var title in query.ShowTitles ?? new string[] { string.Empty }) { var searchString = title + " " + query.GetEpisodeSearchString(); - var searchUrl = BaseUrl + string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); + var episodeSearchUrl = BaseUrl + string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var message = new HttpRequestMessage { Method = HttpMethod.Get, RequestUri = new Uri(BaseUrl + SwitchSingleViewUrl) }; - message.Headers.Referrer = new Uri(searchUrl); + message.Headers.Referrer = new Uri(episodeSearchUrl); var response = await client.SendAsync(message); var results = await response.Content.ReadAsStringAsync(); @@ -176,12 +176,7 @@ namespace Jackett.Indexers var sizeString = row.ChildElements.ElementAt(4).Cq().Text().Split(' '); var sizeVal = float.Parse(sizeString[0]); var sizeUnit = sizeString[1]; - switch (sizeUnit) - { - case "GiB": release.Size = ReleaseInfo.BytesFromGB(sizeVal); break; - case "MiB": release.Size = ReleaseInfo.BytesFromMB(sizeVal); break; - case "KiB": release.Size = ReleaseInfo.BytesFromKB(sizeVal); break; - } + release.Size = ReleaseInfo.GetBytes(sizeUnit, sizeVal); release.Seeders = int.Parse(row.ChildElements.ElementAt(5).Cq().Text()); release.Peers = int.Parse(row.ChildElements.ElementAt(6).Cq().Text()) + release.Seeders; diff --git a/src/Jackett/ReleaseInfo.cs b/src/Jackett/ReleaseInfo.cs index ae8494882..4e9add6ba 100644 --- a/src/Jackett/ReleaseInfo.cs +++ b/src/Jackett/ReleaseInfo.cs @@ -29,6 +29,24 @@ namespace Jackett public long? MinimumSeedTime { get; set; } + public static long GetBytes(string unit, float value) + { + switch (unit.ToLower()) + { + case "kb": + case "kib": + return BytesFromKB(value); + case "mb": + case "mib": + return BytesFromMB(value); + case "gb": + case "gib": + return BytesFromGB(value); + default: + return 0; + } + } + public static long BytesFromGB(float gb) { return BytesFromMB(gb * 1024f);