SceneTime: Fix Column parsing

SceneTime: Column numbers seem to be related to user settings, use
column names instead. Add category mapping support
This commit is contained in:
flightlevel 2016-02-13 16:55:23 +11:00
parent 80686c81ee
commit f2a899eea3
1 changed files with 52 additions and 23 deletions

View File

@ -7,14 +7,11 @@ 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.Linq; using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web;
using Jackett.Models.IndexerConfig; using Jackett.Models.IndexerConfig;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
namespace Jackett.Indexers namespace Jackett.Indexers
{ {
@ -34,13 +31,15 @@ namespace Jackett.Indexers
: base(name: "SceneTime", : base(name: "SceneTime",
description: "Always on time", description: "Always on time",
link: "https://www.scenetime.com/", link: "https://www.scenetime.com/",
caps: TorznabUtil.CreateDefaultTorznabTVCaps(), caps: new TorznabCapabilities(),
manager: i, manager: i,
client: w, client: w,
logger: l, logger: l,
p: ps, p: ps,
configData: new ConfigurationDataBasicLogin()) configData: new ConfigurationDataBasicLogin("For best results, change the 'Torrents per page' setting to the maximum in your profile on the SceneTime webpage."))
{ {
AddCategoryMapping(77, TorznabCatType.TVSD);
AddCategoryMapping(9, TorznabCatType.TVHD);
} }
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
@ -62,23 +61,47 @@ namespace Jackett.Indexers
return IndexerConfigurationStatus.RequiresTesting; return IndexerConfigurationStatus.RequiresTesting;
} }
private Dictionary<string, string> GetSearchFormData(string searchString)
{
return new Dictionary<string, string> {
{ "c2", "1" }, { "c43", "1" }, { "c9", "1" }, { "c63", "1" }, { "c77", "1" }, { "c100", "1" }, { "c101", "1" },
{ "cata", "yes" }, { "sec", "jax" },
{ "search", searchString}
};
}
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{ {
var releases = new List<ReleaseInfo>(); NameValueCollection qParams = new NameValueCollection();
var results = await PostDataWithCookiesAndRetry(SearchUrl, GetSearchFormData(query.GetQueryString())); qParams.Add("cata", "yes");
qParams.Add("sec", "jax");
List<string> catList = MapTorznabCapsToTrackers(query);
foreach (string cat in catList)
{
qParams.Add("c" + cat, "1");
}
if (!string.IsNullOrEmpty(query.SanitizedSearchTerm))
{
qParams.Add("search", query.GetQueryString());
}
string torrentSearchUrl = $"{SearchUrl}?{qParams.GetQueryString()}";
var results = await RequestStringWithCookiesAndRetry(torrentSearchUrl);
List<ReleaseInfo> releases = ParseResponse(results.Content);
return releases;
}
public List<ReleaseInfo> ParseResponse(string htmlResponse)
{
List<ReleaseInfo> releases = new List<ReleaseInfo>();
try try
{ {
CQ dom = results.Content; CQ dom = htmlResponse;
List<string> headerColumns = dom["table[class*='movehere']"].First().Find("tbody > tr > td[class='cat_Head']").Select(x => x.Cq().Text()).ToList();
int categoryIndex = headerColumns.FindIndex(x => x.Equals("Type"));
int nameIndex = headerColumns.FindIndex(x => x.Equals("Name"));
int sizeIndex = headerColumns.FindIndex(x => x.Equals("Size"));
int seedersIndex = headerColumns.FindIndex(x => x.Equals("Seeders"));
int leechersIndex = headerColumns.FindIndex(x => x.Equals("Leechers"));
var rows = dom["tr.browse"]; var rows = dom["tr.browse"];
foreach (var row in rows) foreach (var row in rows)
{ {
@ -86,7 +109,12 @@ namespace Jackett.Indexers
release.MinimumRatio = 1; release.MinimumRatio = 1;
release.MinimumSeedTime = 172800; release.MinimumSeedTime = 172800;
var descCol = row.ChildElements.ElementAt(1); var categoryCol = row.ChildElements.ElementAt(categoryIndex);
string catLink = categoryCol.Cq().Find("a").Attr("href");
string catId = new Regex(@"\?cat=(\d*)").Match(catLink).Groups[1].ToString().Trim();
release.Category = MapTrackerCatToNewznab(catId);
var descCol = row.ChildElements.ElementAt(nameIndex);
var qDescCol = descCol.Cq(); var qDescCol = descCol.Cq();
var qLink = qDescCol.Find("a"); var qLink = qDescCol.Find("a");
release.Title = qLink.Text(); release.Title = qLink.Text();
@ -98,19 +126,20 @@ namespace Jackett.Indexers
release.PublishDate = DateTimeUtil.FromTimeAgo(descCol.ChildNodes.Last().InnerText); release.PublishDate = DateTimeUtil.FromTimeAgo(descCol.ChildNodes.Last().InnerText);
var sizeStr = row.ChildElements.ElementAt(3).Cq().Text(); var sizeStr = row.ChildElements.ElementAt(sizeIndex).Cq().Text();
release.Size = ReleaseInfo.GetBytes(sizeStr); release.Size = ReleaseInfo.GetBytes(sizeStr);
release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(4).Cq().Text().Trim()); release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(seedersIndex).Cq().Text().Trim());
release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(5).Cq().Text().Trim()) + release.Seeders; release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(leechersIndex).Cq().Text().Trim()) + release.Seeders;
releases.Add(release); releases.Add(release);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
OnParseError(results.Content, ex); OnParseError(htmlResponse, ex);
} }
return releases; return releases;
} }
} }