mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-16 21:35:04 -04:00
Compare commits
6 Commits
v1.8.3.388
...
v1.8.4.388
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
74a9fa784a | ||
|
|
1b0c9adf24 | ||
|
|
0eaa538e8a | ||
|
|
39a54eb8f6 | ||
|
|
5ad6237785 | ||
|
|
9fee4f914f |
3
.github/ISSUE_TEMPLATE/config.yml
vendored
3
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -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.
|
||||
|
||||
@@ -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)'
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user