Fix torrentday non local login

This commit is contained in:
KZ
2015-09-04 19:16:40 +01:00
parent b39740848d
commit cf0f355960

View File

@@ -1,212 +1,213 @@
using CsQuery; using CsQuery;
using Jackett.Models; using Jackett.Models;
using Jackett.Services; using Jackett.Services;
using Jackett.Utils; using Jackett.Utils;
using Jackett.Utils.Clients; using Jackett.Utils.Clients;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NLog; using NLog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web; using System.Web;
using Jackett.Models.IndexerConfig; using Jackett.Models.IndexerConfig;
using System.Collections.Specialized; using System.Collections.Specialized;
namespace Jackett.Indexers namespace Jackett.Indexers
{ {
public class TorrentDay : BaseIndexer, IIndexer public class TorrentDay : BaseIndexer, IIndexer
{ {
private string StartPageUrl { get { return SiteLink + "login.php"; } } private string StartPageUrl { get { return SiteLink + "login.php"; } }
private string LoginUrl { get { return SiteLink + "tak3login.php"; } } private string LoginUrl { get { return SiteLink + "tak3login.php"; } }
private string SearchUrl { get { return SiteLink + "browse.php"; } } private string SearchUrl { get { return SiteLink + "browse.php"; } }
new ConfigurationDataRecaptchaLogin configData new ConfigurationDataRecaptchaLogin configData
{ {
get { return (ConfigurationDataRecaptchaLogin)base.configData; } get { return (ConfigurationDataRecaptchaLogin)base.configData; }
set { base.configData = value; } set { base.configData = value; }
} }
public TorrentDay(IIndexerManagerService i, Logger l, IWebClient wc, IProtectionService ps) public TorrentDay(IIndexerManagerService i, Logger l, IWebClient wc, IProtectionService ps)
: base(name: "TorrentDay", : base(name: "TorrentDay",
description: "TorrentDay", description: "TorrentDay",
link: "https://torrentday.eu/", link: "https://torrentday.eu/",
caps: TorznabUtil.CreateDefaultTorznabTVCaps(), caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
manager: i, manager: i,
client: wc, client: wc,
logger: l, logger: l,
p: ps, p: ps,
configData: new ConfigurationDataRecaptchaLogin()) configData: new ConfigurationDataRecaptchaLogin())
{ {
AddCategoryMapping(29, TorznabCatType.TVAnime); AddCategoryMapping(29, TorznabCatType.TVAnime);
AddCategoryMapping(28, TorznabCatType.PC); AddCategoryMapping(28, TorznabCatType.PC);
AddCategoryMapping(28, TorznabCatType.AudioAudiobook); AddCategoryMapping(28, TorznabCatType.AudioAudiobook);
AddCategoryMapping(20, TorznabCatType.Books); AddCategoryMapping(20, TorznabCatType.Books);
AddCategoryMapping(30, TorznabCatType.TVDocumentary); AddCategoryMapping(30, TorznabCatType.TVDocumentary);
//Freelech //Freelech
//Mac //Mac
AddCategoryMapping(25, TorznabCatType.MoviesSD); AddCategoryMapping(25, TorznabCatType.MoviesSD);
AddCategoryMapping(11, TorznabCatType.MoviesHD); AddCategoryMapping(11, TorznabCatType.MoviesHD);
AddCategoryMapping(5, TorznabCatType.MoviesHD); AddCategoryMapping(5, TorznabCatType.MoviesHD);
AddCategoryMapping(3, TorznabCatType.MoviesSD); AddCategoryMapping(3, TorznabCatType.MoviesSD);
AddCategoryMapping(21, TorznabCatType.MoviesSD); AddCategoryMapping(21, TorznabCatType.MoviesSD);
AddCategoryMapping(22, TorznabCatType.MoviesForeign); AddCategoryMapping(22, TorznabCatType.MoviesForeign);
// Movie packs // Movie packs
AddCategoryMapping(44, TorznabCatType.MoviesSD); AddCategoryMapping(44, TorznabCatType.MoviesSD);
AddCategoryMapping(1, TorznabCatType.MoviesSD); AddCategoryMapping(1, TorznabCatType.MoviesSD);
// Music foreign // Music foreign
// Music packs // Music packs
// Music videos // Music videos
AddCategoryMapping(4, TorznabCatType.PCGames); AddCategoryMapping(4, TorznabCatType.PCGames);
// ps3 // ps3
// psp // psp
// wii // wii
// 360 // 360
AddCategoryMapping(24, TorznabCatType.TVSD); AddCategoryMapping(24, TorznabCatType.TVSD);
AddCategoryMapping(32, TorznabCatType.TVHD); AddCategoryMapping(32, TorznabCatType.TVHD);
AddCategoryMapping(31, TorznabCatType.TVSD); AddCategoryMapping(31, TorznabCatType.TVSD);
AddCategoryMapping(33, TorznabCatType.TVSD); AddCategoryMapping(33, TorznabCatType.TVSD);
AddCategoryMapping(14, TorznabCatType.TVHD); AddCategoryMapping(14, TorznabCatType.TVHD);
AddCategoryMapping(26, TorznabCatType.TVSD); AddCategoryMapping(26, TorznabCatType.TVSD);
AddCategoryMapping(7, TorznabCatType.TVHD); AddCategoryMapping(7, TorznabCatType.TVHD);
AddCategoryMapping(2, TorznabCatType.TVSD); AddCategoryMapping(2, TorznabCatType.TVSD);
AddCategoryMapping(6, TorznabCatType.XXX); AddCategoryMapping(6, TorznabCatType.XXX);
AddCategoryMapping(15, TorznabCatType.XXX); AddCategoryMapping(15, TorznabCatType.XXX);
} }
public override async Task<ConfigurationData> GetConfigurationForSetup() public override async Task<ConfigurationData> GetConfigurationForSetup()
{ {
var loginPage = await RequestStringWithCookies(StartPageUrl, string.Empty); var loginPage = await RequestStringWithCookies(StartPageUrl, string.Empty);
CQ cq = loginPage.Content; CQ cq = loginPage.Content;
var result = new ConfigurationDataRecaptchaLogin(); var result = new ConfigurationDataRecaptchaLogin();
result.CookieHeader.Value = loginPage.Cookies; result.CookieHeader.Value = loginPage.Cookies;
result.Captcha.SiteKey = cq.Find(".g-recaptcha").Attr("data-sitekey"); result.Captcha.SiteKey = cq.Find(".g-recaptcha").Attr("data-sitekey");
return result; return result;
} }
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{ {
configData.LoadValuesFromJson(configJson); configData.LoadValuesFromJson(configJson);
var pairs = new Dictionary<string, string> { var pairs = new Dictionary<string, string> {
{ "username", configData.Username.Value }, { "username", configData.Username.Value },
{ "password", configData.Password.Value }, { "password", configData.Password.Value },
{ "g-recaptcha-response", configData.Captcha.Value } { "g-recaptcha-response", configData.Captcha.Value }
}; };
if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie)) if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie))
{ {
// Cookie was manually supplied // Cookie was manually supplied
CookieHeader = configData.Captcha.Cookie; CookieHeader = configData.Captcha.Cookie;
try try
{ {
var results = await PerformQuery(new TorznabQuery()); var results = await PerformQuery(new TorznabQuery());
if (results.Count() == 0) if (results.Count() == 0)
{ {
throw new Exception("Your cookie did not work"); throw new Exception("Your cookie did not work");
} }
SaveConfig(); SaveConfig();
IsConfigured = true; IsConfigured = true;
} return IndexerConfigurationStatus.Completed;
catch (Exception e) }
{ catch (Exception e)
IsConfigured = false; {
throw new Exception("Your cookie did not work: " + e.Message); IsConfigured = false;
} throw new Exception("Your cookie did not work: " + e.Message);
} }
}
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, configData.CookieHeader.Value, true, SiteLink, LoginUrl);
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () => var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, configData.CookieHeader.Value, true, SiteLink, LoginUrl);
{ await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () =>
CQ dom = result.Content; {
var messageEl = dom["#login"]; CQ dom = result.Content;
messageEl.Children("form").Remove(); var messageEl = dom["#login"];
var errorMessage = messageEl.Text().Trim(); messageEl.Children("form").Remove();
var errorMessage = messageEl.Text().Trim();
if (string.IsNullOrWhiteSpace(errorMessage))
{ if (string.IsNullOrWhiteSpace(errorMessage))
errorMessage = dom.Text(); {
} errorMessage = dom.Text();
}
throw new ExceptionWithConfigData(errorMessage, configData);
}); throw new ExceptionWithConfigData(errorMessage, configData);
return IndexerConfigurationStatus.RequiresTesting; });
} return IndexerConfigurationStatus.RequiresTesting;
}
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{ public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
var releases = new List<ReleaseInfo>(); {
var searchString = query.GetQueryString(); var releases = new List<ReleaseInfo>();
var queryUrl = SearchUrl; var searchString = query.GetQueryString();
var queryCollection = new NameValueCollection(); var queryUrl = SearchUrl;
var queryCollection = new NameValueCollection();
if (!string.IsNullOrWhiteSpace(searchString))
queryCollection.Add("search", searchString); if (!string.IsNullOrWhiteSpace(searchString))
queryCollection.Add("search", searchString);
foreach (var cat in MapTorznabCapsToTrackers(query))
queryCollection.Add("c" + cat, "1"); foreach (var cat in MapTorznabCapsToTrackers(query))
queryCollection.Add("c" + cat, "1");
if (queryCollection.Count > 0)
queryUrl += "?" + queryCollection.GetQueryString(); if (queryCollection.Count > 0)
queryUrl += "?" + queryCollection.GetQueryString();
var results = await RequestStringWithCookiesAndRetry(queryUrl);
var results = await RequestStringWithCookiesAndRetry(queryUrl);
// Check for being logged out
if (results.IsRedirect) // Check for being logged out
throw new AuthenticationException(); if (results.IsRedirect)
throw new AuthenticationException();
try
{ try
CQ dom = results.Content; {
var rows = dom["#torrentTable > tbody > tr.browse"]; CQ dom = results.Content;
foreach (var row in rows) var rows = dom["#torrentTable > tbody > tr.browse"];
{ foreach (var row in rows)
CQ qRow = row.Cq(); {
var release = new ReleaseInfo(); CQ qRow = row.Cq();
var release = new ReleaseInfo();
release.MinimumRatio = 1;
release.MinimumSeedTime = 172800; release.MinimumRatio = 1;
release.Title = qRow.Find(".torrentName").Text(); release.MinimumSeedTime = 172800;
release.Description = release.Title; release.Title = qRow.Find(".torrentName").Text();
release.Guid = new Uri(SiteLink + qRow.Find(".torrentName").Attr("href")); release.Description = release.Title;
release.Comments = release.Guid; release.Guid = new Uri(SiteLink + qRow.Find(".torrentName").Attr("href"));
release.Link = new Uri(SiteLink + qRow.Find(".dlLinksInfo > a").Attr("href")); release.Comments = release.Guid;
release.Link = new Uri(SiteLink + qRow.Find(".dlLinksInfo > a").Attr("href"));
var sizeStr = qRow.Find(".sizeInfo").Text();
release.Size = ReleaseInfo.GetBytes(sizeStr); var sizeStr = qRow.Find(".sizeInfo").Text();
release.Size = ReleaseInfo.GetBytes(sizeStr);
var dateStr = qRow.Find(".ulInfo").Text().Split('|').Last().Trim();
var agoIdx = dateStr.IndexOf("ago"); var dateStr = qRow.Find(".ulInfo").Text().Split('|').Last().Trim();
if (agoIdx > -1) var agoIdx = dateStr.IndexOf("ago");
{ if (agoIdx > -1)
dateStr = dateStr.Substring(0, agoIdx); {
} dateStr = dateStr.Substring(0, agoIdx);
release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); }
release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr);
release.Seeders = ParseUtil.CoerceInt(qRow.Find(".seedersInfo").Text());
release.Peers = ParseUtil.CoerceInt(qRow.Find(".leechersInfo").Text()) + release.Seeders; release.Seeders = ParseUtil.CoerceInt(qRow.Find(".seedersInfo").Text());
release.Peers = ParseUtil.CoerceInt(qRow.Find(".leechersInfo").Text()) + release.Seeders;
var cat = qRow.Find("td:eq(0) a").First().Attr("href").Substring(15);//browse.php?cat=24
release.Category = MapTrackerCatToNewznab(cat); var cat = qRow.Find("td:eq(0) a").First().Attr("href").Substring(15);//browse.php?cat=24
release.Category = MapTrackerCatToNewznab(cat);
releases.Add(release);
} releases.Add(release);
} }
catch (Exception ex) }
{ catch (Exception ex)
OnParseError(results.Content, ex); {
} OnParseError(results.Content, ex);
return releases; }
} return releases;
} }
} }
}