Fixed: (MyAnonamouse) Avoid using FL wedges for freeleech torrents

pull/2209/head
Bogdan 5 months ago
parent 44c446943c
commit 58ae9c0a13

@ -1,4 +1,5 @@
using System; using System;
using System.Web;
namespace NzbDrone.Common.Extensions namespace NzbDrone.Common.Extensions
{ {
@ -18,5 +19,24 @@ namespace NzbDrone.Common.Extensions
return Uri.TryCreate(path, UriKind.Absolute, out var uri) && uri.IsWellFormedOriginalString(); return Uri.TryCreate(path, UriKind.Absolute, out var uri) && uri.IsWellFormedOriginalString();
} }
public static Uri RemoveQueryParam(this Uri url, string name)
{
var uriBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query.Remove(name);
uriBuilder.Query = query.ToString() ?? string.Empty;
return uriBuilder.Uri;
}
public static string GetQueryParam(this Uri url, string name)
{
var uriBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
return query[name];
}
} }
} }

@ -56,11 +56,13 @@ namespace NzbDrone.Core.Indexers.Definitions
public override async Task<IndexerDownloadResponse> Download(Uri link) public override async Task<IndexerDownloadResponse> Download(Uri link)
{ {
if (Settings.Freeleech) var downloadLink = link.RemoveQueryParam("canUseToken");
if (Settings.Freeleech && bool.TryParse(link.GetQueryParam("canUseToken"), out var canUseToken) && canUseToken)
{ {
_logger.Debug($"Attempting to use freeleech token for {link.AbsoluteUri}"); _logger.Debug("Attempting to use freeleech token for {0}", downloadLink.AbsoluteUri);
var idMatch = TorrentIdRegex.Match(link.AbsoluteUri); var idMatch = TorrentIdRegex.Match(downloadLink.AbsoluteUri);
if (idMatch.Success) if (idMatch.Success)
{ {
var id = int.Parse(idMatch.Groups["id"].Value); var id = int.Parse(idMatch.Groups["id"].Value);
@ -79,20 +81,20 @@ namespace NzbDrone.Core.Indexers.Definitions
if (resource.Success) if (resource.Success)
{ {
_logger.Debug($"Successfully to used freeleech token for torrentid ${id}"); _logger.Debug("Successfully to used freeleech token for torrentid {0}", id);
} }
else else
{ {
_logger.Debug($"Failed to use freeleech token: ${resource.Error}"); _logger.Debug("Failed to use freeleech token: {0}", resource.Error);
} }
} }
else else
{ {
_logger.Debug($"Could not get torrent id from link ${link.AbsoluteUri}, skipping freeleech"); _logger.Debug("Could not get torrent id from link {0}, skipping freeleech", downloadLink.AbsoluteUri);
} }
} }
return await base.Download(link).ConfigureAwait(false); return await base.Download(downloadLink).ConfigureAwait(false);
} }
protected override IDictionary<string, string> GetCookies() protected override IDictionary<string, string> GetCookies()
@ -485,8 +487,10 @@ namespace NzbDrone.Core.Indexers.Definitions
release.Title += " [VIP]"; release.Title += " [VIP]";
} }
release.DownloadUrl = _settings.BaseUrl + "tor/download.php?tid=" + id; var isFreeLeech = item.Free || item.PersonalFreeLeech || (hasUserVip && item.FreeVip);
release.InfoUrl = _settings.BaseUrl + "t/" + id;
release.DownloadUrl = GetDownloadUrl(id, !isFreeLeech);
release.InfoUrl = $"{_settings.BaseUrl}t/{id}";
release.Guid = release.InfoUrl; release.Guid = release.InfoUrl;
release.Categories = _categories.MapTrackerCatToNewznab(item.Category); release.Categories = _categories.MapTrackerCatToNewznab(item.Category);
release.PublishDate = DateTime.ParseExact(item.Added, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime(); release.PublishDate = DateTime.ParseExact(item.Added, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime();
@ -495,7 +499,7 @@ namespace NzbDrone.Core.Indexers.Definitions
release.Seeders = item.Seeders; release.Seeders = item.Seeders;
release.Peers = item.Leechers + release.Seeders; release.Peers = item.Leechers + release.Seeders;
release.Size = ParseUtil.GetBytes(item.Size); release.Size = ParseUtil.GetBytes(item.Size);
release.DownloadVolumeFactor = item.Free ? 0 : hasUserVip && item.FreeVip ? 0 : 1; release.DownloadVolumeFactor = isFreeLeech ? 0 : 1;
release.UploadVolumeFactor = 1; release.UploadVolumeFactor = 1;
release.MinimumRatio = 1; release.MinimumRatio = 1;
release.MinimumSeedTime = 259200; // 72 hours release.MinimumSeedTime = 259200; // 72 hours
@ -509,6 +513,20 @@ namespace NzbDrone.Core.Indexers.Definitions
return releaseInfos.ToArray(); return releaseInfos.ToArray();
} }
private string GetDownloadUrl(int torrentId, bool canUseToken)
{
var url = new HttpUri(_settings.BaseUrl)
.CombinePath("/tor/download.php")
.AddQueryParam("tid", torrentId);
if (_settings.Freeleech && canUseToken)
{
url = url.AddQueryParam("canUseToken", "true");
}
return url.FullUri;
}
private bool HasUserVip(Dictionary<string, string> cookies) private bool HasUserVip(Dictionary<string, string> cookies)
{ {
var cacheKey = "myanonamouse_user_class_" + _settings.ToJson().SHA256Hash(); var cacheKey = "myanonamouse_user_class_" + _settings.ToJson().SHA256Hash();
@ -587,14 +605,19 @@ namespace NzbDrone.Core.Indexers.Definitions
{ {
[FieldOption(Label="All torrents", Hint = "Search everything")] [FieldOption(Label="All torrents", Hint = "Search everything")]
All = 0, All = 0,
[FieldOption(Label="Only active", Hint = "Last update had 1+ seeders")] [FieldOption(Label="Only active", Hint = "Last update had 1+ seeders")]
Active = 1, Active = 1,
[FieldOption(Label="Freeleech", Hint = "Freeleech torrents")] [FieldOption(Label="Freeleech", Hint = "Freeleech torrents")]
Freeleech = 2, Freeleech = 2,
[FieldOption(Label="Freeleech or VIP", Hint = "Freeleech or VIP torrents")] [FieldOption(Label="Freeleech or VIP", Hint = "Freeleech or VIP torrents")]
FreeleechOrVip = 3, FreeleechOrVip = 3,
[FieldOption(Label="VIP", Hint = "VIP torrents")] [FieldOption(Label="VIP", Hint = "VIP torrents")]
Vip = 4, Vip = 4,
[FieldOption(Label="Not VIP", Hint = "Torrents not VIP")] [FieldOption(Label="Not VIP", Hint = "Torrents not VIP")]
NotVip = 5, NotVip = 5,
} }
@ -611,6 +634,8 @@ namespace NzbDrone.Core.Indexers.Definitions
public string Filetype { get; set; } public string Filetype { get; set; }
public bool Vip { get; set; } public bool Vip { get; set; }
public bool Free { get; set; } public bool Free { get; set; }
[JsonProperty(PropertyName = "personal_freeleech")]
public bool PersonalFreeLeech { get; set; }
[JsonProperty(PropertyName = "fl_vip")] [JsonProperty(PropertyName = "fl_vip")]
public bool FreeVip { get; set; } public bool FreeVip { get; set; }
public string Category { get; set; } public string Category { get; set; }

Loading…
Cancel
Save