From 6d62744667c9242807e30666e4ba729355f08b6c Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 4 Dec 2021 12:26:55 -0600 Subject: [PATCH] Fixed: (Cardigann) Magnet generation for public indexers with InfoHash Fixes #668 --- src/NzbDrone.Core/Indexers/IndexerBase.cs | 21 ++++++++++++++++--- .../Indexers/MagnetLinkBuilder.cs | 16 ++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/IndexerBase.cs b/src/NzbDrone.Core/Indexers/IndexerBase.cs index 75717c1b5..cd123f4ad 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBase.cs @@ -132,10 +132,25 @@ protected virtual IList CleanupReleases(IEnumerable re c.DownloadProtocol = Protocol; c.IndexerPriority = ((IndexerDefinition)Definition).Priority; - //Add common flags - if (Protocol == DownloadProtocol.Torrent && ((TorrentInfo)c).DownloadVolumeFactor == 0) + if (Protocol == DownloadProtocol.Torrent) { - c.IndexerFlags.Add(IndexerFlag.FreeLeech); + // generate magnet link from info hash (not allowed for private sites) + if (((TorrentInfo)c).MagnetUrl == null && !string.IsNullOrWhiteSpace(((TorrentInfo)c).InfoHash) && ((IndexerDefinition)Definition).Privacy != IndexerPrivacy.Private) + { + ((TorrentInfo)c).MagnetUrl = MagnetLinkBuilder.BuildPublicMagnetLink(((TorrentInfo)c).InfoHash, c.Title); + } + + // generate info hash from magnet link + if (((TorrentInfo)c).MagnetUrl != null && string.IsNullOrWhiteSpace(((TorrentInfo)c).InfoHash)) + { + ((TorrentInfo)c).InfoHash = MagnetLinkBuilder.GetInfoHashFromMagnet(((TorrentInfo)c).MagnetUrl); + } + + //Add common flags + if (((TorrentInfo)c).DownloadVolumeFactor == 0) + { + ((TorrentInfo)c).IndexerFlags.Add(IndexerFlag.FreeLeech); + } } }); diff --git a/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs b/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs index 5732c3dcf..a41d64b98 100644 --- a/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs +++ b/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs @@ -1,5 +1,8 @@ +using System; using System.Collections.Generic; +using System.Linq; using MonoTorrent; +using NzbDrone.Core.Parser; namespace NzbDrone.Core.Indexers { @@ -33,5 +36,18 @@ public static string BuildPublicMagnetLink(string infoHash, string releaseTitle) { return new MagnetLink(InfoHash.FromHex(infoHash), releaseTitle, _trackers).ToV1String(); } + + public static string GetInfoHashFromMagnet(string magnet) + { + try + { + var xt = ParseUtil.GetArgumentFromQueryString(magnet.ToString(), "xt"); + return xt.Split(':').Last(); // remove prefix urn:btih: + } + catch (Exception) + { + return null; + } + } } }