mirror of
https://github.com/lidarr/lidarr.git
synced 2025-07-16 10:03:51 -07:00
Fixed: (Redacted) Use Api Key for downloading
This commit is contained in:
parent
45329f29bd
commit
3b0289e3ec
5 changed files with 16 additions and 71 deletions
|
@ -22,7 +22,7 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
|
||||||
Name = "Redacted",
|
Name = "Redacted",
|
||||||
Settings = new RedactedSettings
|
Settings = new RedactedSettings
|
||||||
{
|
{
|
||||||
ApiKey = "key"
|
ApiKey = "secretkey"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,6 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
|
||||||
public void should_parse_recent_feed_from_redacted()
|
public void should_parse_recent_feed_from_redacted()
|
||||||
{
|
{
|
||||||
var recentFeed = ReadAllText(@"Files/Indexers/Gazelle/Gazelle.json");
|
var recentFeed = ReadAllText(@"Files/Indexers/Gazelle/Gazelle.json");
|
||||||
var indexFeed = ReadAllText(@"Files/Indexers/Gazelle/GazelleIndex.json");
|
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>()
|
Mocker.GetMock<IHttpClient>()
|
||||||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get &&
|
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get &&
|
||||||
|
@ -39,13 +38,6 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
|
||||||
v.Headers.Get("Authorization") == ((RedactedSettings)Subject.Definition.Settings).ApiKey)))
|
v.Headers.Get("Authorization") == ((RedactedSettings)Subject.Definition.Settings).ApiKey)))
|
||||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader { ContentType = "application/json" }, recentFeed));
|
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader { ContentType = "application/json" }, recentFeed));
|
||||||
|
|
||||||
Mocker.GetMock<IHttpClient>()
|
|
||||||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get &&
|
|
||||||
v.Url.FullUri.Contains("ajax.php?action=index") &&
|
|
||||||
v.Headers.Get("Authorization") == ((RedactedSettings)Subject.Definition.Settings).ApiKey)))
|
|
||||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), indexFeed));
|
|
||||||
|
|
||||||
((RedactedRequestGenerator)Subject.GetRequestGenerator()).Authenticate();
|
|
||||||
var releases = Subject.FetchRecent();
|
var releases = Subject.FetchRecent();
|
||||||
|
|
||||||
releases.Should().HaveCount(4);
|
releases.Should().HaveCount(4);
|
||||||
|
@ -54,8 +46,7 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
|
||||||
|
|
||||||
releaseInfo.Title.Should().Be("Shania Twain - Shania Twain (1993) [FLAC 24bit Lossless] [WEB]");
|
releaseInfo.Title.Should().Be("Shania Twain - Shania Twain (1993) [FLAC 24bit Lossless] [WEB]");
|
||||||
releaseInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
|
releaseInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
|
||||||
releaseInfo.DownloadUrl.Should()
|
releaseInfo.DownloadUrl.Should().Be("https://redacted.ch/ajax.php?action=download&id=1541452&usetoken=0");
|
||||||
.Be("https://redacted.ch/torrents.php?action=download&id=1541452&authkey=lidarr&torrent_pass=redacted&usetoken=0");
|
|
||||||
releaseInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=106951&torrentid=1541452");
|
releaseInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=106951&torrentid=1541452");
|
||||||
releaseInfo.CommentUrl.Should().Be(null);
|
releaseInfo.CommentUrl.Should().Be(null);
|
||||||
releaseInfo.Indexer.Should().Be(Subject.Definition.Name);
|
releaseInfo.Indexer.Should().Be(Subject.Definition.Name);
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
using System.Collections.Generic;
|
|
||||||
using FluentValidation.Results;
|
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
|
@ -26,7 +24,7 @@ namespace NzbDrone.Core.Indexers.Redacted
|
||||||
|
|
||||||
public override IIndexerRequestGenerator GetRequestGenerator()
|
public override IIndexerRequestGenerator GetRequestGenerator()
|
||||||
{
|
{
|
||||||
return new RedactedRequestGenerator(Settings, _httpClient, _logger);
|
return new RedactedRequestGenerator(Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IParseIndexerResponse GetParser()
|
public override IParseIndexerResponse GetParser()
|
||||||
|
@ -34,11 +32,12 @@ namespace NzbDrone.Core.Indexers.Redacted
|
||||||
return new RedactedParser(Settings);
|
return new RedactedParser(Settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Test(List<ValidationFailure> failures)
|
public override HttpRequest GetDownloadRequest(string link)
|
||||||
{
|
{
|
||||||
((RedactedRequestGenerator)GetRequestGenerator()).Authenticate();
|
var request = new HttpRequest(link);
|
||||||
|
request.Headers.Set("Authorization", Settings.ApiKey);
|
||||||
|
|
||||||
base.Test(failures);
|
return request;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@ namespace NzbDrone.Core.Indexers.Redacted
|
||||||
Container = torrent.Encoding,
|
Container = torrent.Encoding,
|
||||||
Codec = torrent.Format,
|
Codec = torrent.Format,
|
||||||
Size = long.Parse(torrent.Size),
|
Size = long.Parse(torrent.Size),
|
||||||
DownloadUrl = GetDownloadUrl(id),
|
DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken),
|
||||||
InfoUrl = GetInfoUrl(result.GroupId, id),
|
InfoUrl = GetInfoUrl(result.GroupId, id),
|
||||||
Seeders = int.Parse(torrent.Seeders),
|
Seeders = int.Parse(torrent.Seeders),
|
||||||
Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders),
|
Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders),
|
||||||
|
@ -85,17 +85,13 @@ namespace NzbDrone.Core.Indexers.Redacted
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetDownloadUrl(int torrentId)
|
private string GetDownloadUrl(int torrentId, bool canUseToken)
|
||||||
{
|
{
|
||||||
// AuthKey is required but not checked, just pass in a dummy variable
|
|
||||||
// to avoid having to track authkey, which is randomly cycled
|
|
||||||
var url = new HttpUri(_settings.BaseUrl)
|
var url = new HttpUri(_settings.BaseUrl)
|
||||||
.CombinePath("/torrents.php")
|
.CombinePath("/ajax.php")
|
||||||
.AddQueryParam("action", "download")
|
.AddQueryParam("action", "download")
|
||||||
.AddQueryParam("id", torrentId)
|
.AddQueryParam("id", torrentId)
|
||||||
.AddQueryParam("authkey", "lidarr")
|
.AddQueryParam("usetoken", _settings.UseFreeleechToken && canUseToken ? 1 : 0);
|
||||||
.AddQueryParam("torrent_pass", _settings.PassKey)
|
|
||||||
.AddQueryParam("usetoken", _settings.UseFreeleechToken ? 1 : 0);
|
|
||||||
|
|
||||||
return url.FullUri;
|
return url.FullUri;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,5 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using NLog;
|
|
||||||
using NzbDrone.Common.Extensions;
|
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Common.Serializer;
|
|
||||||
using NzbDrone.Core.Indexers.Gazelle;
|
|
||||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Indexers.Redacted
|
namespace NzbDrone.Core.Indexers.Redacted
|
||||||
|
@ -12,14 +7,10 @@ namespace NzbDrone.Core.Indexers.Redacted
|
||||||
public class RedactedRequestGenerator : IIndexerRequestGenerator
|
public class RedactedRequestGenerator : IIndexerRequestGenerator
|
||||||
{
|
{
|
||||||
private readonly RedactedSettings _settings;
|
private readonly RedactedSettings _settings;
|
||||||
private readonly IHttpClient _httpClient;
|
|
||||||
private readonly Logger _logger;
|
|
||||||
|
|
||||||
public RedactedRequestGenerator(RedactedSettings settings, IHttpClient httpClient, Logger logger)
|
public RedactedRequestGenerator(RedactedSettings settings)
|
||||||
{
|
{
|
||||||
_settings = settings;
|
_settings = settings;
|
||||||
_httpClient = httpClient;
|
|
||||||
_logger = logger;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual IndexerPageableRequestChain GetRecentRequests()
|
public virtual IndexerPageableRequestChain GetRecentRequests()
|
||||||
|
@ -54,24 +45,6 @@ namespace NzbDrone.Core.Indexers.Redacted
|
||||||
return pageableRequests;
|
return pageableRequests;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Authenticate()
|
|
||||||
{
|
|
||||||
var index = GetIndex();
|
|
||||||
|
|
||||||
if (index == null ||
|
|
||||||
index.Status.IsNullOrWhiteSpace() ||
|
|
||||||
index.Status != "success" ||
|
|
||||||
index.Response.Passkey.IsNullOrWhiteSpace())
|
|
||||||
{
|
|
||||||
_logger.Debug("Redacted authentication failed.");
|
|
||||||
throw new Exception("Failed to authenticate with Redacted.");
|
|
||||||
}
|
|
||||||
|
|
||||||
_logger.Debug("Redacted authentication succeeded.");
|
|
||||||
|
|
||||||
_settings.PassKey = index.Response.Passkey;
|
|
||||||
}
|
|
||||||
|
|
||||||
private IEnumerable<IndexerRequest> GetRequest(string searchParameters)
|
private IEnumerable<IndexerRequest> GetRequest(string searchParameters)
|
||||||
{
|
{
|
||||||
var req = RequestBuilder()
|
var req = RequestBuilder()
|
||||||
|
@ -81,17 +54,6 @@ namespace NzbDrone.Core.Indexers.Redacted
|
||||||
yield return new IndexerRequest(req);
|
yield return new IndexerRequest(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
private GazelleAuthResponse GetIndex()
|
|
||||||
{
|
|
||||||
var request = RequestBuilder().Resource("ajax.php?action=index").Build();
|
|
||||||
|
|
||||||
var indexResponse = _httpClient.Execute(request);
|
|
||||||
|
|
||||||
var result = Json.Deserialize<GazelleAuthResponse>(indexResponse.Content);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private HttpRequestBuilder RequestBuilder()
|
private HttpRequestBuilder RequestBuilder()
|
||||||
{
|
{
|
||||||
return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}")
|
return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}")
|
||||||
|
|
|
@ -27,19 +27,16 @@ namespace NzbDrone.Core.Indexers.Redacted
|
||||||
[FieldDefinition(1, Label = "ApiKey", HelpText = "Generate this in 'Access Settings' in your Redacted profile", Privacy = PrivacyLevel.ApiKey)]
|
[FieldDefinition(1, Label = "ApiKey", HelpText = "Generate this in 'Access Settings' in your Redacted profile", Privacy = PrivacyLevel.ApiKey)]
|
||||||
public string ApiKey { get; set; }
|
public string ApiKey { get; set; }
|
||||||
|
|
||||||
[FieldDefinition(1, Hidden = HiddenType.Hidden)]
|
[FieldDefinition(2, Type = FieldType.Textbox, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
|
||||||
public string PassKey { get; set; }
|
|
||||||
|
|
||||||
[FieldDefinition(3, Type = FieldType.Textbox, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
|
|
||||||
public int MinimumSeeders { get; set; }
|
public int MinimumSeeders { get; set; }
|
||||||
|
|
||||||
[FieldDefinition(4)]
|
[FieldDefinition(3)]
|
||||||
public SeedCriteriaSettings SeedCriteria { get; set; } = new ();
|
public SeedCriteriaSettings SeedCriteria { get; set; } = new ();
|
||||||
|
|
||||||
[FieldDefinition(5, Type = FieldType.Number, Label = "Early Download Limit", Unit = "days", HelpText = "Time before release date Lidarr will download from this indexer, empty is no limit", Advanced = true)]
|
[FieldDefinition(4, Type = FieldType.Number, Label = "Early Download Limit", Unit = "days", HelpText = "Time before release date Lidarr will download from this indexer, empty is no limit", Advanced = true)]
|
||||||
public int? EarlyReleaseLimit { get; set; }
|
public int? EarlyReleaseLimit { get; set; }
|
||||||
|
|
||||||
[FieldDefinition(6, Type = FieldType.Checkbox, Label = "Use Freeleech Token", HelpText = "Will cause grabbing to fail if you do not have any tokens available", Advanced = true)]
|
[FieldDefinition(5, Type = FieldType.Checkbox, Label = "Use Freeleech Token", HelpText = "Will cause grabbing to fail if you do not have any tokens available", Advanced = true)]
|
||||||
public bool UseFreeleechToken { get; set; }
|
public bool UseFreeleechToken { get; set; }
|
||||||
|
|
||||||
public NzbDroneValidationResult Validate()
|
public NzbDroneValidationResult Validate()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue