From 2eebea06832a4b940a79d66ec4dd1d3cb418f63a Mon Sep 17 00:00:00 2001 From: unknown <zone117x@gmail.com> Date: Mon, 13 Jul 2015 01:13:16 -0600 Subject: [PATCH] Implemented T411 --- src/Jackett/Indexers/T411.cs | 200 ++++++++++++++++++++++++++ src/Jackett/Jackett.csproj | 4 + src/Jackett/WebContent/logos/t411.png | Bin 0 -> 28583 bytes 3 files changed, 204 insertions(+) create mode 100644 src/Jackett/Indexers/T411.cs create mode 100644 src/Jackett/WebContent/logos/t411.png diff --git a/src/Jackett/Indexers/T411.cs b/src/Jackett/Indexers/T411.cs new file mode 100644 index 00000000..cbaff744 --- /dev/null +++ b/src/Jackett/Indexers/T411.cs @@ -0,0 +1,200 @@ +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; + +namespace Jackett.Indexers +{ + public class T411 : IndexerInterface + { + + public event Action<IndexerInterface, JToken> OnSaveConfigurationRequested; + + public event Action<IndexerInterface, string, Exception> OnResultParsingError; + + public string DisplayName + { + get { return "T411"; } + } + + public string DisplayDescription + { + get { return "French Torrent Tracker"; } + } + + public Uri SiteLink + { + get { return new Uri(BaseUrl); } + } + + public bool IsConfigured { get; private set; } + + const string BaseUrl = "http://www.t411.io"; + const string CommentsUrl = BaseUrl + "/torrents/{0}"; + + const string ApiUrl = "http://api.t411.io"; + const string AuthUrl = ApiUrl + "/auth"; + const string SearchUrl = ApiUrl + "/torrents/search/{0}"; + const string DownloadUrl = ApiUrl + "/torrents/download/{0}"; + + HttpClientHandler handler; + HttpClient client; + + string username = string.Empty; + string password = string.Empty; + string token = string.Empty; + DateTime lastTokenFetch = DateTime.MinValue; + + public T411() + { + IsConfigured = false; + handler = new HttpClientHandler + { + AllowAutoRedirect = true + }; + client = new HttpClient(handler); + } + + public Task<ConfigurationData> GetConfigurationForSetup() + { + var config = new ConfigurationDataBasicLogin(); + return Task.FromResult<ConfigurationData>(config); + } + + async Task<string> GetAuthToken(bool forceFetch = false) + { + if (!forceFetch && lastTokenFetch > DateTime.Now - TimeSpan.FromHours(48)) + { + return token; + } + + var pairs = new Dictionary<string, string> { + { "username", username }, + { "password", password } + }; + + var content = new FormUrlEncodedContent(pairs); + + var response = await client.PostAsync(AuthUrl, content); + var responseContent = await response.Content.ReadAsStringAsync(); + var jsonResponse = JObject.Parse(responseContent); + if (jsonResponse["error"] != null) + { + throw new ApplicationException((string)jsonResponse["error"]); + } + token = (string)jsonResponse["token"]; + lastTokenFetch = DateTime.Now; + return token; + } + + public async Task ApplyConfiguration(JToken configJson) + { + var config = new ConfigurationDataBasicLogin(); + config.LoadValuesFromJson(configJson); + + username = config.Username.Value; + password = config.Password.Value; + + try + { + await GetAuthToken(true); + } + catch (Exception ex) + { + throw new ExceptionWithConfigData(ex.Message, (ConfigurationData)config); + } + + var configSaveData = new JObject(); + configSaveData["username"] = username; + configSaveData["password"] = password; + configSaveData["token"] = token; + configSaveData["last_token_fetch"] = lastTokenFetch; + + if (OnSaveConfigurationRequested != null) + OnSaveConfigurationRequested(this, configSaveData); + + IsConfigured = true; + } + + public void LoadFromSavedConfiguration(JToken jsonConfig) + { + username = (string)jsonConfig["username"]; + password = (string)jsonConfig["password"]; + token = (string)jsonConfig["token"]; + lastTokenFetch = (DateTime)jsonConfig["last_token_fetch"]; + IsConfigured = true; + } + + public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query) + { + List<ReleaseInfo> releases = new List<ReleaseInfo>(); + + foreach (var title in query.ShowTitles ?? new string[] { "%20" }) + { + 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); + message.Headers.TryAddWithoutValidation("Authorization", token); + + var response = await client.SendAsync(message); + var results = await response.Content.ReadAsStringAsync(); + + var jsonResult = JObject.Parse(results); + try + { + var items = (JArray)jsonResult["torrents"]; + foreach (var item in items) + { + var release = new ReleaseInfo(); + + release.MinimumRatio = 1; + release.MinimumSeedTime = 172800; + var torrentId = (string)item["id"]; + release.Link = new Uri(string.Format(DownloadUrl, torrentId)); + release.Title = (string)item["name"]; + release.Description = release.Title; + release.Comments = new Uri(string.Format(CommentsUrl, (string)item["rewritename"])); + release.Guid = release.Comments; + + var dateUtc = DateTime.ParseExact((string)item["added"], "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); + release.PublishDate = DateTime.SpecifyKind(dateUtc, DateTimeKind.Utc).ToLocalTime(); + + release.Seeders = ParseUtil.CoerceInt((string)item["seeders"]); + release.Peers = ParseUtil.CoerceInt((string)item["leechers"]) + release.Seeders; + + release.Size = ParseUtil.CoerceLong((string)item["size"]); + + releases.Add(release); + } + } + catch (Exception ex) + { + OnResultParsingError(this, results, ex); + throw ex; + } + } + return releases.ToArray(); + } + + public async Task<byte[]> Download(Uri link) + { + var message = new HttpRequestMessage(); + message.Method = HttpMethod.Get; + message.RequestUri = link; + message.Headers.TryAddWithoutValidation("Authorization", token); + + var response = await client.SendAsync(message); + return await response.Content.ReadAsByteArrayAsync(); + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 532f6f42..e53951a7 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -107,6 +107,7 @@ <Compile Include="Indexers\SceneTime.cs" /> <Compile Include="Indexers\ShowRSS.cs" /> <Compile Include="Indexers\Strike.cs" /> + <Compile Include="Indexers\T411.cs" /> <Compile Include="Indexers\ThePirateBay.cs" /> <Compile Include="Indexers\TorrentDay.cs" /> <Compile Include="Indexers\AnimeBytes.cs" /> @@ -181,6 +182,9 @@ <Content Include="WebContent\logos\showrss.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="WebContent\logos\t411.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="WebContent\logos\torrentday.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> diff --git a/src/Jackett/WebContent/logos/t411.png b/src/Jackett/WebContent/logos/t411.png new file mode 100644 index 0000000000000000000000000000000000000000..30e13134a219fcb3892657209c8f356aad8744f0 GIT binary patch literal 28583 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 J%Q~loCIH1Eo(=#2 literal 0 HcmV?d00001 -- GitLab