Add indexer: Immortalseed. Add category mapping framework.

This commit is contained in:
KZ 2015-07-29 00:10:04 +01:00
parent 37587bdc7e
commit ea069810a5
46 changed files with 494 additions and 170 deletions

View File

@ -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]");
}
}
}

View File

@ -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

View File

@ -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);

View File

@ -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)

View File

@ -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());
}

View File

@ -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;
}
}
}

View File

@ -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)

View File

@ -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));
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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);
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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)

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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)

View File

@ -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)

View File

@ -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();

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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);
}

View File

@ -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" />

View File

@ -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);
});
}
}
}

View File

@ -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; }
}
}

View File

@ -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; }

View File

@ -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),

View File

@ -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); }
}
}
}

View File

@ -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"
};
}
}
}
}

View File

@ -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)

View File

@ -10,5 +10,6 @@ namespace Jackett.Models
{
public DateTime FirstSeen { get; set; }
public string Tracker { get; set; }
public string CategoryDesc { get; set; }
}
}

View File

@ -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)
{

View File

@ -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");
}

View File

@ -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;
}