mirror of https://github.com/Jackett/Jackett
Add indexer: Immortalseed. Add category mapping framework.
This commit is contained in:
parent
37587bdc7e
commit
ea069810a5
|
@ -158,20 +158,20 @@ namespace JackettTest.Indexers
|
|||
indexer.LoadFromSavedConfiguration(JObject.Parse("{\"cookies\":\"bbtid=c\"}"));
|
||||
var results = await indexer.PerformQuery(new Jackett.Models.TorznabQuery() { SanitizedSearchTerm = "Series S1", Season = 1 });
|
||||
|
||||
results.Length.Should().Be(44);
|
||||
results[0].Title.Should().Be("Golden Time Season 1 (BD 720p) [FFF]");
|
||||
results[0].Guid.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff");
|
||||
results[0].Comments.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff");
|
||||
results[0].Size.Should().Be(10307921920);
|
||||
results[0].Description.Should().Be("Golden Time Season 1 (BD 720p) [FFF]");
|
||||
results[0].Link.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff");
|
||||
results[0].Peers.Should().Be(161);
|
||||
results[0].Seeders.Should().Be(151);
|
||||
results[0].MinimumRatio.Should().Be(1);
|
||||
results.Count().Should().Be(44);
|
||||
results.First().Title.Should().Be("Golden Time Season 1 (BD 720p) [FFF]");
|
||||
results.First().Guid.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff");
|
||||
results.First().Comments.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff");
|
||||
results.First().Size.Should().Be(10307921920);
|
||||
results.First().Description.Should().Be("Golden Time Season 1 (BD 720p) [FFF]");
|
||||
results.First().Link.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff");
|
||||
results.First().Peers.Should().Be(161);
|
||||
results.First().Seeders.Should().Be(151);
|
||||
results.First().MinimumRatio.Should().Be(1);
|
||||
|
||||
results[1].Title.Should().Be("Yowamushi Pedal Season 1 (BD 720p) [Commie]");
|
||||
results[4].Title.Should().Be("Dungeon ni Deai o Motomeru no wa Machigatte Iru Darouka: Familia Myth Season 1 (480p) [HorribleSubs]");
|
||||
results[5].Title.Should().Be("Is It Wrong to Try to Pick Up Girls in a Dungeon? Season 1 (480p) [HorribleSubs]");
|
||||
results.ElementAt(1).Title.Should().Be("Yowamushi Pedal Season 1 (BD 720p) [Commie]");
|
||||
results.ElementAt(4).Title.Should().Be("Dungeon ni Deai o Motomeru no wa Machigatte Iru Darouka: Familia Myth Season 1 (480p) [HorribleSubs]");
|
||||
results.ElementAt(5).Title.Should().Be("Is It Wrong to Try to Pick Up Girls in a Dungeon? Season 1 (480p) [HorribleSubs]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
<th>First Seen</th>
|
||||
<th>Tracker</th>
|
||||
<th>Name</th>
|
||||
<th>Category</th>
|
||||
<th>Seeds</th>
|
||||
<th>Leechers</th>
|
||||
<th>Download</th>
|
||||
|
@ -52,6 +53,7 @@
|
|||
<td>{{formatRelative FirstSeen}}</td>
|
||||
<td>{{Tracker}}</td>
|
||||
<td><a href="{{Comments}}">{{Title}}</a></td>
|
||||
<td>{{CategoryDesc}}</td>
|
||||
<td>{{Seeders}}</td>
|
||||
<td>{{Peers}}</td>
|
||||
<td><a href="{{Link}}"><i class="fa fa-download"></i></a></td>
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 9.2 KiB |
|
@ -69,14 +69,16 @@ namespace Jackett.Controllers
|
|||
cacheService.CacheRssResults(indexer.DisplayName, releases);
|
||||
}
|
||||
|
||||
releases = indexer.FilterResults(torznabQuery, releases);
|
||||
|
||||
// Log info
|
||||
if (string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm))
|
||||
{
|
||||
logger.Info(string.Format("Found {0} releases from {1}", releases.Length, indexer.DisplayName));
|
||||
logger.Info(string.Format("Found {0} releases from {1}", releases.Count(), indexer.DisplayName));
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Info(string.Format("Found {0} releases from {1} for: {2}", releases.Length, indexer.DisplayName, torznabQuery.SanitizedSearchTerm));
|
||||
logger.Info(string.Format("Found {0} releases from {1} for: {2}", releases.Count(), indexer.DisplayName, torznabQuery.SanitizedSearchTerm));
|
||||
}
|
||||
|
||||
var severUrl = string.Format("{0}://{1}:{2}/", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port);
|
||||
|
|
|
@ -74,7 +74,7 @@ namespace Jackett.Indexers
|
|||
release.Link = new Uri(DownloadUrl + id);
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
@ -122,7 +122,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(response.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
|
||||
static DateTime UnixTimestampToDateTime(double unixTime)
|
||||
|
|
|
@ -33,7 +33,7 @@ namespace Jackett.Indexers
|
|||
description: "Powered by Tentacles",
|
||||
manager: i,
|
||||
client: client,
|
||||
caps: new TorznabCapabilities(TorznabCategory.Anime),
|
||||
caps: new TorznabCapabilities(TorznabCatType.Anime),
|
||||
logger: l)
|
||||
{
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ namespace Jackett.Indexers
|
|||
}
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
// The result list
|
||||
var releases = new List<ReleaseInfo>();
|
||||
|
@ -127,7 +127,7 @@ namespace Jackett.Indexers
|
|||
return releases.ToArray();
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> GetResults(string searchTerm)
|
||||
public async Task<IEnumerable<ReleaseInfo>> GetResults(string searchTerm)
|
||||
{
|
||||
// This tracker only deals with full seasons so chop off the episode/season number if we have it D:
|
||||
if (!string.IsNullOrWhiteSpace(searchTerm))
|
||||
|
@ -327,7 +327,7 @@ namespace Jackett.Indexers
|
|||
cache.Add(new CachedQueryResult(searchTerm, releases));
|
||||
}
|
||||
|
||||
return releases.Select(s => (ReleaseInfo)s.Clone()).ToArray();
|
||||
return releases.Select(s => (ReleaseInfo)s.Clone());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
|
@ -113,7 +113,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ namespace Jackett.Indexers
|
|||
: base(name: "BakaBT",
|
||||
description: "Anime Community",
|
||||
link: "http://bakabt.me/",
|
||||
caps: new TorznabCapabilities(TorznabCategory.Anime),
|
||||
caps: new TorznabCapabilities(TorznabCatType.Anime),
|
||||
manager: i,
|
||||
client: wc,
|
||||
logger: l)
|
||||
|
@ -65,7 +65,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
|
||||
// This tracker only deals with full seasons so chop off the episode/season number if we have it D:
|
||||
|
@ -170,7 +170,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(response.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
|
||||
public override async Task<byte[]> Download(Uri link)
|
||||
|
|
|
@ -29,6 +29,8 @@ namespace Jackett.Indexers
|
|||
protected IWebClient webclient;
|
||||
protected string cookieHeader = "";
|
||||
|
||||
private List<CategoryMapping> categoryMapping = new List<CategoryMapping>();
|
||||
|
||||
public BaseIndexer(string name, string link, string description, IIndexerManagerService manager, IWebClient client, Logger logger, TorznabCapabilities caps = null)
|
||||
{
|
||||
if (!link.EndsWith("/"))
|
||||
|
@ -46,6 +48,19 @@ namespace Jackett.Indexers
|
|||
TorznabCaps = caps;
|
||||
}
|
||||
|
||||
protected int MapTrackerCatToNewznab(string input)
|
||||
{
|
||||
if (null != input) {
|
||||
input = input.ToLowerInvariant();
|
||||
var mapping = categoryMapping.Where(m => m.TrackerCategory == input).FirstOrDefault();
|
||||
if(mapping!= null)
|
||||
{
|
||||
return mapping.NewzNabCategory;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static string GetIndexerID(Type type)
|
||||
{
|
||||
return StringUtil.StripNonAlphaNumeric(type.Name.ToLowerInvariant());
|
||||
|
@ -239,5 +254,40 @@ namespace Jackett.Indexers
|
|||
onError();
|
||||
}
|
||||
}
|
||||
|
||||
public virtual IEnumerable<ReleaseInfo> FilterResults(TorznabQuery query, IEnumerable<ReleaseInfo> results)
|
||||
{
|
||||
foreach(var result in results)
|
||||
{
|
||||
if(query.Categories.Length == 0 || query.Categories.Contains(result.Category) || result.Category == 0 || TorznabCatType.QueryContainsParentCategory(query.Categories, result.Category))
|
||||
{
|
||||
yield return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void AddCategoryMapping(string trackerCategory, int newznabCategory)
|
||||
{
|
||||
categoryMapping.Add(new CategoryMapping(trackerCategory, newznabCategory));
|
||||
}
|
||||
|
||||
protected void AddCategoryMapping(int trackerCategory, TorznabCategory newznabCategory)
|
||||
{
|
||||
categoryMapping.Add(new CategoryMapping(trackerCategory.ToString(), newznabCategory.ID));
|
||||
if (!TorznabCaps.Categories.Contains(newznabCategory))
|
||||
TorznabCaps.Categories.Add(newznabCategory);
|
||||
}
|
||||
|
||||
protected void AddCategoryMapping(string trackerCategory, TorznabCategory newznabCategory)
|
||||
{
|
||||
categoryMapping.Add(new CategoryMapping(trackerCategory.ToString(), newznabCategory.ID));
|
||||
if (!TorznabCaps.Categories.Contains(newznabCategory))
|
||||
TorznabCaps.Categories.Add(newznabCategory);
|
||||
}
|
||||
|
||||
protected void AddCategoryMapping(int trackerCategory, int newznabCategory)
|
||||
{
|
||||
categoryMapping.Add(new CategoryMapping(trackerCategory.ToString(), newznabCategory));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
|
@ -105,7 +105,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,10 +61,9 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString);
|
||||
var results = await RequestStringWithCookies(episodeSearchUrl);
|
||||
|
@ -107,7 +106,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,10 +74,9 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(searchString));
|
||||
var results = await RequestStringWithCookies(episodeSearchUrl);
|
||||
|
@ -129,7 +128,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
|
@ -94,7 +94,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(response.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,10 +65,9 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
string episodeSearchUrl;
|
||||
|
||||
if (string.IsNullOrEmpty(query.SanitizedSearchTerm))
|
||||
|
@ -125,7 +124,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,10 +62,9 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
|
||||
var response = await RequestStringWithCookies(episodeSearchUrl);
|
||||
|
@ -117,7 +116,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(results, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,11 +59,10 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchurls = new List<string>();
|
||||
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var searchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString.Trim()));
|
||||
var results = await RequestStringWithCookies(searchUrl);
|
||||
|
@ -132,7 +131,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,9 @@ namespace Jackett.Indexers
|
|||
// Called on startup when initializing indexers from saved configuration
|
||||
void LoadFromSavedConfiguration(JToken jsonConfig);
|
||||
|
||||
Task<ReleaseInfo[]> PerformQuery(TorznabQuery query);
|
||||
Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query);
|
||||
|
||||
IEnumerable<ReleaseInfo> FilterResults(TorznabQuery query, IEnumerable<ReleaseInfo> input);
|
||||
|
||||
Task<byte[]> Download(Uri link);
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace Jackett.Indexers
|
|||
client: wc,
|
||||
logger: l)
|
||||
{
|
||||
TorznabCaps.Categories.Add(new TorznabCategory { ID = "5070", Name = "TV/Anime" });
|
||||
TorznabCaps.Categories.Add(TorznabCatType.Anime);
|
||||
}
|
||||
|
||||
public Task<ConfigurationData> GetConfigurationForSetup()
|
||||
|
@ -67,7 +67,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
@ -134,7 +134,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,156 @@
|
|||
using CsQuery;
|
||||
using Jackett.Models;
|
||||
using Jackett.Services;
|
||||
using Jackett.Utils;
|
||||
using Jackett.Utils.Clients;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
|
||||
namespace Jackett.Indexers
|
||||
{
|
||||
public class ImmortalSeed : BaseIndexer, IIndexer
|
||||
{
|
||||
private string BrowsePage { get { return SiteLink + "browse.php"; } }
|
||||
private string LoginUrl { get { return SiteLink + "takelogin.php"; } }
|
||||
private string QueryString { get { return "?do=search&keywords={0}&search_type=t_name&category=0&include_dead_torrents=no"; } }
|
||||
|
||||
public ImmortalSeed(IIndexerManagerService i, IWebClient wc, Logger l)
|
||||
: base(name: "ImmortalSeed",
|
||||
description: "ImmortalSeed",
|
||||
link: "http://immortalseed.me/",
|
||||
caps: TorznabCapsUtil.CreateDefaultTorznabTVCaps(),
|
||||
manager: i,
|
||||
client: wc,
|
||||
logger: l)
|
||||
{
|
||||
AddCategoryMapping(32, TorznabCatType.Anime);
|
||||
AddCategoryMapping(47, TorznabCatType.TVSD);
|
||||
AddCategoryMapping(8, TorznabCatType.TVHD);
|
||||
AddCategoryMapping(48, TorznabCatType.TVHD);
|
||||
AddCategoryMapping(9, TorznabCatType.TVSD);
|
||||
AddCategoryMapping(4, TorznabCatType.TVHD);
|
||||
AddCategoryMapping(6, TorznabCatType.TVSD);
|
||||
|
||||
AddCategoryMapping(22, TorznabCatType.Books);
|
||||
AddCategoryMapping(41, TorznabCatType.Comic);
|
||||
AddCategoryMapping(23, TorznabCatType.Apps);
|
||||
|
||||
AddCategoryMapping(16, TorznabCatType.MoviesHD);
|
||||
AddCategoryMapping(17, TorznabCatType.MoviesSD);
|
||||
AddCategoryMapping(14, TorznabCatType.MoviesSD);
|
||||
AddCategoryMapping(34, TorznabCatType.MoviesForeign);
|
||||
AddCategoryMapping(18, TorznabCatType.MoviesForeign);
|
||||
AddCategoryMapping(33, TorznabCatType.MoviesForeign);
|
||||
|
||||
AddCategoryMapping(34, TorznabCatType.Audio);
|
||||
AddCategoryMapping(37, TorznabCatType.AudioLossless);
|
||||
AddCategoryMapping(35, TorznabCatType.AudioBooks);
|
||||
AddCategoryMapping(36, TorznabCatType.AudioLossy);
|
||||
|
||||
}
|
||||
|
||||
public Task<ConfigurationData> GetConfigurationForSetup()
|
||||
{
|
||||
return Task.FromResult<ConfigurationData>(new ConfigurationDataBasicLogin());
|
||||
}
|
||||
|
||||
public async Task ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
var incomingConfig = new ConfigurationDataBasicLogin();
|
||||
incomingConfig.LoadValuesFromJson(configJson);
|
||||
var pairs = new Dictionary<string, string> {
|
||||
{ "username", incomingConfig.Username.Value },
|
||||
{ "password", incomingConfig.Password.Value }
|
||||
};
|
||||
var request = new Utils.Clients.WebRequest()
|
||||
{
|
||||
Url = LoginUrl,
|
||||
Type = RequestType.POST,
|
||||
Referer = SiteLink,
|
||||
PostData = pairs
|
||||
};
|
||||
var response = await webclient.GetString(request);
|
||||
CQ splashDom = response.Content;
|
||||
var link = splashDom[".trow2 a"].First();
|
||||
var resultPage = await RequestStringWithCookies(link.Attr("href"), response.Cookies);
|
||||
CQ resultDom = resultPage.Content;
|
||||
|
||||
ConfigureIfOK(response.Cookies, resultPage.Content.Contains("/logout.php"), () =>
|
||||
{
|
||||
var tries = resultDom["#main tr:eq(1) td font"].First().Text();
|
||||
var errorMessage = "Incorrect username or password! " + tries + " tries remaining.";
|
||||
throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)incomingConfig);
|
||||
});
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var searchUrl = BrowsePage;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(searchString))
|
||||
{
|
||||
searchUrl += string.Format(QueryString, HttpUtility.UrlEncode(searchString));
|
||||
}
|
||||
|
||||
var results = await RequestStringWithCookies(searchUrl);
|
||||
|
||||
try
|
||||
{
|
||||
CQ dom = results.Content;
|
||||
|
||||
var rows = dom["#sortabletable tr"];
|
||||
foreach (var row in rows.Skip(1))
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
var qRow = row.Cq();
|
||||
release.Title = qRow.Find(".tooltip-content div").First().Text();
|
||||
release.Description = qRow.Find(".tooltip-content div").Get(1).InnerText.Trim();
|
||||
|
||||
var qLink = row.Cq().Find("td:eq(2) a:eq(1)");
|
||||
release.Link = new Uri(qLink.Attr("href"));
|
||||
release.Guid = release.Link;
|
||||
release.Comments = new Uri(qRow.Find(".tooltip-target a").First().Attr("href"));
|
||||
|
||||
// 07-22-2015 11:08 AM
|
||||
var dateString = qRow.Find("td:eq(1) div").Last().Children().Remove().End().Text().Trim();
|
||||
release.PublishDate = DateTime.ParseExact(dateString, "MM-dd-yyyy hh:mm tt", CultureInfo.InvariantCulture);
|
||||
|
||||
var sizeStr = qRow.Find("td:eq(4)").Text().Trim();
|
||||
release.Size = ReleaseInfo.GetBytes(sizeStr);
|
||||
|
||||
release.Seeders = ParseUtil.CoerceInt(qRow.Find("td:eq(6)").Text().Trim());
|
||||
release.Peers = ParseUtil.CoerceInt(qRow.Find("td:eq(7)").Text().Trim()) + release.Seeders;
|
||||
|
||||
var catLink = row.Cq().Find("td:eq(0) a").First().Attr("href");
|
||||
var catSplit = catLink.IndexOf("category=");
|
||||
if (catSplit > -1)
|
||||
{
|
||||
catLink = catLink.Substring(catSplit + 9);
|
||||
}
|
||||
|
||||
release.Category = MapTrackerCatToNewznab(catLink);
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -72,10 +72,9 @@ namespace Jackett.Indexers
|
|||
release.Link = new Uri(DownloadUrl + id);
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString);
|
||||
WebClientStringResult response = null;
|
||||
|
@ -136,7 +135,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(response.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -69,10 +69,9 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
|
||||
|
||||
|
@ -119,7 +118,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(response.Content, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,10 +61,9 @@ namespace Jackett.Indexers
|
|||
return Task.FromResult<ConfigurationData>(new ConfigurationDataBasicLogin());
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
|
||||
|
||||
|
@ -106,7 +105,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(response.Content, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,12 +71,12 @@ namespace Jackett.Indexers
|
|||
return (string)obj["token"];
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
return await PerformQuery(query, BaseUrl);
|
||||
}
|
||||
|
||||
async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query, string baseUrl)
|
||||
async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, string baseUrl)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
string token = await GetToken(baseUrl);
|
||||
|
@ -109,7 +109,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
|
||||
public override Task<byte[]> Download(Uri link)
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
@ -104,7 +104,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -66,7 +66,7 @@ namespace Jackett.Indexers
|
|||
};
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
@ -111,7 +111,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ namespace Jackett.Indexers
|
|||
|
||||
var formattedUrl = config.GetFormattedHostUrl();
|
||||
var releases = await PerformQuery(new TorznabQuery(), formattedUrl);
|
||||
if (releases.Length == 0)
|
||||
if (releases.Count() == 0)
|
||||
throw new Exception("Could not find releases from this URL");
|
||||
|
||||
BaseUrl = formattedUrl;
|
||||
|
@ -62,7 +62,7 @@ namespace Jackett.Indexers
|
|||
IsConfigured = true;
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
return await PerformQuery(query, BaseUrl);
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ namespace Jackett.Indexers
|
|||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query, string baseUrl)
|
||||
async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, string baseUrl)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
@ -97,7 +97,9 @@ namespace Jackett.Indexers
|
|||
release.Title = serie_title;
|
||||
|
||||
release.Comments = new Uri(node.SelectSingleNode("link").InnerText);
|
||||
release.Category = node.SelectSingleNode("title").InnerText;
|
||||
int category = 0;
|
||||
int.TryParse(node.SelectSingleNode("title").InnerText, out category);
|
||||
release.Category = category;
|
||||
var test = node.SelectSingleNode("enclosure");
|
||||
release.Guid = new Uri(test.Attributes["url"].Value);
|
||||
release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture);
|
||||
|
@ -116,7 +118,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(result.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var formData = HttpUtility.ParseQueryString(SearchFormData);
|
||||
|
@ -101,7 +101,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(response.Content, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ namespace Jackett.Indexers
|
|||
IsConfigured = !string.IsNullOrEmpty(baseUrl);
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
|
@ -105,7 +105,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
|
||||
public override Task<byte[]> Download(Uri link)
|
||||
|
|
|
@ -118,10 +118,9 @@ namespace Jackett.Indexers
|
|||
IsConfigured = true;
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchTerm = string.IsNullOrEmpty(query.SanitizedSearchTerm) ? "%20" : query.SanitizedSearchTerm;
|
||||
var searchString = searchTerm + " " + query.GetEpisodeSearchString();
|
||||
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
|
||||
|
@ -166,7 +165,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(results, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
|
||||
public override async Task<byte[]> Download(Uri link)
|
||||
|
|
|
@ -48,7 +48,7 @@ namespace Jackett.Indexers
|
|||
|
||||
var formattedUrl = config.GetFormattedHostUrl();
|
||||
var releases = await PerformQuery(new TorznabQuery(), formattedUrl);
|
||||
if (releases.Length == 0)
|
||||
if (releases.Count() == 0)
|
||||
throw new Exception("Could not find releases from this URL");
|
||||
|
||||
BaseUrl = formattedUrl;
|
||||
|
@ -65,12 +65,12 @@ namespace Jackett.Indexers
|
|||
IsConfigured = true;
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
return await PerformQuery(query, BaseUrl);
|
||||
}
|
||||
|
||||
async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query, string baseUrl)
|
||||
async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, string baseUrl)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
|
|
@ -63,7 +63,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
@ -103,7 +103,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,10 +59,9 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
|
||||
var results = await RequestStringWithCookies(episodeSearchUrl);
|
||||
|
@ -111,7 +110,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ namespace Jackett.Indexers
|
|||
});
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
@ -99,7 +99,7 @@ namespace Jackett.Indexers
|
|||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ using System.Threading.Tasks;
|
|||
using System.Web;
|
||||
using System.Windows.Forms;
|
||||
using System.Xml;
|
||||
using System.Linq;
|
||||
|
||||
namespace Jackett.Indexers
|
||||
{
|
||||
|
@ -43,8 +44,8 @@ namespace Jackett.Indexers
|
|||
config.LoadValuesFromJson(configJson);
|
||||
|
||||
var formattedUrl = config.GetFormattedHostUrl();
|
||||
var releases = await PerformQuery(new TorznabQuery(), formattedUrl);
|
||||
if (releases.Length == 0)
|
||||
IEnumerable<ReleaseInfo> releases = await PerformQuery(new TorznabQuery(), formattedUrl);
|
||||
if (releases.Count() == 0)
|
||||
throw new Exception("Could not find releases from this URL");
|
||||
|
||||
BaseUrl = formattedUrl;
|
||||
|
@ -52,10 +53,9 @@ namespace Jackett.Indexers
|
|||
configSaveData["base_url"] = BaseUrl;
|
||||
SaveConfig(configSaveData);
|
||||
IsConfigured = true;
|
||||
|
||||
}
|
||||
|
||||
async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query, string baseUrl)
|
||||
async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, string baseUrl)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
@ -82,7 +82,9 @@ namespace Jackett.Indexers
|
|||
release.Title = serie_title;
|
||||
|
||||
release.Comments = new Uri(node.SelectSingleNode("link").InnerText);
|
||||
release.Category = node.SelectSingleNode("category").InnerText;
|
||||
int category = 0;
|
||||
int.TryParse(node.SelectSingleNode("category").InnerText, out category);
|
||||
release.Category = category;
|
||||
release.Guid = new Uri(node.SelectSingleNode("guid").InnerText);
|
||||
release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture);
|
||||
|
||||
|
@ -101,7 +103,7 @@ namespace Jackett.Indexers
|
|||
OnParseError(xml, ex);
|
||||
}
|
||||
|
||||
return releases.ToArray();
|
||||
return releases;
|
||||
}
|
||||
|
||||
|
||||
|
@ -111,7 +113,7 @@ namespace Jackett.Indexers
|
|||
IsConfigured = true;
|
||||
}
|
||||
|
||||
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
return await PerformQuery(query, BaseUrl);
|
||||
}
|
||||
|
|
|
@ -175,6 +175,7 @@
|
|||
<Compile Include="Indexers\HDSpace.cs" />
|
||||
<Compile Include="Indexers\HDTorrents.cs" />
|
||||
<Compile Include="Indexers\IIndexer.cs" />
|
||||
<Compile Include="Indexers\ImmortalSeed.cs" />
|
||||
<Compile Include="Indexers\IPTorrents.cs" />
|
||||
<Compile Include="Indexers\MoreThanTV.cs" />
|
||||
<Compile Include="Indexers\Pretome.cs" />
|
||||
|
@ -192,6 +193,7 @@
|
|||
<Compile Include="Indexers\TorrentShack.cs" />
|
||||
<Compile Include="Indexers\Torrentz.cs" />
|
||||
<Compile Include="Models\CachedResult.cs" />
|
||||
<Compile Include="Models\CategoryMapping.cs" />
|
||||
<Compile Include="Models\IndexerConfig\BmtvConfig.cs" />
|
||||
<Compile Include="Models\IndexerConfig\ConfigurationDataBasicLoginAnimeBytes.cs" />
|
||||
<Compile Include="Models\IndexerConfig\ConfigurationDataBasicLoginFrenchTorrentDb.cs" />
|
||||
|
@ -199,6 +201,7 @@
|
|||
<Compile Include="Models\TorznabCapabilities.cs" />
|
||||
<Compile Include="Models\Config\ServerConfig.cs" />
|
||||
<Compile Include="Models\TorznabCategory.cs" />
|
||||
<Compile Include="Models\TorznabCatType.cs" />
|
||||
<Compile Include="Models\TrackerCache.cs" />
|
||||
<Compile Include="Models\TrackerCacheResult.cs" />
|
||||
<Compile Include="Services\CacheService.cs" />
|
||||
|
|
|
@ -9,6 +9,7 @@ using Jackett.Indexers;
|
|||
using Jackett.Utils;
|
||||
using Jackett.Utils.Clients;
|
||||
using AutoMapper;
|
||||
using Jackett.Models;
|
||||
|
||||
namespace Jackett
|
||||
{
|
||||
|
@ -58,6 +59,11 @@ namespace Jackett
|
|||
|
||||
Mapper.CreateMap<WebClientStringResult, WebClientStringResult>();
|
||||
Mapper.CreateMap<WebClientByteResult, WebClientByteResult>();
|
||||
|
||||
Mapper.CreateMap<ReleaseInfo, TrackerCacheResult>().AfterMap((r, t) =>
|
||||
{
|
||||
t.CategoryDesc = TorznabCatType.GetCatDesc(r.Category);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Jackett.Models
|
||||
{
|
||||
class CategoryMapping
|
||||
{
|
||||
public CategoryMapping(string trackerCat, int newzCat)
|
||||
{
|
||||
TrackerCategory = trackerCat.ToLowerInvariant();
|
||||
NewzNabCategory = newzCat;
|
||||
}
|
||||
|
||||
public string TrackerCategory { get; private set; }
|
||||
public int NewzNabCategory { get; private set; }
|
||||
}
|
||||
}
|
|
@ -16,7 +16,7 @@ namespace Jackett.Models
|
|||
public Uri Link { get; set; }
|
||||
public Uri Comments { get; set; }
|
||||
public DateTime PublishDate { get; set; }
|
||||
public string Category { get; set; }
|
||||
public int Category { get; set; }
|
||||
public long? Size { get; set; }
|
||||
public string Description { get; set; }
|
||||
public long? RageID { get; set; }
|
||||
|
|
|
@ -63,8 +63,6 @@ namespace Jackett.Models
|
|||
new XElement("link", ChannelInfo.ImageLink.ToString()),
|
||||
new XElement("description", ChannelInfo.ImageDescription)
|
||||
),
|
||||
|
||||
|
||||
from r in Releases
|
||||
select new XElement("item",
|
||||
new XElement("title", r.Title),
|
||||
|
@ -74,7 +72,7 @@ namespace Jackett.Models
|
|||
r.Size == null ? null : new XElement("size", r.Size),
|
||||
new XElement("description", r.Description),
|
||||
new XElement("link", r.Link ?? r.MagnetUri),
|
||||
r.Category == null ? null : new XElement("category", r.Category),
|
||||
r.Category == 0 ? null : new XElement("category", r.Category),
|
||||
new XElement(
|
||||
"enclosure",
|
||||
new XAttribute("url", r.Link ?? r.MagnetUri),
|
||||
|
|
|
@ -0,0 +1,140 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Jackett.Models
|
||||
{
|
||||
class TorznabCatType
|
||||
{
|
||||
private static Dictionary<int, string> cats = new Dictionary<int, string>();
|
||||
|
||||
static TorznabCatType()
|
||||
{
|
||||
cats.Add(5000, "TV");
|
||||
cats.Add(5030, "TV/SD");
|
||||
cats.Add(5040, "TV/HD");
|
||||
cats.Add(5070, "TV/Anime");
|
||||
cats.Add(8000, "Books");
|
||||
cats.Add(8020, "Books/Comics");
|
||||
cats.Add(4000, "PC");
|
||||
cats.Add(3030, "Audio/Audiobook");
|
||||
cats.Add(2040, "Movies/HD");
|
||||
cats.Add(2030, "Movies/SD");
|
||||
cats.Add(2010, "Movies/Foreign");
|
||||
cats.Add(3000, "Audio");
|
||||
cats.Add(3040, "Audio/Lossless");
|
||||
cats.Add(3010, "Audio/MP3");
|
||||
}
|
||||
|
||||
public static bool QueryContainsParentCategory(int[] queryCats, int releaseCat)
|
||||
{
|
||||
if (cats.ContainsKey(releaseCat) && queryCats!=null)
|
||||
{
|
||||
var ncab = cats[releaseCat];
|
||||
var split = ncab.IndexOf("/");
|
||||
if (split > -1)
|
||||
{
|
||||
string parentCatName = ncab.Substring(0,split);
|
||||
if (cats.ContainsValue(parentCatName))
|
||||
{
|
||||
var parentCat = cats.Where(c => c.Value == parentCatName).First().Key;
|
||||
return queryCats.Contains(parentCat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static string GetCatDesc(int newznabcat)
|
||||
{
|
||||
if (cats.ContainsKey(newznabcat))
|
||||
{
|
||||
return cats[newznabcat];
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
private static TorznabCategory GetCat(int id)
|
||||
{
|
||||
return new TorznabCategory()
|
||||
{
|
||||
ID = id,
|
||||
Name = cats[id]
|
||||
};
|
||||
}
|
||||
|
||||
public static TorznabCategory Anime
|
||||
{
|
||||
get { return GetCat(5070); }
|
||||
}
|
||||
|
||||
public static TorznabCategory TV
|
||||
{
|
||||
get { return GetCat(5000); }
|
||||
}
|
||||
|
||||
public static TorznabCategory TVSD
|
||||
{
|
||||
get { return GetCat(5030); }
|
||||
}
|
||||
|
||||
public static TorznabCategory TVHD
|
||||
{
|
||||
get { return GetCat(5040); }
|
||||
}
|
||||
|
||||
public static TorznabCategory Books
|
||||
{
|
||||
get { return GetCat(8000); }
|
||||
}
|
||||
|
||||
public static TorznabCategory Comic
|
||||
{
|
||||
get { return GetCat(8020); }
|
||||
}
|
||||
|
||||
public static TorznabCategory Apps
|
||||
{
|
||||
get { return GetCat(4000); }
|
||||
}
|
||||
|
||||
public static TorznabCategory AudioBooks
|
||||
{
|
||||
get { return GetCat(3030); }
|
||||
}
|
||||
|
||||
public static TorznabCategory MoviesHD
|
||||
{
|
||||
get { return GetCat(2040); }
|
||||
}
|
||||
|
||||
public static TorznabCategory MoviesSD
|
||||
{
|
||||
get { return GetCat(2040); }
|
||||
}
|
||||
|
||||
public static TorznabCategory MoviesForeign
|
||||
{
|
||||
get { return GetCat(2040); }
|
||||
}
|
||||
|
||||
public static TorznabCategory Audio
|
||||
{
|
||||
get { return GetCat(3000); }
|
||||
}
|
||||
|
||||
public static TorznabCategory AudioLossless
|
||||
{
|
||||
get { return GetCat(3040); }
|
||||
}
|
||||
|
||||
public static TorznabCategory AudioLossy
|
||||
{
|
||||
get { return GetCat(3010); }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -8,7 +8,7 @@ namespace Jackett.Models
|
|||
{
|
||||
public class TorznabCategory
|
||||
{
|
||||
public string ID { get; set; }
|
||||
public int ID { get; set; }
|
||||
public string Name { get; set; }
|
||||
|
||||
public List<TorznabCategory> SubCategories { get; private set; }
|
||||
|
@ -17,53 +17,5 @@ namespace Jackett.Models
|
|||
{
|
||||
SubCategories = new List<TorznabCategory>();
|
||||
}
|
||||
|
||||
public static TorznabCategory Anime
|
||||
{
|
||||
get
|
||||
{
|
||||
return new TorznabCategory()
|
||||
{
|
||||
ID = "5070",
|
||||
Name = "TV/Anime"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public static TorznabCategory TV
|
||||
{
|
||||
get
|
||||
{
|
||||
return new TorznabCategory()
|
||||
{
|
||||
ID = "5000",
|
||||
Name = "TV"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public static TorznabCategory TVSD
|
||||
{
|
||||
get
|
||||
{
|
||||
return new TorznabCategory()
|
||||
{
|
||||
ID = "5030",
|
||||
Name = "TV/SD"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public static TorznabCategory TVHD
|
||||
{
|
||||
get
|
||||
{
|
||||
return new TorznabCategory()
|
||||
{
|
||||
ID = "5040",
|
||||
Name = "TV/HD"
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace Jackett.Models
|
|||
public class TorznabQuery
|
||||
{
|
||||
public string QueryType { get; set; }
|
||||
public string[] Categories { get; set; }
|
||||
public int[] Categories { get; set; }
|
||||
public int Extended { get; set; }
|
||||
public string ApiKey { get; set; }
|
||||
public int Limit { get; set; }
|
||||
|
@ -74,7 +74,10 @@ namespace Jackett.Models
|
|||
|
||||
if (query["cat"] != null)
|
||||
{
|
||||
q.Categories = query["cat"].Split(',');
|
||||
q.Categories = query["cat"].Split(',').Select(s => int.Parse(s)).ToArray();
|
||||
}else
|
||||
{
|
||||
q.Categories = new int[0];
|
||||
}
|
||||
|
||||
if (query["extended"] != null)
|
||||
|
|
|
@ -10,5 +10,6 @@ namespace Jackett.Models
|
|||
{
|
||||
public DateTime FirstSeen { get; set; }
|
||||
public string Tracker { get; set; }
|
||||
public string CategoryDesc { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ namespace Jackett.Services
|
|||
{
|
||||
public interface ICacheService
|
||||
{
|
||||
void CacheRssResults(string trackerId, ReleaseInfo[] releases);
|
||||
void CacheRssResults(string trackerId, IEnumerable<ReleaseInfo> releases);
|
||||
List<TrackerCacheResult> GetCachedResults();
|
||||
}
|
||||
|
||||
|
@ -20,12 +20,7 @@ namespace Jackett.Services
|
|||
private readonly int MAX_RESULTS_PER_TRACKER = 100;
|
||||
private readonly TimeSpan AGE_LIMIT = new TimeSpan(2, 0, 0, 0);
|
||||
|
||||
static CacheService()
|
||||
{
|
||||
Mapper.CreateMap<ReleaseInfo,TrackerCacheResult>();
|
||||
}
|
||||
|
||||
public void CacheRssResults(string trackerId, ReleaseInfo[] releases)
|
||||
public void CacheRssResults(string trackerId, IEnumerable<ReleaseInfo> releases)
|
||||
{
|
||||
lock (cache)
|
||||
{
|
||||
|
|
|
@ -77,8 +77,8 @@ namespace Jackett.Services
|
|||
var indexer = GetIndexer(name);
|
||||
var browseQuery = new TorznabQuery();
|
||||
var results = await indexer.PerformQuery(browseQuery);
|
||||
logger.Info(string.Format("Found {0} releases from {1}", results.Length, indexer.DisplayName));
|
||||
if (results.Length == 0)
|
||||
logger.Info(string.Format("Found {0} releases from {1}", results.Count(), indexer.DisplayName));
|
||||
if (results.Count() == 0)
|
||||
throw new Exception("Found no results while trying to browse this tracker");
|
||||
}
|
||||
|
||||
|
|
|
@ -16,9 +16,9 @@ namespace Jackett.Utils
|
|||
caps.TVSearchAvailable = true;
|
||||
caps.SupportsTVRageSearch = false;
|
||||
caps.Categories.AddRange(new[] {
|
||||
TorznabCategory.TV,
|
||||
TorznabCategory.TVSD,
|
||||
TorznabCategory.TVHD
|
||||
TorznabCatType.TV,
|
||||
TorznabCatType.TVSD,
|
||||
TorznabCatType.TVHD
|
||||
});
|
||||
return caps;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue