diff --git a/src/Jackett.Common/Indexers/MyAnonamouse.cs b/src/Jackett.Common/Indexers/MyAnonamouse.cs index 6e98faf2a..ede7661ca 100644 --- a/src/Jackett.Common/Indexers/MyAnonamouse.cs +++ b/src/Jackett.Common/Indexers/MyAnonamouse.cs @@ -1,10 +1,11 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Globalization; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; -using CsQuery; using Jackett.Common.Models; using Jackett.Common.Models.IndexerConfig; using Jackett.Common.Services.Interfaces; @@ -18,11 +19,11 @@ namespace Jackett.Common.Indexers public class Myanonamouse : BaseWebIndexer { private string LoginUrl { get { return SiteLink + "takelogin.php"; } } - private string SearchUrl { get { return SiteLink + "tor/js/loadSearch2.php"; } } + private string SearchUrl { get { return SiteLink + "tor/js/loadSearchJSONbasic.php"; } } - private new ConfigurationDataBasicLogin configData + private new ConfigurationDataMyAnonamouse configData { - get { return (ConfigurationDataBasicLogin)base.configData; } + get { return (ConfigurationDataMyAnonamouse)base.configData; } set { base.configData = value; } } @@ -30,122 +31,136 @@ namespace Jackett.Common.Indexers : base(name: "MyAnonamouse", description: "Friendliness, Warmth and Sharing", link: "https://www.myanonamouse.net/", - caps: new TorznabCapabilities(TorznabCatType.Books, - TorznabCatType.AudioAudiobook, - TorznabCatType.BooksComics, - TorznabCatType.BooksEbook, - TorznabCatType.BooksMagazines, - TorznabCatType.BooksTechnical), configService: configService, client: c, logger: l, p: ps, - configData: new ConfigurationDataBasicLogin()) + configData: new ConfigurationDataMyAnonamouse()) { Encoding = Encoding.UTF8; Language = "en-us"; Type = "private"; + webclient.EmulateBrowser = false; - AddCategoryMapping("61", TorznabCatType.BooksComics); - AddCategoryMapping("91", TorznabCatType.BooksTechnical); - AddCategoryMapping("80", TorznabCatType.BooksTechnical); - AddCategoryMapping("79", TorznabCatType.BooksMagazines); - AddCategoryMapping("39", TorznabCatType.AudioAudiobook); - AddCategoryMapping("49", TorznabCatType.AudioAudiobook); - AddCategoryMapping("50", TorznabCatType.AudioAudiobook); - AddCategoryMapping("83", TorznabCatType.AudioAudiobook); - AddCategoryMapping("51", TorznabCatType.AudioAudiobook); - AddCategoryMapping("97", TorznabCatType.AudioAudiobook); - AddCategoryMapping("40", TorznabCatType.AudioAudiobook); - AddCategoryMapping("41", TorznabCatType.AudioAudiobook); - AddCategoryMapping("106", TorznabCatType.AudioAudiobook); - AddCategoryMapping("42", TorznabCatType.AudioAudiobook); - AddCategoryMapping("52", TorznabCatType.AudioAudiobook); - AddCategoryMapping("98", TorznabCatType.AudioAudiobook); - AddCategoryMapping("54", TorznabCatType.AudioAudiobook); - AddCategoryMapping("55", TorznabCatType.AudioAudiobook); - AddCategoryMapping("43", TorznabCatType.AudioAudiobook); - AddCategoryMapping("99", TorznabCatType.AudioAudiobook); - AddCategoryMapping("84", TorznabCatType.AudioAudiobook); - AddCategoryMapping("44", TorznabCatType.AudioAudiobook); - AddCategoryMapping("56", TorznabCatType.AudioAudiobook); - AddCategoryMapping("137", TorznabCatType.AudioAudiobook); - AddCategoryMapping("45", TorznabCatType.AudioAudiobook); - AddCategoryMapping("57", TorznabCatType.AudioAudiobook); - AddCategoryMapping("85", TorznabCatType.AudioAudiobook); - AddCategoryMapping("87", TorznabCatType.AudioAudiobook); - AddCategoryMapping("119", TorznabCatType.AudioAudiobook); - AddCategoryMapping("88", TorznabCatType.AudioAudiobook); - AddCategoryMapping("58", TorznabCatType.AudioAudiobook); - AddCategoryMapping("59", TorznabCatType.AudioAudiobook); - AddCategoryMapping("46", TorznabCatType.AudioAudiobook); - AddCategoryMapping("47", TorznabCatType.AudioAudiobook); - AddCategoryMapping("53", TorznabCatType.AudioAudiobook); - AddCategoryMapping("89", TorznabCatType.AudioAudiobook); - AddCategoryMapping("100", TorznabCatType.AudioAudiobook); - AddCategoryMapping("108", TorznabCatType.AudioAudiobook); - AddCategoryMapping("48", TorznabCatType.AudioAudiobook); - AddCategoryMapping("111", TorznabCatType.AudioAudiobook); - AddCategoryMapping("60", TorznabCatType.BooksEbook); - AddCategoryMapping("71", TorznabCatType.BooksEbook); - AddCategoryMapping("72", TorznabCatType.BooksEbook); - AddCategoryMapping("90", TorznabCatType.BooksEbook); - AddCategoryMapping("73", TorznabCatType.BooksEbook); - AddCategoryMapping("101", TorznabCatType.BooksEbook); - AddCategoryMapping("62", TorznabCatType.BooksEbook); - AddCategoryMapping("63", TorznabCatType.BooksEbook); - AddCategoryMapping("107", TorznabCatType.BooksEbook); - AddCategoryMapping("64", TorznabCatType.BooksEbook); - AddCategoryMapping("74", TorznabCatType.BooksEbook); - AddCategoryMapping("102", TorznabCatType.BooksEbook); - AddCategoryMapping("76", TorznabCatType.BooksEbook); - AddCategoryMapping("77", TorznabCatType.BooksEbook); - AddCategoryMapping("65", TorznabCatType.BooksEbook); - AddCategoryMapping("103", TorznabCatType.BooksEbook); - AddCategoryMapping("115", TorznabCatType.BooksEbook); - AddCategoryMapping("66", TorznabCatType.BooksEbook); - AddCategoryMapping("78", TorznabCatType.BooksEbook); - AddCategoryMapping("138", TorznabCatType.BooksEbook); - AddCategoryMapping("67", TorznabCatType.BooksEbook); - AddCategoryMapping("92", TorznabCatType.BooksEbook); - AddCategoryMapping("118", TorznabCatType.BooksEbook); - AddCategoryMapping("94", TorznabCatType.BooksEbook); - AddCategoryMapping("120", TorznabCatType.BooksEbook); - AddCategoryMapping("95", TorznabCatType.BooksEbook); - AddCategoryMapping("81", TorznabCatType.BooksEbook); - AddCategoryMapping("82", TorznabCatType.BooksEbook); - AddCategoryMapping("68", TorznabCatType.BooksEbook); - AddCategoryMapping("69", TorznabCatType.BooksEbook); - AddCategoryMapping("75", TorznabCatType.BooksEbook); - AddCategoryMapping("96", TorznabCatType.BooksEbook); - AddCategoryMapping("104", TorznabCatType.BooksEbook); - AddCategoryMapping("109", TorznabCatType.BooksEbook); - AddCategoryMapping("70", TorznabCatType.BooksEbook); - AddCategoryMapping("112", TorznabCatType.BooksEbook); + AddCategoryMapping("13", TorznabCatType.AudioAudiobook, "AudioBooks"); + AddCategoryMapping("14", TorznabCatType.BooksEbook, "E-Books"); + AddCategoryMapping("15", TorznabCatType.AudioAudiobook, "Musicology"); + AddCategoryMapping("16", TorznabCatType.AudioAudiobook, "Radio"); + AddCategoryMapping("39", TorznabCatType.AudioAudiobook, "Audiobooks - Action/Adventure"); + AddCategoryMapping("49", TorznabCatType.AudioAudiobook, "Audiobooks - Art"); + AddCategoryMapping("50", TorznabCatType.AudioAudiobook, "Audiobooks - Biographical"); + AddCategoryMapping("83", TorznabCatType.AudioAudiobook, "Audiobooks - Business"); + AddCategoryMapping("51", TorznabCatType.AudioAudiobook, "Audiobooks - Computer/Internet"); + AddCategoryMapping("97", TorznabCatType.AudioAudiobook, "Audiobooks - Crafts"); + AddCategoryMapping("40", TorznabCatType.AudioAudiobook, "Audiobooks - Crime/Thriller"); + AddCategoryMapping("41", TorznabCatType.AudioAudiobook, "Audiobooks - Fantasy"); + AddCategoryMapping("106", TorznabCatType.AudioAudiobook, "Audiobooks - Food"); + AddCategoryMapping("42", TorznabCatType.AudioAudiobook, "Audiobooks - General Fiction"); + AddCategoryMapping("52", TorznabCatType.AudioAudiobook, "Audiobooks - General Non-Fic"); + AddCategoryMapping("98", TorznabCatType.AudioAudiobook, "Audiobooks - Historical Fiction"); + AddCategoryMapping("54", TorznabCatType.AudioAudiobook, "Audiobooks - History"); + AddCategoryMapping("55", TorznabCatType.AudioAudiobook, "Audiobooks - Home/Garden"); + AddCategoryMapping("43", TorznabCatType.AudioAudiobook, "Audiobooks - Horror"); + AddCategoryMapping("99", TorznabCatType.AudioAudiobook, "Audiobooks - Humor"); + AddCategoryMapping("84", TorznabCatType.AudioAudiobook, "Audiobooks - Instructional"); + AddCategoryMapping("44", TorznabCatType.AudioAudiobook, "Audiobooks - Juvenile"); + AddCategoryMapping("56", TorznabCatType.AudioAudiobook, "Audiobooks - Language"); + AddCategoryMapping("45", TorznabCatType.AudioAudiobook, "Audiobooks - Literary Classics"); + AddCategoryMapping("57", TorznabCatType.AudioAudiobook, "Audiobooks - Math/Science/Tech"); + AddCategoryMapping("85", TorznabCatType.AudioAudiobook, "Audiobooks - Medical"); + AddCategoryMapping("87", TorznabCatType.AudioAudiobook, "Audiobooks - Mystery"); + AddCategoryMapping("119", TorznabCatType.AudioAudiobook, "Audiobooks - Nature"); + AddCategoryMapping("88", TorznabCatType.AudioAudiobook, "Audiobooks - Philosophy"); + AddCategoryMapping("58", TorznabCatType.AudioAudiobook, "Audiobooks - Pol/Soc/Relig"); + AddCategoryMapping("59", TorznabCatType.AudioAudiobook, "Audiobooks - Recreation"); + AddCategoryMapping("46", TorznabCatType.AudioAudiobook, "Audiobooks - Romance"); + AddCategoryMapping("47", TorznabCatType.AudioAudiobook, "Audiobooks - Science Fiction"); + AddCategoryMapping("53", TorznabCatType.AudioAudiobook, "Audiobooks - Self-Help"); + AddCategoryMapping("89", TorznabCatType.AudioAudiobook, "Audiobooks - Travel/Adventure"); + AddCategoryMapping("100", TorznabCatType.AudioAudiobook, "Audiobooks - True Crime"); + AddCategoryMapping("108", TorznabCatType.AudioAudiobook, "Audiobooks - Urban Fantasy"); + AddCategoryMapping("48", TorznabCatType.AudioAudiobook, "Audiobooks - Western"); + AddCategoryMapping("111", TorznabCatType.AudioAudiobook, "Audiobooks - Young Adult"); + AddCategoryMapping("60", TorznabCatType.BooksEbook, "Ebooks - Action/Adventure"); + AddCategoryMapping("71", TorznabCatType.BooksEbook, "Ebooks - Art"); + AddCategoryMapping("72", TorznabCatType.BooksEbook, "Ebooks - Biographical"); + AddCategoryMapping("90", TorznabCatType.BooksEbook, "Ebooks - Business"); + AddCategoryMapping("61", TorznabCatType.BooksComics, "Ebooks - Comics/Graphic novels"); + AddCategoryMapping("73", TorznabCatType.BooksEbook, "Ebooks - Computer/Internet"); + AddCategoryMapping("101", TorznabCatType.BooksEbook, "Ebooks - Crafts"); + AddCategoryMapping("62", TorznabCatType.BooksEbook, "Ebooks - Crime/Thriller"); + AddCategoryMapping("63", TorznabCatType.BooksEbook, "Ebooks - Fantasy"); + AddCategoryMapping("107", TorznabCatType.BooksEbook, "Ebooks - Food"); + AddCategoryMapping("64", TorznabCatType.BooksEbook, "Ebooks - General Fiction"); + AddCategoryMapping("74", TorznabCatType.BooksEbook, "Ebooks - General Non-Fiction"); + AddCategoryMapping("102", TorznabCatType.BooksEbook, "Ebooks - Historical Fiction"); + AddCategoryMapping("76", TorznabCatType.BooksEbook, "Ebooks - History"); + AddCategoryMapping("77", TorznabCatType.BooksEbook, "Ebooks - Home/Garden"); + AddCategoryMapping("65", TorznabCatType.BooksEbook, "Ebooks - Horror"); + AddCategoryMapping("103", TorznabCatType.BooksEbook, "Ebooks - Humor"); + AddCategoryMapping("115", TorznabCatType.BooksEbook, "Ebooks - Illusion/Magic"); + AddCategoryMapping("91", TorznabCatType.BooksTechnical, "Ebooks - Instructional"); + AddCategoryMapping("66", TorznabCatType.BooksEbook, "Ebooks - Juvenile"); + AddCategoryMapping("78", TorznabCatType.BooksEbook, "Ebooks - Language"); + AddCategoryMapping("67", TorznabCatType.BooksEbook, "Ebooks - Literary Classics"); + AddCategoryMapping("79", TorznabCatType.BooksMagazines, "Ebooks - Magazines/Newspapers"); + AddCategoryMapping("80", TorznabCatType.BooksTechnical, "Ebooks - Math/Science/Tech"); + AddCategoryMapping("92", TorznabCatType.BooksEbook, "Ebooks - Medical"); + AddCategoryMapping("118", TorznabCatType.BooksEbook, "Ebooks - Mixed Collections"); + AddCategoryMapping("94", TorznabCatType.BooksEbook, "Ebooks - Mystery"); + AddCategoryMapping("120", TorznabCatType.BooksEbook, "Ebooks - Nature"); + AddCategoryMapping("95", TorznabCatType.BooksEbook, "Ebooks - Philosophy"); + AddCategoryMapping("81", TorznabCatType.BooksEbook, "Ebooks - Pol/Soc/Relig"); + AddCategoryMapping("82", TorznabCatType.BooksEbook, "Ebooks - Recreation"); + AddCategoryMapping("68", TorznabCatType.BooksEbook, "Ebooks - Romance"); + AddCategoryMapping("69", TorznabCatType.BooksEbook, "Ebooks - Science Fiction"); + AddCategoryMapping("75", TorznabCatType.BooksEbook, "Ebooks - Self-Help"); + AddCategoryMapping("96", TorznabCatType.BooksEbook, "Ebooks - Travel/Adventure"); + AddCategoryMapping("104", TorznabCatType.BooksEbook, "Ebooks - True Crime"); + AddCategoryMapping("109", TorznabCatType.BooksEbook, "Ebooks - Urban Fantasy"); + AddCategoryMapping("70", TorznabCatType.BooksEbook, "Ebooks - Western"); + AddCategoryMapping("112", TorznabCatType.BooksEbook, "Ebooks - Young Adult"); + AddCategoryMapping("19", TorznabCatType.AudioAudiobook, "Guitar/Bass Tabs"); + AddCategoryMapping("20", TorznabCatType.AudioAudiobook, "Individual Sheet"); + AddCategoryMapping("24", TorznabCatType.AudioAudiobook, "Individual Sheet MP3"); + AddCategoryMapping("126", TorznabCatType.AudioAudiobook, "Instructional Book with Video"); + AddCategoryMapping("22", TorznabCatType.AudioAudiobook, "Instructional Media - Music"); + AddCategoryMapping("113", TorznabCatType.AudioAudiobook, "Lick Library - LTP/Jam With"); + AddCategoryMapping("114", TorznabCatType.AudioAudiobook, "Lick Library - Techniques/QL"); + AddCategoryMapping("17", TorznabCatType.AudioAudiobook, "Music - Complete Editions"); + AddCategoryMapping("26", TorznabCatType.AudioAudiobook, "Music Book"); + AddCategoryMapping("27", TorznabCatType.AudioAudiobook, "Music Book MP3"); + AddCategoryMapping("30", TorznabCatType.AudioAudiobook, "Sheet Collection"); + AddCategoryMapping("31", TorznabCatType.AudioAudiobook, "Sheet Collection MP3"); + AddCategoryMapping("127", TorznabCatType.AudioAudiobook, "Radio - Comedy"); + AddCategoryMapping("130", TorznabCatType.AudioAudiobook, "Radio - Drama"); + AddCategoryMapping("128", TorznabCatType.AudioAudiobook, "Radio - Factual/Documentary"); + AddCategoryMapping("132", TorznabCatType.AudioAudiobook, "Radio - Reading"); } public override async Task ApplyConfiguration(JToken configJson) { LoadValuesFromJson(configJson); - var pairs = new Dictionary { - { "email", configData.Username.Value }, - { "password", configData.Password.Value }, - { "returnto", "/" } - }; - configData.CookieHeader.Cookie = ""; // cookie reset needed in order to relogin - - var preRequest = await RequestStringWithCookiesAndRetry(LoginUrl); - - var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, preRequest.Cookies, true, SearchUrl, SiteLink); - await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("Search Results"), () => + // TODO: implement captcha + CookieHeader = "mam_id=" + configData.MamId.Value; + try { - CQ dom = result.Content; - var errorMessage = dom["table.main table td.text"].Text().Trim().Replace("\n\t", " "); - throw new ExceptionWithConfigData(errorMessage, configData); - }); + var results = await PerformQuery(new TorznabQuery()); + if (results.Count() == 0) + { + throw new Exception("Your man_id did not work"); + } - return IndexerConfigurationStatus.RequiresTesting; + IsConfigured = true; + SaveConfig(); + return IndexerConfigurationStatus.Completed; + } + catch (Exception e) + { + IsConfigured = false; + throw new Exception("Your man_id did not work: " + e.Message); + } } protected override async Task> PerformQuery(TorznabQuery query) @@ -162,6 +177,12 @@ namespace Jackett.Common.Indexers qParams.Add("tor[sortType]", "default"); qParams.Add("tor[startNumber]", "0"); + qParams.Add("thumbnails", "1"); // gives links for thumbnail sized versions of their posters + //qParams.Add("posterLink", "1"); // gives links for a full sized poster + //qParams.Add("dlLink", "1"); // include the url to download the torrent + qParams.Add("description", "1"); // include the description + //qParams.Add("bookmarks", "0"); // include if the item is bookmarked or not + List catList = MapTorznabCapsToTrackers(query); if (catList.Any()) { @@ -182,65 +203,72 @@ namespace Jackett.Common.Indexers } var response = await RequestStringWithCookiesAndRetry(urlSearch); - if (response.Status == System.Net.HttpStatusCode.Forbidden || CookieHeader.Contains("pass=deleted") || response.Content.Contains("Access limits exceeded.")) + if (response.Content.StartsWith("Error")) { - // re-login - await ApplyConfiguration(null); - response = await RequestStringWithCookiesAndRetry(urlSearch); + throw new Exception(response.Content); } try { - CQ dom = response.Content; - var rows = dom["table[class='newTorTable'] > tbody > tr[id^=\"tdr\"]"]; + var jsonContent = JObject.Parse(response.Content); + var sitelink = new Uri(SiteLink); - foreach (IDomObject row in rows) + foreach (var item in jsonContent.Value("data")) { - CQ torrentData = row.OuterHTML; - CQ cells = row.Cq().Find("td"); - - string tid = torrentData.Attr("id").Substring(4); - var qTitle = torrentData.Find("a[class='title']").First(); - string title = qTitle.Text().Trim(); - var details = new Uri(SiteLink + qTitle.Attr("href")); - string author = torrentData.Find("a[class='author']").First().Text().Trim(); - Uri link = new Uri(SiteLink + "tor/download.php?tid=" + tid); // DL Link is no long available directly, build it ourself - long files = ParseUtil.CoerceLong(cells.Elements.ElementAt(4).Cq().Find("a").Text()); - long size = ReleaseInfo.GetBytes(cells.Elements.ElementAt(4).Cq().Text().Split('[')[1].TrimEnd(']')); - int seeders = ParseUtil.CoerceInt(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(0).Cq().Text()); - int leechers = ParseUtil.CoerceInt(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(1).Cq().Text()); - long grabs = ParseUtil.CoerceLong(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(2).Cq().Text()); - bool freeleech = torrentData.Find("img[alt=\"freeleech\"]").Any(); - - string pubDateStr = cells.Elements.ElementAt(5).Cq().Text().Split('[')[0]; - DateTime publishDate = DateTime.Parse(pubDateStr).ToLocalTime(); - - long category = 0; - string cat = torrentData.Find("a[class='newCatLink']").First().Attr("href").Remove(0, "/tor/browse.php?tor[cat][]]=".Length); - long.TryParse(cat, out category); - var release = new ReleaseInfo(); + + var id = item.Value("id"); + release.Title = item.Value("title"); - release.Title = String.IsNullOrEmpty(author) ? title : String.Format("{0} by {1}", title, author); - release.Guid = link; - release.Link = link; - release.PublishDate = publishDate; - release.Files = files; - release.Size = size; - release.Description = release.Title; - release.Seeders = seeders; - release.Peers = seeders + leechers; - release.Grabs = grabs; - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; - release.Category = MapTrackerCatToNewznab(category.ToString()); - release.Comments = details; + release.Description = item.Value("description"); - if (freeleech) + var author_info = item.Value("author_info"); + string author = null; + if (!string.IsNullOrWhiteSpace(author_info)) + { + author_info = Regex.Unescape(author_info); + var author_info_json = JObject.Parse(author_info); + author = author_info_json.First.Last.Value(); + } + if (author != null) + release.Title += " by " + author; + + var flags = new List(); + + var lang_code = item.Value("lang_code"); + if (!string.IsNullOrEmpty(lang_code)) + flags.Add(lang_code); + + var filetype = item.Value("filetype"); + if (!string.IsNullOrEmpty(filetype)) + flags.Add(filetype); + + if (flags.Count > 0) + release.Title += " [" + string.Join(" / ", flags) + "]"; + + var category = item.Value("category"); + release.Category = MapTrackerCatToNewznab(category); + + release.Link = new Uri(sitelink, "/tor/download.php?tid=" + id); + release.Comments = new Uri(sitelink, "/t/" + id); + release.Guid = release.Comments; + + var dateStr = item.Value("added"); + var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); + release.PublishDate = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc).ToLocalTime(); + + release.Grabs = item.Value("times_completed"); + release.Files = item.Value("numfiles"); + release.Seeders = item.Value("seeders"); + release.Peers = item.Value("leechers") + release.Seeders; + var size = item.Value("size"); + release.Size = ReleaseInfo.GetBytes(size); + var free = item.Value("free"); + + if (free == 1) release.DownloadVolumeFactor = 0; else release.DownloadVolumeFactor = 1; - release.UploadVolumeFactor = 1; releases.Add(release); diff --git a/src/Jackett.Common/Models/IndexerConfig/Bespoke/ConfigurationDataMyAnonamouse.cs b/src/Jackett.Common/Models/IndexerConfig/Bespoke/ConfigurationDataMyAnonamouse.cs new file mode 100644 index 000000000..71a69df3e --- /dev/null +++ b/src/Jackett.Common/Models/IndexerConfig/Bespoke/ConfigurationDataMyAnonamouse.cs @@ -0,0 +1,20 @@ +namespace Jackett.Common.Models.IndexerConfig +{ + + public class ConfigurationDataMyAnonamouse : ConfigurationData + { + public StringItem MamId { get; private set; } + public DisplayItem MamIdHint { get; private set; } + + public ConfigurationDataMyAnonamouse() + { + MamId = new StringItem { Name = "mam_id" }; + MamIdHint = new DisplayItem( + "Go to your security preferences and create a new session for the IP used by the Jackett server. Then paste the resulting mam_id value into the mam_id field here.") + { + Name = "mam_id instructions" + }; + } + } + +}