Compare commits

...

6 Commits

Author SHA1 Message Date
Bogdan
74a9fa784a Fixed: (Nebulance) Detect TV UHD releases 2023-08-26 20:21:41 +03:00
ilike2burnthing
1b0c9adf24 Remove Reddit from issues config 2023-08-22 00:30:49 +03:00
Bogdan
0eaa538e8a Allow deselecting values when using search through url query params 2023-08-21 21:32:26 +03:00
Bogdan
39a54eb8f6 Prevent health checks warnings for disabled notifications 2023-08-21 21:04:30 +03:00
Bogdan
5ad6237785 Improve music and console search results for AnimeBytes
Also prevent duplicate categories showing in the indexer info modal
2023-08-21 18:08:43 +03:00
Bogdan
9fee4f914f Bump version to 1.8.4 2023-08-20 12:23:24 +03:00
9 changed files with 66 additions and 48 deletions

View File

@@ -6,6 +6,3 @@ contact_links:
- name: Support via Discord
url: https://prowlarr.com/discord
about: Chat with users and devs on support and setup related topics.
- name: Support via Reddit
url: https://reddit.com/r/prowlarr
about: Discuss and search thru support topics.

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.8.3'
majorVersion: '1.8.4'
minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'

View File

@@ -1,3 +1,4 @@
import { uniqBy } from 'lodash';
import React, { useCallback, useState } from 'react';
import { useSelector } from 'react-redux';
import { createSelector } from 'reselect';
@@ -249,8 +250,7 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) {
</div>
</FieldSet>
{capabilities.categories !== null &&
capabilities.categories.length > 0 ? (
{capabilities?.categories?.length > 0 ? (
<FieldSet legend={translate('IndexerCategories')}>
<Table
columns={[
@@ -266,7 +266,7 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) {
},
]}
>
{capabilities.categories
{uniqBy(capabilities.categories, 'id')
.sort((a, b) => a.id - b.id)
.map((category) => {
return (
@@ -275,9 +275,8 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) {
<TableRowCell>{category.id}</TableRowCell>
<TableRowCell>{category.name}</TableRowCell>
</TableRow>
{category.subCategories !== null &&
category.subCategories.length > 0
? category.subCategories
{category?.subCategories?.length > 0
? uniqBy(category.subCategories, 'id')
.sort((a, b) => a.id - b.id)
.map((subCategory) => {
return (

View File

@@ -24,6 +24,7 @@ class SearchFooter extends Component {
super(props, context);
const {
defaultSearchQueryParams,
defaultIndexerIds,
defaultCategories,
defaultSearchQuery,
@@ -33,16 +34,16 @@ class SearchFooter extends Component {
} = props;
this.state = {
isQueryParameterModalOpen: false,
queryModalOptions: null,
searchType: defaultSearchType,
searchIndexerIds: defaultSearchQueryParams.searchIndexerIds ?? defaultIndexerIds,
searchCategories: defaultSearchQueryParams.searchCategories ?? defaultCategories,
searchQuery: (defaultSearchQueryParams.searchQuery ?? defaultSearchQuery) || '',
searchType: defaultSearchQueryParams.searchType ?? defaultSearchType,
searchLimit: defaultSearchQueryParams.searchLimit ?? defaultSearchLimit,
searchOffset: defaultSearchQueryParams.searchOffset ?? defaultSearchOffset,
newSearch: true,
searchingReleases: false,
searchQuery: defaultSearchQuery || '',
searchIndexerIds: defaultIndexerIds,
searchCategories: defaultCategories,
searchLimit: defaultSearchLimit,
searchOffset: defaultSearchOffset,
newSearch: true
isQueryParameterModalOpen: false,
queryModalOptions: null
};
}
@@ -189,6 +190,7 @@ class SearchFooter extends Component {
break;
default:
icon = icons.SEARCH;
break;
}
let footerLabel = searchIndexerIds.length === 0 ? translate('SearchAllIndexers') : translate('SearchCountIndexers', { count: searchIndexerIds.length });
@@ -300,6 +302,7 @@ class SearchFooter extends Component {
}
SearchFooter.propTypes = {
defaultSearchQueryParams: PropTypes.object.isRequired,
defaultIndexerIds: PropTypes.arrayOf(PropTypes.number).isRequired,
defaultCategories: PropTypes.arrayOf(PropTypes.number).isRequired,
defaultSearchQuery: PropTypes.string.isRequired,

View File

@@ -49,12 +49,12 @@ function createMapStateToProps() {
return {
defaultSearchQueryParams,
defaultSearchQuery: defaultSearchQueryParams.searchQuery ?? defaultSearchQuery,
defaultIndexerIds: defaultSearchQueryParams.searchIndexerIds ?? defaultIndexerIds,
defaultCategories: defaultSearchQueryParams.searchCategories ?? defaultCategories,
defaultSearchType: defaultSearchQueryParams.searchType ?? defaultSearchType,
defaultSearchLimit: defaultSearchQueryParams.searchLimit ?? defaultSearchLimit,
defaultSearchOffset: defaultSearchQueryParams.searchOffset ?? defaultSearchOffset
defaultSearchQuery,
defaultIndexerIds,
defaultCategories,
defaultSearchType,
defaultSearchLimit,
defaultSearchOffset
};
}
);
@@ -87,14 +87,9 @@ class SearchFooterConnector extends Component {
// Render
render() {
const {
defaultSearchQueryParams,
...otherProps
} = this.props;
return (
<SearchFooter
{...otherProps}
{...this.props}
onInputChange={this.onInputChange}
/>
);

View File

@@ -124,7 +124,9 @@ namespace NzbDrone.Core.Indexers.Definitions
caps.Categories.AddCategoryMapping("anime[bd_special]", NewznabStandardCategory.TVAnime, "BD Special");
caps.Categories.AddCategoryMapping("anime[movie]", NewznabStandardCategory.Movies, "Movie");
caps.Categories.AddCategoryMapping("audio", NewznabStandardCategory.Audio, "Music");
caps.Categories.AddCategoryMapping("gamec[game]", NewznabStandardCategory.Console, "Game");
caps.Categories.AddCategoryMapping("gamec[game]", NewznabStandardCategory.PCGames, "Game");
caps.Categories.AddCategoryMapping("gamec[visual_novel]", NewznabStandardCategory.Console, "Game Visual Novel");
caps.Categories.AddCategoryMapping("gamec[visual_novel]", NewznabStandardCategory.PCGames, "Game Visual Novel");
caps.Categories.AddCategoryMapping("printedtype[manga]", NewznabStandardCategory.BooksComics, "Manga");
caps.Categories.AddCategoryMapping("printedtype[oneshot]", NewznabStandardCategory.BooksComics, "Oneshot");
@@ -364,7 +366,7 @@ namespace NzbDrone.Core.Indexers.Definitions
var minimumSeedTime = 259200 + (int)(size / (int)Math.Pow(1024, 3) * 18000);
var propertyList = WebUtility.HtmlDecode(torrent.Property)
.Split('|', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
.Split(new[] { " | ", " / " }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
.ToList();
propertyList.RemoveAll(p => ExcludedProperties.Any(p.ContainsIgnoreCase));
@@ -386,7 +388,6 @@ namespace NzbDrone.Core.Indexers.Definitions
}
if (_settings.ExcludeRaw &&
categoryName == "Anime" &&
properties.Any(p => p.StartsWithIgnoreCase("RAW") || p.Contains("BR-DISK")))
{
continue;
@@ -467,32 +468,34 @@ namespace NzbDrone.Core.Indexers.Definitions
{
if (properties.Contains("PSP"))
{
categories = new List<IndexerCategory> { NewznabStandardCategory.ConsolePSP };
categories = new List<IndexerCategory> { NewznabStandardCategory.Console, NewznabStandardCategory.ConsolePSP };
}
if (properties.Contains("PS3"))
{
categories = new List<IndexerCategory> { NewznabStandardCategory.ConsolePS3 };
categories = new List<IndexerCategory> { NewznabStandardCategory.Console, NewznabStandardCategory.ConsolePS3 };
}
if (properties.Contains("PS Vita"))
{
categories = new List<IndexerCategory> { NewznabStandardCategory.ConsolePSVita };
categories = new List<IndexerCategory> { NewznabStandardCategory.Console, NewznabStandardCategory.ConsolePSVita };
}
if (properties.Contains("3DS"))
{
categories = new List<IndexerCategory> { NewznabStandardCategory.Console3DS };
categories = new List<IndexerCategory> { NewznabStandardCategory.Console, NewznabStandardCategory.Console3DS };
}
if (properties.Contains("NDS"))
{
categories = new List<IndexerCategory> { NewznabStandardCategory.ConsoleNDS };
categories = new List<IndexerCategory> { NewznabStandardCategory.Console, NewznabStandardCategory.ConsoleNDS };
}
if (properties.Contains("PSX") || properties.Contains("PS2") || properties.Contains("SNES") || properties.Contains("NES") || properties.Contains("GBA") || properties.Contains("Switch"))
if (properties.Contains("PSX") || properties.Contains("PS2") || properties.Contains("SNES") ||
properties.Contains("NES") || properties.Contains("GBA") || properties.Contains("Switch") ||
properties.Contains("N64"))
{
categories = new List<IndexerCategory> { NewznabStandardCategory.ConsoleOther };
categories = new List<IndexerCategory> { NewznabStandardCategory.Console, NewznabStandardCategory.ConsoleOther };
}
if (properties.Contains("PC"))
@@ -505,15 +508,15 @@ namespace NzbDrone.Core.Indexers.Definitions
{
if (properties.Any(p => p.Contains("Lossless")))
{
categories = new List<IndexerCategory> { NewznabStandardCategory.AudioLossless };
categories = new List<IndexerCategory> { NewznabStandardCategory.Audio, NewznabStandardCategory.AudioLossless };
}
else if (properties.Any(p => p.Contains("MP3")))
{
categories = new List<IndexerCategory> { NewznabStandardCategory.AudioMP3 };
categories = new List<IndexerCategory> { NewznabStandardCategory.Audio, NewznabStandardCategory.AudioMP3 };
}
else
{
categories = new List<IndexerCategory> { NewznabStandardCategory.AudioOther };
categories = new List<IndexerCategory> { NewznabStandardCategory.Audio, NewznabStandardCategory.AudioOther };
}
}

View File

@@ -79,6 +79,7 @@ namespace NzbDrone.Core.Indexers.Definitions
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.TV);
caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TVSD);
caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.TVHD);
caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.TVUHD);
return caps;
}

View File

@@ -27,6 +27,11 @@ namespace NzbDrone.Core.Notifications
_logger = logger;
}
protected override List<NotificationDefinition> Active()
{
return base.Active().Where(c => c.Enable).ToList();
}
public List<INotification> OnGrabEnabled(bool filterBlockedNotifications = true)
{
if (filterBlockedNotifications)

View File

@@ -5,7 +5,7 @@ namespace NzbDrone.Core.Parser
{
public static class TvCategoryFromQualityParser
{
private static readonly Regex SourceRegex = new Regex(@"\b(?:
private static readonly Regex SourceRegex = new (@"\b(?:
(?<bluray>BluRay|Blu-Ray|HDDVD|BD)|
(?<webdl>WEB[-_. ]DL|WEBDL|WebRip|iTunesHD|WebHD)|
(?<hdtv>HDTV)|
@@ -19,16 +19,16 @@ namespace NzbDrone.Core.Parser
)\b",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
private static readonly Regex RawHdRegex = new Regex(@"\b(?<rawhd>TrollHD|RawHD|1080i[-_. ]HDTV|Raw[-_. ]HD|MPEG[-_. ]?2)\b",
private static readonly Regex RawHdRegex = new (@"\b(?<rawhd>TrollHD|RawHD|1080i[-_. ]HDTV|Raw[-_. ]HD|MPEG[-_. ]?2)\b",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex ResolutionRegex = new Regex(@"\b(?:(?<q480p>480p|640x480|848x480)|(?<q576p>576p)|(?<q720p>720p|1280x720)|(?<q1080p>1080p|1920x1080))\b",
private static readonly Regex ResolutionRegex = new (@"\b(?:(?<q480p>480p|640x480|848x480)|(?<q576p>576p)|(?<q720p>720p|1280x720)|(?<q1080p>1080p|1920x1080)|(?<q2160p>2160p))\b",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex CodecRegex = new Regex(@"\b(?:(?<x264>x264)|(?<h264>h264)|(?<xvidhd>XvidHD)|(?<xvid>Xvid)|(?<divx>divx))\b",
private static readonly Regex CodecRegex = new (@"\b(?:(?<x264>x264)|(?<h264>h264)|(?<xvidhd>XvidHD)|(?<xvid>Xvid)|(?<divx>divx))\b",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex HighDefPdtvRegex = new Regex(@"hr[-_. ]ws", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex HighDefPdtvRegex = new (@"hr[-_. ]ws", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public static IndexerCategory ParseTvShowQuality(string tvShowFileName)
{
@@ -40,6 +40,11 @@ namespace NzbDrone.Core.Parser
if (sourceMatch.Groups["webdl"].Success)
{
if (resolutionMatch.Groups["q2160p"].Success)
{
return NewznabStandardCategory.TVUHD;
}
if (resolutionMatch.Groups["q1080p"].Success || resolutionMatch.Groups["q720p"].Success)
{
return NewznabStandardCategory.TVHD;
@@ -53,6 +58,11 @@ namespace NzbDrone.Core.Parser
if (sourceMatch.Groups["hdtv"].Success)
{
if (resolutionMatch.Groups["q2160p"].Success)
{
return NewznabStandardCategory.TVUHD;
}
if (resolutionMatch.Groups["q1080p"].Success || resolutionMatch.Groups["q720p"].Success)
{
return NewznabStandardCategory.TVHD;
@@ -70,6 +80,11 @@ namespace NzbDrone.Core.Parser
return NewznabStandardCategory.TVSD;
}
if (resolutionMatch.Groups["q2160p"].Success)
{
return NewznabStandardCategory.TVUHD;
}
if (resolutionMatch.Groups["q1080p"].Success || resolutionMatch.Groups["q720p"].Success)
{
return NewznabStandardCategory.TVHD;