avistaz: fix category parsing. resolves #7593 (#8050)

This commit is contained in:
Diego Heras
2020-04-09 19:12:43 +02:00
committed by GitHub
parent 4686f8ee5f
commit 208ca3b065
2 changed files with 66 additions and 23 deletions

View File

@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@@ -23,15 +22,13 @@ namespace Jackett.Common.Indexers.Abstract
private string LoginUrl => SiteLink + "auth/login"; private string LoginUrl => SiteLink + "auth/login";
private string SearchUrl => SiteLink + "torrents?"; private string SearchUrl => SiteLink + "torrents?";
private string IMDBSearch => SiteLink + "ajax/movies/3?term="; private string IMDBSearch => SiteLink + "ajax/movies/3?term=";
private readonly Regex _catRegex = new Regex(@"\s+fa\-([a-z]+)\s+", RegexOptions.IgnoreCase);
private readonly HashSet<string> _hdResolutions = new HashSet<string> { "1080p", "1080i", "720p" };
private new ConfigurationDataBasicLogin configData private new ConfigurationDataBasicLogin configData => (ConfigurationDataBasicLogin)base.configData;
{
get => (ConfigurationDataBasicLogin)base.configData;
set => base.configData = value;
}
// hook to adjust the search term // hook to adjust the search term
protected string GetSearchTerm(TorznabQuery query) => $"{query.SearchTerm} {query.GetEpisodeSearchString()}"; protected virtual string GetSearchTerm(TorznabQuery query) => $"{query.SearchTerm} {query.GetEpisodeSearchString()}";
protected AvistazTracker(string name, string link, string description, IIndexerConfigurationService configService, protected AvistazTracker(string name, string link, string description, IIndexerConfigurationService configService,
WebClient client, Logger logger, IProtectionService p, TorznabCapabilities caps) WebClient client, Logger logger, IProtectionService p, TorznabCapabilities caps)
@@ -49,10 +46,13 @@ namespace Jackett.Common.Indexers.Abstract
Language = "en-us"; Language = "en-us";
AddCategoryMapping(1, TorznabCatType.Movies); AddCategoryMapping(1, TorznabCatType.Movies);
AddCategoryMapping(1, TorznabCatType.MoviesForeign); AddCategoryMapping(1, TorznabCatType.MoviesUHD);
AddCategoryMapping(1, TorznabCatType.MoviesHD); AddCategoryMapping(1, TorznabCatType.MoviesHD);
AddCategoryMapping(1, TorznabCatType.MoviesSD); AddCategoryMapping(1, TorznabCatType.MoviesSD);
AddCategoryMapping(2, TorznabCatType.TV); AddCategoryMapping(2, TorznabCatType.TV);
AddCategoryMapping(2, TorznabCatType.TVUHD);
AddCategoryMapping(2, TorznabCatType.TVHD);
AddCategoryMapping(2, TorznabCatType.TVSD);
AddCategoryMapping(3, TorznabCatType.Audio); AddCategoryMapping(3, TorznabCatType.Audio);
} }
@@ -86,14 +86,30 @@ namespace Jackett.Common.Indexers.Abstract
var releases = new List<ReleaseInfo>(); var releases = new List<ReleaseInfo>();
var categoryMapping = MapTorznabCapsToTrackers(query).Distinct().ToList(); var categoryMapping = MapTorznabCapsToTrackers(query).Distinct().ToList();
var qc = new NameValueCollection var qc = new List<KeyValuePair<string, string>> // NameValueCollection don't support cat[]=19&cat[]=6
{ {
{"in", "1"}, {"in", "1"},
{"type", categoryMapping.Any() ? categoryMapping.First() : "0"} // type=0 => all categories {"type", categoryMapping.Any() ? categoryMapping.First() : "0"} // type=0 => all categories
}; };
// resolution filter to improve the search
if (!query.Categories.Contains(TorznabCatType.Movies.ID) && !query.Categories.Contains(TorznabCatType.TV.ID) &&
!query.Categories.Contains(TorznabCatType.Audio.ID))
{
if (query.Categories.Contains(TorznabCatType.MoviesUHD.ID) || query.Categories.Contains(TorznabCatType.TVUHD.ID))
qc.Add("video_quality[]", "6"); // 2160p
if (query.Categories.Contains(TorznabCatType.MoviesHD.ID) || query.Categories.Contains(TorznabCatType.TVHD.ID))
{
qc.Add("video_quality[]", "2"); // 720p
qc.Add("video_quality[]", "7"); // 1080i
qc.Add("video_quality[]", "3"); // 1080p
}
if (query.Categories.Contains(TorznabCatType.MoviesSD.ID) || query.Categories.Contains(TorznabCatType.TVSD.ID))
qc.Add("video_quality[]", "1"); // SD
}
// imdb search // imdb search
if (!string.IsNullOrWhiteSpace(query.ImdbID)) if (query.IsImdbQuery)
{ {
var movieId = await GetMovieId(query.ImdbID); var movieId = await GetMovieId(query.ImdbID);
if (movieId == null) if (movieId == null)
@@ -101,7 +117,7 @@ namespace Jackett.Common.Indexers.Abstract
qc.Add("movie_id", movieId); qc.Add("movie_id", movieId);
} }
else else
qc.Add("search", GetSearchTerm(query)); qc.Add("search", GetSearchTerm(query).Trim());
var episodeSearchUrl = SearchUrl + qc.GetQueryString(); var episodeSearchUrl = SearchUrl + qc.GetQueryString();
var response = await RequestStringWithCookiesAndRetry(episodeSearchUrl); var response = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
@@ -146,14 +162,38 @@ namespace Jackett.Common.Indexers.Abstract
release.Seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(7)").Text().Trim()); release.Seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(7)").Text().Trim());
release.Peers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(8)").Text().Trim()) + release.Seeders; release.Peers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(8)").Text().Trim()) + release.Seeders;
var cat = row.QuerySelectorAll("td:nth-of-type(1) i").First().GetAttribute("class") var resolution = row.QuerySelector("span.badge-extra")?.TextContent.Trim();
.Replace("torrent-icon", string.Empty) var catMatch = _catRegex.Match(row.QuerySelectorAll("td:nth-of-type(1) i").First().GetAttribute("class"));
.Replace("fa fa-", string.Empty) var cats = new List<int>();
.Replace("film", "1") switch(catMatch.Groups[1].Value)
.Replace("tv", "2") {
.Replace("music", "3") case "film":
.Replace("text-pink", string.Empty); if (query.Categories.Contains(TorznabCatType.Movies.ID))
release.Category = MapTrackerCatToNewznab(cat.Trim()); cats.Add(TorznabCatType.Movies.ID);
cats.Add(resolution switch
{
var res when _hdResolutions.Contains(res) => TorznabCatType.MoviesHD.ID,
"2160p" => TorznabCatType.MoviesUHD.ID,
_ => TorznabCatType.MoviesSD.ID
});
break;
case "tv":
if (query.Categories.Contains(TorznabCatType.TV.ID))
cats.Add(TorznabCatType.TV.ID);
cats.Add(resolution switch
{
var res when _hdResolutions.Contains(res) => TorznabCatType.TVHD.ID,
"2160p" => TorznabCatType.TVUHD.ID,
_ => TorznabCatType.TVSD.ID
});
break;
case "music":
cats.Add(TorznabCatType.Audio.ID);
break;
default:
throw new Exception("Error parsing category!");
}
release.Category = cats;
var grabs = row.QuerySelector("td:nth-child(9)").Text(); var grabs = row.QuerySelector("td:nth-child(9)").Text();
release.Grabs = ParseUtil.CoerceInt(grabs); release.Grabs = ParseUtil.CoerceInt(grabs);
@@ -165,10 +205,7 @@ namespace Jackett.Common.Indexers.Abstract
else else
release.DownloadVolumeFactor = 1; release.DownloadVolumeFactor = 1;
if (row.QuerySelectorAll("i.fa-diamond").Any()) release.UploadVolumeFactor = row.QuerySelectorAll("i.fa-diamond").Any() ? 2 : 1;
release.UploadVolumeFactor = 2;
else
release.UploadVolumeFactor = 1;
releases.Add(release); releases.Add(release);
} }

View File

@@ -21,5 +21,11 @@ namespace Jackett.Common.Indexers
logger: l, logger: l,
p: ps) p: ps)
=> Type = "private"; => Type = "private";
// Avistaz has episodes without season. eg Running Man E323
protected override string GetSearchTerm(TorznabQuery query) =>
!string.IsNullOrWhiteSpace(query.Episode) && query.Season == 0 ?
$"{query.SearchTerm} E{query.Episode}" :
$"{query.SearchTerm} {query.GetEpisodeSearchString()}";
} }
} }