diff --git a/src/Jackett.Common/Indexers/EraiRaws.cs b/src/Jackett.Common/Indexers/EraiRaws.cs index 07e71e9d3..03124e3d2 100644 --- a/src/Jackett.Common/Indexers/EraiRaws.cs +++ b/src/Jackett.Common/Indexers/EraiRaws.cs @@ -143,7 +143,7 @@ namespace Jackett.Common.Indexers { foreach (var fi in feedItems) { - EraiRawsReleaseInfo releaseInfo = new EraiRawsReleaseInfo(fi); + var releaseInfo = new EraiRawsReleaseInfo(fi); // Validate the release if (releaseInfo.PublishDate == null) @@ -152,9 +152,9 @@ namespace Jackett.Common.Indexers continue; } - if (releaseInfo.MagnetLink == null) + if (releaseInfo.MagnetLink == null && string.IsNullOrWhiteSpace(releaseInfo.InfoHash)) { - logger.Warn($"Failed to parse {DisplayName} RSS feed item '{fi.Title}' due to malformed link URI."); + logger.Warn($"Failed to parse {DisplayName} RSS feed item '{fi.Title}' due to malformed link URI and no infohash available."); continue; } @@ -183,11 +183,25 @@ namespace Jackett.Common.Indexers { foreach (var fi in feedItems) { + var guid = fi.MagnetLink; + if (guid == null) + { + // Magnet link is not available so generate something unique + var builder = new UriBuilder(fi.DetailsLink); + if (!string.IsNullOrWhiteSpace(builder.Query)) + { + builder.Query += "&"; + } + builder.Query += $"infoHash={fi.InfoHash}"; + guid = builder.Uri; + } + yield return new ReleaseInfo { Title = string.Concat(fi.Title, " - ", fi.Quality), - Guid = fi.MagnetLink, + Guid = guid, MagnetUri = fi.MagnetLink, + InfoHash = fi.InfoHash, Details = fi.DetailsLink, PublishDate = fi.PublishDate.Value.ToLocalTime().DateTime, Category = MapTrackerCatToNewznab("1"), @@ -224,6 +238,7 @@ namespace Jackett.Common.Indexers var title = rssItem.SelectSingleNode("title")?.InnerText; var link = rssItem.SelectSingleNode("link")?.InnerText; var publishDate = rssItem.SelectSingleNode("pubDate")?.InnerText; + var infoHash = rssItem.SelectSingleNode("erai:infohash", nsm)?.InnerText; var size = rssItem.SelectSingleNode("erai:size", nsm)?.InnerText; var description = rssItem.SelectSingleNode("description")?.InnerText; var quality = rssItem.SelectSingleNode("erai:resolution", nsm)?.InnerText; @@ -232,6 +247,7 @@ namespace Jackett.Common.Indexers { Title = title, Link = link, + InfoHash = infoHash, PublishDate = publishDate, Size = size, Description = description, @@ -249,6 +265,8 @@ namespace Jackett.Common.Indexers public string Link { get; private set; } + public string InfoHash { get; private set; } + public string PublishDate { get; private set; } public string Size { get; private set; } @@ -262,8 +280,10 @@ namespace Jackett.Common.Indexers /// private bool IsValid() { - return !(string.IsNullOrWhiteSpace(Title) || - string.IsNullOrWhiteSpace(Link) || + var missingBothHashAndLink = string.IsNullOrWhiteSpace(Link) && string.IsNullOrWhiteSpace(InfoHash); + + return !(missingBothHashAndLink || + string.IsNullOrWhiteSpace(Title) || string.IsNullOrWhiteSpace(PublishDate) || string.IsNullOrWhiteSpace(Size) || string.IsNullOrWhiteSpace(Quality)); @@ -281,6 +301,7 @@ namespace Jackett.Common.Indexers Quality = feedItem.Quality; Size = ReleaseInfo.GetBytes(feedItem.Size); DetailsLink = ParseDetailsLink(feedItem.Description); + InfoHash = feedItem.InfoHash; if (Uri.TryCreate(feedItem.Link, UriKind.Absolute, out Uri magnetUri)) { @@ -321,6 +342,8 @@ namespace Jackett.Common.Indexers public Uri MagnetLink { get; } + public string InfoHash { get; } + public Uri DetailsLink { get; set; } public DateTimeOffset? PublishDate { get; } @@ -342,8 +365,6 @@ namespace Jackett.Common.Indexers { " - (?[0-9]+) ", " - " } // " - <episode> ..." }; - private const string TITLE_URL_SLUG_REGEX = @"^(?<url_slug>.+) -"; - public string Parse(string title) { var results = SearchTitleForDetails(title, new Dictionary<string, Dictionary<string, string>> {