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\"}")); indexer.LoadFromSavedConfiguration(JObject.Parse("{\"cookies\":\"bbtid=c\"}"));
var results = await indexer.PerformQuery(new Jackett.Models.TorznabQuery() { SanitizedSearchTerm = "Series S1", Season = 1 }); var results = await indexer.PerformQuery(new Jackett.Models.TorznabQuery() { SanitizedSearchTerm = "Series S1", Season = 1 });
results.Length.Should().Be(44); results.Count().Should().Be(44);
results[0].Title.Should().Be("Golden Time Season 1 (BD 720p) [FFF]"); results.First().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.First().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.First().Comments.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff");
results[0].Size.Should().Be(10307921920); results.First().Size.Should().Be(10307921920);
results[0].Description.Should().Be("Golden Time Season 1 (BD 720p) [FFF]"); results.First().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.First().Link.Should().Be("http://bakabt.me/torrent/180302/golden-time-bd-720p-fff");
results[0].Peers.Should().Be(161); results.First().Peers.Should().Be(161);
results[0].Seeders.Should().Be(151); results.First().Seeders.Should().Be(151);
results[0].MinimumRatio.Should().Be(1); results.First().MinimumRatio.Should().Be(1);
results[1].Title.Should().Be("Yowamushi Pedal Season 1 (BD 720p) [Commie]"); results.ElementAt(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.ElementAt(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(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>First Seen</th>
<th>Tracker</th> <th>Tracker</th>
<th>Name</th> <th>Name</th>
<th>Category</th>
<th>Seeds</th> <th>Seeds</th>
<th>Leechers</th> <th>Leechers</th>
<th>Download</th> <th>Download</th>
@@ -52,6 +53,7 @@
<td>{{formatRelative FirstSeen}}</td> <td>{{formatRelative FirstSeen}}</td>
<td>{{Tracker}}</td> <td>{{Tracker}}</td>
<td><a href="{{Comments}}">{{Title}}</a></td> <td><a href="{{Comments}}">{{Title}}</a></td>
<td>{{CategoryDesc}}</td>
<td>{{Seeders}}</td> <td>{{Seeders}}</td>
<td>{{Peers}}</td> <td>{{Peers}}</td>
<td><a href="{{Link}}"><i class="fa fa-download"></i></a></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); cacheService.CacheRssResults(indexer.DisplayName, releases);
} }
releases = indexer.FilterResults(torznabQuery, releases);
// Log info // Log info
if (string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm)) 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 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); 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); 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
@@ -122,7 +122,7 @@ namespace Jackett.Indexers
OnParseError(response.Content, ex); OnParseError(response.Content, ex);
} }
return releases.ToArray(); return releases;
} }
static DateTime UnixTimestampToDateTime(double unixTime) static DateTime UnixTimestampToDateTime(double unixTime)

View File

@@ -33,7 +33,7 @@ namespace Jackett.Indexers
description: "Powered by Tentacles", description: "Powered by Tentacles",
manager: i, manager: i,
client: client, client: client,
caps: new TorznabCapabilities(TorznabCategory.Anime), caps: new TorznabCapabilities(TorznabCatType.Anime),
logger: l) 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 // The result list
var releases = new List<ReleaseInfo>(); var releases = new List<ReleaseInfo>();
@@ -127,7 +127,7 @@ namespace Jackett.Indexers
return releases.ToArray(); 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: // This tracker only deals with full seasons so chop off the episode/season number if we have it D:
if (!string.IsNullOrWhiteSpace(searchTerm)) if (!string.IsNullOrWhiteSpace(searchTerm))
@@ -327,7 +327,7 @@ namespace Jackett.Indexers
cache.Add(new CachedQueryResult(searchTerm, releases)); 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>(); List<ReleaseInfo> releases = new List<ReleaseInfo>();
@@ -113,7 +113,7 @@ namespace Jackett.Indexers
{ {
OnParseError(results.Content, ex); OnParseError(results.Content, ex);
} }
return releases.ToArray(); return releases;
} }
} }
} }

View File

@@ -25,7 +25,7 @@ namespace Jackett.Indexers
: base(name: "BakaBT", : base(name: "BakaBT",
description: "Anime Community", description: "Anime Community",
link: "http://bakabt.me/", link: "http://bakabt.me/",
caps: new TorznabCapabilities(TorznabCategory.Anime), caps: new TorznabCapabilities(TorznabCatType.Anime),
manager: i, manager: i,
client: wc, client: wc,
logger: l) 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: // 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); OnParseError(response.Content, ex);
} }
return releases.ToArray(); return releases;
} }
public override async Task<byte[]> Download(Uri link) public override async Task<byte[]> Download(Uri link)

View File

@@ -29,6 +29,8 @@ namespace Jackett.Indexers
protected IWebClient webclient; protected IWebClient webclient;
protected string cookieHeader = ""; 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) public BaseIndexer(string name, string link, string description, IIndexerManagerService manager, IWebClient client, Logger logger, TorznabCapabilities caps = null)
{ {
if (!link.EndsWith("/")) if (!link.EndsWith("/"))
@@ -46,6 +48,19 @@ namespace Jackett.Indexers
TorznabCaps = caps; 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) public static string GetIndexerID(Type type)
{ {
return StringUtil.StripNonAlphaNumeric(type.Name.ToLowerInvariant()); return StringUtil.StripNonAlphaNumeric(type.Name.ToLowerInvariant());
@@ -239,5 +254,40 @@ namespace Jackett.Indexers
onError(); 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>(); List<ReleaseInfo> releases = new List<ReleaseInfo>();
@@ -105,7 +105,7 @@ namespace Jackett.Indexers
OnParseError(results.Content, ex); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString);
var results = await RequestStringWithCookies(episodeSearchUrl); var results = await RequestStringWithCookies(episodeSearchUrl);
@@ -107,7 +106,7 @@ namespace Jackett.Indexers
OnParseError(results.Content, ex); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
var episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(searchString)); var episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(searchString));
var results = await RequestStringWithCookies(episodeSearchUrl); var results = await RequestStringWithCookies(episodeSearchUrl);
@@ -129,7 +128,7 @@ namespace Jackett.Indexers
OnParseError(results.Content, ex); 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>(); List<ReleaseInfo> releases = new List<ReleaseInfo>();
@@ -94,7 +94,7 @@ namespace Jackett.Indexers
OnParseError(response.Content, ex); 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; string episodeSearchUrl;
if (string.IsNullOrEmpty(query.SanitizedSearchTerm)) if (string.IsNullOrEmpty(query.SanitizedSearchTerm))
@@ -125,7 +124,7 @@ namespace Jackett.Indexers
OnParseError(results.Content, ex); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
var response = await RequestStringWithCookies(episodeSearchUrl); var response = await RequestStringWithCookies(episodeSearchUrl);
@@ -117,7 +116,7 @@ namespace Jackett.Indexers
{ {
OnParseError(results, ex); 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 releases = new List<ReleaseInfo>();
var searchurls = new List<string>(); var searchurls = new List<string>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
var searchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString.Trim())); var searchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString.Trim()));
var results = await RequestStringWithCookies(searchUrl); var results = await RequestStringWithCookies(searchUrl);
@@ -132,7 +131,7 @@ namespace Jackett.Indexers
OnParseError(results.Content, ex); 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 // Called on startup when initializing indexers from saved configuration
void LoadFromSavedConfiguration(JToken jsonConfig); 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); Task<byte[]> Download(Uri link);
} }

View File

@@ -30,7 +30,7 @@ namespace Jackett.Indexers
client: wc, client: wc,
logger: l) logger: l)
{ {
TorznabCaps.Categories.Add(new TorznabCategory { ID = "5070", Name = "TV/Anime" }); TorznabCaps.Categories.Add(TorznabCatType.Anime);
} }
public Task<ConfigurationData> GetConfigurationForSetup() 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
@@ -134,7 +134,7 @@ namespace Jackett.Indexers
OnParseError(results, ex); 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); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString);
WebClientStringResult response = null; WebClientStringResult response = null;
@@ -136,7 +135,7 @@ namespace Jackett.Indexers
OnParseError(response.Content, ex); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
@@ -119,7 +118,7 @@ namespace Jackett.Indexers
{ {
OnParseError(response.Content, ex); OnParseError(response.Content, ex);
} }
return releases.ToArray(); return releases;
} }
} }
} }

View File

@@ -61,10 +61,9 @@ namespace Jackett.Indexers
return Task.FromResult<ConfigurationData>(new ConfigurationDataBasicLogin()); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
@@ -106,7 +105,7 @@ namespace Jackett.Indexers
{ {
OnParseError(response.Content, ex); OnParseError(response.Content, ex);
} }
return releases.ToArray(); return releases;
} }
} }
} }

View File

@@ -71,12 +71,12 @@ namespace Jackett.Indexers
return (string)obj["token"]; return (string)obj["token"];
} }
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query) public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{ {
return await PerformQuery(query, BaseUrl); 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 releases = new List<ReleaseInfo>();
string token = await GetToken(baseUrl); string token = await GetToken(baseUrl);
@@ -109,7 +109,7 @@ namespace Jackett.Indexers
{ {
OnParseError(results.Content, ex); OnParseError(results.Content, ex);
} }
return releases.ToArray(); return releases;
} }
public override Task<byte[]> Download(Uri link) 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
@@ -104,7 +104,7 @@ namespace Jackett.Indexers
OnParseError(results.Content, ex); 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
@@ -111,7 +111,7 @@ namespace Jackett.Indexers
{ {
OnParseError(results.Content, ex); OnParseError(results.Content, ex);
} }
return releases.ToArray(); return releases;
} }
} }
} }

View File

@@ -45,7 +45,7 @@ namespace Jackett.Indexers
var formattedUrl = config.GetFormattedHostUrl(); var formattedUrl = config.GetFormattedHostUrl();
var releases = await PerformQuery(new TorznabQuery(), formattedUrl); 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"); throw new Exception("Could not find releases from this URL");
BaseUrl = formattedUrl; BaseUrl = formattedUrl;
@@ -62,7 +62,7 @@ namespace Jackett.Indexers
IsConfigured = true; IsConfigured = true;
} }
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query) public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{ {
return await PerformQuery(query, BaseUrl); return await PerformQuery(query, BaseUrl);
} }
@@ -72,7 +72,7 @@ namespace Jackett.Indexers
throw new NotImplementedException(); 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
@@ -97,7 +97,9 @@ namespace Jackett.Indexers
release.Title = serie_title; release.Title = serie_title;
release.Comments = new Uri(node.SelectSingleNode("link").InnerText); 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"); var test = node.SelectSingleNode("enclosure");
release.Guid = new Uri(test.Attributes["url"].Value); release.Guid = new Uri(test.Attributes["url"].Value);
release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture); release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture);
@@ -116,7 +118,7 @@ namespace Jackett.Indexers
OnParseError(result.Content, ex); 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 releases = new List<ReleaseInfo>();
var formData = HttpUtility.ParseQueryString(SearchFormData); var formData = HttpUtility.ParseQueryString(SearchFormData);
@@ -101,7 +101,7 @@ namespace Jackett.Indexers
{ {
OnParseError(response.Content, ex); OnParseError(response.Content, ex);
} }
return releases.ToArray(); return releases;
} }
} }
} }

View File

@@ -56,7 +56,7 @@ namespace Jackett.Indexers
IsConfigured = !string.IsNullOrEmpty(baseUrl); 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>(); List<ReleaseInfo> releases = new List<ReleaseInfo>();
@@ -105,7 +105,7 @@ namespace Jackett.Indexers
OnParseError(results.Content, ex); OnParseError(results.Content, ex);
} }
return releases.ToArray(); return releases;
} }
public override Task<byte[]> Download(Uri link) public override Task<byte[]> Download(Uri link)

View File

@@ -118,10 +118,9 @@ namespace Jackett.Indexers
IsConfigured = true; 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 searchTerm = string.IsNullOrEmpty(query.SanitizedSearchTerm) ? "%20" : query.SanitizedSearchTerm;
var searchString = searchTerm + " " + query.GetEpisodeSearchString(); var searchString = searchTerm + " " + query.GetEpisodeSearchString();
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
@@ -166,7 +165,7 @@ namespace Jackett.Indexers
{ {
OnParseError(results, ex); OnParseError(results, ex);
} }
return releases.ToArray(); return releases;
} }
public override async Task<byte[]> Download(Uri link) public override async Task<byte[]> Download(Uri link)

View File

@@ -48,7 +48,7 @@ namespace Jackett.Indexers
var formattedUrl = config.GetFormattedHostUrl(); var formattedUrl = config.GetFormattedHostUrl();
var releases = await PerformQuery(new TorznabQuery(), formattedUrl); 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"); throw new Exception("Could not find releases from this URL");
BaseUrl = formattedUrl; BaseUrl = formattedUrl;
@@ -65,12 +65,12 @@ namespace Jackett.Indexers
IsConfigured = true; IsConfigured = true;
} }
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query) public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{ {
return await PerformQuery(query, BaseUrl); 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
@@ -103,7 +103,7 @@ namespace Jackett.Indexers
{ {
OnParseError(results.Content, ex); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString));
var results = await RequestStringWithCookies(episodeSearchUrl); var results = await RequestStringWithCookies(episodeSearchUrl);
@@ -111,7 +110,7 @@ namespace Jackett.Indexers
OnParseError(results.Content, ex); 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
@@ -99,7 +99,7 @@ namespace Jackett.Indexers
{ {
OnParseError(results.Content, ex); OnParseError(results.Content, ex);
} }
return releases.ToArray(); return releases;
} }
} }
} }

View File

@@ -13,6 +13,7 @@ using System.Threading.Tasks;
using System.Web; using System.Web;
using System.Windows.Forms; using System.Windows.Forms;
using System.Xml; using System.Xml;
using System.Linq;
namespace Jackett.Indexers namespace Jackett.Indexers
{ {
@@ -43,8 +44,8 @@ namespace Jackett.Indexers
config.LoadValuesFromJson(configJson); config.LoadValuesFromJson(configJson);
var formattedUrl = config.GetFormattedHostUrl(); var formattedUrl = config.GetFormattedHostUrl();
var releases = await PerformQuery(new TorznabQuery(), formattedUrl); IEnumerable<ReleaseInfo> releases = await PerformQuery(new TorznabQuery(), formattedUrl);
if (releases.Length == 0) if (releases.Count() == 0)
throw new Exception("Could not find releases from this URL"); throw new Exception("Could not find releases from this URL");
BaseUrl = formattedUrl; BaseUrl = formattedUrl;
@@ -52,10 +53,9 @@ namespace Jackett.Indexers
configSaveData["base_url"] = BaseUrl; configSaveData["base_url"] = BaseUrl;
SaveConfig(configSaveData); SaveConfig(configSaveData);
IsConfigured = true; 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 releases = new List<ReleaseInfo>();
var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
@@ -82,7 +82,9 @@ namespace Jackett.Indexers
release.Title = serie_title; release.Title = serie_title;
release.Comments = new Uri(node.SelectSingleNode("link").InnerText); 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.Guid = new Uri(node.SelectSingleNode("guid").InnerText);
release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture); release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture);
@@ -101,7 +103,7 @@ namespace Jackett.Indexers
OnParseError(xml, ex); OnParseError(xml, ex);
} }
return releases.ToArray(); return releases;
} }
@@ -111,7 +113,7 @@ namespace Jackett.Indexers
IsConfigured = true; IsConfigured = true;
} }
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query) public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{ {
return await PerformQuery(query, BaseUrl); return await PerformQuery(query, BaseUrl);
} }

View File

@@ -175,6 +175,7 @@
<Compile Include="Indexers\HDSpace.cs" /> <Compile Include="Indexers\HDSpace.cs" />
<Compile Include="Indexers\HDTorrents.cs" /> <Compile Include="Indexers\HDTorrents.cs" />
<Compile Include="Indexers\IIndexer.cs" /> <Compile Include="Indexers\IIndexer.cs" />
<Compile Include="Indexers\ImmortalSeed.cs" />
<Compile Include="Indexers\IPTorrents.cs" /> <Compile Include="Indexers\IPTorrents.cs" />
<Compile Include="Indexers\MoreThanTV.cs" /> <Compile Include="Indexers\MoreThanTV.cs" />
<Compile Include="Indexers\Pretome.cs" /> <Compile Include="Indexers\Pretome.cs" />
@@ -192,6 +193,7 @@
<Compile Include="Indexers\TorrentShack.cs" /> <Compile Include="Indexers\TorrentShack.cs" />
<Compile Include="Indexers\Torrentz.cs" /> <Compile Include="Indexers\Torrentz.cs" />
<Compile Include="Models\CachedResult.cs" /> <Compile Include="Models\CachedResult.cs" />
<Compile Include="Models\CategoryMapping.cs" />
<Compile Include="Models\IndexerConfig\BmtvConfig.cs" /> <Compile Include="Models\IndexerConfig\BmtvConfig.cs" />
<Compile Include="Models\IndexerConfig\ConfigurationDataBasicLoginAnimeBytes.cs" /> <Compile Include="Models\IndexerConfig\ConfigurationDataBasicLoginAnimeBytes.cs" />
<Compile Include="Models\IndexerConfig\ConfigurationDataBasicLoginFrenchTorrentDb.cs" /> <Compile Include="Models\IndexerConfig\ConfigurationDataBasicLoginFrenchTorrentDb.cs" />
@@ -199,6 +201,7 @@
<Compile Include="Models\TorznabCapabilities.cs" /> <Compile Include="Models\TorznabCapabilities.cs" />
<Compile Include="Models\Config\ServerConfig.cs" /> <Compile Include="Models\Config\ServerConfig.cs" />
<Compile Include="Models\TorznabCategory.cs" /> <Compile Include="Models\TorznabCategory.cs" />
<Compile Include="Models\TorznabCatType.cs" />
<Compile Include="Models\TrackerCache.cs" /> <Compile Include="Models\TrackerCache.cs" />
<Compile Include="Models\TrackerCacheResult.cs" /> <Compile Include="Models\TrackerCacheResult.cs" />
<Compile Include="Services\CacheService.cs" /> <Compile Include="Services\CacheService.cs" />

View File

@@ -9,6 +9,7 @@ using Jackett.Indexers;
using Jackett.Utils; using Jackett.Utils;
using Jackett.Utils.Clients; using Jackett.Utils.Clients;
using AutoMapper; using AutoMapper;
using Jackett.Models;
namespace Jackett namespace Jackett
{ {
@@ -58,6 +59,11 @@ namespace Jackett
Mapper.CreateMap<WebClientStringResult, WebClientStringResult>(); Mapper.CreateMap<WebClientStringResult, WebClientStringResult>();
Mapper.CreateMap<WebClientByteResult, WebClientByteResult>(); 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 Link { get; set; }
public Uri Comments { get; set; } public Uri Comments { get; set; }
public DateTime PublishDate { get; set; } public DateTime PublishDate { get; set; }
public string Category { get; set; } public int Category { get; set; }
public long? Size { get; set; } public long? Size { get; set; }
public string Description { get; set; } public string Description { get; set; }
public long? RageID { get; set; } public long? RageID { get; set; }

View File

@@ -63,8 +63,6 @@ namespace Jackett.Models
new XElement("link", ChannelInfo.ImageLink.ToString()), new XElement("link", ChannelInfo.ImageLink.ToString()),
new XElement("description", ChannelInfo.ImageDescription) new XElement("description", ChannelInfo.ImageDescription)
), ),
from r in Releases from r in Releases
select new XElement("item", select new XElement("item",
new XElement("title", r.Title), new XElement("title", r.Title),
@@ -74,7 +72,7 @@ namespace Jackett.Models
r.Size == null ? null : new XElement("size", r.Size), r.Size == null ? null : new XElement("size", r.Size),
new XElement("description", r.Description), new XElement("description", r.Description),
new XElement("link", r.Link ?? r.MagnetUri), 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( new XElement(
"enclosure", "enclosure",
new XAttribute("url", r.Link ?? r.MagnetUri), 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 class TorznabCategory
{ {
public string ID { get; set; } public int ID { get; set; }
public string Name { get; set; } public string Name { get; set; }
public List<TorznabCategory> SubCategories { get; private set; } public List<TorznabCategory> SubCategories { get; private set; }
@@ -17,53 +17,5 @@ namespace Jackett.Models
{ {
SubCategories = new List<TorznabCategory>(); 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 class TorznabQuery
{ {
public string QueryType { get; set; } public string QueryType { get; set; }
public string[] Categories { get; set; } public int[] Categories { get; set; }
public int Extended { get; set; } public int Extended { get; set; }
public string ApiKey { get; set; } public string ApiKey { get; set; }
public int Limit { get; set; } public int Limit { get; set; }
@@ -74,7 +74,10 @@ namespace Jackett.Models
if (query["cat"] != null) 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) if (query["extended"] != null)

View File

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

View File

@@ -10,7 +10,7 @@ namespace Jackett.Services
{ {
public interface ICacheService public interface ICacheService
{ {
void CacheRssResults(string trackerId, ReleaseInfo[] releases); void CacheRssResults(string trackerId, IEnumerable<ReleaseInfo> releases);
List<TrackerCacheResult> GetCachedResults(); List<TrackerCacheResult> GetCachedResults();
} }
@@ -20,12 +20,7 @@ namespace Jackett.Services
private readonly int MAX_RESULTS_PER_TRACKER = 100; private readonly int MAX_RESULTS_PER_TRACKER = 100;
private readonly TimeSpan AGE_LIMIT = new TimeSpan(2, 0, 0, 0); private readonly TimeSpan AGE_LIMIT = new TimeSpan(2, 0, 0, 0);
static CacheService() public void CacheRssResults(string trackerId, IEnumerable<ReleaseInfo> releases)
{
Mapper.CreateMap<ReleaseInfo,TrackerCacheResult>();
}
public void CacheRssResults(string trackerId, ReleaseInfo[] releases)
{ {
lock (cache) lock (cache)
{ {

View File

@@ -77,8 +77,8 @@ namespace Jackett.Services
var indexer = GetIndexer(name); var indexer = GetIndexer(name);
var browseQuery = new TorznabQuery(); var browseQuery = new TorznabQuery();
var results = await indexer.PerformQuery(browseQuery); var results = await indexer.PerformQuery(browseQuery);
logger.Info(string.Format("Found {0} releases from {1}", results.Length, indexer.DisplayName)); logger.Info(string.Format("Found {0} releases from {1}", results.Count(), indexer.DisplayName));
if (results.Length == 0) if (results.Count() == 0)
throw new Exception("Found no results while trying to browse this tracker"); 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.TVSearchAvailable = true;
caps.SupportsTVRageSearch = false; caps.SupportsTVRageSearch = false;
caps.Categories.AddRange(new[] { caps.Categories.AddRange(new[] {
TorznabCategory.TV, TorznabCatType.TV,
TorznabCategory.TVSD, TorznabCatType.TVSD,
TorznabCategory.TVHD TorznabCatType.TVHD
}); });
return caps; return caps;
} }