Jackett/src/Jackett/Indexers/SpeedCD.cs

124 lines
5.2 KiB
C#
Raw Normal View History

2015-12-04 20:01:36 +00:00
using CsQuery;
2015-07-19 17:18:54 +00:00
using Jackett.Models;
using Jackett.Services;
using Jackett.Utils;
using Jackett.Utils.Clients;
2015-07-19 02:19:09 +00:00
using Newtonsoft.Json.Linq;
2015-07-19 17:18:54 +00:00
using NLog;
2015-07-19 02:19:09 +00:00
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
using Jackett.Models.IndexerConfig;
2015-07-19 02:19:09 +00:00
namespace Jackett.Indexers
{
2015-07-19 17:18:54 +00:00
public class SpeedCD : BaseIndexer, IIndexer
2015-07-19 02:19:09 +00:00
{
2015-12-04 20:01:36 +00:00
private string LoginUrl { get { return SiteLink + "take.login.php"; } }
private string SearchUrl { get { return SiteLink + "V3/API/API.php"; } }
2015-12-04 20:01:36 +00:00
private string SearchFormData { get { return "c53=1&c49=1&c2=1&c52=1&c41=1&c50=1&c30=1&c1=1&c42=1&c32=1&c43=1&c47=1&c28=1&c48=1&c40=1&jxt=4&jxw=b"; } }
private string CommentsUrl { get { return SiteLink + "t/{0}"; } }
private string DownloadUrl { get { return SiteLink + "download.php?torrent={0}"; } }
new ConfigurationDataBasicLogin configData
{
get { return (ConfigurationDataBasicLogin)base.configData; }
set { base.configData = value; }
}
2015-08-07 19:09:13 +00:00
public SpeedCD(IIndexerManagerService i, Logger l, IWebClient wc, IProtectionService ps)
: base(name: "Speed.cd",
description: "Your home now!",
link: "http://speed.cd/",
2015-12-04 20:01:36 +00:00
caps: new TorznabCapabilities(TorznabCatType.Movies,
TorznabCatType.TV,
TorznabCatType.TVSD,
TorznabCatType.TVHD,
TorznabCatType.Movies,
TorznabCatType.MoviesOther,
TorznabCatType.MoviesHD,
TorznabCatType.Movies3D,
TorznabCatType.MoviesBluRay,
TorznabCatType.MoviesDVD
),
manager: i,
client: wc,
logger: l,
2015-08-07 19:09:13 +00:00
p: ps,
configData: new ConfigurationDataBasicLogin())
2015-07-19 02:19:09 +00:00
{
2015-12-04 20:01:36 +00:00
2015-07-19 02:19:09 +00:00
}
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
2015-07-19 02:19:09 +00:00
{
configData.LoadValuesFromJson(configJson);
2015-07-19 02:19:09 +00:00
var pairs = new Dictionary<string, string> {
{ "username", configData.Username.Value },
{ "password", configData.Password.Value },
};
2015-07-19 02:19:09 +00:00
2015-08-02 18:14:21 +00:00
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, SiteLink);
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () =>
2015-07-19 02:19:09 +00:00
{
CQ dom = result.Content;
2015-07-19 02:19:09 +00:00
var errorMessage = dom["h5"].First().Text().Trim();
throw new ExceptionWithConfigData(errorMessage, configData);
});
return IndexerConfigurationStatus.RequiresTesting;
2015-07-19 02:19:09 +00:00
}
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
2015-07-19 02:19:09 +00:00
{
var releases = new List<ReleaseInfo>();
2015-07-19 02:19:09 +00:00
var formData = HttpUtility.ParseQueryString(SearchFormData);
var formDict = formData.AllKeys.ToDictionary(t => t, t => formData[t]);
formDict.Add("search", query.SanitizedSearchTerm);
var response = await PostDataWithCookiesAndRetry(SearchUrl, formDict);
2015-07-19 02:19:09 +00:00
try
{
var jsonResult = JObject.Parse(response.Content);
2015-07-19 02:19:09 +00:00
var resultArray = ((JArray)jsonResult["Fs"])[0]["Cn"]["torrents"];
foreach (var jobj in resultArray)
{
var release = new ReleaseInfo();
var id = (int)jobj["id"];
release.Comments = new Uri(string.Format(CommentsUrl, id));
release.Guid = release.Comments;
release.Link = new Uri(string.Format(DownloadUrl, id));
release.Title = Regex.Replace((string)jobj["name"], "<.*?>", String.Empty);
var SizeStr = ((string)jobj["size"]);
release.Size = ReleaseInfo.GetBytes(SizeStr);
2015-07-19 02:19:09 +00:00
release.Seeders = ParseUtil.CoerceInt((string)jobj["seed"]);
release.Peers = ParseUtil.CoerceInt((string)jobj["leech"]) + release.Seeders;
// ex: Tuesday, May 26, 2015 at 6:00pm
var dateStr = new Regex("title=\"(.*?)\"").Match((string)jobj["added"]).Groups[1].ToString();
dateStr = dateStr.Replace(" at", "");
var dateTime = DateTime.ParseExact(dateStr, "dddd, MMMM d, yyyy h:mmtt", CultureInfo.InvariantCulture);
release.PublishDate = dateTime;
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError(response.Content, ex);
2015-07-19 02:19:09 +00:00
}
return releases;
2015-07-19 02:19:09 +00:00
}
}
}