From 75f0cce06413ca3e68e5b00f826ffd5b10b540fe Mon Sep 17 00:00:00 2001 From: KZ Date: Sun, 19 Jul 2015 18:18:54 +0100 Subject: [PATCH] Change indexers to use new api --- src/Jackett.Console/Jackett.Console.csproj | 4 + src/Jackett.Service/Jackett.Service.csproj | 4 + src/Jackett.Tray/Main.cs | 6 +- src/Jackett/Content/logos/speedcd.png | Bin 0 -> 34498 bytes src/Jackett/Controllers/APIController.cs | 2 +- src/Jackett/Controllers/AdminController.cs | 5 +- src/Jackett/Indexers/AlphaRatio.cs | 69 +++++---------- src/Jackett/Indexers/AnimeBytes.cs | 83 ++++++------------ src/Jackett/Indexers/BaseIndexer.cs | 34 +++++-- src/Jackett/Indexers/BeyondHD.cs | 65 +++++--------- src/Jackett/Indexers/BitHdtv.cs | 62 +++++-------- src/Jackett/Indexers/BitMeTV.cs | 55 +++++------- src/Jackett/Indexers/FrenchTorrentDb.cs | 51 +++++------ src/Jackett/Indexers/Freshon.cs | 58 +++++------- src/Jackett/Indexers/HDTorrents.cs | 71 +++++---------- src/Jackett/Indexers/IPTorrents.cs | 71 +++++---------- src/Jackett/Indexers/Master.cs | 16 ---- src/Jackett/Indexers/MoreThanTV.cs | 74 +++++----------- src/Jackett/Indexers/Rarbg.cs | 53 ++++------- src/Jackett/Indexers/SceneAccess.cs | 63 ++++--------- src/Jackett/Indexers/SceneTime.cs | 61 +++++-------- src/Jackett/Indexers/ShowRSS.cs | 58 ++++-------- src/Jackett/Indexers/SpeedCD.cs | 54 ++++++------ src/Jackett/Indexers/Strike.cs | 67 +++++--------- src/Jackett/Indexers/T411.cs | 49 +++-------- src/Jackett/Indexers/ThePirateBay.cs | 38 +++----- src/Jackett/Indexers/TorrentDay.cs | 66 +++++--------- src/Jackett/Indexers/TorrentLeech.cs | 60 ++++--------- src/Jackett/Indexers/TorrentShack.cs | 59 ++++--------- src/Jackett/Indexers/Torrentz.cs | 63 ++++--------- src/Jackett/Jackett.csproj | 8 +- src/Jackett/JackettModule.cs | 2 +- src/Jackett/Models/ConfigurationData.cs | 5 +- src/Jackett/Models/ConfigurationDataUrl.cs | 5 ++ src/Jackett/Services/IndexerManagerService.cs | 26 +++--- src/Jackett/{ => Utils}/DataUrl.cs | 4 +- src/Jackett/Utils/DateTimeUtil.cs | 18 ++++ 37 files changed, 532 insertions(+), 957 deletions(-) create mode 100644 src/Jackett/Content/logos/speedcd.png delete mode 100644 src/Jackett/Indexers/Master.cs rename src/Jackett/{ => Utils}/DataUrl.cs (91%) create mode 100644 src/Jackett/Utils/DateTimeUtil.cs diff --git a/src/Jackett.Console/Jackett.Console.csproj b/src/Jackett.Console/Jackett.Console.csproj index 918f669ff..c170cf8f5 100644 --- a/src/Jackett.Console/Jackett.Console.csproj +++ b/src/Jackett.Console/Jackett.Console.csproj @@ -115,6 +115,10 @@ + + {74420a79-cc16-442c-8b1e-7c1b913844f0} + CurlSharp + {e636d5f8-68b4-4903-b4ed-ccfd9c9e899f} Jackett diff --git a/src/Jackett.Service/Jackett.Service.csproj b/src/Jackett.Service/Jackett.Service.csproj index b9614e42a..bf2fb9a88 100644 --- a/src/Jackett.Service/Jackett.Service.csproj +++ b/src/Jackett.Service/Jackett.Service.csproj @@ -121,6 +121,10 @@ + + {74420a79-cc16-442c-8b1e-7c1b913844f0} + CurlSharp + {e636d5f8-68b4-4903-b4ed-ccfd9c9e899f} Jackett diff --git a/src/Jackett.Tray/Main.cs b/src/Jackett.Tray/Main.cs index a1a51b09f..991f72f1a 100644 --- a/src/Jackett.Tray/Main.cs +++ b/src/Jackett.Tray/Main.cs @@ -1,5 +1,4 @@ -#if !__MonoCS__ -using Microsoft.Win32; +using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; @@ -92,5 +91,4 @@ namespace JackettTray shortcut.Save();*/ } } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/Jackett/Content/logos/speedcd.png b/src/Jackett/Content/logos/speedcd.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd781b46e83798dc8c0574dbfd5a3861f02c426 GIT binary patch literal 34498 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 GetConfigForm() { var jsonReply = new JObject(); @@ -99,7 +99,7 @@ namespace Jackett.Controllers foreach (var indexer in indexerService.GetAllIndexers()) { var item = new JObject(); - item["id"] = indexer.GetType().Name.ToLowerInvariant(); + item["id"] = indexer.GetType().Name; item["name"] = indexer.DisplayName; item["description"] = indexer.DisplayDescription; item["configured"] = indexer.IsConfigured; @@ -126,6 +126,7 @@ namespace Jackett.Controllers var postData = await ReadPostDataJson(); string indexerString = (string)postData["indexer"]; indexerService.TestIndexer(indexerString); + jsonReply["name"] = indexerService.GetIndexer(indexerString).DisplayName; jsonReply["result"] = "success"; } catch (Exception ex) diff --git a/src/Jackett/Indexers/AlphaRatio.cs b/src/Jackett/Indexers/AlphaRatio.cs index e4883f83d..be2deeae2 100644 --- a/src/Jackett/Indexers/AlphaRatio.cs +++ b/src/Jackett/Indexers/AlphaRatio.cs @@ -12,57 +12,36 @@ using System.Net.Http.Headers; using Jackett.Models; using Jackett.Utils; using NLog; +using Jackett.Services; namespace Jackett.Indexers { - public class AlphaRatio : IIndexer + public class AlphaRatio : BaseIndexer,IIndexer { - public string DisplayName - { - get { return "AlphaRatio"; } - } - - public string DisplayDescription - { - get { return "Legendary"; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - - public event Action OnSaveConfigurationRequested; - public event Action OnResultParsingError; - - public bool IsConfigured { get; private set; } - - static string BaseUrl = "https://alpharatio.cc"; - - static string LoginUrl = BaseUrl + "/login.php"; - - static string SearchUrl = BaseUrl + "/ajax.php?action=browse&searchstr="; - - static string DownloadUrl = BaseUrl + "/torrents.php?action=download&id="; - - static string GuidUrl = BaseUrl + "/torrents.php?torrentid="; - - static string chromeUserAgent = BrowserUtil.ChromeUserAgent; + private readonly string LoginUrl = ""; + private readonly string SearchUrl = ""; + private readonly string DownloadUrl = ""; + private readonly string GuidUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; string cookieHeader; - private Logger logger; - public AlphaRatio(Logger l) + public AlphaRatio(IIndexerManagerService i, Logger l): + base(name: "AlphaRatio", + description: "Legendary", + link: new Uri("https://alpharatio.cc"), + rageid: true, + manager:i, + logger:l) { - logger = l; - IsConfigured = false; + LoginUrl = SiteLink + "/login.php"; + SearchUrl = SiteLink + "/ajax.php?action=browse&searchstr="; + DownloadUrl = SiteLink + "/torrents.php?action=download&id="; + GuidUrl = SiteLink + "/torrents.php?torrentid="; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -83,8 +62,7 @@ namespace Jackett.Indexers public async Task ApplyConfiguration(JToken configJson) { var configSaveData = new JObject(); - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); + SaveConfig(configSaveData); var config = new ConfigurationDataBasicLogin(); config.LoadValuesFromJson(configJson); @@ -131,9 +109,7 @@ namespace Jackett.Indexers } else { - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } @@ -143,7 +119,7 @@ namespace Jackett.Indexers var message = new HttpRequestMessage(); message.Method = HttpMethod.Post; message.RequestUri = uri; - message.Headers.UserAgent.ParseAdd(chromeUserAgent); + message.Headers.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent); return message; } @@ -223,8 +199,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); diff --git a/src/Jackett/Indexers/AnimeBytes.cs b/src/Jackett/Indexers/AnimeBytes.cs index c5360a0f8..fe21b802f 100644 --- a/src/Jackett/Indexers/AnimeBytes.cs +++ b/src/Jackett/Indexers/AnimeBytes.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -18,7 +19,7 @@ using System.Web; namespace Jackett.Indexers { - public class AnimeBytes : IIndexer + public class AnimeBytes : BaseIndexer, IIndexer { class ConfigurationDataBasicLoginAnimeBytes : ConfigurationDataBasicLogin { @@ -38,48 +39,27 @@ namespace Jackett.Indexers } } - private static List cache = new List(); - private static readonly TimeSpan cacheTime = new TimeSpan(0, 9, 0); + + private readonly string LoginUrl = ""; + private readonly string SearchUrl = ""; - public event Action OnResultParsingError; - public event Action OnSaveConfigurationRequested; - - static string chromeUserAgent = BrowserUtil.ChromeUserAgent; - - public string DisplayName - { - get { return "AnimeBytes"; } - } - - public string DisplayDescription - { - get { return "The web's best Chinese cartoons"; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - const string BaseUrl = "https://animebytes.tv"; - const string LoginUrl = BaseUrl + "/user/login"; - const string SearchUrl = BaseUrl + "/torrents.php?filter_cat[1]=1"; - - public bool IsConfigured { get; private set; } public bool AllowRaws { get; private set; } - - CookieContainer cookieContainer; HttpClientHandler handler; HttpClient client; - Logger logger; - public AnimeBytes(Logger l) + public AnimeBytes(IIndexerManagerService i, Logger l) : + base(name: "AnimeBytes", + description: "The web's best Chinese cartoons", + link: new Uri("https://animebytes.tv"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + + LoginUrl = SiteLink + "/user/login"; + SearchUrl = SiteLink + "/torrents.php?filter_cat[1]=1"; + cookieContainer = new CookieContainer(); handler = new HttpClientHandler { @@ -88,7 +68,7 @@ namespace Jackett.Indexers UseCookies = true, }; client = new HttpClient(handler); - client.DefaultRequestHeaders.Add("User-Agent", chromeUserAgent); + client.DefaultRequestHeaders.Add("User-Agent", BrowserUtil.ChromeUserAgent); } public Task GetConfigurationForSetup() @@ -132,11 +112,11 @@ namespace Jackett.Indexers { foreach (var c in cookies) { - cookieContainer.SetCookies(new Uri(BaseUrl), c.Substring(0, c.LastIndexOf(';'))); + cookieContainer.SetCookies(SiteLink, c.Substring(0, c.LastIndexOf(';'))); } } - foreach (Cookie cookie in cookieContainer.GetCookies(new Uri(BaseUrl))) + foreach (Cookie cookie in cookieContainer.GetCookies(SiteLink)) { if (cookie.Name == "session") { @@ -146,7 +126,7 @@ namespace Jackett.Indexers } // Get the home page now we are logged in as AllowAutoRedirect is false as we needed to get the cookie manually. - response = await client.GetAsync(BaseUrl); + response = await client.GetAsync(SiteLink); responseContent = await response.Content.ReadAsStringAsync(); if (!responseContent.Contains("/user/logout")) @@ -160,16 +140,14 @@ namespace Jackett.Indexers cookieContainer.DumpToJson(SiteLink, configSaveData); configSaveData["raws"] = AllowRaws; - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookieContainer.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookieContainer.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; AllowRaws = jsonConfig["raws"].Value(); } @@ -191,13 +169,7 @@ namespace Jackett.Indexers return sb.ToString(); } - private void CleanCache() - { - foreach (var expired in cache.Where(i => i.Created - DateTime.Now > cacheTime).ToList()) - { - cache.Remove(expired); - } - } + public async Task PerformQuery(TorznabQuery query) @@ -344,9 +316,9 @@ namespace Jackett.Indexers release.PublishDate = release.PublishDate.AddDays(Math.Min(DateTime.Now.DayOfYear, 365) - 1); var infoLink = links.Get(1); - release.Comments = new Uri(BaseUrl + "/" + infoLink.Attributes.GetAttribute("href")); - release.Guid = new Uri(BaseUrl + "/" + infoLink.Attributes.GetAttribute("href") + "&nh=" + Hash(title)); // Sonarr should dedupe on this url - allow a url per name. - release.Link = new Uri(BaseUrl + "/" + downloadLink.Attributes.GetAttribute("href")); + release.Comments = new Uri(SiteLink + "/" + infoLink.Attributes.GetAttribute("href")); + release.Guid = new Uri(SiteLink + "/" + infoLink.Attributes.GetAttribute("href") + "&nh=" + Hash(title)); // Sonarr should dedupe on this url - allow a url per name. + release.Link = new Uri(SiteLink + "/" + downloadLink.Attributes.GetAttribute("href")); // We dont actually have a release name >.> so try to create one var releaseTags = infoLink.InnerText.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList(); @@ -406,8 +378,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, responseContent, ex); - throw ex; + OnParseError(responseContent, ex); } // Add to the cache diff --git a/src/Jackett/Indexers/BaseIndexer.cs b/src/Jackett/Indexers/BaseIndexer.cs index 1de82fb31..106633a91 100644 --- a/src/Jackett/Indexers/BaseIndexer.cs +++ b/src/Jackett/Indexers/BaseIndexer.cs @@ -6,10 +6,11 @@ using System.Threading.Tasks; using Jackett.Models; using Newtonsoft.Json.Linq; using NLog; +using Jackett.Services; namespace Jackett.Indexers { - public abstract class BaseIndexer: IIndexer + public abstract class BaseIndexer { public string DisplayDescription { get; private set; } public string DisplayName { get; private set; } @@ -17,28 +18,43 @@ namespace Jackett.Indexers public Uri SiteLink { get; private set; } public bool RequiresRageIDLookupDisabled { get; private set; } - public abstract Task ApplyConfiguration(JToken configJson); - public abstract Task Download(Uri link); - public abstract Task GetConfigurationForSetup(); - public abstract void LoadFromSavedConfiguration(JToken jsonConfig); - public abstract Task PerformQuery(TorznabQuery query); + protected Logger logger; + protected IIndexerManagerService indexerService; - private Logger logger; + protected static List cache = new List(); + protected static readonly TimeSpan cacheTime = new TimeSpan(0, 9, 0); - public BaseIndexer(string name, string description, Uri link, Logger logger) + + public BaseIndexer(string name, string description, bool rageid, Uri link, IIndexerManagerService manager, Logger logger) { DisplayName = name; DisplayDescription = description; SiteLink = link; this.logger = logger; + indexerService = manager; + RequiresRageIDLookupDisabled = rageid; } - protected void LogParseError(string results, Exception ex) + protected void SaveConfig(JToken config) + { + indexerService.SaveConfig(this as IIndexer, config); + } + + protected void OnParseError(string results, Exception ex) { var fileName = string.Format("Error on {0} for {1}.txt", DateTime.Now.ToString("yyyyMMddHHmmss"), DisplayName); var spacing = string.Join("", Enumerable.Repeat(Environment.NewLine, 5)); var fileContents = string.Format("{0}{1}{2}", ex, spacing, results); logger.Error(fileName + fileContents); + throw ex; + } + + protected void CleanCache() + { + foreach (var expired in cache.Where(i => i.Created - DateTime.Now > cacheTime).ToList()) + { + cache.Remove(expired); + } } } } diff --git a/src/Jackett/Indexers/BeyondHD.cs b/src/Jackett/Indexers/BeyondHD.cs index f55a5bdb5..7fca5cb92 100644 --- a/src/Jackett/Indexers/BeyondHD.cs +++ b/src/Jackett/Indexers/BeyondHD.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -14,44 +15,26 @@ using System.Web; namespace Jackett.Indexers { - public class BeyondHD : IIndexer + public class BeyondHD : BaseIndexer, IIndexer { - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - public string DisplayName - { - get { return "BeyondHD"; } - } - - public string DisplayDescription - { - get { return "Without BeyondHD, your HDTV is just a TV"; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured { get; private set; } - - const string BaseUrl = "https://beyondhd.me"; - const string SearchUrl = BaseUrl + "/browse.php?c40=1&c44=1&c48=1&c89=1&c46=1&c45=1&searchin=title&incldead=0&search={0}"; - const string DownloadUrl = BaseUrl + "/download.php?torrent={0}"; + private readonly string SearchUrl = ""; + private readonly string DownloadUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger logger; - public BeyondHD(Logger l) + public BeyondHD(IIndexerManagerService i, Logger l) : + base(name: "BeyondHD", + description: "Without BeyondHD, your HDTV is just a TV", + link: new Uri("https://beyondhd.me"), + rageid: true, + manager:i, + logger:l) { - logger = l; - IsConfigured = false; + SearchUrl = SiteLink + "/browse.php?c40=1&c44=1&c48=1&c89=1&c46=1&c45=1&searchin=title&incldead=0&search={0}"; + DownloadUrl = SiteLink + "/download.php?torrent={0}"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -75,9 +58,9 @@ namespace Jackett.Indexers var jsonCookie = new JObject(); jsonCookie["cookie_header"] = config.CookieHeader; - cookies.FillFromJson(new Uri(BaseUrl), jsonCookie, logger); + cookies.FillFromJson(SiteLink, jsonCookie, logger); - var responseContent = await client.GetStringAsync(BaseUrl); + var responseContent = await client.GetStringAsync(SiteLink); if (!responseContent.Contains("logout.php")) { @@ -88,18 +71,14 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } - } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -124,14 +103,14 @@ namespace Jackett.Indexers var qRow = row.Cq(); var qLink = row.ChildElements.ElementAt(2).FirstChild.Cq(); - release.Link = new Uri(BaseUrl + "/" + qLink.Attr("href")); + release.Link = new Uri(SiteLink + "/" + qLink.Attr("href")); var torrentID = qLink.Attr("href").Split('=').Last(); var descCol = row.ChildElements.ElementAt(3); var qCommentLink = descCol.FirstChild.Cq(); release.Title = qCommentLink.Text(); release.Description = release.Title; - release.Comments = new Uri(BaseUrl + "/" + qCommentLink.Attr("href")); + release.Comments = new Uri(SiteLink + "/" + qCommentLink.Attr("href")); release.Guid = release.Comments; var dateStr = descCol.ChildElements.Last().Cq().Text().Split('|').Last().ToLowerInvariant().Replace("ago.", "").Trim(); @@ -167,11 +146,9 @@ namespace Jackett.Indexers } } - catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); diff --git a/src/Jackett/Indexers/BitHdtv.cs b/src/Jackett/Indexers/BitHdtv.cs index a7319e23c..27ea5cbd5 100644 --- a/src/Jackett/Indexers/BitHdtv.cs +++ b/src/Jackett/Indexers/BitHdtv.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -15,41 +16,28 @@ using System.Web; namespace Jackett.Indexers { - public class BitHdtv : IIndexer + public class BitHdtv : BaseIndexer, IIndexer { - public event Action OnResultParsingError; - - public string DisplayName - { - get { return "BIT-HDTV"; } - } - - public string DisplayDescription - { - get { return "Home of high definition invites"; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - static string BaseUrl = "https://www.bit-hdtv.com"; - static string LoginUrl = BaseUrl + "/takelogin.php"; - static string SearchUrl = BaseUrl + "/torrents.php?cat=0&search="; - static string DownloadUrl = BaseUrl + "/download.php?/{0}/dl.torrent"; + private readonly string LoginUrl = ""; + private readonly string SearchUrl = ""; + private readonly string DownloadUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger loggger; - public BitHdtv(Logger l) + public BitHdtv(IIndexerManagerService i, Logger l) : + base(name: "BIT-HDTV", + description: "Home of high definition invites", + link: new Uri("https://www.bit-hdtv.com"), + rageid: true, + manager: i, + logger: l) { - loggger = l; - IsConfigured = false; + LoginUrl = SiteLink + "/takelogin.php"; + SearchUrl = SiteLink + "/torrents.php?cat=0&search="; + DownloadUrl = SiteLink + "/download.php?/{0}/dl.torrent"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -94,21 +82,14 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } - public event Action OnSaveConfigurationRequested; - - public bool IsConfigured { get; private set; } - public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, loggger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -136,7 +117,7 @@ namespace Jackett.Indexers release.MinimumSeedTime = 172800; release.Title = qLink.Attr("title"); release.Description = release.Title; - release.Guid = new Uri(BaseUrl + qLink.Attr("href")); + release.Guid = new Uri(SiteLink + qLink.Attr("href")); release.Comments = release.Guid; release.Link = new Uri(string.Format(DownloadUrl, qLink.Attr("href").Split('=')[1])); @@ -157,8 +138,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); @@ -168,7 +148,5 @@ namespace Jackett.Indexers { return client.GetByteArrayAsync(link); } - - } } diff --git a/src/Jackett/Indexers/BitMeTV.cs b/src/Jackett/Indexers/BitMeTV.cs index fc845d2db..f5f08f209 100644 --- a/src/Jackett/Indexers/BitMeTV.cs +++ b/src/Jackett/Indexers/BitMeTV.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -16,7 +17,7 @@ using System.Web; namespace Jackett.Indexers { - public class BitMeTV : IIndexer + public class BitMeTV : BaseIndexer, IIndexer { class BmtvConfig : ConfigurationData { @@ -42,24 +43,28 @@ namespace Jackett.Indexers } } - static string BaseUrl = "http://www.bitmetv.org"; - static string LoginUrl = BaseUrl + "/login.php"; - static string LoginPost = BaseUrl + "/takelogin.php"; - static string CaptchaUrl = BaseUrl + "/visual.php"; - static string SearchUrl = BaseUrl + "/browse.php"; + private readonly string LoginUrl = ""; + private readonly string LoginPost = ""; + private readonly string CaptchaUrl = ""; + private readonly string SearchUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger logger; - public event Action OnSaveConfigurationRequested; - public event Action OnResultParsingError; - - public BitMeTV(Logger l) + public BitMeTV(IIndexerManagerService i, Logger l) : + base(name: "BitMeTV", + description: "TV Episode specialty tracker", + link: new Uri("http://www.bitmetv.org"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + LoginUrl = SiteLink + "/login.php"; + LoginPost = SiteLink + "/takelogin.php"; + CaptchaUrl = SiteLink + "/visual.php"; + SearchUrl = SiteLink + "/browse.php"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -70,16 +75,6 @@ namespace Jackett.Indexers client = new HttpClient(handler); } - public string DisplayName { get { return "BitMeTV"; } } - - public string DisplayDescription { get { return "TV Episode specialty tracker"; } } - - public Uri SiteLink { get { return new Uri(BaseUrl); } } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured { get; private set; } - public async Task GetConfigurationForSetup() { await client.GetAsync(LoginUrl); @@ -119,17 +114,14 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -155,7 +147,7 @@ namespace Jackett.Indexers release.MinimumRatio = 1; release.MinimumSeedTime = 172800; - release.Comments = new Uri(BaseUrl + "/" + qLink.Attr("href")); + release.Comments = new Uri(SiteLink + "/" + qLink.Attr("href")); release.Guid = release.Comments; release.Title = qLink.Attr("title"); release.Description = release.Title; @@ -169,7 +161,7 @@ namespace Jackett.Indexers var date = DateTime.ParseExact(formattedTimeString, "dddd MMMM d yyyy hh:mm:ss tt", CultureInfo.InvariantCulture); release.PublishDate = DateTime.SpecifyKind(date, DateTimeKind.Utc).ToLocalTime(); - release.Link = new Uri(BaseUrl + "/" + row.ChildElements.ElementAt(2).Cq().Children("a.index").Attr("href")); + release.Link = new Uri(SiteLink + "/" + row.ChildElements.ElementAt(2).Cq().Children("a.index").Attr("href")); var sizeCol = row.ChildElements.ElementAt(6); var sizeVal = ParseUtil.CoerceFloat(sizeCol.ChildNodes[0].NodeValue); @@ -187,8 +179,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); diff --git a/src/Jackett/Indexers/FrenchTorrentDb.cs b/src/Jackett/Indexers/FrenchTorrentDb.cs index d03eecceb..1dead510b 100644 --- a/src/Jackett/Indexers/FrenchTorrentDb.cs +++ b/src/Jackett/Indexers/FrenchTorrentDb.cs @@ -1,7 +1,9 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; +using NLog; using System; using System.Collections.Generic; using System.Globalization; @@ -12,7 +14,7 @@ using System.Web; namespace Jackett.Indexers { - class FrenchTorrentDb : IIndexer + class FrenchTorrentDb : BaseIndexer, IIndexer { public event Action OnSaveConfigurationRequested; @@ -33,28 +35,9 @@ namespace Jackett.Indexers } } - 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 RequiresRageIDLookupDisabled { get { return true; } } - - 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; + private readonly string MainUrl = ""; + private readonly string SearchUrl = ""; string cookie = string.Empty; @@ -62,9 +45,17 @@ namespace Jackett.Indexers HttpClientHandler handler; HttpClient client; - public FrenchTorrentDb() + public FrenchTorrentDb(IIndexerManagerService i, Logger l) : + base(name: "FrenchTorrentDb", + description: "One the biggest French Torrent Tracker", + link: new Uri("http://www.frenchtorrentdb.com/"), + rageid: true, + manager: i, + logger: l) { - IsConfigured = false; + MainUrl = SiteLink + "?section=INDEX"; + SearchUrl = SiteLink + "?section=TORRENTS&exact=1&name={0}&submit=GO"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -73,12 +64,12 @@ namespace Jackett.Indexers UseCookies = true, }; client = new HttpClient(handler); - client.DefaultRequestHeaders.UserAgent.ParseAdd(chromeUserAgent); + client.DefaultRequestHeaders.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent); } public Task GetConfigurationForSetup() { - var config = new ConfigurationDataUrl(BaseUrl); + var config = new ConfigurationDataUrl(SiteLink); return Task.FromResult(config); } @@ -86,7 +77,7 @@ namespace Jackett.Indexers { var config = new ConfigurationDataBasicLoginFrenchTorrentDb(); config.LoadValuesFromJson(configJson); - cookies.SetCookies(new Uri(BaseUrl), "WebsiteID=" + config.Cookie.Value); + cookies.SetCookies(SiteLink, "WebsiteID=" + config.Cookie.Value); var mainPage = await client.GetAsync(MainUrl); string responseContent = await mainPage.Content.ReadAsStringAsync(); @@ -109,7 +100,7 @@ namespace Jackett.Indexers public void LoadFromSavedConfiguration(Newtonsoft.Json.Linq.JToken jsonConfig) { cookie = (string)jsonConfig["cookie"]; - cookies.SetCookies(new Uri(BaseUrl), "WebsiteID=" + cookie); + cookies.SetCookies(SiteLink, "WebsiteID=" + cookie); IsConfigured = true; } @@ -142,9 +133,9 @@ namespace Jackett.Indexers release.MinimumSeedTime = 172800; release.Title = qLink.Text().Trim(); release.Description = release.Title; - release.Comments = new Uri(BaseUrl + "/" + qLink.Attr("href").TrimStart('/')); + release.Comments = new Uri(SiteLink + "/" + qLink.Attr("href").TrimStart('/')); release.Guid = release.Comments; - release.Link = new Uri(BaseUrl + "/" + qDlLink.Attr("href").TrimStart('/')); + release.Link = new Uri(SiteLink + "/" + 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; diff --git a/src/Jackett/Indexers/Freshon.cs b/src/Jackett/Indexers/Freshon.cs index d5080b10e..41522d2be 100644 --- a/src/Jackett/Indexers/Freshon.cs +++ b/src/Jackett/Indexers/Freshon.cs @@ -1,6 +1,7 @@ using CsQuery; using Jackett.Indexers; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -18,38 +19,29 @@ using System.Web.UI.WebControls; namespace Jackett { - public class Freshon : IIndexer + public class Freshon : BaseIndexer, IIndexer { - public event Action OnResultParsingError; - - static string BaseUrl = "https://freshon.tv"; - static string LoginUrl = BaseUrl + "/login.php"; - static string LoginPostUrl = BaseUrl + "/login.php?action=makelogin"; - static string SearchUrl = BaseUrl + "/browse.php"; - - static string chromeUserAgent = BrowserUtil.ChromeUserAgent; + private readonly string LoginUrl = ""; + private readonly string LoginPostUrl = ""; + private readonly string SearchUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - public bool IsConfigured { get; private set; } - - public string DisplayName { get { return "FreshOnTV"; } } - - public string DisplayDescription { get { return "Our goal is to provide the latest stuff in the TV show domain"; } } - - public Uri SiteLink { get { return new Uri(BaseUrl); } } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public event Action OnSaveConfigurationRequested; - private Logger logger; - - public Freshon(Logger l) + public Freshon(IIndexerManagerService i, Logger l) : + base(name: "FreshOnTV", + description: "Our goal is to provide the latest stuff in the TV show domain", + link: new Uri("https://www.bit-hdtv.com"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + + LoginUrl = SiteLink + "/login.php"; + LoginPostUrl = SiteLink + "/login.php?action=makelogin"; + SearchUrl = SiteLink + "/browse.php"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -99,17 +91,14 @@ namespace Jackett { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - // if (OnSaveConfigurationRequested != null) - // OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -118,7 +107,7 @@ namespace Jackett var message = new HttpRequestMessage(); message.Method = HttpMethod.Get; message.RequestUri = uri; - message.Headers.UserAgent.ParseAdd(chromeUserAgent); + message.Headers.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent); return message; } @@ -156,9 +145,9 @@ namespace Jackett release.MinimumSeedTime = 172800; release.Title = qLink.Attr("title"); release.Description = release.Title; - release.Guid = new Uri(BaseUrl + qLink.Attr("href")); + release.Guid = new Uri(SiteLink + qLink.Attr("href")); release.Comments = release.Guid; - release.Link = new Uri(BaseUrl + qRow.Find("td.table_links > a").First().Attr("href")); + release.Link = new Uri(SiteLink + qRow.Find("td.table_links > a").First().Attr("href")); DateTime pubDate; var dateString = qRow.Find("td.table_added").Text().Trim(); @@ -183,8 +172,7 @@ namespace Jackett } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); diff --git a/src/Jackett/Indexers/HDTorrents.cs b/src/Jackett/Indexers/HDTorrents.cs index 9655ec244..63738302e 100644 --- a/src/Jackett/Indexers/HDTorrents.cs +++ b/src/Jackett/Indexers/HDTorrents.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -15,28 +16,27 @@ using System.Web; namespace Jackett.Indexers { - public class HDTorrents : IIndexer + public class HDTorrents : BaseIndexer, IIndexer { - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - const string DefaultUrl = "http://hdts.ru"; // Of the accessible domains the .ru seems the most reliable. https://hdts.ru | https://hd-torrents.org | https://hd-torrents.net | https://hd-torrents.me - string BaseUrl = DefaultUrl; - static string chromeUserAgent = BrowserUtil.ChromeUserAgent; - private string SearchUrl = DefaultUrl + "/torrents.php?search={0}&active=1&options=0&category%5B%5D=59&category%5B%5D=60&category%5B%5D=30&category%5B%5D=38&page={1}"; - private static string LoginUrl = DefaultUrl + "/login.php"; + private readonly string SearchUrl = ""; + private static string LoginUrl = ""; private const int MAXPAGES = 3; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger logger; - public HDTorrents(Logger l) + public HDTorrents(IIndexerManagerService i, Logger l) : + base(name: "HD-Torrents", + description: "HD-Torrents is a private torrent website with HD torrents and strict rules on their content.", + link: new Uri("http://hdts.ru"),// Of the accessible domains the .ru seems the most reliable. https://hdts.ru | https://hd-torrents.org | https://hd-torrents.net | https://hd-torrents.me + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + SearchUrl = SiteLink + "/torrents.php?search={0}&active=1&options=0&category%5B%5D=59&category%5B%5D=60&category%5B%5D=30&category%5B%5D=38&page={1}"; + LoginUrl = SiteLink + "/login.php"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -47,29 +47,6 @@ namespace Jackett.Indexers client = new HttpClient(handler); } - public string DisplayName - { - get { return "HD-Torrents"; } - } - - public string DisplayDescription - { - get { return "HD-Torrents is a private torrent website with HD torrents and strict rules on their content."; } - } - - public Uri SiteLink - { - get { return new Uri(DefaultUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured - { - get; - private set; - } - public Task GetConfigurationForSetup() { var config = new ConfigurationDataBasicLogin(); @@ -81,7 +58,7 @@ namespace Jackett.Indexers var message = new HttpRequestMessage(); message.Method = HttpMethod.Get; message.RequestUri = new Uri(url); - message.Headers.UserAgent.ParseAdd(chromeUserAgent); + message.Headers.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent); return message; } @@ -118,10 +95,7 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } @@ -132,7 +106,7 @@ namespace Jackett.Indexers IsConfigured = true; } - async Task PerformQuery(TorznabQuery query, string baseUrl) + async Task PerformQuery(TorznabQuery query, Uri baseUrl) { List releases = new List(); List searchurls = new List(); @@ -212,9 +186,9 @@ namespace Jackett.Indexers } release.Size = size; - release.Guid = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent b a").Attr("href")); - release.Link = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent").Get(3).FirstChild.GetAttribute("href")); - release.Comments = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent b a").Attr("href") + "#comments"); + release.Guid = new Uri(SiteLink + "/" + qRow.Find("td.mainblockcontent b a").Attr("href")); + release.Link = new Uri(SiteLink + "/" + qRow.Find("td.mainblockcontent").Get(3).FirstChild.GetAttribute("href")); + release.Comments = new Uri(SiteLink + "/" + qRow.Find("td.mainblockcontent b a").Attr("href") + "#comments"); string[] dateSplit = qRow.Find("td.mainblockcontent").Get(5).InnerHTML.Split(','); string dateString = dateSplit[1].Substring(0, dateSplit[1].IndexOf('>')); @@ -225,8 +199,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError( results, ex); } } @@ -236,7 +209,7 @@ namespace Jackett.Indexers public async Task PerformQuery(TorznabQuery query) { - return await PerformQuery(query, BaseUrl); + return await PerformQuery(query, SiteLink); } public Task Download(Uri link) diff --git a/src/Jackett/Indexers/IPTorrents.cs b/src/Jackett/Indexers/IPTorrents.cs index 00ff0ca5a..d26c6ef65 100644 --- a/src/Jackett/Indexers/IPTorrents.cs +++ b/src/Jackett/Indexers/IPTorrents.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -15,38 +16,22 @@ using System.Web; namespace Jackett.Indexers { - public class IPTorrents : IIndexer + public class IPTorrents : BaseIndexer, IIndexer { - - public event Action OnSaveConfigurationRequested; - public event Action OnResultParsingError; - - public string DisplayName { get { return "IPTorrents"; } } - - public string DisplayDescription { get { return "Always a step ahead"; } } - - public Uri SiteLink { get { return new Uri(BaseUrl); } } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured { get; private set; } - - static string chromeUserAgent = BrowserUtil.ChromeUserAgent; - - static string BaseUrl = "https://iptorrents.com"; - - string SearchUrl = BaseUrl + "/t?q="; - - + private readonly string SearchUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger logger; - public IPTorrents(Logger l) + public IPTorrents(IIndexerManagerService i, Logger l) : + base(name: "IPTorrents", + description: "Always a step ahead.", + link: new Uri("https://iptorrents.com"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + SearchUrl = SiteLink + "t?q="; cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -59,7 +44,7 @@ namespace Jackett.Indexers public async Task GetConfigurationForSetup() { - await client.GetAsync(new Uri(BaseUrl)); + await client.GetAsync(SiteLink); var config = new ConfigurationDataBasicLogin(); return (ConfigurationData)config; } @@ -79,9 +64,9 @@ namespace Jackett.Indexers var message = new HttpRequestMessage(); message.Method = HttpMethod.Post; message.Content = content; - message.RequestUri = new Uri(BaseUrl); - message.Headers.Referrer = new Uri(BaseUrl); - message.Headers.UserAgent.ParseAdd(chromeUserAgent); + message.RequestUri = SiteLink; + message.Headers.Referrer = SiteLink; + message.Headers.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent); var response = await client.SendAsync(message); var responseContent = await response.Content.ReadAsStringAsync(); @@ -97,13 +82,9 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } - } HttpRequestMessage CreateHttpRequest(Uri uri) @@ -111,22 +92,19 @@ namespace Jackett.Indexers var message = new HttpRequestMessage(); message.Method = HttpMethod.Get; message.RequestUri = uri; - message.Headers.UserAgent.ParseAdd(chromeUserAgent); + message.Headers.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent); return message; } public void LoadFromSavedConfiguration(Newtonsoft.Json.Linq.JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } public async Task PerformQuery(TorznabQuery query) { - - List releases = new List(); - - + var releases = new List(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString); @@ -148,7 +126,7 @@ namespace Jackett.Indexers var qTitleLink = qRow.Find("a.t_title").First(); release.Title = qTitleLink.Text().Trim(); release.Description = release.Title; - release.Guid = new Uri(BaseUrl + qTitleLink.Attr("href")); + release.Guid = new Uri(SiteLink + qTitleLink.Attr("href")); release.Comments = release.Guid; DateTime pubDate; @@ -174,7 +152,7 @@ namespace Jackett.Indexers release.PublishDate = pubDate; var qLink = row.ChildElements.ElementAt(3).Cq().Children("a"); - release.Link = new Uri(BaseUrl + qLink.Attr("href")); + release.Link = new Uri(SiteLink + qLink.Attr("href")); var sizeStr = row.ChildElements.ElementAt(5).Cq().Text().Trim(); var sizeVal = ParseUtil.CoerceFloat(sizeStr.Split(' ')[0]); @@ -189,12 +167,10 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); - } public async Task Download(Uri link) @@ -204,8 +180,5 @@ namespace Jackett.Indexers var bytes = await response.Content.ReadAsByteArrayAsync(); return bytes; } - - - } } diff --git a/src/Jackett/Indexers/Master.cs b/src/Jackett/Indexers/Master.cs deleted file mode 100644 index b563b69cd..000000000 --- a/src/Jackett/Indexers/Master.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Jackett.Indexers -{ - class Master - { - - - - } -} diff --git a/src/Jackett/Indexers/MoreThanTV.cs b/src/Jackett/Indexers/MoreThanTV.cs index 0c158e524..86136bffd 100644 --- a/src/Jackett/Indexers/MoreThanTV.cs +++ b/src/Jackett/Indexers/MoreThanTV.cs @@ -1,5 +1,7 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; +using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; using System; @@ -14,52 +16,33 @@ using System.Web; namespace Jackett.Indexers { - public class MoreThanTV : IIndexer + public class MoreThanTV : BaseIndexer, IIndexer { - public string DisplayName - { - get { return "MoreThanTV"; } - } - - public string DisplayDescription - { - get { return "ROMANIAN Private Torrent Tracker for TV / MOVIES, and the internal tracker for the release group DRACULA"; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public event Action OnSaveConfigurationRequested; - public event Action OnResultParsingError; - - public bool IsConfigured { get; private set; } - - static string BaseUrl = "https://www.morethan.tv"; - - static string LoginUrl = BaseUrl + "/login.php"; - - static string SearchUrl = BaseUrl + "/ajax.php?action=browse&searchstr="; - - static string DownloadUrl = BaseUrl + "/torrents.php?action=download&id="; - - static string GuidUrl = BaseUrl + "/torrents.php?torrentid="; + private readonly string LoginUrl =""; + private readonly string SearchUrl = ""; + private readonly string DownloadUrl = ""; + private readonly string GuidUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - private Logger logger; string cookieHeader; int retries = 3; - public MoreThanTV(Logger l) + public MoreThanTV(IIndexerManagerService i, Logger l) : + base(name: "MoreThanTV", + description: "ROMANIAN Private Torrent Tracker for TV / MOVIES, and the internal tracker for the release group DRACULA.", + link: new Uri("https://www.morethan.tv"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + LoginUrl = SiteLink + "/login.php"; + SearchUrl = SiteLink + "/ajax.php?action=browse&searchstr="; + DownloadUrl = SiteLink + "/torrents.php?action=download&id="; + GuidUrl = SiteLink + "/torrents.php?torrentid="; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -121,9 +104,7 @@ namespace Jackett.Indexers } else { - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } @@ -135,7 +116,7 @@ namespace Jackett.Indexers IsConfigured = true; } - static void FillReleaseInfoFromJson(ReleaseInfo release, JObject r) + private void FillReleaseInfoFromJson(ReleaseInfo release, JObject r) { var id = r["torrentId"]; release.Size = (long)r["size"]; @@ -173,7 +154,7 @@ namespace Jackett.Indexers double dateNum; if (double.TryParse((string)r["groupTime"], out dateNum)) { - pubDate = UnixTimestampToDateTime(dateNum); + pubDate = DateTimeUtil.UnixTimestampToDateTime(dateNum); pubDate = DateTime.SpecifyKind(pubDate, DateTimeKind.Utc).ToLocalTime(); } @@ -205,20 +186,12 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); } - static DateTime UnixTimestampToDateTime(double unixTime) - { - DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); - long unixTimeStampInTicks = (long)(unixTime * TimeSpan.TicksPerSecond); - return new DateTime(unixStart.Ticks + unixTimeStampInTicks); - } - public async Task Download(Uri link) { if (Engine.IsWindows) @@ -230,7 +203,6 @@ namespace Jackett.Indexers var response = await CurlHelper.GetAsync(link.ToString(), cookieHeader); return response.Content; } - } } } diff --git a/src/Jackett/Indexers/Rarbg.cs b/src/Jackett/Indexers/Rarbg.cs index 9495d9475..72d16bdfc 100644 --- a/src/Jackett/Indexers/Rarbg.cs +++ b/src/Jackett/Indexers/Rarbg.cs @@ -1,7 +1,9 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; +using NLog; using System; using System.Collections.Generic; using System.Linq; @@ -12,48 +14,27 @@ using System.Threading.Tasks; namespace Jackett.Indexers { - public class Rarbg : IIndexer + public class Rarbg : BaseIndexer, IIndexer { - 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 RequiresRageIDLookupDisabled { get { return false; } } - - public bool IsConfigured { get; private set; } - const string DefaultUrl = "http://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 = BrowserUtil.ChromeUserAgent; - - string BaseUrl; + private string BaseUrl; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - public Rarbg() + + public Rarbg(IIndexerManagerService i, Logger l) : + base(name: "RARBG", + description: "RARBG", + link: new Uri("https://rarbg.com"), + rageid: true, + manager: i, + logger: l) { - IsConfigured = false; cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -85,10 +66,7 @@ namespace Jackett.Indexers var configSaveData = new JObject(); configSaveData["base_url"] = BaseUrl; - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } @@ -103,7 +81,7 @@ namespace Jackett.Indexers var message = new HttpRequestMessage(); message.Method = HttpMethod.Get; message.RequestUri = new Uri(uri); - message.Headers.UserAgent.ParseAdd(chromeUserAgent); + message.Headers.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent); return message; } @@ -156,10 +134,9 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); + OnParseError(results, ex); } return releases.ToArray(); - } public Task Download(Uri link) diff --git a/src/Jackett/Indexers/SceneAccess.cs b/src/Jackett/Indexers/SceneAccess.cs index b748423a9..799cfdd6b 100644 --- a/src/Jackett/Indexers/SceneAccess.cs +++ b/src/Jackett/Indexers/SceneAccess.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -13,50 +14,27 @@ using System.Threading.Tasks; namespace Jackett.Indexers { - class SceneAccess : IIndexer + class SceneAccess : BaseIndexer, IIndexer { - 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); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - 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; - } + private readonly string LoginUrl = ""; + private readonly string SearchUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; string cookieHeader; - private Logger logger; - public SceneAccess(Logger l) + public SceneAccess(IIndexerManagerService i, Logger l) : + base(name: "SceneAccess", + description: "Your gateway to the scene", + link: new Uri("https://sceneaccess.eu"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + LoginUrl = SiteLink + "/login"; + SearchUrl = SiteLink + "/{0}?method=1&c{1}=1&search={2}"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -114,16 +92,14 @@ namespace Jackett.Indexers } else { - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); cookieHeader = cookies.GetCookieHeader(SiteLink); IsConfigured = true; } @@ -162,9 +138,9 @@ namespace Jackett.Indexers 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.Guid = new Uri(SiteLink + "/" + qRow.Find(".ttr_name > a").Attr("href")); release.Comments = release.Guid; - release.Link = new Uri(BaseUrl + "/" + qRow.Find(".td_dl > a").Attr("href")); + release.Link = new Uri(SiteLink + "/" + qRow.Find(".td_dl > a").Attr("href")); var sizeStr = qRow.Find(".ttr_size").Contents()[0].NodeValue; var sizeParts = sizeStr.Split(' '); @@ -185,8 +161,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); diff --git a/src/Jackett/Indexers/SceneTime.cs b/src/Jackett/Indexers/SceneTime.cs index 1ac3fcddb..1e26a6497 100644 --- a/src/Jackett/Indexers/SceneTime.cs +++ b/src/Jackett/Indexers/SceneTime.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -15,46 +16,28 @@ using System.Web; namespace Jackett.Indexers { - public class SceneTime : IIndexer + public class SceneTime : BaseIndexer, IIndexer { - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - public string DisplayName - { - get { return "SceneTime"; } - } - - public string DisplayDescription - { - get { return "Always on time"; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured { get; private set; } - - const string BaseUrl = "https://www.scenetime.com"; - const string LoginUrl = BaseUrl + "/takelogin.php"; - const string SearchUrl = BaseUrl + "/browse_API.php"; - const string DownloadUrl = BaseUrl + "/download.php/{0}/download.torrent"; + private readonly string LoginUrl = ""; + private readonly string SearchUrl = ""; + private readonly string DownloadUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger logger; - - public SceneTime(Logger l) + public SceneTime(IIndexerManagerService i, Logger l) : + base(name: "SceneTime", + description: "Always on time", + link: new Uri("https://www.scenetime.com"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + LoginUrl = SiteLink + "/takelogin.php"; + SearchUrl = SiteLink + "/browse_API.php"; + DownloadUrl = SiteLink + "/download.php/{0}/download.torrent"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -96,17 +79,14 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -146,7 +126,7 @@ namespace Jackett.Indexers var qLink = qDescCol.Find("a"); release.Title = qLink.Text(); release.Description = release.Title; - release.Comments = new Uri(BaseUrl + "/" + qLink.Attr("href")); + release.Comments = new Uri(SiteLink + "/" + qLink.Attr("href")); release.Guid = release.Comments; var torrentId = qLink.Attr("href").Split('=')[1]; release.Link = new Uri(string.Format(DownloadUrl, torrentId)); @@ -169,8 +149,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); } diff --git a/src/Jackett/Indexers/ShowRSS.cs b/src/Jackett/Indexers/ShowRSS.cs index 30d9b7357..c37f271ee 100644 --- a/src/Jackett/Indexers/ShowRSS.cs +++ b/src/Jackett/Indexers/ShowRSS.cs @@ -1,6 +1,8 @@ using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; +using NLog; using System; using System.Collections.Generic; using System.Globalization; @@ -14,47 +16,25 @@ using System.Xml; namespace Jackett.Indexers { - public class ShowRSS : IIndexer + public class ShowRSS : BaseIndexer, IIndexer { - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - public string DisplayName - { - get { return "ShowRSS"; } - } - - public string DisplayDescription - { - get { return "showRSS is a service that allows you to keep track of your favorite TV shows"; } - } - - public Uri SiteLink - { - get { return new Uri(DefaultUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - const string DefaultUrl = "http://showrss.info"; - const string searchAllUrl = DefaultUrl + "/feeds/all.rss"; + private readonly string searchAllUrl = ""; string BaseUrl; - static string chromeUserAgent = BrowserUtil.ChromeUserAgent; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - public bool IsConfigured + public ShowRSS(IIndexerManagerService i, Logger l) : + base(name: "ShowRSS", + description: "showRSS is a service that allows you to keep track of your favorite TV shows", + link: new Uri("http://showrss.info"), + rageid: true, + manager: i, + logger: l) { - get; - private set; - } + searchAllUrl = SiteLink + "/feeds/all.rss"; - public ShowRSS() - { - IsConfigured = false; cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -67,13 +47,13 @@ namespace Jackett.Indexers public Task GetConfigurationForSetup() { - var config = new ConfigurationDataUrl(DefaultUrl); + var config = new ConfigurationDataUrl(SiteLink); return Task.FromResult(config); } public async Task ApplyConfiguration(Newtonsoft.Json.Linq.JToken configJson) { - var config = new ConfigurationDataUrl(DefaultUrl); + var config = new ConfigurationDataUrl(SiteLink); config.LoadValuesFromJson(configJson); var formattedUrl = config.GetFormattedHostUrl(); @@ -85,10 +65,7 @@ namespace Jackett.Indexers var configSaveData = new JObject(); configSaveData["base_url"] = BaseUrl; - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } @@ -112,7 +89,7 @@ namespace Jackett.Indexers { WebClient wc = new WebClient(); WebHeaderCollection headers = new WebHeaderCollection(); - headers.Add("User-Agent", chromeUserAgent); + headers.Add("User-Agent", BrowserUtil.ChromeUserAgent); wc.Headers = headers; return wc; } @@ -166,8 +143,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, xml, ex); - throw ex; + OnParseError(xml, ex); } return releases.ToArray(); diff --git a/src/Jackett/Indexers/SpeedCD.cs b/src/Jackett/Indexers/SpeedCD.cs index 6e43d55e1..97d8a1af6 100644 --- a/src/Jackett/Indexers/SpeedCD.cs +++ b/src/Jackett/Indexers/SpeedCD.cs @@ -1,5 +1,9 @@ using CsQuery; +using Jackett.Models; +using Jackett.Services; +using Jackett.Utils; using Newtonsoft.Json.Linq; +using NLog; using System; using System.Collections.Generic; using System.Globalization; @@ -13,36 +17,31 @@ using System.Web; namespace Jackett.Indexers { - public class SpeedCD : IndexerInterface + public class SpeedCD : BaseIndexer, IIndexer { - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - public string DisplayName { get { return "Speed.cd"; } } - - public string DisplayDescription { get { return "Your home now!"; } } - - public Uri SiteLink { get { return new Uri(BaseUrl); } } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - const string BaseUrl = "http://speed.cd"; - const string LoginUrl = BaseUrl + "/take_login.php"; - const string SearchUrl = BaseUrl + "/V3/API/API.php"; - const string SearchFormData = "c53=1&c49=1&c2=1&c52=1&c41=1&c50=1&c30=1&jxt=4&jxw=b"; - const string CommentsUrl = BaseUrl + "/t/{0}"; - const string DownloadUrl = BaseUrl + "/download.php?torrent={0}"; + private readonly string LoginUrl = ""; + private readonly string SearchUrl = ""; + private readonly string SearchFormData = "c53=1&c49=1&c2=1&c52=1&c41=1&c50=1&c30=1&jxt=4&jxw=b"; + private readonly string CommentsUrl =""; + private readonly string DownloadUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - public bool IsConfigured { get; private set; } - - public SpeedCD() + public SpeedCD(IIndexerManagerService i, Logger l) : + base(name: "Speed.cd", + description: "Your home now!", + link: new Uri("http://speed.cd"), + rageid: true, + manager: i, + logger: l) { - IsConfigured = false; + LoginUrl = SiteLink + "/take_login.php"; + SearchUrl = SiteLink + "/V3/API/API.php"; + CommentsUrl = SiteLink + "/t/{0}"; + DownloadUrl = SiteLink + "/download.php?torrent={0}"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -84,17 +83,14 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -142,7 +138,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); + // OnResultParsingError(this, results, ex); throw ex; } return releases.ToArray(); diff --git a/src/Jackett/Indexers/Strike.cs b/src/Jackett/Indexers/Strike.cs index 594f9c391..c42a7ddff 100644 --- a/src/Jackett/Indexers/Strike.cs +++ b/src/Jackett/Indexers/Strike.cs @@ -1,5 +1,7 @@ using Jackett.Models; +using Jackett.Services; using Newtonsoft.Json.Linq; +using NLog; using System; using System.Collections.Generic; using System.Globalization; @@ -12,47 +14,24 @@ using System.Web; namespace Jackett.Indexers { - public class Strike : IIndexer + public class Strike : BaseIndexer, IIndexer { + private readonly string DownloadUrl = "/torrents/api/download/{0}.torrent"; + private readonly string SearchUrl = "/api/v2/torrents/search/?category=TV&phrase={0}"; + private string BaseUrl; - public event Action OnSaveConfigurationRequested; - public event Action OnResultParsingError; + private CookieContainer cookies; + private HttpClientHandler handler; + private HttpClient client; - public string DisplayName + public Strike(IIndexerManagerService i, Logger l) : + base(name: "Strike", + description: "Torrent search engine", + link: new Uri("https://getstrike.net"), + rageid: true, + manager: i, + logger: l) { - get { return "Strike"; } - } - - public string DisplayDescription - { - get { return "Torrent search engine"; } - } - - public Uri SiteLink - { - get { return new Uri(DefaultUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured { get; private set; } - - const string DefaultUrl = "https://getstrike.net"; - - - //const string DownloadUrl = "/api/v2/torrents/download/?hash={0}"; - const string DownloadUrl = "/torrents/api/download/{0}.torrent"; - - const string SearchUrl = "/api/v2/torrents/search/?category=TV&phrase={0}"; - string BaseUrl; - - CookieContainer cookies; - HttpClientHandler handler; - HttpClient client; - - public Strike() - { - IsConfigured = false; cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -65,13 +44,13 @@ namespace Jackett.Indexers public Task GetConfigurationForSetup() { - var config = new ConfigurationDataUrl(DefaultUrl); + var config = new ConfigurationDataUrl(SiteLink); return Task.FromResult(config); } public async Task ApplyConfiguration(JToken configJson) { - var config = new ConfigurationDataUrl(DefaultUrl); + var config = new ConfigurationDataUrl(SiteLink); config.LoadValuesFromJson(configJson); var formattedUrl = config.GetFormattedHostUrl(); @@ -83,12 +62,8 @@ namespace Jackett.Indexers var configSaveData = new JObject(); configSaveData["base_url"] = BaseUrl; - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; - } public void LoadFromSavedConfiguration(JToken jsonConfig) @@ -138,11 +113,9 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } - return releases.ToArray(); } diff --git a/src/Jackett/Indexers/T411.cs b/src/Jackett/Indexers/T411.cs index 8371acb93..605df001b 100644 --- a/src/Jackett/Indexers/T411.cs +++ b/src/Jackett/Indexers/T411.cs @@ -1,6 +1,8 @@ using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; +using NLog; using System; using System.Collections.Generic; using System.Globalization; @@ -14,35 +16,9 @@ using System.Web; namespace Jackett.Indexers { - public class T411 : IIndexer + public class T411 : BaseIndexer, IIndexer { - - public event Action OnSaveConfigurationRequested; - - public event Action 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 RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured { get; private set; } - - const string BaseUrl = "http://www.t411.io"; - const string CommentsUrl = BaseUrl + "/torrents/{0}"; - + private readonly string CommentsUrl = ""; const string ApiUrl = "http://api.t411.io"; const string AuthUrl = ApiUrl + "/auth"; const string SearchUrl = ApiUrl + "/torrents/search/{0}"; @@ -56,8 +32,15 @@ namespace Jackett.Indexers string token = string.Empty; DateTime lastTokenFetch = DateTime.MinValue; - public T411() + public T411(IIndexerManagerService i, Logger l) : + base(name: "T411", + description: "French Torrent Tracker", + link: new Uri("http://www.t411.io"), + rageid: true, + manager: i, + logger: l) { + CommentsUrl = SiteLink + "/torrents/{0}"; IsConfigured = false; handler = new HttpClientHandler { @@ -120,10 +103,7 @@ namespace Jackett.Indexers configSaveData["password"] = password; configSaveData["token"] = token; configSaveData["last_token_fetch"] = lastTokenFetch; - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } @@ -182,8 +162,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); } diff --git a/src/Jackett/Indexers/ThePirateBay.cs b/src/Jackett/Indexers/ThePirateBay.cs index c133f55d4..a2b1df7f9 100644 --- a/src/Jackett/Indexers/ThePirateBay.cs +++ b/src/Jackett/Indexers/ThePirateBay.cs @@ -1,7 +1,9 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; +using NLog; using System; using System.Collections.Generic; using System.Globalization; @@ -15,35 +17,24 @@ using System.Web; namespace Jackett.Indexers { - public class ThePirateBay : IIndexer + public class ThePirateBay : BaseIndexer, IIndexer { - - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - public string DisplayName { get { return "The Pirate Bay"; } } - - public string DisplayDescription { get { return "The worlds largest bittorrent indexer"; } } - - public Uri SiteLink { get { return new Uri(DefaultUrl); } } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured { get; private set; } - - const string DefaultUrl = "https://thepiratebay.mn"; const string SearchUrl = "/search/{0}/0/99/208,205"; - string BaseUrl; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - public ThePirateBay() + public ThePirateBay(IIndexerManagerService i, Logger l) : + base(name: "The Pirate Bay", + description: "The worlds largest bittorrent indexer", + link: new Uri("https://thepiratebay.mn"), + rageid: true, + manager: i, + logger: l) { - BaseUrl = DefaultUrl; + BaseUrl = SiteLink.ToString(); IsConfigured = false; cookies = new CookieContainer(); handler = new HttpClientHandler @@ -63,7 +54,7 @@ namespace Jackett.Indexers public async Task ApplyConfiguration(JToken configJson) { - var config = new ConfigurationDataUrl(DefaultUrl); + var config = new ConfigurationDataUrl(SiteLink); config.LoadValuesFromJson(configJson); var formattedUrl = config.GetFormattedHostUrl(); @@ -75,10 +66,7 @@ namespace Jackett.Indexers var configSaveData = new JObject(); configSaveData["base_url"] = BaseUrl; - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } diff --git a/src/Jackett/Indexers/TorrentDay.cs b/src/Jackett/Indexers/TorrentDay.cs index 019ac070b..e6bb3b685 100644 --- a/src/Jackett/Indexers/TorrentDay.cs +++ b/src/Jackett/Indexers/TorrentDay.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -15,47 +16,28 @@ using System.Web; namespace Jackett.Indexers { - public class TorrentDay : IIndexer + public class TorrentDay: BaseIndexer, IIndexer { - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - public string DisplayName - { - get { return "TorrentDay"; } - } - - public string DisplayDescription - { - get { return DisplayName; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - public bool IsConfigured { get; private set; } - - const string BaseUrl = "https://torrentday.eu"; - const string StartPageUrl = BaseUrl + "/login.php"; - const string LoginUrl = BaseUrl + "/tak3login.php"; - const string SearchUrl = BaseUrl + "/browse.php?search={0}&cata=yes&c2=1&c7=1&c14=1&c24=1&c26=1&c31=1&c32=1&c33=1"; - - static string chromeUserAgent = BrowserUtil.ChromeUserAgent; + private readonly string StartPageUrl = ""; + private readonly string LoginUrl = ""; + private readonly string SearchUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger logger; - public TorrentDay(Logger l) + public TorrentDay(IIndexerManagerService i, Logger l) : + base(name: "TorrentDay", + description: "TorrentDay", + link: new Uri("https://torrentday.eu"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + StartPageUrl = SiteLink + "/login.php"; + LoginUrl = SiteLink + "/tak3login.php"; + SearchUrl = SiteLink + "/browse.php?search={0}&cata=yes&c2=1&c7=1&c14=1&c24=1&c26=1&c31=1&c32=1&c33=1"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -77,7 +59,7 @@ namespace Jackett.Indexers var message = new HttpRequestMessage(); message.Method = HttpMethod.Get; message.RequestUri = new Uri(uri); - message.Headers.UserAgent.ParseAdd(chromeUserAgent); + message.Headers.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent); return message; } @@ -115,17 +97,14 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -149,9 +128,9 @@ namespace Jackett.Indexers release.MinimumSeedTime = 172800; release.Title = qRow.Find(".torrentName").Text(); release.Description = release.Title; - release.Guid = new Uri(BaseUrl + "/" + qRow.Find(".torrentName").Attr("href")); + release.Guid = new Uri(SiteLink + "/" + qRow.Find(".torrentName").Attr("href")); release.Comments = release.Guid; - release.Link = new Uri(BaseUrl + "/" + qRow.Find(".dlLinksInfo > a").Attr("href")); + release.Link = new Uri(SiteLink + "/" + qRow.Find(".dlLinksInfo > a").Attr("href")); var sizeStr = qRow.Find(".sizeInfo").Text().Trim(); var sizeParts = sizeStr.Split(' '); @@ -185,8 +164,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); } diff --git a/src/Jackett/Indexers/TorrentLeech.cs b/src/Jackett/Indexers/TorrentLeech.cs index d1ac3218d..cefd16987 100644 --- a/src/Jackett/Indexers/TorrentLeech.cs +++ b/src/Jackett/Indexers/TorrentLeech.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -15,45 +16,26 @@ using System.Web; namespace Jackett.Indexers { - public class TorrentLeech : IIndexer + public class TorrentLeech : BaseIndexer, IIndexer { - public event Action OnResultParsingError; - - public event Action OnSaveConfigurationRequested; - - public string DisplayName - { - get { return "TorrentLeech"; } - } - - public string DisplayDescription - { - get { return "This is what happens when you seed"; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - const string BaseUrl = "http://www.torrentleech.org"; - const string LoginUrl = BaseUrl + "/user/account/login/"; - const string SearchUrl = BaseUrl + "/torrents/browse/index/query/{0}/categories/2%2C26%2C27%2C32/orderby/added?"; - - public bool IsConfigured { get; private set; } - + private readonly string LoginUrl =""; + private readonly string SearchUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger logger; - public TorrentLeech(Logger l) + public TorrentLeech(IIndexerManagerService i, Logger l) : + base(name: "TorrentLeech", + description: "This is what happens when you seed", + link: new Uri("http://www.torrentleech.org"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + LoginUrl = SiteLink + "/user/account/login/"; + SearchUrl = SiteLink + "/torrents/browse/index/query/{0}/categories/2%2C26%2C27%2C32/orderby/added?"; + cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -98,17 +80,14 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } } public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -137,12 +116,12 @@ namespace Jackett.Indexers release.MinimumSeedTime = 172800; CQ qLink = qRow.Find(".title > a").First(); - release.Guid = new Uri(BaseUrl + qLink.Attr("href")); + release.Guid = new Uri(SiteLink + qLink.Attr("href")); release.Comments = release.Guid; release.Title = qLink.Text(); release.Description = release.Title; - release.Link = new Uri(BaseUrl + qRow.Find(".quickdownload > a").Attr("href")); + release.Link = new Uri(SiteLink + qRow.Find(".quickdownload > a").Attr("href")); var dateString = qRow.Find(".name").First()[0].ChildNodes[4].NodeValue.Replace(" on", "").Trim(); //"2015-04-25 23:38:12" @@ -161,8 +140,7 @@ namespace Jackett.Indexers catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); diff --git a/src/Jackett/Indexers/TorrentShack.cs b/src/Jackett/Indexers/TorrentShack.cs index ec41b0164..8444b7699 100644 --- a/src/Jackett/Indexers/TorrentShack.cs +++ b/src/Jackett/Indexers/TorrentShack.cs @@ -1,5 +1,6 @@ using CsQuery; using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; using NLog; @@ -15,45 +16,25 @@ using System.Web; namespace Jackett.Indexers { - public class TorrentShack : IIndexer + public class TorrentShack : BaseIndexer, IIndexer { - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - public string DisplayName - { - get { return "TorrentShack"; } - } - - public string DisplayDescription - { - get { return DisplayName; } - } - - public Uri SiteLink - { - get { return new Uri(BaseUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - const string BaseUrl = "http://torrentshack.me"; - const string LoginUrl = BaseUrl + "/login.php"; - const string SearchUrl = BaseUrl + "/torrents.php?searchstr={0}&release_type=both&searchtags=&tags_type=0&order_by=s3&order_way=desc&torrent_preset=all&filter_cat%5B600%5D=1&filter_cat%5B620%5D=1&filter_cat%5B700%5D=1&filter_cat%5B981%5D=1&filter_cat%5B980%5D=1"; - + private readonly string LoginUrl =""; + private readonly string SearchUrl = ""; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - Logger logger; - public bool IsConfigured { get; private set; } - - public TorrentShack(Logger l) + public TorrentShack(IIndexerManagerService i, Logger l) : + base(name: "TorrentShack", + description: "TorrentShack", + link: new Uri("http://torrentshack.me"), + rageid: true, + manager: i, + logger: l) { - logger = l; - IsConfigured = false; + LoginUrl = SiteLink + "/login.php"; + SearchUrl = SiteLink + "/torrents.php?searchstr={0}&release_type=both&searchtags=&tags_type=0&order_by=s3&order_way=desc&torrent_preset=all&filter_cat%5B600%5D=1&filter_cat%5B620%5D=1&filter_cat%5B700%5D=1&filter_cat%5B981%5D=1&filter_cat%5B980%5D=1"; cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -99,10 +80,7 @@ namespace Jackett.Indexers { var configSaveData = new JObject(); cookies.DumpToJson(SiteLink, configSaveData); - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } @@ -110,7 +88,7 @@ namespace Jackett.Indexers public void LoadFromSavedConfiguration(JToken jsonConfig) { - cookies.FillFromJson(new Uri(BaseUrl), jsonConfig, logger); + cookies.FillFromJson(SiteLink, jsonConfig, logger); IsConfigured = true; } @@ -135,9 +113,9 @@ namespace Jackett.Indexers release.MinimumSeedTime = 172800; release.Title = qRow.Find(".torrent_name_link").Text(); release.Description = release.Title; - release.Guid = new Uri(BaseUrl + "/" + qRow.Find(".torrent_name_link").Parent().Attr("href")); + release.Guid = new Uri(SiteLink + "/" + qRow.Find(".torrent_name_link").Parent().Attr("href")); release.Comments = release.Guid; - release.Link = new Uri(BaseUrl + "/" + qRow.Find(".torrent_handle_links > a").First().Attr("href")); + release.Link = new Uri(SiteLink + "/" + qRow.Find(".torrent_handle_links > a").First().Attr("href")); var dateStr = qRow.Find(".time").Text().Trim(); if (dateStr.ToLower().Contains("just now")) @@ -177,8 +155,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, results, ex); - throw ex; + OnParseError(results, ex); } return releases.ToArray(); } diff --git a/src/Jackett/Indexers/Torrentz.cs b/src/Jackett/Indexers/Torrentz.cs index b3991179c..47a968b95 100644 --- a/src/Jackett/Indexers/Torrentz.cs +++ b/src/Jackett/Indexers/Torrentz.cs @@ -1,6 +1,8 @@ using Jackett.Models; +using Jackett.Services; using Jackett.Utils; using Newtonsoft.Json.Linq; +using NLog; using System; using System.Collections.Generic; using System.Globalization; @@ -13,47 +15,25 @@ using System.Xml; namespace Jackett.Indexers { - public class Torrentz : IIndexer + public class Torrentz : BaseIndexer, IIndexer { - public event Action OnSaveConfigurationRequested; - - public event Action OnResultParsingError; - - public string DisplayName - { - get { return "Torrentz"; } - } - - public string DisplayDescription - { - get { return "Torrentz is a meta-search engine and a Multisearch. This means we just search other search engines."; } - } - - public Uri SiteLink - { - get { return new Uri(DefaultUrl); } - } - - public bool RequiresRageIDLookupDisabled { get { return true; } } - - const string DefaultUrl = "https://torrentz.eu"; - const string SearchUrl = DefaultUrl + "/feed_verifiedP?f={0}"; + private readonly string SearchUrl = ""; string BaseUrl; - static string chromeUserAgent = BrowserUtil.ChromeUserAgent; CookieContainer cookies; HttpClientHandler handler; HttpClient client; - public bool IsConfigured + public Torrentz(IIndexerManagerService i, Logger l) : + base(name: "Torrentz", + description: "Torrentz is a meta-search engine and a Multisearch. This means we just search other search engines.", + link: new Uri("https://torrentz.eu"), + rageid: true, + manager: i, + logger: l) { - get; - private set; - } - public Torrentz() - { - IsConfigured = false; + SearchUrl = SiteLink + "/feed_verifiedP?f={0}"; cookies = new CookieContainer(); handler = new HttpClientHandler { @@ -64,18 +44,16 @@ namespace Jackett.Indexers client = new HttpClient(handler); } - - public Task GetConfigurationForSetup() { - var config = new ConfigurationDataUrl(DefaultUrl); + var config = new ConfigurationDataUrl(SiteLink); return Task.FromResult(config); } public async Task ApplyConfiguration(JToken configJson) { - var config = new ConfigurationDataUrl(DefaultUrl); + var config = new ConfigurationDataUrl(SiteLink); config.LoadValuesFromJson(configJson); var formattedUrl = config.GetFormattedHostUrl(); @@ -87,10 +65,7 @@ namespace Jackett.Indexers var configSaveData = new JObject(); configSaveData["base_url"] = BaseUrl; - - if (OnSaveConfigurationRequested != null) - OnSaveConfigurationRequested(this, configSaveData); - + SaveConfig(configSaveData); IsConfigured = true; } @@ -99,7 +74,7 @@ namespace Jackett.Indexers { WebClient wc = new WebClient(); WebHeaderCollection headers = new WebHeaderCollection(); - headers.Add("User-Agent", chromeUserAgent); + headers.Add("User-Agent", BrowserUtil.ChromeUserAgent); wc.Headers = headers; return wc; } @@ -119,7 +94,7 @@ namespace Jackett.Indexers { using (wc) { - xml = wc.DownloadString(episodeSearchUrl); + xml = await wc.DownloadStringTaskAsync(new Uri(episodeSearchUrl)); xmlDoc.LoadXml(xml); } @@ -153,8 +128,7 @@ namespace Jackett.Indexers } catch (Exception ex) { - OnResultParsingError(this, xml, ex); - throw ex; + OnParseError(xml, ex); } return releases.ToArray(); @@ -176,7 +150,6 @@ namespace Jackett.Indexers { throw new NotImplementedException(); } - } public class TorrentzHelper diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index ca06f9283..e83170226 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -139,6 +139,7 @@ + @@ -153,7 +154,7 @@ - + @@ -164,7 +165,6 @@ - @@ -179,6 +179,7 @@ + @@ -241,6 +242,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/Jackett/JackettModule.cs b/src/Jackett/JackettModule.cs index f658d48c8..2b68ce122 100644 --- a/src/Jackett/JackettModule.cs +++ b/src/Jackett/JackettModule.cs @@ -23,7 +23,7 @@ namespace Jackett .Where(p => typeof(IIndexer).IsAssignableFrom(p) && !p.IsInterface) .ToArray()) { - builder.RegisterType(indexer).Named(indexer.Name.ToLowerInvariant()).SingleInstance(); + builder.RegisterType(indexer).Named(indexer.Name); } } } diff --git a/src/Jackett/Models/ConfigurationData.cs b/src/Jackett/Models/ConfigurationData.cs index 41b6b0055..21344cf9c 100644 --- a/src/Jackett/Models/ConfigurationData.cs +++ b/src/Jackett/Models/ConfigurationData.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json.Linq; +using Jackett.Utils; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; @@ -57,7 +58,7 @@ namespace Jackett.Models jObject["value"] = ((BoolItem)item).Value; break; case ItemType.DisplayImage: - string dataUri = DataUrl.BytesToDataUrl(((ImageItem)item).Value, "image/jpeg"); + string dataUri = DataUrlUtils.BytesToDataUrl(((ImageItem)item).Value, "image/jpeg"); jObject["value"] = dataUri; break; } diff --git a/src/Jackett/Models/ConfigurationDataUrl.cs b/src/Jackett/Models/ConfigurationDataUrl.cs index 08e80a76a..abf834d58 100644 --- a/src/Jackett/Models/ConfigurationDataUrl.cs +++ b/src/Jackett/Models/ConfigurationDataUrl.cs @@ -10,6 +10,11 @@ namespace Jackett.Models { public StringItem Url { get; private set; } + public ConfigurationDataUrl(Uri defaultUrl) + { + Url = new StringItem { Name = "Url", Value = defaultUrl.ToString() }; + } + public ConfigurationDataUrl(string defaultUrl) { Url = new StringItem { Name = "Url", Value = defaultUrl }; diff --git a/src/Jackett/Services/IndexerManagerService.cs b/src/Jackett/Services/IndexerManagerService.cs index 718ea39da..55fd7b9aa 100644 --- a/src/Jackett/Services/IndexerManagerService.cs +++ b/src/Jackett/Services/IndexerManagerService.cs @@ -27,6 +27,7 @@ namespace Jackett.Services private IContainer container; private IConfigurationService configService; private Logger logger; + private Dictionary indexers = new Dictionary(); public IndexerManagerService(IContainer c, IConfigurationService config, Logger l) { @@ -37,33 +38,35 @@ namespace Jackett.Services public void InitIndexers() { - // Load the existing config for each indexer - foreach (var indexer in GetAllIndexers()) + foreach (var idx in container.Resolve>().OrderBy(_ => _.DisplayName)) { - var configFilePath = GetIndexerConfigFilePath(indexer); + indexers.Add(idx.DisplayName, idx); + var configFilePath = GetIndexerConfigFilePath(idx); if (File.Exists(configFilePath)) { var jsonString = JObject.Parse(File.ReadAllText(configFilePath)); - indexer.LoadFromSavedConfiguration(jsonString); + idx.LoadFromSavedConfiguration(jsonString); } } } public IIndexer GetIndexer(string name) { - var indexer = GetAllIndexers().Where(i => string.Equals(i.DisplayName, name, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); - if (indexer == null) + var indexer = indexers.Values.Where(i => string.Equals(i.DisplayName, name, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); + if (indexer != null) + { + return indexer; + } + else { logger.Error("Request for unknown indexer: " + name); throw new Exception("Unknown indexer: " + name); } - return indexer; } public IEnumerable GetAllIndexers() { - - return container.Resolve>().OrderBy(_ => _.DisplayName); + return indexers.Values; } public async void TestIndexer(string name) @@ -79,10 +82,9 @@ namespace Jackett.Services public void DeleteIndexer(string name) { var indexer = GetIndexer(name); - var configPath = configService.GetIndexerConfigDir(); + var configPath = GetIndexerConfigFilePath(indexer); File.Delete(configPath); - //Indexers.Remove(name); - //LoadMissingIndexers(); + indexers[name] = container.ResolveNamed(name); } private string GetIndexerConfigFilePath(IIndexer indexer) diff --git a/src/Jackett/DataUrl.cs b/src/Jackett/Utils/DataUrl.cs similarity index 91% rename from src/Jackett/DataUrl.cs rename to src/Jackett/Utils/DataUrl.cs index 3ff22beeb..07b08508b 100644 --- a/src/Jackett/DataUrl.cs +++ b/src/Jackett/Utils/DataUrl.cs @@ -6,9 +6,9 @@ using System.Text; using System.Threading.Tasks; using System.Web; -namespace Jackett +namespace Jackett.Utils { - public class DataUrl + public class DataUrlUtils { public static string ReadFileToDataUrl(string file) { diff --git a/src/Jackett/Utils/DateTimeUtil.cs b/src/Jackett/Utils/DateTimeUtil.cs new file mode 100644 index 000000000..093df7a76 --- /dev/null +++ b/src/Jackett/Utils/DateTimeUtil.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Jackett.Utils +{ + public static class DateTimeUtil + { + public static DateTime UnixTimestampToDateTime(double unixTime) + { + DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); + long unixTimeStampInTicks = (long)(unixTime * TimeSpan.TicksPerSecond); + return new DateTime(unixStart.Ticks + unixTimeStampInTicks); + } + } +}