diff --git a/src/Jackett/ConfigurationDataUrl.cs b/src/Jackett/ConfigurationDataUrl.cs new file mode 100644 index 000000000..e302cf2fd --- /dev/null +++ b/src/Jackett/ConfigurationDataUrl.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Jackett +{ + public class ConfigurationDataUrl : ConfigurationData + { + public StringItem Url { get; private set; } + + public ConfigurationDataUrl(string defaultUrl) + { + Url = new StringItem { Name = "Url", Value = defaultUrl }; + } + + public override Item[] GetItems() + { + return new Item[] { Url }; + } + + public string GetFormattedHostUrl() + { + var uri = new Uri(Url.Value); + return string.Format("{0}://{1}", uri.Scheme, uri.Host); + } + } +} diff --git a/src/Jackett/Indexers/Rarbg.cs b/src/Jackett/Indexers/Rarbg.cs new file mode 100644 index 000000000..a95c7ea87 --- /dev/null +++ b/src/Jackett/Indexers/Rarbg.cs @@ -0,0 +1,160 @@ +using CsQuery; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace Jackett.Indexers +{ + public class Rarbg : IndexerInterface + { + public event Action OnSaveConfigurationRequested; + + public event Action OnResultParsingError; + + public string DisplayName + { + get { return "RARBG"; } + } + + public string DisplayDescription + { + get { return DisplayName; } + } + + public Uri SiteLink + { + get { return new Uri("https://rarbg.com"); } + } + + public bool IsConfigured { get; private set; } + + const string DefaultUrl = "https://torrentapi.org"; + + const string TokenUrl = "/pubapi.php?get_token=get_token&format=json"; + const string SearchTVRageUrl = "/pubapi.php?mode=search&search_tvrage={0}&token={1}&format=json&min_seeders=1"; + const string SearchQueryUrl = "/pubapi.php?mode=search&search_string={0}&token={1}&format=json&min_seeders=1"; + + static string chromeUserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"; + + string BaseUrl; + + CookieContainer cookies; + HttpClientHandler handler; + HttpClient client; + + public Rarbg() + { + IsConfigured = false; + cookies = new CookieContainer(); + handler = new HttpClientHandler + { + CookieContainer = cookies, + AllowAutoRedirect = true, + UseCookies = true, + }; + client = new HttpClient(handler); + } + + public Task GetConfigurationForSetup() + { + var config = new ConfigurationDataUrl(DefaultUrl); + return Task.FromResult(config); + } + + public async Task ApplyConfiguration(JToken configJson) + { + var config = new ConfigurationDataUrl(DefaultUrl); + config.LoadValuesFromJson(configJson); + + var formattedUrl = config.GetFormattedHostUrl(); + var token = await GetToken(formattedUrl); + /*var releases = await PerformQuery(new TorznabQuery(), formattedUrl); + if (releases.Length == 0) + throw new Exception("Could not find releases from this URL");*/ + + BaseUrl = formattedUrl; + + var configSaveData = new JObject(); + configSaveData["base_url"] = BaseUrl; + + if (OnSaveConfigurationRequested != null) + OnSaveConfigurationRequested(this, configSaveData); + + IsConfigured = true; + } + + public void LoadFromSavedConfiguration(JToken jsonConfig) + { + BaseUrl = (string)jsonConfig["base_url"]; + IsConfigured = true; + } + + HttpRequestMessage CreateHttpRequest(string uri) + { + var message = new HttpRequestMessage(); + message.Method = HttpMethod.Get; + message.RequestUri = new Uri(uri); + message.Headers.UserAgent.ParseAdd(chromeUserAgent); + return message; + } + + async Task GetToken(string url) + { + var request = CreateHttpRequest(url + TokenUrl); + var response = await client.SendAsync(request); + var result = await response.Content.ReadAsStringAsync(); + JObject obj = JObject.Parse(result); + return (string)obj["token"]; + } + + public async Task PerformQuery(TorznabQuery query) + { + return await PerformQuery(query, BaseUrl); + } + + async Task PerformQuery(TorznabQuery query, string baseUrl) + { + List releases = new List(); + + string token = await GetToken(baseUrl); + string searchUrl; + if (query.RageID != 0) + searchUrl = string.Format(baseUrl + SearchTVRageUrl, query.RageID, token); + else + searchUrl = string.Format(baseUrl + SearchQueryUrl, query.SearchTerm, token); + + var request = CreateHttpRequest(searchUrl); + var response = await client.SendAsync(request); + var results = await response.Content.ReadAsStringAsync(); + + var jItems = JArray.Parse(results); + foreach (JObject item in jItems) + { + var release = new ReleaseInfo(); + release.Title = (string)item["f"]; + release.MagnetUri = new Uri((string)item["d"]); + release.Guid = release.MagnetUri; + release.PublishDate = new DateTime(1970, 1, 1); + release.Size = 0; + release.Seeders = 1; + release.Peers = 1; + release.MinimumRatio = 1; + release.MinimumSeedTime = 172800; + releases.Add(release); + } + + return releases.ToArray(); + + } + + public Task Download(Uri link) + { + throw new NotImplementedException(); + } + } +}