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;
|
2015-07-27 00:03:51 +00:00
|
|
|
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;
|
2015-08-03 21:38:45 +00:00
|
|
|
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"; } }
|
2015-07-27 00:03:51 +00:00
|
|
|
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"; } }
|
2015-07-27 00:03:51 +00:00
|
|
|
private string CommentsUrl { get { return SiteLink + "t/{0}"; } }
|
|
|
|
private string DownloadUrl { get { return SiteLink + "download.php?torrent={0}"; } }
|
2015-08-03 21:38:45 +00:00
|
|
|
|
|
|
|
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)
|
2015-07-19 23:05:30 +00:00
|
|
|
: base(name: "Speed.cd",
|
|
|
|
description: "Your home now!",
|
2015-07-27 00:03:51 +00:00
|
|
|
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
|
|
|
|
),
|
2015-07-19 23:05:30 +00:00
|
|
|
manager: i,
|
2015-07-27 00:03:51 +00:00
|
|
|
client: wc,
|
2015-08-03 21:38:45 +00:00
|
|
|
logger: l,
|
2015-08-07 19:09:13 +00:00
|
|
|
p: ps,
|
2015-08-03 21:38:45 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2015-08-22 20:57:13 +00:00
|
|
|
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
2015-07-19 02:19:09 +00:00
|
|
|
{
|
2015-08-03 21:38:45 +00:00
|
|
|
configData.LoadValuesFromJson(configJson);
|
2015-07-19 02:19:09 +00:00
|
|
|
var pairs = new Dictionary<string, string> {
|
2015-08-03 21:38:45 +00:00
|
|
|
{ "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);
|
2015-08-02 17:28:59 +00:00
|
|
|
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () =>
|
2015-07-19 02:19:09 +00:00
|
|
|
{
|
2015-07-27 00:03:51 +00:00
|
|
|
CQ dom = result.Content;
|
2015-07-19 02:19:09 +00:00
|
|
|
var errorMessage = dom["h5"].First().Text().Trim();
|
2015-08-03 21:38:45 +00:00
|
|
|
throw new ExceptionWithConfigData(errorMessage, configData);
|
2015-07-27 00:03:51 +00:00
|
|
|
});
|
2015-08-22 20:57:13 +00:00
|
|
|
|
|
|
|
return IndexerConfigurationStatus.RequiresTesting;
|
2015-07-19 02:19:09 +00:00
|
|
|
}
|
|
|
|
|
2015-07-28 23:10:04 +00:00
|
|
|
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
2015-07-19 02:19:09 +00:00
|
|
|
{
|
2015-07-27 00:03:51 +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);
|
2015-07-29 17:47:51 +00:00
|
|
|
var response = await PostDataWithCookiesAndRetry(SearchUrl, formDict);
|
2015-07-19 02:19:09 +00:00
|
|
|
try
|
|
|
|
{
|
2015-07-27 00:03:51 +00:00
|
|
|
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);
|
|
|
|
|
2015-07-26 03:53:53 +00:00
|
|
|
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)
|
|
|
|
{
|
2015-07-27 00:03:51 +00:00
|
|
|
OnParseError(response.Content, ex);
|
2015-07-19 02:19:09 +00:00
|
|
|
}
|
2015-07-28 23:10:04 +00:00
|
|
|
return releases;
|
2015-07-19 02:19:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|