core: remove enumerable related extensions (#7842)

This commit is contained in:
Cory
2020-03-26 22:13:38 -05:00
committed by GitHub
parent 5806ec4b94
commit 06315470c4
7 changed files with 26 additions and 61 deletions

View File

@@ -265,7 +265,7 @@ namespace Jackett.Common.Indexers
return results; return results;
var filteredResults = results.Where( var filteredResults = results.Where(
result => result.Category.IsEmptyOrNull() || query.Categories.Intersect(result.Category).Any() || result => result.Category?.Any() != true || query.Categories.Intersect(result.Category).Any() ||
TorznabCatType.QueryContainsParentCategory(query.Categories, result.Category)); TorznabCatType.QueryContainsParentCategory(query.Categories, result.Category));
return filteredResults; return filteredResults;

View File

@@ -85,7 +85,7 @@ namespace Jackett.Common.Indexers.Meta
logger.Error(aggregateTask.Exception, "Error during request in metaindexer " + ID); logger.Error(aggregateTask.Exception, "Error during request in metaindexer " + ID);
} }
var unorderedResult = aggregateTask.Result.Select(r => r.Releases).Flatten(); var unorderedResult = aggregateTask.Result.SelectMany(r => r.Releases);
var resultFilters = resultFilterProvider.FiltersForQuery(query); var resultFilters = resultFilterProvider.FiltersForQuery(query);
var filteredResults = resultFilters.Select(async f => await f.FilterResults(unorderedResult)).SelectMany(t => t.Result); var filteredResults = resultFilters.Select(async f => await f.FilterResults(unorderedResult)).SelectMany(t => t.Result);
var uniqueFilteredResults = filteredResults.Distinct(); var uniqueFilteredResults = filteredResults.Distinct();

View File

@@ -24,7 +24,7 @@ namespace Jackett.Common.Indexers.Meta
public class NoFallbackStrategyProvider : IFallbackStrategyProvider public class NoFallbackStrategyProvider : IFallbackStrategyProvider
{ {
public IEnumerable<IFallbackStrategy> FallbackStrategiesForQuery(TorznabQuery query) => (new NoFallbackStrategy()).ToEnumerable(); public IEnumerable<IFallbackStrategy> FallbackStrategiesForQuery(TorznabQuery query) { yield return new NoFallbackStrategy(); }
} }
public class ImdbFallbackStrategy : IFallbackStrategy public class ImdbFallbackStrategy : IFallbackStrategy
@@ -32,18 +32,16 @@ namespace Jackett.Common.Indexers.Meta
public ImdbFallbackStrategy(IImdbResolver resolver, TorznabQuery query) public ImdbFallbackStrategy(IImdbResolver resolver, TorznabQuery query)
{ {
this.resolver = resolver; this.resolver = resolver;
titles = null;
this.query = query; this.query = query;
} }
public async Task<IEnumerable<TorznabQuery>> FallbackQueries() public async Task<IEnumerable<TorznabQuery>> FallbackQueries()
{ {
titles ??= (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title?.ToEnumerable() ?? Enumerable.Empty<string>(); var title = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title;
return titles.Select(query.CreateFallback); return title != null ? new[] {query.CreateFallback(title)} : Enumerable.Empty<TorznabQuery>();
} }
private readonly IImdbResolver resolver; private readonly IImdbResolver resolver;
private IEnumerable<string> titles;
private readonly TorznabQuery query; private readonly TorznabQuery query;
} }

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -55,20 +56,16 @@ namespace Jackett.Common.Indexers.Meta
var remainingResults = results.Except(wrongResults).Except(perfectResults); var remainingResults = results.Except(wrongResults).Except(perfectResults);
var titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title?.ToEnumerable() ?? Enumerable.Empty<string>(); var title = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title;
var strippedTitles = titles.Select(t => RemoveSpecialChars(t)); if (title == null)
var normalizedTitles = strippedTitles.SelectMany(t => GenerateTitleVariants(t)); return perfectResults;
var titleFilteredResults = remainingResults.Where(r => var normalizedTitles = GenerateTitleVariants(RemoveSpecialChars(title));
{
// TODO Make it possible to configure case insensitivity
var containsAnyTitle = normalizedTitles.Select(t => r.Title.ToLowerInvariant().Contains(t.ToLowerInvariant()));
var isProbablyValidResult = containsAnyTitle.Any(b => b);
return isProbablyValidResult;
});
var filteredResults = perfectResults.Concat(titleFilteredResults).Distinct(); // TODO Make it possible to configure case insensitivity
return filteredResults; var titleFilteredResults = remainingResults.Where(
r => normalizedTitles.Any(t => r.Title.IndexOf(t, StringComparison.InvariantCultureIgnoreCase) >= 0));
return perfectResults.Union(titleFilteredResults);
} }
// TODO improve character replacement with invalid chars // TODO improve character replacement with invalid chars
@@ -97,7 +94,7 @@ namespace Jackett.Common.Indexers.Meta
public class NoResultFilterProvider : IResultFilterProvider public class NoResultFilterProvider : IResultFilterProvider
{ {
public IEnumerable<IResultFilter> FiltersForQuery(TorznabQuery query) => (new NoFilter()).ToEnumerable(); public IEnumerable<IResultFilter> FiltersForQuery(TorznabQuery query) { yield return new NoFilter(); }
} }
public class ImdbTitleResultFilterProvider : IResultFilterProvider public class ImdbTitleResultFilterProvider : IResultFilterProvider
@@ -106,12 +103,7 @@ namespace Jackett.Common.Indexers.Meta
public IEnumerable<IResultFilter> FiltersForQuery(TorznabQuery query) public IEnumerable<IResultFilter> FiltersForQuery(TorznabQuery query)
{ {
IResultFilter filter = null; yield return !query.IsImdbQuery ? (IResultFilter)new NoFilter() : new ImdbTitleResultFilter(resolver, query);
if (!query.IsImdbQuery)
filter = new NoFilter();
else
filter = new ImdbTitleResultFilter(resolver, query);
return filter.ToEnumerable();
} }
private readonly IImdbResolver resolver; private readonly IImdbResolver resolver;

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@@ -255,12 +256,9 @@ namespace Jackett.Common.Indexers
//TODO convert to initializer //TODO convert to initializer
var releases = new List<ReleaseInfo>(); var releases = new List<ReleaseInfo>();
/* If series from sites are indexed than we dont need to reindex them. */ // If series from sites are indexed then we don't need to reindex them.
if (series == null || series.IsEmpty()) if (series?.Any() != true)
{
await GetSeriesInfo(); await GetSeriesInfo();
}
var unixTimestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; var unixTimestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
WebClientStringResult results; WebClientStringResult results;

View File

@@ -56,7 +56,7 @@ namespace Jackett.Common.Models
var term = SearchTerm; var term = SearchTerm;
if (SearchTerm == null) if (SearchTerm == null)
term = ""; term = "";
var safetitle = term.Where(c => (char.IsLetterOrDigit(c) var safeTitle = term.Where(c => (char.IsLetterOrDigit(c)
|| char.IsWhiteSpace(c) || char.IsWhiteSpace(c)
|| c == '-' || c == '-'
|| c == '.' || c == '.'
@@ -70,8 +70,8 @@ namespace Jackett.Common.Models
|| c == ']' || c == ']'
|| c == '+' || c == '+'
|| c == '%' || c == '%'
)).AsString(); ));
return safetitle; return string.Concat(safeTitle);
} }
} }

View File

@@ -32,36 +32,18 @@ namespace Jackett.Common.Utils
public static class GenericConversionExtensions public static class GenericConversionExtensions
{ {
public static IEnumerable<T> ToEnumerable<T>(this T obj) => new T[] { obj };
public static NonNull<T> ToNonNull<T>(this T obj) where T : class => new NonNull<T>(obj); public static NonNull<T> ToNonNull<T>(this T obj) where T : class => new NonNull<T>(obj);
} }
public static class EnumerableExtension public static class EnumerableExtension
{ {
public static string AsString(this IEnumerable<char> chars) => string.Concat(chars); public static T FirstIfSingleOrDefault<T>(this IEnumerable<T> source, T replace = default)
public static T FirstIfSingleOrDefault<T>(this IEnumerable<T> enumerable, T replace = default)
{ {
//Avoid enumerating the whole array. if (source is ICollection<T> collection)
//If enumerable.Count() < 2, takes whole array. return collection.Count == 1 ? collection.First() : replace;
var test = enumerable.Take(2).ToList(); var test = source.Take(2).ToList();
return test.Count == 1 ? test[0] : replace; return test.Count == 1 ? test[0] : replace;
} }
public static IEnumerable<T> Flatten<T>(this IEnumerable<IEnumerable<T>> list) => list.SelectMany(x => x);
}
public static class CollectionExtension
{
// IEnumerable class above already does this. All ICollection are IEnumerable, so favor IEnumerable?
public static bool IsEmpty<T>(this ICollection<T> obj) => obj.Count == 0;
// obj == null || obj.IsEmpty() causes VS to suggest merging sequential checks
// the result is obj?.IsEmpty() == true which returns false when null
// Other options are obj?.IsEmpty() == true || obj == null Or (obj?.IsEmpty()).GetValueOrDefault(true)
// All three options remove the suggestion and give the intended result of this function
public static bool IsEmptyOrNull<T>(this ICollection<T> obj) => obj?.IsEmpty() ?? true;
} }
public static class XElementExtension public static class XElementExtension
@@ -71,11 +53,6 @@ namespace Jackett.Common.Utils
public static string FirstValue(this XElement element, string name) => element.First(name).Value; public static string FirstValue(this XElement element, string name) => element.First(name).Value;
} }
public static class KeyValuePairsExtension
{
public static IDictionary<Key, Value> ToDictionary<Key, Value>(this IEnumerable<KeyValuePair<Key, Value>> pairs) => pairs.ToDictionary(x => x.Key, x => x.Value);
}
public static class TaskExtensions public static class TaskExtensions
{ {
public static Task<IEnumerable<TResult>> Until<TResult>(this IEnumerable<Task<TResult>> tasks, TimeSpan timeout) public static Task<IEnumerable<TResult>> Until<TResult>(this IEnumerable<Task<TResult>> tasks, TimeSpan timeout)