From 1c980f7241ebb8e1c5494be486be65c0b940ecc4 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 13 Jun 2015 21:46:55 -0500 Subject: [PATCH] added sceneaccess indexer --- src/Jackett/Indexers/SceneAccess.cs | 207 +++++++++++++++++++ src/Jackett/Jackett.csproj | 4 + src/Jackett/WebContent/logos/sceneaccess.png | Bin 0 -> 18158 bytes 3 files changed, 211 insertions(+) create mode 100644 src/Jackett/Indexers/SceneAccess.cs create mode 100644 src/Jackett/WebContent/logos/sceneaccess.png diff --git a/src/Jackett/Indexers/SceneAccess.cs b/src/Jackett/Indexers/SceneAccess.cs new file mode 100644 index 000000000..6af5df5ef --- /dev/null +++ b/src/Jackett/Indexers/SceneAccess.cs @@ -0,0 +1,207 @@ +using CsQuery; +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.Text; +using System.Threading.Tasks; + +namespace Jackett.Indexers +{ + class SceneAccess : IndexerInterface + { + public event Action OnSaveConfigurationRequested; + + public event Action OnResultParsingError; + + public string DisplayName + { + get { return "SceneAccess"; } + } + + public string DisplayDescription + { + get { return "Your gateway to the scene"; } + } + + public Uri SiteLink + { + get { return new Uri(BaseUrl); } + } + + const string BaseUrl = "https://sceneaccess.eu"; + const string LoginUrl = BaseUrl + "/login"; + const string SearchUrl = BaseUrl + "/{0}?method=1&c{1}=1&search={2}"; + + + public bool IsConfigured + { + get; private set; + } + + CookieContainer cookies; + HttpClientHandler handler; + HttpClient client; + string cookieHeader; + + public SceneAccess() + { + IsConfigured = false; + cookies = new CookieContainer(); + handler = new HttpClientHandler + { + CookieContainer = cookies, + AllowAutoRedirect = true, + UseCookies = true, + }; + client = new HttpClient(handler); + } + + public Task GetConfigurationForSetup() + { + var config = new ConfigurationDataBasicLogin(); + return Task.FromResult(config); + } + + public async Task ApplyConfiguration(JToken configJson) + { + var config = new ConfigurationDataBasicLogin(); + config.LoadValuesFromJson(configJson); + + var pairs = new Dictionary { + { "username", config.Username.Value }, + { "password", config.Password.Value }, + { "submit", "come on in" } + }; + + var content = new FormUrlEncodedContent(pairs); + + string responseContent; + JArray cookieJArray; + + if (Program.IsWindows) + { + // If Windows use .net http + var response = await client.PostAsync(LoginUrl, content); + responseContent = await response.Content.ReadAsStringAsync(); + cookieJArray = cookies.ToJson(SiteLink); + } + else + { + // If UNIX system use curl + var response = await CurlHelper.PostAsync(LoginUrl, pairs); + responseContent = Encoding.UTF8.GetString(response.Content); + cookieHeader = response.CookieHeader; + cookieJArray = new JArray(response.CookiesFlat); + } + + if (!responseContent.Contains("nav_profile")) + { + CQ dom = responseContent; + var messageEl = dom["#login_box_desc"]; + var errorMessage = messageEl.Text().Trim(); + throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)config); + } + else + { + var configSaveData = new JObject(); + configSaveData["cookies"] = cookieJArray; + + if (OnSaveConfigurationRequested != null) + OnSaveConfigurationRequested(this, configSaveData); + + IsConfigured = true; + } + } + + public void LoadFromSavedConfiguration(JToken jsonConfig) + { + cookies.FillFromJson(new Uri(BaseUrl), (JArray)jsonConfig["cookies"]); + cookieHeader = cookies.GetCookieHeader(SiteLink); + 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 searchSection = string.IsNullOrEmpty(query.Episode) ? "archive" : "browse"; + var searchCategory = string.IsNullOrEmpty(query.Episode) ? "26" : "27"; + + var searchUrl = string.Format(SearchUrl, searchSection, searchCategory, searchString); + + string results; + if (Program.IsWindows) + { + results = await client.GetStringAsync(searchUrl); + } + else + { + var response = await CurlHelper.GetAsync(searchUrl, cookieHeader); + results = Encoding.UTF8.GetString(response.Content); + } + + try + { + CQ dom = results; + var rows = dom["#torrents-table > tbody > tr.tt_row"]; + foreach (var row in rows) + { + CQ qRow = row.Cq(); + var release = new ReleaseInfo(); + + release.MinimumRatio = 1; + release.MinimumSeedTime = 129600; + release.Title = qRow.Find(".ttr_name > a").Text(); + release.Description = release.Title; + release.Guid = new Uri(BaseUrl + "/" + qRow.Find(".ttr_name > a").Attr("href")); + release.Comments = release.Guid; + release.Link = new Uri(BaseUrl + "/" + qRow.Find(".td_dl > a").Attr("href")); + + var sizeStr = qRow.Find(".ttr_size").Contents()[0].NodeValue; + var sizeParts = sizeStr.Split(' '); + release.Size = ReleaseInfo.GetBytes(sizeParts[1], float.Parse(sizeParts[0], NumberStyles.Float | NumberStyles.AllowThousands)); + + var timeStr = qRow.Find(".ttr_added").Text(); + DateTime time; + if (DateTime.TryParseExact(timeStr, "yyyy-MM-ddHH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out time)) + { + release.PublishDate = time; + } + + release.Seeders = int.Parse(qRow.Find(".ttr_seeders").Text(), NumberStyles.AllowThousands); + release.Peers = int.Parse(qRow.Find(".ttr_leechers").Text(), NumberStyles.AllowThousands) + release.Seeders; + + releases.Add(release); + } + } + catch (Exception ex) + { + OnResultParsingError(this, results, ex); + throw ex; + } + } + + return releases.ToArray(); + } + + public async Task Download(Uri link) + { + if (Program.IsWindows) + { + return await client.GetByteArrayAsync(link); + } + else + { + var response = await CurlHelper.GetAsync(link.ToString(), cookieHeader); + return response.Content; + } + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index e1e9664fe..de1e67018 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -97,6 +97,7 @@ + @@ -145,6 +146,9 @@ + + PreserveNewest + PreserveNewest diff --git a/src/Jackett/WebContent/logos/sceneaccess.png b/src/Jackett/WebContent/logos/sceneaccess.png new file mode 100644 index 0000000000000000000000000000000000000000..f8fe8c38717b58e55ed41778bd526b1a9a85f969 GIT binary patch literal 18158 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

W$1?BiBQVy`^jatNX|dM3R`=Qal; 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