1
0
Fork 0
mirror of https://github.com/Jackett/Jackett synced 2025-01-01 12:46:23 +00:00

Merge pull request #88 from Kayomani/hotfix/Bugfixes

HDTorrents bugfix, change AnimeBytes to work with RageId queries and reduce sizes of cards to improve presentation with the large number of indexers
This commit is contained in:
Matthew Little 2015-07-18 11:03:01 -06:00
commit 974565d907
5 changed files with 62 additions and 47 deletions

View file

@ -1,6 +1,7 @@
using CsQuery; using CsQuery;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
@ -19,20 +20,18 @@ namespace Jackett.Indexers
class ConfigurationDataBasicLoginAnimeBytes : ConfigurationDataBasicLogin class ConfigurationDataBasicLoginAnimeBytes : ConfigurationDataBasicLogin
{ {
public BoolItem IncludeRaw { get; private set; } public BoolItem IncludeRaw { get; private set; }
public DisplayItem RageIdWarning { get; private set; }
public DisplayItem DateWarning { get; private set; } public DisplayItem DateWarning { get; private set; }
public ConfigurationDataBasicLoginAnimeBytes() public ConfigurationDataBasicLoginAnimeBytes()
: base() : base()
{ {
IncludeRaw = new BoolItem() { Name = "IncludeRaw", Value = false }; IncludeRaw = new BoolItem() { Name = "IncludeRaw", Value = false };
RageIdWarning = new DisplayItem("Ensure rageid lookup is disabled in Sonarr for this tracker.") { Name = "RageWarning" };
DateWarning = new DisplayItem("This tracker does not supply upload dates so they are based off year of release.") { Name = "DateWarning" }; DateWarning = new DisplayItem("This tracker does not supply upload dates so they are based off year of release.") { Name = "DateWarning" };
} }
public override Item[] GetItems() public override Item[] GetItems()
{ {
return new Item[] { Username, Password, IncludeRaw, RageIdWarning, DateWarning }; return new Item[] { Username, Password, IncludeRaw, DateWarning };
} }
} }
@ -196,12 +195,28 @@ namespace Jackett.Indexers
public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query) public async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query)
{ {
// This tracker only deals with full seasons so chop off the episode/season number if we have it D: // The result list
if (!string.IsNullOrWhiteSpace(query.SearchTerm)) var releases = new ConcurrentBag<ReleaseInfo>();
var titles = query.ShowTitles ?? new string[] { query.SearchTerm??string.Empty };
var tasks = titles.Select(async item =>
{ {
var splitindex = query.SearchTerm.LastIndexOf(' '); foreach (var result in await GetResults(item))
releases.Add(result);
});
await Task.WhenAll(tasks);
return releases.ToArray();
}
public async Task<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))
{
var splitindex = searchTerm.LastIndexOf(' ');
if (splitindex > -1) if (splitindex > -1)
query.SearchTerm = query.SearchTerm.Substring(0, splitindex); searchTerm = searchTerm.Substring(0, splitindex);
} }
// The result list // The result list
@ -213,17 +228,16 @@ namespace Jackett.Indexers
// Remove old cache items // Remove old cache items
CleanCache(); CleanCache();
var cachedResult = cache.Where(i => i.Query == query.SearchTerm).FirstOrDefault(); var cachedResult = cache.Where(i => i.Query == searchTerm).FirstOrDefault();
if (cachedResult != null) if (cachedResult != null)
return cachedResult.Results.Select(s => (ReleaseInfo)s.Clone()).ToArray(); return cachedResult.Results.Select(s => (ReleaseInfo)s.Clone()).ToArray();
} }
var queryUrl = SearchUrl; var queryUrl = SearchUrl;
// Only include the query bit if its required as hopefully the site caches the non query page // Only include the query bit if its required as hopefully the site caches the non query page
if (!string.IsNullOrWhiteSpace(query.SearchTerm)) if (!string.IsNullOrWhiteSpace(searchTerm))
{ {
queryUrl += "&action=advanced&search_type=title&sort=time_added&way=desc&anime%5Btv_series%5D=1&searchstr=" + WebUtility.UrlEncode(searchTerm);
queryUrl += "&action=advanced&search_type=title&sort=time_added&way=desc&anime%5Btv_series%5D=1&searchstr=" + WebUtility.UrlEncode(query.SearchTerm);
} }
// Get the content from the tracker // Get the content from the tracker
@ -320,13 +334,15 @@ namespace Jackett.Indexers
release.MinimumRatio = 1; release.MinimumRatio = 1;
release.MinimumSeedTime = 259200; release.MinimumSeedTime = 259200;
var downloadLink = links.Get(0); var downloadLink = links.Get(0);
release.Guid = new Uri(BaseUrl + "/" + downloadLink.Attributes.GetAttribute("href") + "&nh=" + Hash(title)); // Sonarr should dedupe on this url - allow a url per name.
release.Link = release.Guid;// We dont know this so try to fake based on the release year // We dont know this so try to fake based on the release year
release.PublishDate = new DateTime(year, 1, 1); release.PublishDate = new DateTime(year, 1, 1);
release.PublishDate = release.PublishDate.AddDays(Math.Min(DateTime.Now.DayOfYear, 365) - 1); release.PublishDate = release.PublishDate.AddDays(Math.Min(DateTime.Now.DayOfYear, 365) - 1);
var infoLink = links.Get(1); var infoLink = links.Get(1);
release.Comments = new Uri(BaseUrl + "/" + infoLink.Attributes.GetAttribute("href")); release.Comments = new Uri(BaseUrl + "/" + infoLink.Attributes.GetAttribute("href"));
release.Guid = new Uri(BaseUrl + "/" + infoLink.Attributes.GetAttribute("href") + "&nh=" + Hash(title)); // Sonarr should dedupe on this url - allow a url per name.
release.Link = new Uri(BaseUrl + "/" + downloadLink.Attributes.GetAttribute("href"));
// We dont actually have a release name >.> so try to create one // We dont actually have a release name >.> so try to create one
var releaseTags = infoLink.InnerText.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList(); var releaseTags = infoLink.InnerText.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
@ -390,11 +406,10 @@ namespace Jackett.Indexers
throw ex; throw ex;
} }
// Add to the cache // Add to the cache
lock (cache) lock (cache)
{ {
cache.Add(new CachedResult(query.SearchTerm, releases)); cache.Add(new CachedResult(searchTerm, releases));
} }
return releases.Select(s => (ReleaseInfo)s.Clone()).ToArray(); return releases.Select(s => (ReleaseInfo)s.Clone()).ToArray();

View file

@ -18,7 +18,7 @@ namespace Jackett.Indexers
public event Action<IndexerInterface, string, Exception> OnResultParsingError; public event Action<IndexerInterface, string, Exception> OnResultParsingError;
const string DefaultUrl = "http://hd-torrents.org"; const string DefaultUrl = "http://hdts.ru"; // Of the accessible domains the .ru seems the most reliable. https://hdts.ru | https://hd-torrents.org | https://hd-torrents.net | https://hd-torrents.me
string BaseUrl = DefaultUrl; string BaseUrl = DefaultUrl;
static string chromeUserAgent = BrowserUtil.ChromeUserAgent; static string chromeUserAgent = BrowserUtil.ChromeUserAgent;
private string SearchUrl = DefaultUrl + "/torrents.php?search={0}&active=1&options=0&category%5B%5D=59&category%5B%5D=60&category%5B%5D=30&category%5B%5D=38&page={1}"; private string SearchUrl = DefaultUrl + "/torrents.php?search={0}&active=1&options=0&category%5B%5D=59&category%5B%5D=60&category%5B%5D=30&category%5B%5D=38&page={1}";
@ -176,7 +176,7 @@ namespace Jackett.Indexers
release.MinimumRatio = 1; release.MinimumRatio = 1;
release.MinimumSeedTime = 172800; release.MinimumSeedTime = 172800;
release.MagnetUri = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent").Get(3).FirstChild.GetAttribute("href"));
int seeders, peers; int seeders, peers;
if (ParseUtil.TryCoerceInt(qRow.Find("td").Get(9).FirstChild.FirstChild.InnerText, out seeders)) if (ParseUtil.TryCoerceInt(qRow.Find("td").Get(9).FirstChild.FirstChild.InnerText, out seeders))
@ -207,15 +207,14 @@ namespace Jackett.Indexers
} }
release.Size = size; release.Size = size;
release.Link = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent b a").Attr("href")); release.Guid = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent b a").Attr("href"));
release.Guid = release.Link; release.Link = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent").Get(3).FirstChild.GetAttribute("href"));
release.Comments = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent b a").Attr("href") + "#comments");
string[] dateSplit = qRow.Find("td.mainblockcontent").Get(5).InnerHTML.Split(','); string[] dateSplit = qRow.Find("td.mainblockcontent").Get(5).InnerHTML.Split(',');
string dateString = dateSplit[1].Substring(0, dateSplit[1].IndexOf('>')); string dateString = dateSplit[1].Substring(0, dateSplit[1].IndexOf('>'));
release.PublishDate = DateTime.Parse(dateString, CultureInfo.InvariantCulture); release.PublishDate = DateTime.Parse(dateString, CultureInfo.InvariantCulture);
release.Comments = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent").Get(2).FirstChild.GetAttribute("href"));
releases.Add(release); releases.Add(release);
} }
} }
@ -237,7 +236,7 @@ namespace Jackett.Indexers
public Task<byte[]> Download(Uri link) public Task<byte[]> Download(Uri link)
{ {
throw new NotImplementedException(); return client.GetByteArrayAsync(link);
} }
} }
} }

View file

@ -276,7 +276,7 @@ namespace Jackett
jsonReply["api_key"] = ApiKey.CurrentKey; jsonReply["api_key"] = ApiKey.CurrentKey;
jsonReply["app_version"] = Assembly.GetExecutingAssembly().GetName().Version.ToString(); jsonReply["app_version"] = Assembly.GetExecutingAssembly().GetName().Version.ToString();
JArray items = new JArray(); JArray items = new JArray();
foreach (var i in indexerManager.Indexers) foreach (var i in indexerManager.Indexers.OrderBy(_=>_.Key))
{ {
var indexer = i.Value; var indexer = i.Value;
var item = new JObject(); var item = new JObject();

View file

@ -25,18 +25,31 @@
border-radius: 6px; border-radius: 6px;
box-shadow: 1px 1px 5px 2px #cdcdcd; box-shadow: 1px 1px 5px 2px #cdcdcd;
padding: 10px; padding: 10px;
width: 260px; width: 270px;
display: inline-block; display: inline-block;
vertical-align: top; vertical-align: top;
margin: 10px; margin: 5px;
} }
#indexers {
text-align: center;
}
#unconfigured-indexers{
text-align: center;
}
#unconfigured-indexers .card {
width: 200px;
}
.unconfigured-indexer { .unconfigured-indexer {
height: 170px; height: 120px;
} }
.indexer { .indexer {
height: 230px; height: 180px;
} }
.add-indexer { .add-indexer {
@ -45,6 +58,7 @@
.indexer-logo { .indexer-logo {
text-align: center; text-align: center;
padding-bottom: 5px;
} }
.indexer-logo > img { .indexer-logo > img {

View file

@ -42,6 +42,9 @@
<hr /> <hr />
<div class="input-area"> <div class="input-area">
<p>
To add a Jackett indexer in Sonarr go to <b>Settings > Indexers > Add > Torznab > Custom</b>.
</p>
<span class="input-header">Jackett API Key: </span> <span class="input-header">Jackett API Key: </span>
<input id="api-key-input" class="form-control input-right" type="text" value="" placeholder="API Key" readonly=""> <input id="api-key-input" class="form-control input-right" type="text" value="" placeholder="API Key" readonly="">
<p>Use this key when adding indexers to Sonarr. This key works for all indexers.</p> <p>Use this key when adding indexers to Sonarr. This key works for all indexers.</p>
@ -52,23 +55,13 @@
</button> </button>
<span title="Jackett will restart after changing the port" class="glyphicon glyphicon-info-sign"></span> <span title="Jackett will restart after changing the port" class="glyphicon glyphicon-info-sign"></span>
</div> </div>
<hr /> <hr />
<h3>Configured Indexers</h3> <h3>Configured Indexers</h3>
<div id="indexers"> <div id="indexers"> </div>
</div>
<hr /> <hr />
<div id="footer"> <div id="footer">
Jackett Version <span id="app-version"></span> Jackett Version <span id="app-version"></span>
</div> </div>
</div> </div>
<div id="select-indexer-modal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true"> <div id="select-indexer-modal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
@ -81,10 +74,6 @@
<div class="modal-body"> <div class="modal-body">
<div id="unconfigured-indexers"> <div id="unconfigured-indexers">
</div> </div>
<hr />
<p>
To add a Jackett indexer in Sonarr go to <b>Settings > Indexers > Add > Torznab > Custom</b>
</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
@ -123,8 +112,7 @@
</button> </button>
<div class="configured-indexer indexer card"> <div class="configured-indexer indexer card">
<div class="indexer-logo"><img src="logos/{{id}}.png" /></div> <div class="indexer-logo"><img alt="{{name}}" title="{{name}}" src="logos/{{id}}.png" /></div>
<div class="indexer-name"><h3>{{name}}</h3></div>
<div class="indexer-buttons"> <div class="indexer-buttons">
<button class="btn btn-primary btn-sm indexer-setup" data-id="{{id}}"> <button class="btn btn-primary btn-sm indexer-setup" data-id="{{id}}">
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> <span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
@ -146,8 +134,7 @@
</div> </div>
<div class="unconfigured-indexer card"> <div class="unconfigured-indexer card">
<div class="indexer-logo"><img src="logos/{{id}}.png" /></div> <div class="indexer-logo"><img alt="{{name}}" title="{{name}}" src="logos/{{id}}.png" /></div>
<div class="indexer-name"><h3>{{name}}</h3></div>
<div class="indexer-buttons"> <div class="indexer-buttons">
<a class="btn btn-info" target="_blank" href="{{site_link}}">Visit <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span></a> <a class="btn btn-info" target="_blank" href="{{site_link}}">Visit <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span></a>
<button class="indexer-setup btn btn-success" data-id="{{id}}">Setup <span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button> <button class="indexer-setup btn btn-success" data-id="{{id}}">Setup <span class="glyphicon glyphicon-ok" aria-hidden="true"></span></button>