From 146e7ca7b6b5f8614855d51d13fa83d46748b095 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 16 Jul 2023 07:01:33 +0300 Subject: [PATCH 001/964] Use HelpTexts for sync levels in applications --- .../Applications/EditApplicationModalContent.js | 5 ++++- .../Manage/Edit/ManageApplicationsEditModalContent.tsx | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js b/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js index a8b0636de..caaa6fd1c 100644 --- a/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js +++ b/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js @@ -102,7 +102,10 @@ function EditApplicationModalContent(props) { type={inputTypes.SELECT} values={syncLevelOptions} name="syncLevel" - helpText={`${translate('SyncLevelAddRemove')}
${translate('SyncLevelFull')}`} + helpTexts={[ + translate('SyncLevelAddRemove'), + translate('SyncLevelFull') + ]} {...syncLevel} onChange={onInputChange} /> diff --git a/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx b/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx index dfdd1639b..e359eac25 100644 --- a/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx +++ b/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx @@ -82,9 +82,10 @@ function ManageApplicationsEditModalContent( name="syncLevel" value={syncLevel} values={syncLevelOptions} - helpText={`${translate('SyncLevelAddRemove')}
${translate( - 'SyncLevelFull' - )}`} + helpTexts={[ + translate('SyncLevelAddRemove'), + translate('SyncLevelFull'), + ]} onChange={onInputChange} /> From b9a28f243eb8980e4d069d49cc8512c8a1eb290b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 16 Jul 2023 08:14:24 +0300 Subject: [PATCH 002/964] Bump version to 1.7.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2383f7f05..3c3dad8fd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.7.2' + majorVersion: '1.7.3' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 5e52627799d4bde176c2101e11a5bb9aa24d45d7 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 14 Jul 2023 16:55:25 -0700 Subject: [PATCH 003/964] Fixed: Ensure translations are fetched before loading app (cherry picked from commit ad2721dc55f3233e4c299babe5744418bc530418) --- frontend/build/webpack.config.js | 4 +++ frontend/src/App/App.js | 7 +++-- frontend/src/Components/Page/ErrorPage.js | 4 +++ frontend/src/Components/Page/PageConnector.js | 5 ++- frontend/src/Utilities/String/translate.js | 31 +++++++++++-------- frontend/src/index.js | 9 ++++-- 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/frontend/build/webpack.config.js b/frontend/build/webpack.config.js index 7c1dcba83..f331cbc0b 100644 --- a/frontend/build/webpack.config.js +++ b/frontend/build/webpack.config.js @@ -82,6 +82,10 @@ module.exports = (env) => { hints: false }, + experiments: { + topLevelAwait: true + }, + plugins: [ new webpack.DefinePlugin({ __DEV__: !isProduction, diff --git a/frontend/src/App/App.js b/frontend/src/App/App.js index 1eea6e082..e7b226a5d 100644 --- a/frontend/src/App/App.js +++ b/frontend/src/App/App.js @@ -7,13 +7,13 @@ import PageConnector from 'Components/Page/PageConnector'; import ApplyTheme from './ApplyTheme'; import AppRoutes from './AppRoutes'; -function App({ store, history }) { +function App({ store, history, hasTranslationsError }) { return ( - + @@ -25,7 +25,8 @@ function App({ store, history }) { App.propTypes = { store: PropTypes.object.isRequired, - history: PropTypes.object.isRequired + history: PropTypes.object.isRequired, + hasTranslationsError: PropTypes.bool.isRequired }; export default App; diff --git a/frontend/src/Components/Page/ErrorPage.js b/frontend/src/Components/Page/ErrorPage.js index 77bed6a31..7c8f4a8c3 100644 --- a/frontend/src/Components/Page/ErrorPage.js +++ b/frontend/src/Components/Page/ErrorPage.js @@ -7,6 +7,7 @@ function ErrorPage(props) { const { version, isLocalStorageSupported, + hasTranslationsError, indexersError, indexerStatusError, indexerCategoriesError, @@ -21,6 +22,8 @@ function ErrorPage(props) { if (!isLocalStorageSupported) { errorMessage = 'Local Storage is not supported or disabled. A plugin or private browsing may have disabled it.'; + } else if (hasTranslationsError) { + errorMessage = 'Failed to load translations from API'; } else if (indexersError) { errorMessage = getErrorMessage(indexersError, 'Failed to load indexers from API'); } else if (indexerStatusError) { @@ -55,6 +58,7 @@ function ErrorPage(props) { ErrorPage.propTypes = { version: PropTypes.string.isRequired, isLocalStorageSupported: PropTypes.bool.isRequired, + hasTranslationsError: PropTypes.bool.isRequired, indexersError: PropTypes.object, indexerStatusError: PropTypes.object, indexerCategoriesError: PropTypes.object, diff --git a/frontend/src/Components/Page/PageConnector.js b/frontend/src/Components/Page/PageConnector.js index 5ac032c0f..d584933e8 100644 --- a/frontend/src/Components/Page/PageConnector.js +++ b/frontend/src/Components/Page/PageConnector.js @@ -232,6 +232,7 @@ class PageConnector extends Component { render() { const { + hasTranslationsError, isPopulated, hasError, dispatchFetchTags, @@ -245,11 +246,12 @@ class PageConnector extends Component { ...otherProps } = this.props; - if (hasError || !this.state.isLocalStorageSupported) { + if (hasTranslationsError || hasError || !this.state.isLocalStorageSupported) { return ( ); } @@ -270,6 +272,7 @@ class PageConnector extends Component { } PageConnector.propTypes = { + hasTranslationsError: PropTypes.bool.isRequired, isPopulated: PropTypes.bool.isRequired, hasError: PropTypes.bool.isRequired, isSidebarVisible: PropTypes.bool.isRequired, diff --git a/frontend/src/Utilities/String/translate.js b/frontend/src/Utilities/String/translate.js index 7483b27aa..fb0ec0cb5 100644 --- a/frontend/src/Utilities/String/translate.js +++ b/frontend/src/Utilities/String/translate.js @@ -1,22 +1,27 @@ import createAjaxRequest from 'Utilities/createAjaxRequest'; function getTranslations() { - let localization = null; - const ajaxOptions = { - async: false, + return createAjaxRequest({ + global: false, dataType: 'json', - url: '/localization', - success: function(data) { - localization = data.Strings; - } - }; - - createAjaxRequest(ajaxOptions); - - return localization; + url: '/localization' + }).request; } -const translations = getTranslations(); +let translations = {}; + +export function fetchTranslations() { + return new Promise(async(resolve) => { + try { + const data = await getTranslations(); + translations = data.Strings; + + resolve(true); + } catch (error) { + resolve(false); + } + }); +} export default function translate(key, args = []) { const translation = translations[key] || key; diff --git a/frontend/src/index.js b/frontend/src/index.js index 59911154e..acdfc6517 100644 --- a/frontend/src/index.js +++ b/frontend/src/index.js @@ -1,8 +1,7 @@ import { createBrowserHistory } from 'history'; import React from 'react'; import { render } from 'react-dom'; -import createAppStore from 'Store/createAppStore'; -import App from './App/App'; +import { fetchTranslations } from 'Utilities/String/translate'; import './preload'; import './polyfills'; @@ -10,12 +9,18 @@ import 'Styles/globals.css'; import './index.css'; const history = createBrowserHistory(); +const hasTranslationsError = !await fetchTranslations(); + +const { default: createAppStore } = await import('Store/createAppStore'); +const { default: App } = await import('./App/App'); + const store = createAppStore(history); render( , document.getElementById('root') ); From 3fab8fb0db0f4831f2c9d325320b61686330c44d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 16 Jul 2023 17:04:08 +0300 Subject: [PATCH 004/964] Fixed: (Search) Ensure TvMazeId is parsed correctly on a repeat search --- .../Definitions/TvSearchCriteria.cs | 30 ++++++++++++++----- .../IndexerSearch/NewznabRequest.cs | 9 ++++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/Definitions/TvSearchCriteria.cs b/src/NzbDrone.Core/IndexerSearch/Definitions/TvSearchCriteria.cs index 1e4c35e5b..a79878a98 100644 --- a/src/NzbDrone.Core/IndexerSearch/Definitions/TvSearchCriteria.cs +++ b/src/NzbDrone.Core/IndexerSearch/Definitions/TvSearchCriteria.cs @@ -45,14 +45,20 @@ namespace NzbDrone.Core.IndexerSearch.Definitions { get { - var searchQueryTerm = $"Term: []"; + var searchQueryTerm = "Term: []"; var searchEpisodeTerm = $" for Season / Episode:[{EpisodeSearchString}]"; if (SearchTerm.IsNotNullOrWhiteSpace()) { searchQueryTerm = $"Term: [{SearchTerm}]"; } - if (!ImdbId.IsNotNullOrWhiteSpace() && !TvdbId.HasValue && !RId.HasValue && !TraktId.HasValue) + if (!ImdbId.IsNotNullOrWhiteSpace() && + !TvdbId.HasValue && + !RId.HasValue && + !TraktId.HasValue && + !TvMazeId.HasValue && + !TmdbId.HasValue && + !DoubanId.HasValue) { return $"{searchQueryTerm}{searchEpisodeTerm}"; } @@ -80,11 +86,21 @@ namespace NzbDrone.Core.IndexerSearch.Definitions builder.Append($" TraktId:[{TraktId}]"); } + if (TvMazeId.HasValue) + { + builder.Append($" TvMazeId:[{TvMazeId}]"); + } + if (TmdbId.HasValue) { builder.Append($" TmdbId:[{TmdbId}]"); } + if (DoubanId.HasValue) + { + builder.Append($" DoubanId:[{DoubanId}]"); + } + builder = builder.Append(searchEpisodeTerm); return builder.ToString().Trim(); } @@ -92,29 +108,29 @@ namespace NzbDrone.Core.IndexerSearch.Definitions private string GetEpisodeSearchString() { - if (Season == null || Season == 0) + if (Season is null or 0) { return string.Empty; } string episodeString; - if (DateTime.TryParseExact(string.Format("{0} {1}", Season, Episode), "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate)) + if (DateTime.TryParseExact($"{Season} {Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate)) { episodeString = showDate.ToString("yyyy.MM.dd"); } else if (Episode.IsNullOrWhiteSpace()) { - episodeString = string.Format("S{0:00}", Season); + episodeString = $"S{Season:00}"; } else { try { - episodeString = string.Format("S{0:00}E{1:00}", Season, ParseUtil.CoerceInt(Episode)); + episodeString = $"S{Season:00}E{ParseUtil.CoerceInt(Episode):00}"; } catch (FormatException) { - episodeString = string.Format("S{0:00}E{1}", Season, Episode); + episodeString = $"S{Season:00}E{Episode}"; } } diff --git a/src/NzbDrone.Core/IndexerSearch/NewznabRequest.cs b/src/NzbDrone.Core/IndexerSearch/NewznabRequest.cs index 8fb138fcf..bddfc4de4 100644 --- a/src/NzbDrone.Core/IndexerSearch/NewznabRequest.cs +++ b/src/NzbDrone.Core/IndexerSearch/NewznabRequest.cs @@ -5,7 +5,7 @@ namespace NzbDrone.Core.IndexerSearch { public class NewznabRequest { - private static readonly Regex TvRegex = new (@"\{((?:imdbid\:)(?[^{]+)|(?:rid\:)(?[^{]+)|(?:tvdbid\:)(?[^{]+)|(?:tmdbid\:)(?[^{]+)|(?:doubanid\:)(?[^{]+)|(?:season\:)(?[^{]+)|(?:episode\:)(?[^{]+)|(?:year\:)(?[^{]+)|(?:genre\:)(?[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex TvRegex = new (@"\{((?:imdbid\:)(?[^{]+)|(?:rid\:)(?[^{]+)|(?:tvdbid\:)(?[^{]+)|(?:tmdbid\:)(?[^{]+)|(?:tvmazeid\:)(?[^{]+)|(?:doubanid\:)(?[^{]+)|(?:season\:)(?[^{]+)|(?:episode\:)(?[^{]+)|(?:year\:)(?[^{]+)|(?:genre\:)(?[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex MovieRegex = new (@"\{((?:imdbid\:)(?[^{]+)|(?:doubanid\:)(?[^{]+)|(?:tmdbid\:)(?[^{]+)|(?:traktid\:)(?[^{]+)|(?:year\:)(?[^{]+)|(?:genre\:)(?[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex MusicRegex = new (@"\{((?:artist\:)(?[^{]+)|(?:album\:)(?[^{]+)|(?:track\:)(?[^{]+)|(?:label\:)(? { @@ -56,7 +56,7 @@ function TableOptionsColumn(props) { TableOptionsColumn.propTypes = { name: PropTypes.string.isRequired, - label: PropTypes.string.isRequired, + label: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired, isVisible: PropTypes.bool.isRequired, isModifiable: PropTypes.bool.isRequired, index: PropTypes.number.isRequired, diff --git a/frontend/src/Components/Table/TableOptions/TableOptionsColumnDragSource.js b/frontend/src/Components/Table/TableOptions/TableOptionsColumnDragSource.js index 100559660..77d18463f 100644 --- a/frontend/src/Components/Table/TableOptions/TableOptionsColumnDragSource.js +++ b/frontend/src/Components/Table/TableOptions/TableOptionsColumnDragSource.js @@ -112,7 +112,7 @@ class TableOptionsColumnDragSource extends Component { - {label} + {typeof label === 'function' ? label() : label} ); })} From 7e4980b8559eaa28f40805cc03b0063a2514443f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 3 Aug 2023 17:17:10 +0300 Subject: [PATCH 071/964] New: Add translations for columns --- .../FileBrowser/FileBrowserModalContent.js | 4 +- .../Components/Page/Sidebar/PageSidebar.js | 38 +++++++-------- .../Page/Sidebar/PageSidebarItem.js | 4 +- .../src/Indexer/Add/AddIndexerModalContent.js | 22 +++++---- .../Select/Edit/EditIndexerModalContent.tsx | 22 +++++++-- .../src/Search/Table/SearchIndexHeader.js | 2 +- .../ManageApplicationsEditModalContent.tsx | 29 +++++++++-- .../Manage/ManageApplicationsModalContent.tsx | 8 ++-- .../ManageDownloadClientsEditModalContent.tsx | 22 +++++++-- .../ManageDownloadClientsModalContent.tsx | 8 ++-- frontend/src/Store/Actions/historyActions.js | 34 ++++++------- frontend/src/Store/Actions/indexerActions.js | 2 +- .../src/Store/Actions/indexerIndexActions.js | 48 +++++++++---------- .../src/Store/Actions/indexerStatsActions.js | 2 +- frontend/src/Store/Actions/oAuthActions.js | 2 +- frontend/src/Store/Actions/releaseActions.js | 40 ++++++++-------- frontend/src/Store/Actions/systemActions.js | 18 +++---- frontend/src/System/Backup/Backups.js | 6 +-- frontend/src/System/Logs/Files/LogFiles.js | 4 +- frontend/src/System/Status/Health/Health.js | 4 +- .../src/System/Tasks/Queued/QueuedTasks.js | 10 ++-- .../System/Tasks/Scheduled/ScheduledTasks.js | 10 ++-- 22 files changed, 199 insertions(+), 140 deletions(-) diff --git a/frontend/src/Components/FileBrowser/FileBrowserModalContent.js b/frontend/src/Components/FileBrowser/FileBrowserModalContent.js index fd2ff8afa..dfb720003 100644 --- a/frontend/src/Components/FileBrowser/FileBrowserModalContent.js +++ b/frontend/src/Components/FileBrowser/FileBrowserModalContent.js @@ -20,12 +20,12 @@ import styles from './FileBrowserModalContent.css'; const columns = [ { name: 'type', - label: translate('Type'), + label: () => translate('Type'), isVisible: true }, { name: 'name', - label: translate('Name'), + label: () => translate('Name'), isVisible: true } ]; diff --git a/frontend/src/Components/Page/Sidebar/PageSidebar.js b/frontend/src/Components/Page/Sidebar/PageSidebar.js index 045789075..069a4cdf7 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebar.js +++ b/frontend/src/Components/Page/Sidebar/PageSidebar.js @@ -20,12 +20,12 @@ const SIDEBAR_WIDTH = parseInt(dimensions.sidebarWidth); const links = [ { iconName: icons.MOVIE_CONTINUING, - title: translate('Indexers'), + title: () => translate('Indexers'), to: '/', alias: '/indexers', children: [ { - title: translate('Stats'), + title: () => translate('Stats'), to: '/indexers/stats' } ] @@ -33,47 +33,47 @@ const links = [ { iconName: icons.SEARCH, - title: translate('Search'), + title: () => translate('Search'), to: '/search' }, { iconName: icons.ACTIVITY, - title: translate('History'), + title: () => translate('History'), to: '/history' }, { iconName: icons.SETTINGS, - title: translate('Settings'), + title: () => translate('Settings'), to: '/settings', children: [ { - title: translate('Indexers'), + title: () => translate('Indexers'), to: '/settings/indexers' }, { - title: translate('Apps'), + title: () => translate('Apps'), to: '/settings/applications' }, { - title: translate('DownloadClients'), + title: () => translate('DownloadClients'), to: '/settings/downloadclients' }, { - title: translate('Connect'), + title: () => translate('Connect'), to: '/settings/connect' }, { - title: translate('Tags'), + title: () => translate('Tags'), to: '/settings/tags' }, { - title: translate('General'), + title: () => translate('General'), to: '/settings/general' }, { - title: translate('UI'), + title: () => translate('UI'), to: '/settings/ui' } ] @@ -81,32 +81,32 @@ const links = [ { iconName: icons.SYSTEM, - title: translate('System'), + title: () => translate('System'), to: '/system/status', children: [ { - title: translate('Status'), + title: () => translate('Status'), to: '/system/status', statusComponent: HealthStatusConnector }, { - title: translate('Tasks'), + title: () => translate('Tasks'), to: '/system/tasks' }, { - title: translate('Backup'), + title: () => translate('Backup'), to: '/system/backup' }, { - title: translate('Updates'), + title: () => translate('Updates'), to: '/system/updates' }, { - title: translate('Events'), + title: () => translate('Events'), to: '/system/events' }, { - title: translate('LogFiles'), + title: () => translate('LogFiles'), to: '/system/logs/files' } ] diff --git a/frontend/src/Components/Page/Sidebar/PageSidebarItem.js b/frontend/src/Components/Page/Sidebar/PageSidebarItem.js index 9ad78db6b..754071c79 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebarItem.js +++ b/frontend/src/Components/Page/Sidebar/PageSidebarItem.js @@ -64,7 +64,7 @@ class PageSidebarItem extends Component { } - {title} + {typeof title === 'function' ? title() : title} { @@ -88,7 +88,7 @@ class PageSidebarItem extends Component { PageSidebarItem.propTypes = { iconName: PropTypes.object, - title: PropTypes.string.isRequired, + title: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired, to: PropTypes.string.isRequired, isActive: PropTypes.bool, isActiveParent: PropTypes.bool, diff --git a/frontend/src/Indexer/Add/AddIndexerModalContent.js b/frontend/src/Indexer/Add/AddIndexerModalContent.js index 4617664ad..7925167e6 100644 --- a/frontend/src/Indexer/Add/AddIndexerModalContent.js +++ b/frontend/src/Indexer/Add/AddIndexerModalContent.js @@ -22,31 +22,31 @@ import styles from './AddIndexerModalContent.css'; const columns = [ { name: 'protocol', - label: translate('Protocol'), + label: () => translate('Protocol'), isSortable: true, isVisible: true }, { name: 'sortName', - label: translate('Name'), + label: () => translate('Name'), isSortable: true, isVisible: true }, { name: 'language', - label: translate('Language'), + label: () => translate('Language'), isSortable: true, isVisible: true }, { name: 'description', - label: translate('Description'), + label: () => translate('Description'), isSortable: false, isVisible: true }, { name: 'privacy', - label: translate('Privacy'), + label: () => translate('Privacy'), isSortable: true, isVisible: true } @@ -66,15 +66,21 @@ const protocols = [ const privacyLevels = [ { key: 'private', - value: translate('Private') + get value() { + return translate('Private'); + } }, { key: 'semiPrivate', - value: translate('SemiPrivate') + get value() { + return translate('SemiPrivate'); + } }, { key: 'public', - value: translate('Public') + get value() { + return translate('Public'); + } } ]; diff --git a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx index 1aba90a0b..a25a15d2f 100644 --- a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx +++ b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx @@ -30,9 +30,25 @@ interface EditIndexerModalContentProps { const NO_CHANGE = 'noChange'; const enableOptions = [ - { key: NO_CHANGE, value: translate('NoChange'), disabled: true }, - { key: 'true', value: translate('Enabled') }, - { key: 'false', value: translate('Disabled') }, + { + key: NO_CHANGE, + get value() { + return translate('NoChange'); + }, + disabled: true, + }, + { + key: 'true', + get value() { + return translate('Enabled'); + }, + }, + { + key: 'false', + get value() { + return translate('Disabled'); + }, + }, ]; function EditIndexerModalContent(props: EditIndexerModalContentProps) { diff --git a/frontend/src/Search/Table/SearchIndexHeader.js b/frontend/src/Search/Table/SearchIndexHeader.js index 6b91adb45..17b79e2f7 100644 --- a/frontend/src/Search/Table/SearchIndexHeader.js +++ b/frontend/src/Search/Table/SearchIndexHeader.js @@ -96,7 +96,7 @@ class SearchIndexHeader extends Component { isSortable={isSortable} {...otherProps} > - {label} + {typeof label === 'function' ? label() : label} ); }) diff --git a/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx b/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx index e359eac25..4840b89fa 100644 --- a/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx +++ b/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx @@ -25,10 +25,31 @@ interface ManageApplicationsEditModalContentProps { const NO_CHANGE = 'noChange'; const syncLevelOptions = [ - { key: NO_CHANGE, value: translate('NoChange'), disabled: true }, - { key: ApplicationSyncLevel.Disabled, value: translate('Disabled') }, - { key: ApplicationSyncLevel.AddOnly, value: translate('AddOnly') }, - { key: ApplicationSyncLevel.FullSync, value: translate('FullSync') }, + { + key: NO_CHANGE, + get value() { + return translate('NoChange'); + }, + disabled: true, + }, + { + key: ApplicationSyncLevel.Disabled, + get value() { + return translate('Disabled'); + }, + }, + { + key: ApplicationSyncLevel.AddOnly, + get value() { + return translate('AddOnly'); + }, + }, + { + key: ApplicationSyncLevel.FullSync, + get value() { + return translate('FullSync'); + }, + }, ]; function ManageApplicationsEditModalContent( diff --git a/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx b/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx index b6c636fbe..b3235aa32 100644 --- a/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx +++ b/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx @@ -36,25 +36,25 @@ type OnSelectedChangeCallback = React.ComponentProps< const COLUMNS = [ { name: 'name', - label: translate('Name'), + label: () => translate('Name'), isSortable: true, isVisible: true, }, { name: 'implementation', - label: translate('Implementation'), + label: () => translate('Implementation'), isSortable: true, isVisible: true, }, { name: 'syncLevel', - label: translate('SyncLevel'), + label: () => translate('SyncLevel'), isSortable: true, isVisible: true, }, { name: 'tags', - label: translate('Tags'), + label: () => translate('Tags'), isSortable: true, isVisible: true, }, diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx index c9279de3b..5770a6255 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx @@ -25,9 +25,25 @@ interface ManageDownloadClientsEditModalContentProps { const NO_CHANGE = 'noChange'; const enableOptions = [ - { key: NO_CHANGE, value: translate('NoChange'), disabled: true }, - { key: 'enabled', value: translate('Enabled') }, - { key: 'disabled', value: translate('Disabled') }, + { + key: NO_CHANGE, + get value() { + return translate('NoChange'); + }, + disabled: true, + }, + { + key: 'enabled', + get value() { + return translate('Enabled'); + }, + }, + { + key: 'disabled', + get value() { + return translate('Disabled'); + }, + }, ]; function ManageDownloadClientsEditModalContent( diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx index c7291b012..a6a4b501f 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx @@ -35,25 +35,25 @@ type OnSelectedChangeCallback = React.ComponentProps< const COLUMNS = [ { name: 'name', - label: translate('Name'), + label: () => translate('Name'), isSortable: true, isVisible: true, }, { name: 'implementation', - label: translate('Implementation'), + label: () => translate('Implementation'), isSortable: true, isVisible: true, }, { name: 'enable', - label: translate('Enabled'), + label: () => translate('Enabled'), isSortable: true, isVisible: true, }, { name: 'priority', - label: translate('ClientPriority'), + label: () => translate('ClientPriority'), isSortable: true, isVisible: true, }, diff --git a/frontend/src/Store/Actions/historyActions.js b/frontend/src/Store/Actions/historyActions.js index c8019e6d4..2e133f61e 100644 --- a/frontend/src/Store/Actions/historyActions.js +++ b/frontend/src/Store/Actions/historyActions.js @@ -30,67 +30,67 @@ export const defaultState = { columns: [ { name: 'eventType', - columnLabel: translate('EventType'), + columnLabel: () => translate('EventType'), isVisible: true, isModifiable: false }, { name: 'indexer', - label: translate('Indexer'), + label: () => translate('Indexer'), isSortable: false, isVisible: true }, { name: 'query', - label: translate('Query'), + label: () => translate('Query'), isSortable: false, isVisible: true }, { name: 'parameters', - label: translate('Parameters'), + label: () => translate('Parameters'), isSortable: false, isVisible: true }, { name: 'grabTitle', - label: translate('GrabTitle'), + label: () => translate('GrabTitle'), isSortable: false, isVisible: false }, { name: 'queryType', - label: translate('QueryType'), + label: () => translate('QueryType'), isSortable: false, isVisible: false }, { name: 'categories', - label: translate('Categories'), + label: () => translate('Categories'), isSortable: false, isVisible: true }, { name: 'date', - label: translate('Date'), + label: () => translate('Date'), isSortable: true, isVisible: true }, { name: 'source', - label: translate('Source'), + label: () => translate('Source'), isSortable: false, isVisible: false }, { name: 'elapsedTime', - label: translate('ElapsedTime'), + label: () => translate('ElapsedTime'), isSortable: false, isVisible: true }, { name: 'details', - columnLabel: translate('Details'), + columnLabel: () => translate('Details'), isVisible: true, isModifiable: false } @@ -101,12 +101,12 @@ export const defaultState = { filters: [ { key: 'all', - label: translate('All'), + label: () => translate('All'), filters: [] }, { key: 'releaseGrabbed', - label: translate('Grabbed'), + label: () => translate('Grabbed'), filters: [ { key: 'eventType', @@ -117,7 +117,7 @@ export const defaultState = { }, { key: 'indexerRss', - label: translate('IndexerRss'), + label: () => translate('IndexerRss'), filters: [ { key: 'eventType', @@ -128,7 +128,7 @@ export const defaultState = { }, { key: 'indexerQuery', - label: translate('IndexerQuery'), + label: () => translate('IndexerQuery'), filters: [ { key: 'eventType', @@ -139,7 +139,7 @@ export const defaultState = { }, { key: 'indexerAuth', - label: translate('IndexerAuth'), + label: () => translate('IndexerAuth'), filters: [ { key: 'eventType', @@ -150,7 +150,7 @@ export const defaultState = { }, { key: 'failed', - label: translate('Failed'), + label: () => translate('Failed'), filters: [ { key: 'successful', diff --git a/frontend/src/Store/Actions/indexerActions.js b/frontend/src/Store/Actions/indexerActions.js index 3a2e7d5ce..39ed90da8 100644 --- a/frontend/src/Store/Actions/indexerActions.js +++ b/frontend/src/Store/Actions/indexerActions.js @@ -54,7 +54,7 @@ export const defaultState = { export const filters = [ { key: 'all', - label: translate('All'), + label: () => translate('All'), filters: [] } ]; diff --git a/frontend/src/Store/Actions/indexerIndexActions.js b/frontend/src/Store/Actions/indexerIndexActions.js index a42897996..c55e46031 100644 --- a/frontend/src/Store/Actions/indexerIndexActions.js +++ b/frontend/src/Store/Actions/indexerIndexActions.js @@ -32,93 +32,93 @@ export const defaultState = { columns: [ { name: 'status', - columnLabel: translate('IndexerStatus'), + columnLabel: () => translate('IndexerStatus'), isSortable: true, isVisible: true, isModifiable: false }, { name: 'sortName', - label: translate('IndexerName'), + label: () => translate('IndexerName'), isSortable: true, isVisible: true, isModifiable: false }, { name: 'protocol', - label: translate('Protocol'), + label: () => translate('Protocol'), isSortable: true, isVisible: true }, { name: 'privacy', - label: translate('Privacy'), + label: () => translate('Privacy'), isSortable: true, isVisible: true }, { name: 'priority', - label: translate('Priority'), + label: () => translate('Priority'), isSortable: true, isVisible: true }, { name: 'appProfileId', - label: translate('SyncProfile'), + label: () => translate('SyncProfile'), isSortable: true, isVisible: true }, { name: 'added', - label: translate('Added'), + label: () => translate('Added'), isSortable: true, isVisible: true }, { name: 'vipExpiration', - label: translate('VipExpiration'), + label: () => translate('VipExpiration'), isSortable: true, isVisible: false }, { name: 'capabilities', - label: translate('Categories'), + label: () => translate('Categories'), isSortable: false, isVisible: true }, { name: 'minimumSeeders', - label: translate('MinimumSeeders'), + label: () => translate('MinimumSeeders'), isSortable: true, isVisible: false }, { name: 'seedRatio', - label: translate('SeedRatio'), + label: () => translate('SeedRatio'), isSortable: true, isVisible: false }, { name: 'seedTime', - label: translate('SeedTime'), + label: () => translate('SeedTime'), isSortable: true, isVisible: false }, { name: 'packSeedTime', - label: translate('PackSeedTime'), + label: () => translate('PackSeedTime'), isSortable: true, isVisible: false }, { name: 'tags', - label: translate('Tags'), + label: () => translate('Tags'), isSortable: false, isVisible: false }, { name: 'actions', - columnLabel: translate('Actions'), + columnLabel: () => translate('Actions'), isVisible: true, isModifiable: false } @@ -136,53 +136,53 @@ export const defaultState = { filterBuilderProps: [ { name: 'name', - label: translate('IndexerName'), + label: () => translate('IndexerName'), type: filterBuilderTypes.STRING }, { name: 'enable', - label: translate('Enabled'), + label: () => translate('Enabled'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.BOOL }, { name: 'added', - label: translate('Added'), + label: () => translate('Added'), type: filterBuilderTypes.DATE, valueType: filterBuilderValueTypes.DATE }, { name: 'vipExpiration', - label: translate('VipExpiration'), + label: () => translate('VipExpiration'), type: filterBuilderTypes.DATE, valueType: filterBuilderValueTypes.DATE }, { name: 'priority', - label: translate('Priority'), + label: () => translate('Priority'), type: filterBuilderTypes.NUMBER }, { name: 'protocol', - label: translate('Protocol'), + label: () => translate('Protocol'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.PROTOCOL }, { name: 'privacy', - label: translate('Privacy'), + label: () => translate('Privacy'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.PRIVACY }, { name: 'appProfileId', - label: translate('SyncProfile'), + label: () => translate('SyncProfile'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.APP_PROFILE }, { name: 'tags', - label: translate('Tags'), + label: () => translate('Tags'), type: filterBuilderTypes.ARRAY, valueType: filterBuilderValueTypes.TAG } diff --git a/frontend/src/Store/Actions/indexerStatsActions.js b/frontend/src/Store/Actions/indexerStatsActions.js index e937cee93..9171ee340 100644 --- a/frontend/src/Store/Actions/indexerStatsActions.js +++ b/frontend/src/Store/Actions/indexerStatsActions.js @@ -33,7 +33,7 @@ export const defaultState = { filters: [ { key: 'all', - label: translate('All'), + label: () => translate('All'), filters: [] }, { diff --git a/frontend/src/Store/Actions/oAuthActions.js b/frontend/src/Store/Actions/oAuthActions.js index b6b05d05e..b5b4966ac 100644 --- a/frontend/src/Store/Actions/oAuthActions.js +++ b/frontend/src/Store/Actions/oAuthActions.js @@ -60,7 +60,7 @@ function showOAuthWindow(url, payload) { responseJSON: [ { propertyName: payload.name, - errorMessage: translate('OAuthPopupMessage') + errorMessage: () => translate('OAuthPopupMessage') } ] }; diff --git a/frontend/src/Store/Actions/releaseActions.js b/frontend/src/Store/Actions/releaseActions.js index fb8df2004..d8618a15a 100644 --- a/frontend/src/Store/Actions/releaseActions.js +++ b/frontend/src/Store/Actions/releaseActions.js @@ -56,55 +56,55 @@ export const defaultState = { }, { name: 'protocol', - label: translate('Protocol'), + label: () => translate('Protocol'), isSortable: true, isVisible: true }, { name: 'age', - label: translate('Age'), + label: () => translate('Age'), isSortable: true, isVisible: true }, { name: 'sortTitle', - label: translate('Title'), + label: () => translate('Title'), isSortable: true, isVisible: true }, { name: 'indexer', - label: translate('Indexer'), + label: () => translate('Indexer'), isSortable: true, isVisible: true }, { name: 'size', - label: translate('Size'), + label: () => translate('Size'), isSortable: true, isVisible: true }, { name: 'files', - label: translate('Files'), + label: () => translate('Files'), isSortable: true, isVisible: false }, { name: 'grabs', - label: translate('Grabs'), + label: () => translate('Grabs'), isSortable: true, isVisible: true }, { name: 'peers', - label: translate('Peers'), + label: () => translate('Peers'), isSortable: true, isVisible: true }, { name: 'category', - label: translate('Category'), + label: () => translate('Category'), isSortable: true, isVisible: true }, @@ -116,7 +116,7 @@ export const defaultState = { }, { name: 'actions', - columnLabel: translate('Actions'), + columnLabel: () => translate('Actions'), isVisible: true, isModifiable: false } @@ -158,7 +158,7 @@ export const defaultState = { filters: [ { key: 'all', - label: translate('All'), + label: () => translate('All'), filters: [] } ], @@ -166,50 +166,50 @@ export const defaultState = { filterBuilderProps: [ { name: 'title', - label: translate('Title'), + label: () => translate('Title'), type: filterBuilderTypes.STRING }, { name: 'age', - label: translate('Age'), + label: () => translate('Age'), type: filterBuilderTypes.NUMBER }, { name: 'protocol', - label: translate('Protocol'), + label: () => translate('Protocol'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.PROTOCOL }, { name: 'indexerId', - label: translate('Indexer'), + label: () => translate('Indexer'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.INDEXER }, { name: 'size', - label: translate('Size'), + label: () => translate('Size'), type: filterBuilderTypes.NUMBER, valueType: filterBuilderValueTypes.BYTES }, { name: 'files', - label: translate('Files'), + label: () => translate('Files'), type: filterBuilderTypes.NUMBER }, { name: 'grabs', - label: translate('Grabs'), + label: () => translate('Grabs'), type: filterBuilderTypes.NUMBER }, { name: 'seeders', - label: translate('Seeders'), + label: () => translate('Seeders'), type: filterBuilderTypes.NUMBER }, { name: 'peers', - label: translate('Peers'), + label: () => translate('Peers'), type: filterBuilderTypes.NUMBER } ], diff --git a/frontend/src/Store/Actions/systemActions.js b/frontend/src/Store/Actions/systemActions.js index 4910e462d..92360b589 100644 --- a/frontend/src/Store/Actions/systemActions.js +++ b/frontend/src/Store/Actions/systemActions.js @@ -82,34 +82,34 @@ export const defaultState = { columns: [ { name: 'level', - columnLabel: translate('Level'), + columnLabel: () => translate('Level'), isSortable: false, isVisible: true, isModifiable: false }, { name: 'time', - label: translate('Time'), + label: () => translate('Time'), isSortable: true, isVisible: true, isModifiable: false }, { name: 'logger', - label: translate('Component'), + label: () => translate('Component'), isSortable: false, isVisible: true, isModifiable: false }, { name: 'message', - label: translate('Message'), + label: () => translate('Message'), isVisible: true, isModifiable: false }, { name: 'actions', - columnLabel: translate('Actions'), + columnLabel: () => translate('Actions'), isSortable: true, isVisible: true, isModifiable: false @@ -121,12 +121,12 @@ export const defaultState = { filters: [ { key: 'all', - label: translate('All'), + label: () => translate('All'), filters: [] }, { key: 'info', - label: translate('Info'), + label: () => translate('Info'), filters: [ { key: 'level', @@ -137,7 +137,7 @@ export const defaultState = { }, { key: 'warn', - label: translate('Warn'), + label: () => translate('Warn'), filters: [ { key: 'level', @@ -148,7 +148,7 @@ export const defaultState = { }, { key: 'error', - label: translate('Error'), + label: () => translate('Error'), filters: [ { key: 'level', diff --git a/frontend/src/System/Backup/Backups.js b/frontend/src/System/Backup/Backups.js index 4f9cd0483..8f7a5b0a5 100644 --- a/frontend/src/System/Backup/Backups.js +++ b/frontend/src/System/Backup/Backups.js @@ -21,17 +21,17 @@ const columns = [ }, { name: 'name', - label: translate('Name'), + label: () => translate('Name'), isVisible: true }, { name: 'size', - label: translate('Size'), + label: () => translate('Size'), isVisible: true }, { name: 'time', - label: translate('Time'), + label: () => translate('Time'), isVisible: true }, { diff --git a/frontend/src/System/Logs/Files/LogFiles.js b/frontend/src/System/Logs/Files/LogFiles.js index 1db261a82..7f002c4d7 100644 --- a/frontend/src/System/Logs/Files/LogFiles.js +++ b/frontend/src/System/Logs/Files/LogFiles.js @@ -19,12 +19,12 @@ import LogFilesTableRow from './LogFilesTableRow'; const columns = [ { name: 'filename', - label: translate('Filename'), + label: () => translate('Filename'), isVisible: true }, { name: 'lastWriteTime', - label: translate('LastWriteTime'), + label: () => translate('LastWriteTime'), isVisible: true }, { diff --git a/frontend/src/System/Status/Health/Health.js b/frontend/src/System/Status/Health/Health.js index d4981a4f8..2747050f6 100644 --- a/frontend/src/System/Status/Health/Health.js +++ b/frontend/src/System/Status/Health/Health.js @@ -66,12 +66,12 @@ const columns = [ }, { name: 'message', - label: translate('Message'), + label: () => translate('Message'), isVisible: true }, { name: 'actions', - label: translate('Actions'), + label: () => translate('Actions'), isVisible: true } ]; diff --git a/frontend/src/System/Tasks/Queued/QueuedTasks.js b/frontend/src/System/Tasks/Queued/QueuedTasks.js index 5dc901ae4..dac38f1d4 100644 --- a/frontend/src/System/Tasks/Queued/QueuedTasks.js +++ b/frontend/src/System/Tasks/Queued/QueuedTasks.js @@ -15,27 +15,27 @@ const columns = [ }, { name: 'commandName', - label: translate('Name'), + label: () => translate('Name'), isVisible: true }, { name: 'queued', - label: translate('Queued'), + label: () => translate('Queued'), isVisible: true }, { name: 'started', - label: translate('Started'), + label: () => translate('Started'), isVisible: true }, { name: 'ended', - label: translate('Ended'), + label: () => translate('Ended'), isVisible: true }, { name: 'duration', - label: translate('Duration'), + label: () => translate('Duration'), isVisible: true }, { diff --git a/frontend/src/System/Tasks/Scheduled/ScheduledTasks.js b/frontend/src/System/Tasks/Scheduled/ScheduledTasks.js index 8dbe5c08b..bec151613 100644 --- a/frontend/src/System/Tasks/Scheduled/ScheduledTasks.js +++ b/frontend/src/System/Tasks/Scheduled/ScheduledTasks.js @@ -10,27 +10,27 @@ import ScheduledTaskRowConnector from './ScheduledTaskRowConnector'; const columns = [ { name: 'name', - label: translate('Name'), + label: () => translate('Name'), isVisible: true }, { name: 'interval', - label: translate('Interval'), + label: () => translate('Interval'), isVisible: true }, { name: 'lastExecution', - label: translate('LastExecution'), + label: () => translate('LastExecution'), isVisible: true }, { name: 'lastDuration', - label: translate('LastDuration'), + label: () => translate('LastDuration'), isVisible: true }, { name: 'nextExecution', - label: translate('NextExecution'), + label: () => translate('NextExecution'), isVisible: true }, { From c93d6cff635a992f64c6e643b7d006b24f095c9a Mon Sep 17 00:00:00 2001 From: Servarr Date: Thu, 3 Aug 2023 14:27:25 +0000 Subject: [PATCH 072/964] Automated API Docs update [skip ci] --- src/Prowlarr.Api.V1/openapi.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index 64c798de5..b0d85055e 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -2195,18 +2195,6 @@ } } }, - "/initialize.js": { - "get": { - "tags": [ - "InitializeJs" - ], - "responses": { - "200": { - "description": "Success" - } - } - } - }, "/api/v1/localization": { "get": { "tags": [ From 0bfb557470dc92bbf9a02c0e8cd76bd104e27a4b Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 3 Aug 2023 17:55:50 -0700 Subject: [PATCH 073/964] Prevent NullRef in ContainsInvalidPathChars (cherry picked from commit 5f7217844533907d7fc6287a48efb31987736c4c) --- src/NzbDrone.Common/Extensions/PathExtensions.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Common/Extensions/PathExtensions.cs b/src/NzbDrone.Common/Extensions/PathExtensions.cs index f2d82f10e..b7af090bc 100644 --- a/src/NzbDrone.Common/Extensions/PathExtensions.cs +++ b/src/NzbDrone.Common/Extensions/PathExtensions.cs @@ -158,6 +158,11 @@ namespace NzbDrone.Common.Extensions public static bool ContainsInvalidPathChars(this string text) { + if (text.IsNullOrWhiteSpace()) + { + throw new ArgumentNullException("text"); + } + return text.IndexOfAny(Path.GetInvalidPathChars()) >= 0; } From 3c5eefc3498523def7992eb332108f2574e84493 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 4 Aug 2023 03:38:53 +0300 Subject: [PATCH 074/964] New: Health check for indexers with invalid download client (cherry picked from commit 377fce6fe15c0875c4bd33f1371a31af79c9310c) --- .../Checks/IndexerDownloadClientCheck.cs | 49 +++++++++++++++++++ src/NzbDrone.Core/Localization/Core/en.json | 1 + 2 files changed, 50 insertions(+) create mode 100644 src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs new file mode 100644 index 000000000..0d1682efc --- /dev/null +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs @@ -0,0 +1,49 @@ +using System.Linq; +using NzbDrone.Core.Download; +using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; +using NzbDrone.Core.ThingiProvider.Events; + +namespace NzbDrone.Core.HealthCheck.Checks +{ + [CheckOn(typeof(ProviderUpdatedEvent))] + [CheckOn(typeof(ProviderDeletedEvent))] + [CheckOn(typeof(ProviderBulkUpdatedEvent))] + [CheckOn(typeof(ProviderBulkDeletedEvent))] + [CheckOn(typeof(ProviderUpdatedEvent))] + [CheckOn(typeof(ProviderDeletedEvent))] + [CheckOn(typeof(ProviderBulkUpdatedEvent))] + [CheckOn(typeof(ProviderBulkDeletedEvent))] + public class IndexerDownloadClientCheck : HealthCheckBase + { + private readonly IIndexerFactory _indexerFactory; + private readonly IDownloadClientFactory _downloadClientFactory; + + public IndexerDownloadClientCheck(IIndexerFactory indexerFactory, + IDownloadClientFactory downloadClientFactory, + ILocalizationService localizationService) + : base(localizationService) + { + _indexerFactory = indexerFactory; + _downloadClientFactory = downloadClientFactory; + } + + public override HealthCheck Check() + { + var downloadClientsIds = _downloadClientFactory.All().Where(v => v.Enable).Select(v => v.Id).ToList(); + var invalidIndexers = _indexerFactory.All() + .Where(v => v.Enable && v.DownloadClientId > 0 && !downloadClientsIds.Contains(v.DownloadClientId)) + .ToList(); + + if (invalidIndexers.Any()) + { + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + string.Format(_localizationService.GetLocalizedString("IndexerDownloadClientHealthCheckMessage"), string.Join(", ", invalidIndexers.Select(v => v.Name).ToArray())), + "#invalid-indexer-download-client-setting"); + } + + return new HealthCheck(GetType()); + } + } +} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index a8d6e58f6..8c267fcae 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -229,6 +229,7 @@ "IndexerCategories": "Indexer Categories", "IndexerDetails": "Indexer Details", "IndexerDisabled": "Indexer Disabled", + "IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {0}.", "IndexerDownloadClientHelpText": "Specify which download client is used for grabs made within Prowlarr from this indexer", "IndexerFailureRate": "Indexer Failure Rate", "IndexerFlags": "Indexer Flags", From 1100f350ae31e26657a75da5f680be58340cb44d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 4 Aug 2023 07:05:31 +0300 Subject: [PATCH 075/964] Fix translations for option values --- .../Form/HintedSelectInputOption.js | 4 ++-- frontend/src/Search/QueryParameterModal.js | 10 ++++----- .../EditApplicationModalContent.js | 21 ++++++++++++++++--- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/frontend/src/Components/Form/HintedSelectInputOption.js b/frontend/src/Components/Form/HintedSelectInputOption.js index 65e5fdfc9..4f59fc0a4 100644 --- a/frontend/src/Components/Form/HintedSelectInputOption.js +++ b/frontend/src/Components/Form/HintedSelectInputOption.js @@ -33,7 +33,7 @@ function HintedSelectInputOption(props) { isMobile && styles.isMobile )} > -
{value}
+
{typeof value === 'function' ? value() : value}
{ hint != null && @@ -48,7 +48,7 @@ function HintedSelectInputOption(props) { HintedSelectInputOption.propTypes = { id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, - value: PropTypes.string.isRequired, + value: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired, hint: PropTypes.node, depth: PropTypes.number, isSelected: PropTypes.bool.isRequired, diff --git a/frontend/src/Search/QueryParameterModal.js b/frontend/src/Search/QueryParameterModal.js index 863ccc003..cd7b8e191 100644 --- a/frontend/src/Search/QueryParameterModal.js +++ b/frontend/src/Search/QueryParameterModal.js @@ -14,11 +14,11 @@ import QueryParameterOption from './QueryParameterOption'; import styles from './QueryParameterModal.css'; const searchOptions = [ - { key: 'search', value: translate('BasicSearch') }, - { key: 'tvsearch', value: translate('TvSearch') }, - { key: 'movie', value: translate('MovieSearch') }, - { key: 'music', value: translate( 'AudioSearch') }, - { key: 'book', value: translate('BookSearch') } + { key: 'search', value: () => translate('BasicSearch') }, + { key: 'tvsearch', value: () => translate('TvSearch') }, + { key: 'movie', value: () => translate('MovieSearch') }, + { key: 'music', value: () => translate( 'AudioSearch') }, + { key: 'book', value: () => translate('BookSearch') } ]; const seriesTokens = [ diff --git a/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js b/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js index ee1822610..88ad57076 100644 --- a/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js +++ b/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js @@ -19,9 +19,24 @@ import translate from 'Utilities/String/translate'; import styles from './EditApplicationModalContent.css'; const syncLevelOptions = [ - { key: 'disabled', value: translate('Disabled') }, - { key: 'addOnly', value: translate('AddRemoveOnly') }, - { key: 'fullSync', value: translate('FullSync') } + { + key: 'disabled', + get value() { + return translate('Disabled'); + } + }, + { + key: 'addOnly', + get value() { + return translate('AddRemoveOnly'); + } + }, + { + key: 'fullSync', + get value() { + return translate('FullSync'); + } + } ]; function EditApplicationModalContent(props) { From 141f1597dc9445b611f01955bb28eea172a121b0 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 3 Aug 2023 19:54:44 -0700 Subject: [PATCH 076/964] New: Ignore inaccessible files with getting files (cherry picked from commit e5aa8584100d96a2077c57f74ae5b2ceab63de19) --- .../DiskTests/DiskTransferServiceFixture.cs | 6 ++-- src/NzbDrone.Common/ArchiveService.cs | 5 +-- src/NzbDrone.Common/Disk/DiskProviderBase.cs | 31 ++++++++++++------- src/NzbDrone.Common/Disk/IDiskProvider.cs | 6 ++-- .../EnvironmentInfo/AppFolderFactory.cs | 2 +- src/NzbDrone.Core/Backup/BackupService.cs | 6 ++-- .../MacOsVersionAdapterFixture.cs | 6 ++-- .../ReleaseFileVersionAdapterFixture.cs | 10 +++--- .../IssueFileVersionAdapter.cs | 3 +- .../VersionAdapters/MacOsVersionAdapter.cs | 3 +- .../ReleaseFileVersionAdapter.cs | 3 +- .../VersionAdapters/SynologyVersionAdapter.cs | 3 +- src/Prowlarr.Api.V1/Logs/LogFileController.cs | 2 +- .../Logs/UpdateLogFileController.cs | 2 +- 14 files changed, 47 insertions(+), 41 deletions(-) diff --git a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs index 4fca6ca40..b01ac65db 100644 --- a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs +++ b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs @@ -837,7 +837,7 @@ namespace NzbDrone.Common.Test.DiskTests // Note: never returns anything. Mocker.GetMock() - .Setup(v => v.GetFileInfos(It.IsAny(), SearchOption.TopDirectoryOnly)) + .Setup(v => v.GetFileInfos(It.IsAny(), false)) .Returns(new List()); Mocker.GetMock() @@ -875,8 +875,8 @@ namespace NzbDrone.Common.Test.DiskTests .Returns(v => new DirectoryInfo(v).GetDirectories().ToList()); Mocker.GetMock() - .Setup(v => v.GetFileInfos(It.IsAny(), SearchOption.TopDirectoryOnly)) - .Returns((v, _) => new DirectoryInfo(v).GetFiles().ToList()); + .Setup(v => v.GetFileInfos(It.IsAny(), false)) + .Returns((v, _) => new DirectoryInfo(v).GetFiles().ToList()); Mocker.GetMock() .Setup(v => v.GetFileSize(It.IsAny())) diff --git a/src/NzbDrone.Common/ArchiveService.cs b/src/NzbDrone.Common/ArchiveService.cs index 4cd6f6835..800d240ab 100644 --- a/src/NzbDrone.Common/ArchiveService.cs +++ b/src/NzbDrone.Common/ArchiveService.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.GZip; @@ -11,7 +12,7 @@ namespace NzbDrone.Common public interface IArchiveService { void Extract(string compressedFile, string destination); - void CreateZip(string path, params string[] files); + void CreateZip(string path, IEnumerable files); } public class ArchiveService : IArchiveService @@ -39,7 +40,7 @@ namespace NzbDrone.Common _logger.Debug("Extraction complete."); } - public void CreateZip(string path, params string[] files) + public void CreateZip(string path, IEnumerable files) { using (var zipFile = ZipFile.Create(path)) { diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index 521cb61df..c386aa001 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -46,7 +46,7 @@ namespace NzbDrone.Common.Disk { CheckFolderExists(path); - var dirFiles = GetFiles(path, SearchOption.AllDirectories).ToList(); + var dirFiles = GetFiles(path, true).ToList(); if (!dirFiles.Any()) { @@ -149,25 +149,29 @@ namespace NzbDrone.Common.Disk return Directory.EnumerateFileSystemEntries(path).Empty(); } - public string[] GetDirectories(string path) + public IEnumerable GetDirectories(string path) { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - return Directory.GetDirectories(path); + return Directory.EnumerateDirectories(path); } - public string[] GetFiles(string path, SearchOption searchOption) + public IEnumerable GetFiles(string path, bool recursive) { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - return Directory.GetFiles(path, "*.*", searchOption); + return Directory.EnumerateFiles(path, "*", new EnumerationOptions + { + RecurseSubdirectories = recursive, + IgnoreInaccessible = true + }); } public long GetFolderSize(string path) { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - return GetFiles(path, SearchOption.AllDirectories).Sum(e => new FileInfo(e).Length); + return GetFiles(path, true).Sum(e => new FileInfo(e).Length); } public long GetFileSize(string path) @@ -288,8 +292,9 @@ namespace NzbDrone.Common.Disk { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - var files = Directory.GetFiles(path, "*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); - Array.ForEach(files, RemoveReadOnly); + var files = GetFiles(path, recursive); + + files.ToList().ForEach(RemoveReadOnly); Directory.Delete(path, recursive); } @@ -414,7 +419,7 @@ namespace NzbDrone.Common.Disk { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - foreach (var file in GetFiles(path, SearchOption.TopDirectoryOnly)) + foreach (var file in GetFiles(path, false)) { DeleteFile(file); } @@ -515,13 +520,17 @@ namespace NzbDrone.Common.Disk return new FileInfo(path); } - public List GetFileInfos(string path, SearchOption searchOption = SearchOption.TopDirectoryOnly) + public List GetFileInfos(string path, bool recursive = false) { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); var di = new DirectoryInfo(path); - return di.GetFiles("*", searchOption).ToList(); + return di.EnumerateFiles("*", new EnumerationOptions + { + RecurseSubdirectories = recursive, + IgnoreInaccessible = true + }).ToList(); } public void RemoveEmptySubfolders(string path) diff --git a/src/NzbDrone.Common/Disk/IDiskProvider.cs b/src/NzbDrone.Common/Disk/IDiskProvider.cs index 6c33692c3..46589411a 100644 --- a/src/NzbDrone.Common/Disk/IDiskProvider.cs +++ b/src/NzbDrone.Common/Disk/IDiskProvider.cs @@ -22,8 +22,8 @@ namespace NzbDrone.Common.Disk bool FileExists(string path, StringComparison stringComparison); bool FolderWritable(string path); bool FolderEmpty(string path); - string[] GetDirectories(string path); - string[] GetFiles(string path, SearchOption searchOption); + IEnumerable GetDirectories(string path); + IEnumerable GetFiles(string path, bool recursive); long GetFolderSize(string path); long GetFileSize(string path); void CreateFolder(string path); @@ -52,7 +52,7 @@ namespace NzbDrone.Common.Disk IMount GetMount(string path); List GetDirectoryInfos(string path); FileInfo GetFileInfo(string path); - List GetFileInfos(string path, SearchOption searchOption = SearchOption.TopDirectoryOnly); + List GetFileInfos(string path, bool recursive = false); void RemoveEmptySubfolders(string path); void SaveStream(Stream stream, string path); bool IsValidFolderPermissionMask(string mask); diff --git a/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs b/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs index 78caf0b12..178ce7a0f 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs @@ -159,7 +159,7 @@ namespace NzbDrone.Common.EnvironmentInfo private void CleanupSqLiteRollbackFiles() { - _diskProvider.GetFiles(_appFolderInfo.AppDataFolder, SearchOption.TopDirectoryOnly) + _diskProvider.GetFiles(_appFolderInfo.AppDataFolder, false) .Where(f => Path.GetFileName(f).StartsWith("nzbdrone.db")) .ToList() .ForEach(_diskProvider.DeleteFile); diff --git a/src/NzbDrone.Core/Backup/BackupService.cs b/src/NzbDrone.Core/Backup/BackupService.cs index 97f13ee15..14fc91efc 100644 --- a/src/NzbDrone.Core/Backup/BackupService.cs +++ b/src/NzbDrone.Core/Backup/BackupService.cs @@ -89,7 +89,7 @@ namespace NzbDrone.Core.Backup // Delete journal file created during database backup _diskProvider.DeleteFile(Path.Combine(_backupTempFolder, "prowlarr.db-journal")); - _archiveService.CreateZip(backupPath, _diskProvider.GetFiles(_backupTempFolder, SearchOption.TopDirectoryOnly)); + _archiveService.CreateZip(backupPath, _diskProvider.GetFiles(_backupTempFolder, false)); Cleanup(); @@ -128,7 +128,7 @@ namespace NzbDrone.Core.Backup _archiveService.Extract(backupFileName, temporaryPath); - foreach (var file in _diskProvider.GetFiles(temporaryPath, SearchOption.TopDirectoryOnly)) + foreach (var file in _diskProvider.GetFiles(temporaryPath, false)) { var fileName = Path.GetFileName(file); @@ -243,7 +243,7 @@ namespace NzbDrone.Core.Backup private IEnumerable GetBackupFiles(string path) { - var files = _diskProvider.GetFiles(path, SearchOption.TopDirectoryOnly); + var files = _diskProvider.GetFiles(path, false); return files.Where(f => BackupFileRegex.IsMatch(f)); } diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs index f0dbe0a85..b4df1027a 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs @@ -25,7 +25,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters .Setup(c => c.FolderExists("/System/Library/CoreServices/")).Returns(true); Mocker.GetMock() - .Setup(c => c.GetFiles("/System/Library/CoreServices/", SearchOption.TopDirectoryOnly)) + .Setup(c => c.GetFiles("/System/Library/CoreServices/", false)) .Returns(new[] { plistPath }); Mocker.GetMock() @@ -49,7 +49,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters .Setup(c => c.FolderExists("/System/Library/CoreServices/")).Returns(true); Mocker.GetMock() - .Setup(c => c.GetFiles("/System/Library/CoreServices/", SearchOption.TopDirectoryOnly)) + .Setup(c => c.GetFiles("/System/Library/CoreServices/", false)) .Returns(new[] { plistPath }); Mocker.GetMock() @@ -69,7 +69,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters Subject.Read().Should().BeNull(); Mocker.GetMock() - .Verify(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly), Times.Never()); + .Verify(c => c.GetFiles(It.IsAny(), false), Times.Never()); } } } diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs index 0c3257657..496f4eefa 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs @@ -29,25 +29,25 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters } [Test] - public void should_return_null_if_etc_doestn_exist() + public void should_return_null_if_etc_doesnt_exist() { Mocker.GetMock().Setup(c => c.FolderExists("/etc/")).Returns(false); Subject.Read().Should().BeNull(); Mocker.GetMock() - .Verify(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly), Times.Never()); + .Verify(c => c.GetFiles(It.IsAny(), false), Times.Never()); Subject.Read().Should().BeNull(); } [Test] - public void should_return_null_if_release_file_doestn_exist() + public void should_return_null_if_release_file_doesnt_exist() { Mocker.GetMock().Setup(c => c.FolderExists("/etc/")).Returns(true); Subject.Read().Should().BeNull(); Mocker.GetMock() - .Setup(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly)).Returns(Array.Empty()); + .Setup(c => c.GetFiles(It.IsAny(), false)).Returns(Array.Empty()); Subject.Read().Should().BeNull(); } @@ -59,7 +59,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters Subject.Read().Should().BeNull(); Mocker.GetMock() - .Setup(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly)).Returns(new[] + .Setup(c => c.GetFiles(It.IsAny(), false)).Returns(new[] { "/etc/lsb-release", "/etc/os-release" diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs index 2965f5a1a..4113c3993 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs @@ -1,4 +1,3 @@ -using System.IO; using System.Linq; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; @@ -21,7 +20,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters return null; } - var issueFile = _diskProvider.GetFiles("/etc/", SearchOption.TopDirectoryOnly).SingleOrDefault(c => c.EndsWith("/issue")); + var issueFile = _diskProvider.GetFiles("/etc/", false).SingleOrDefault(c => c.EndsWith("/issue")); if (issueFile == null) { diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs index 59f743da2..1171334b5 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs @@ -1,4 +1,3 @@ -using System.IO; using System.Linq; using System.Text.RegularExpressions; using NLog; @@ -33,7 +32,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters return null; } - var allFiles = _diskProvider.GetFiles(PLIST_DIR, SearchOption.TopDirectoryOnly); + var allFiles = _diskProvider.GetFiles(PLIST_DIR, false); var versionFile = allFiles.SingleOrDefault(c => c.EndsWith("/SystemVersion.plist") || diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs index 9347176b2..77c4b9edc 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs @@ -1,4 +1,3 @@ -using System.IO; using System.Linq; using System.Text.RegularExpressions; using NzbDrone.Common.Disk; @@ -22,7 +21,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters return null; } - var releaseFiles = _diskProvider.GetFiles("/etc/", SearchOption.TopDirectoryOnly).Where(c => c.EndsWith("release")).ToList(); + var releaseFiles = _diskProvider.GetFiles("/etc/", false).Where(c => c.EndsWith("release")).ToList(); var name = "Linux"; var fullName = ""; diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs index 994867527..b27c0d7e4 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs @@ -1,4 +1,3 @@ -using System.IO; using System.Linq; using System.Text.RegularExpressions; using NzbDrone.Common.Disk; @@ -24,7 +23,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters return null; } - var versionFile = _diskProvider.GetFiles("/etc.defaults/", SearchOption.TopDirectoryOnly).SingleOrDefault(c => c.EndsWith("VERSION")); + var versionFile = _diskProvider.GetFiles("/etc.defaults/", false).SingleOrDefault(c => c.EndsWith("VERSION")); if (versionFile == null) { diff --git a/src/Prowlarr.Api.V1/Logs/LogFileController.cs b/src/Prowlarr.Api.V1/Logs/LogFileController.cs index 9f43b0a21..d4c901df9 100644 --- a/src/Prowlarr.Api.V1/Logs/LogFileController.cs +++ b/src/Prowlarr.Api.V1/Logs/LogFileController.cs @@ -25,7 +25,7 @@ namespace Prowlarr.Api.V1.Logs protected override IEnumerable GetLogFiles() { - return _diskProvider.GetFiles(_appFolderInfo.GetLogFolder(), SearchOption.TopDirectoryOnly); + return _diskProvider.GetFiles(_appFolderInfo.GetLogFolder(), false); } protected override string GetLogFilePath(string filename) diff --git a/src/Prowlarr.Api.V1/Logs/UpdateLogFileController.cs b/src/Prowlarr.Api.V1/Logs/UpdateLogFileController.cs index f2a07f8c5..c7e4a2cdf 100644 --- a/src/Prowlarr.Api.V1/Logs/UpdateLogFileController.cs +++ b/src/Prowlarr.Api.V1/Logs/UpdateLogFileController.cs @@ -32,7 +32,7 @@ namespace Prowlarr.Api.V1.Logs return Enumerable.Empty(); } - return _diskProvider.GetFiles(_appFolderInfo.GetUpdateLogFolder(), SearchOption.TopDirectoryOnly) + return _diskProvider.GetFiles(_appFolderInfo.GetUpdateLogFolder(), false) .Where(f => Regex.IsMatch(Path.GetFileName(f), LOGFILE_ROUTE.TrimStart('/'), RegexOptions.IgnoreCase)) .ToList(); } From 6961c5a1c60a196ffbde0b285e1fbdca454e1ffe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 4 Aug 2023 17:20:28 +0300 Subject: [PATCH 077/964] Fixed: (AlphaRatio) Use FL tokens only if `canUseToken` is true Fixes #1811 --- .../Indexers/Definitions/AlphaRatio.cs | 29 +++++++++++++++++++ .../Definitions/Gazelle/GazelleParser.cs | 6 ++-- .../Indexers/Definitions/GreatPosterWall.cs | 2 +- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs b/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs index ef9d70139..aa8d6d9b4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using NLog; +using NzbDrone.Common.Http; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers.Definitions.Gazelle; @@ -29,6 +30,11 @@ public class AlphaRatio : GazelleBase return new AlphaRatioRequestGenerator(Settings, Capabilities, _httpClient, _logger); } + public override IParseIndexerResponse GetParser() + { + return new AlphaRatioParser(Settings, Capabilities); + } + protected override IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities @@ -110,6 +116,29 @@ public class AlphaRatioRequestGenerator : GazelleRequestGenerator } } +public class AlphaRatioParser : GazelleParser +{ + public AlphaRatioParser(AlphaRatioSettings settings, IndexerCapabilities capabilities) + : base(settings, capabilities) + { + } + + protected override string GetDownloadUrl(int torrentId, bool canUseToken) + { + var url = new HttpUri(Settings.BaseUrl) + .CombinePath("/torrents.php") + .AddQueryParam("action", "download") + .AddQueryParam("id", torrentId); + + if (Settings.UseFreeleechToken && canUseToken) + { + url = url.AddQueryParam("usetoken", "1"); + } + + return url.FullUri; + } +} + public class AlphaRatioSettings : GazelleSettings { [FieldDefinition(6, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Search freeleech torrents only")] diff --git a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs index fab9ee8d2..cd6b08ada 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs @@ -78,7 +78,7 @@ public class GazelleParser : IParseIndexerResponse Grabs = torrent.Snatches, Codec = torrent.Format, Size = long.Parse(torrent.Size), - DownloadUrl = GetDownloadUrl(id), + DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken), InfoUrl = infoUrl, Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), @@ -113,7 +113,7 @@ public class GazelleParser : IParseIndexerResponse Guid = infoUrl, Title = groupName, Size = long.Parse(result.Size), - DownloadUrl = GetDownloadUrl(id), + DownloadUrl = GetDownloadUrl(id, result.CanUseToken), InfoUrl = infoUrl, Seeders = int.Parse(result.Seeders), Peers = int.Parse(result.Leechers) + int.Parse(result.Seeders), @@ -146,7 +146,7 @@ public class GazelleParser : IParseIndexerResponse .ToArray(); } - protected virtual string GetDownloadUrl(int torrentId) + protected virtual string GetDownloadUrl(int torrentId, bool canUseToken) { var url = new HttpUri(Settings.BaseUrl) .CombinePath("/torrents.php") diff --git a/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs b/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs index ace0e0829..744dbf642 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs @@ -227,7 +227,7 @@ public class GreatPosterWallParser : GazelleParser .ToArray(); } - private string GetDownloadUrl(int torrentId, bool canUseToken) + protected override string GetDownloadUrl(int torrentId, bool canUseToken) { var url = new HttpUri(_settings.BaseUrl) .CombinePath("/torrents.php") From ea73466f6a714bfc00131861ce13f1701c2c745f Mon Sep 17 00:00:00 2001 From: TwentyNine78 <31310559+twentynine78@users.noreply.github.com> Date: Tue, 22 Jun 2021 05:29:50 +0200 Subject: [PATCH 078/964] Fixed: Compatibility with the new Download Station API (cherry picked from commit 49e90463e57929e7b9885f1b7b0eb05bd7cc3ebe) --- .../Clients/DownloadStation/DiskStationApi.cs | 3 +- .../DownloadStation/DiskStationApiInfo.cs | 2 +- .../DownloadStation/DownloadStation2Task.cs | 27 ++++ .../DownloadStation/DownloadStationTask.cs | 2 +- .../DownloadStationTaskAdditional.cs | 2 +- .../DownloadStationTaskFile.cs | 2 +- .../DownloadStation/Proxies/DSMInfoProxy.cs | 4 +- .../Proxies/DiskStationProxyBase.cs | 18 ++- .../Proxies/DownloadStationInfoProxy.cs | 4 +- .../DownloadStationTaskProxySelector.cs | 68 ++++++++++ ...Proxy.cs => DownloadStationTaskProxyV1.cs} | 17 ++- .../Proxies/DownloadStationTaskProxyV2.cs | 119 ++++++++++++++++++ .../Proxies/FileStationProxy.cs | 2 +- .../Responses/DSMInfoResponse.cs | 2 +- .../Responses/DiskStationAuthResponse.cs | 2 +- .../Responses/DiskStationError.cs | 22 ++-- .../Responses/DiskStationInfoResponse.cs | 2 +- .../Responses/DiskStationResponse.cs | 2 +- .../DownloadStation2TaskInfoResponse.cs | 11 ++ .../DownloadStationTaskInfoResponse.cs | 2 +- .../FileStationListFileInfoResponse.cs | 2 +- .../Responses/FileStationListResponse.cs | 2 +- .../DownloadStation/SerialNumberProvider.cs | 3 +- .../DownloadStation/SharedFolderMapping.cs | 2 +- .../DownloadStation/SharedFolderResolver.cs | 3 +- .../DownloadStation/TorrentDownloadStation.cs | 17 +-- .../DownloadStation/UsenetDownloadStation.cs | 17 +-- 27 files changed, 305 insertions(+), 54 deletions(-) create mode 100644 src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStation2Task.cs create mode 100644 src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxySelector.cs rename src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/{DownloadStationTaskProxy.cs => DownloadStationTaskProxyV1.cs} (79%) create mode 100644 src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV2.cs create mode 100644 src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DownloadStation2TaskInfoResponse.cs diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/DiskStationApi.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/DiskStationApi.cs index 8fcefdd51..9b3cbfc33 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/DiskStationApi.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/DiskStationApi.cs @@ -1,4 +1,4 @@ -namespace NzbDrone.Core.Download.Clients.DownloadStation +namespace NzbDrone.Core.Download.Clients.DownloadStation { public enum DiskStationApi { @@ -6,6 +6,7 @@ Auth, DownloadStationInfo, DownloadStationTask, + DownloadStation2Task, FileStationList, DSMInfo, } diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/DiskStationApiInfo.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/DiskStationApiInfo.cs index 60f84c672..b507747b3 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/DiskStationApiInfo.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/DiskStationApiInfo.cs @@ -1,4 +1,4 @@ -namespace NzbDrone.Core.Download.Clients.DownloadStation +namespace NzbDrone.Core.Download.Clients.DownloadStation { public class DiskStationApiInfo { diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStation2Task.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStation2Task.cs new file mode 100644 index 000000000..ef52bb7e0 --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStation2Task.cs @@ -0,0 +1,27 @@ +namespace NzbDrone.Core.Download.Clients.DownloadStation +{ + public class DownloadStation2Task + { + public string Username { get; set; } + + public string Id { get; set; } + + public string Title { get; set; } + + public long Size { get; set; } + + /// + /// /// Possible values are: BT, NZB, http, ftp, eMule and https + /// + public string Type { get; set; } + + public int Status { get; set; } + + public DownloadStationTaskAdditional Additional { get; set; } + + public override string ToString() + { + return this.Title; + } + } +} diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTask.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTask.cs index 41faac633..3c5de2fb9 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTask.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTask.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using Newtonsoft.Json; using NzbDrone.Common.Serializer; diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTaskAdditional.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTaskAdditional.cs index 81e55569e..79c893ab5 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTaskAdditional.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTaskAdditional.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using Newtonsoft.Json; namespace NzbDrone.Core.Download.Clients.DownloadStation diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTaskFile.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTaskFile.cs index 2538e3e10..6cc396cd7 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTaskFile.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationTaskFile.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; using Newtonsoft.Json.Converters; namespace NzbDrone.Core.Download.Clients.DownloadStation diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DSMInfoProxy.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DSMInfoProxy.cs index 322296c06..46808fcbc 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DSMInfoProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DSMInfoProxy.cs @@ -1,4 +1,4 @@ -using NLog; +using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Http; using NzbDrone.Core.Download.Clients.DownloadStation.Responses; @@ -13,7 +13,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies public class DSMInfoProxy : DiskStationProxyBase, IDSMInfoProxy { public DSMInfoProxy(IHttpClient httpClient, ICacheManager cacheManager, Logger logger) - : base(DiskStationApi.DSMInfo, "SYNO.DSM.Info", httpClient, cacheManager, logger) + : base(DiskStationApi.DSMInfo, "SYNO.DSM.Info", httpClient, cacheManager, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DiskStationProxyBase.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DiskStationProxyBase.cs index 213b3e505..c1507aa2e 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DiskStationProxyBase.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DiskStationProxyBase.cs @@ -172,7 +172,14 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies { if (apiInfo.NeedsAuthentication) { - requestBuilder.AddFormParameter("_sid", _sessionCache.Get(GenerateSessionCacheKey(settings), () => AuthenticateClient(settings), TimeSpan.FromHours(6))); + if (_apiType == DiskStationApi.DownloadStation2Task) + { + requestBuilder.AddQueryParam("_sid", _sessionCache.Get(GenerateSessionCacheKey(settings), () => AuthenticateClient(settings), TimeSpan.FromHours(6))); + } + else + { + requestBuilder.AddFormParameter("_sid", _sessionCache.Get(GenerateSessionCacheKey(settings), () => AuthenticateClient(settings), TimeSpan.FromHours(6))); + } } requestBuilder.AddFormParameter("api", apiInfo.Name); @@ -242,7 +249,14 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies if (info == null) { - throw new DownloadClientException("Info of {0} not found on {1}:{2}", api, settings.Host, settings.Port); + if (api == DiskStationApi.DownloadStation2Task) + { + _logger.Warn("Info of {0} not found on {1}:{2}", api, settings.Host, settings.Port); + } + else + { + throw new DownloadClientException("Info of {0} not found on {1}:{2}", api, settings.Host, settings.Port); + } } } diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationInfoProxy.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationInfoProxy.cs index 1723fcc80..5fe44ddfd 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationInfoProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationInfoProxy.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Http; @@ -13,7 +13,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies public class DownloadStationInfoProxy : DiskStationProxyBase, IDownloadStationInfoProxy { public DownloadStationInfoProxy(IHttpClient httpClient, ICacheManager cacheManager, Logger logger) - : base(DiskStationApi.DownloadStationInfo, "SYNO.DownloadStation.Info", httpClient, cacheManager, logger) + : base(DiskStationApi.DownloadStationInfo, "SYNO.DownloadStation.Info", httpClient, cacheManager, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxySelector.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxySelector.cs new file mode 100644 index 000000000..1eae7930e --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxySelector.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using NLog; +using NzbDrone.Common.Cache; + +namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies +{ + public interface IDownloadStationTaskProxy : IDiskStationProxy + { + bool IsApiSupported(DownloadStationSettings settings); + IEnumerable GetTasks(DownloadStationSettings settings); + void RemoveTask(string downloadId, DownloadStationSettings settings); + void AddTaskFromUrl(string url, string downloadDirectory, DownloadStationSettings settings); + void AddTaskFromData(byte[] data, string filename, string downloadDirectory, DownloadStationSettings settings); + } + + public interface IDownloadStationTaskProxySelector + { + IDownloadStationTaskProxy GetProxy(DownloadStationSettings settings); + } + + public class DownloadStationTaskProxySelector : IDownloadStationTaskProxySelector + { + private readonly ICached _proxyCache; + private readonly Logger _logger; + + private readonly IDownloadStationTaskProxy _proxyV1; + private readonly IDownloadStationTaskProxy _proxyV2; + + public DownloadStationTaskProxySelector(DownloadStationTaskProxyV1 proxyV1, DownloadStationTaskProxyV2 proxyV2, ICacheManager cacheManager, Logger logger) + { + _proxyCache = cacheManager.GetCache(GetType(), "taskProxy"); + _logger = logger; + + _proxyV1 = proxyV1; + _proxyV2 = proxyV2; + } + + public IDownloadStationTaskProxy GetProxy(DownloadStationSettings settings) + { + return GetProxyCache(settings); + } + + private IDownloadStationTaskProxy GetProxyCache(DownloadStationSettings settings) + { + var propKey = $"{settings.Host}_{settings.Port}"; + + return _proxyCache.Get(propKey, () => FetchProxy(settings), TimeSpan.FromMinutes(10.0)); + } + + private IDownloadStationTaskProxy FetchProxy(DownloadStationSettings settings) + { + if (_proxyV2.IsApiSupported(settings)) + { + _logger.Trace("Using DownloadStation Task API v2"); + return _proxyV2; + } + + if (_proxyV1.IsApiSupported(settings)) + { + _logger.Trace("Using DownloadStation Task API v1"); + return _proxyV1; + } + + throw new DownloadClientException("Unable to determine DownloadStations Task API version"); + } + } +} diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxy.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV1.cs similarity index 79% rename from src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxy.cs rename to src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV1.cs index 5ae04a152..13e5131fb 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV1.cs @@ -9,21 +9,18 @@ using NzbDrone.Core.Download.Clients.DownloadStation.Responses; namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies { - public interface IDownloadStationTaskProxy : IDiskStationProxy + public class DownloadStationTaskProxyV1 : DiskStationProxyBase, IDownloadStationTaskProxy { - IEnumerable GetTasks(DownloadStationSettings settings); - void RemoveTask(string downloadId, DownloadStationSettings settings); - void AddTaskFromUrl(string url, string downloadDirectory, DownloadStationSettings settings); - void AddTaskFromData(byte[] data, string filename, string downloadDirectory, DownloadStationSettings settings); - } - - public class DownloadStationTaskProxy : DiskStationProxyBase, IDownloadStationTaskProxy - { - public DownloadStationTaskProxy(IHttpClient httpClient, ICacheManager cacheManager, Logger logger) + public DownloadStationTaskProxyV1(IHttpClient httpClient, ICacheManager cacheManager, Logger logger) : base(DiskStationApi.DownloadStationTask, "SYNO.DownloadStation.Task", httpClient, cacheManager, logger) { } + public bool IsApiSupported(DownloadStationSettings settings) + { + return GetApiInfo(settings) != null; + } + public void AddTaskFromData(byte[] data, string filename, string downloadDirectory, DownloadStationSettings settings) { var requestBuilder = BuildRequest(settings, "create", 2, HttpMethod.Post); diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV2.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV2.cs new file mode 100644 index 000000000..6f81c3ac3 --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV2.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using NLog; +using NzbDrone.Common.Cache; +using NzbDrone.Common.Extensions; +using NzbDrone.Common.Http; +using NzbDrone.Core.Download.Clients.DownloadStation.Responses; + +namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies +{ + public class DownloadStationTaskProxyV2 : DiskStationProxyBase, IDownloadStationTaskProxy + { + public DownloadStationTaskProxyV2(IHttpClient httpClient, ICacheManager cacheManager, Logger logger) + : base(DiskStationApi.DownloadStation2Task, "SYNO.DownloadStation2.Task", httpClient, cacheManager, logger) + { + } + + public bool IsApiSupported(DownloadStationSettings settings) + { + return GetApiInfo(settings) != null; + } + + public void AddTaskFromData(byte[] data, string filename, string downloadDirectory, DownloadStationSettings settings) + { + var requestBuilder = BuildRequest(settings, "create", 2, HttpMethod.Post); + + requestBuilder.AddFormParameter("type", "\"file\""); + requestBuilder.AddFormParameter("file", "[\"fileData\"]"); + requestBuilder.AddFormParameter("create_list", "false"); + + if (downloadDirectory.IsNotNullOrWhiteSpace()) + { + requestBuilder.AddFormParameter("destination", $"\"{downloadDirectory}\""); + } + + requestBuilder.AddFormUpload("fileData", filename, data); + + ProcessRequest(requestBuilder, $"add task from data {filename}", settings); + } + + public void AddTaskFromUrl(string url, string downloadDirectory, DownloadStationSettings settings) + { + var requestBuilder = BuildRequest(settings, "create", 2); + + requestBuilder.AddQueryParam("type", "url"); + requestBuilder.AddQueryParam("url", url); + requestBuilder.AddQueryParam("create_list", "false"); + + if (downloadDirectory.IsNotNullOrWhiteSpace()) + { + requestBuilder.AddQueryParam("destination", downloadDirectory); + } + + ProcessRequest(requestBuilder, $"add task from url {url}", settings); + } + + public IEnumerable GetTasks(DownloadStationSettings settings) + { + try + { + var result = new List(); + + var requestBuilder = BuildRequest(settings, "list", 1); + requestBuilder.AddQueryParam("additional", "detail"); + + var response = ProcessRequest(requestBuilder, "get tasks with additional detail", settings); + + if (response.Success && response.Data.Total > 0) + { + requestBuilder.AddQueryParam("additional", "transfer"); + var responseTransfer = ProcessRequest(requestBuilder, "get tasks with additional transfer", settings); + + if (responseTransfer.Success) + { + foreach (var task in response.Data.Task) + { + var taskTransfer = responseTransfer.Data.Task.Where(t => t.Id == task.Id).First(); + + var combinedTask = new DownloadStationTask + { + Username = task.Username, + Id = task.Id, + Title = task.Title, + Size = task.Size, + Status = (DownloadStationTaskStatus)task.Status, + Type = task.Type, + Additional = new DownloadStationTaskAdditional + { + Detail = task.Additional.Detail, + Transfer = taskTransfer.Additional.Transfer + } + }; + + result.Add(combinedTask); + } + } + } + + return result; + } + catch (DownloadClientException e) + { + _logger.Error(e); + return Array.Empty(); + } + } + + public void RemoveTask(string downloadId, DownloadStationSettings settings) + { + var requestBuilder = BuildRequest(settings, "delete", 2); + requestBuilder.AddQueryParam("id", downloadId); + requestBuilder.AddQueryParam("force_complete", "false"); + + ProcessRequest(requestBuilder, $"remove item {downloadId}", settings); + } + } +} diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/FileStationProxy.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/FileStationProxy.cs index a07cc1b47..fbfa3b4ae 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/FileStationProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/FileStationProxy.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Http; diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DSMInfoResponse.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DSMInfoResponse.cs index 0848bba70..e2e81c4ca 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DSMInfoResponse.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DSMInfoResponse.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using Newtonsoft.Json; namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationAuthResponse.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationAuthResponse.cs index d02503a25..04d6444ac 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationAuthResponse.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationAuthResponse.cs @@ -1,4 +1,4 @@ -namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses +namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { public class DiskStationAuthResponse { diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationError.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationError.cs index 50758d3af..c3f9b1090 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationError.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationError.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { @@ -20,16 +20,22 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { 104, "The requested version does not support the functionality" }, { 105, "The logged in session does not have permission" }, { 106, "Session timeout" }, - { 107, "Session interrupted by duplicate login" } + { 107, "Session interrupted by duplicate login" }, + { 119, "SID not found" } }; AuthMessages = new Dictionary { { 400, "No such account or incorrect password" }, - { 401, "Account disabled" }, - { 402, "Permission denied" }, - { 403, "2-step verification code required" }, - { 404, "Failed to authenticate 2-step verification code" } + { 401, "Disabled account" }, + { 402, "Denied permission" }, + { 403, "2-step authentication code required" }, + { 404, "Failed to authenticate 2-step authentication code" }, + { 406, "Enforce to authenticate with 2-factor authentication code" }, + { 407, "Blocked IP source" }, + { 408, "Expired password cannot change" }, + { 409, "Expired password" }, + { 410, "Password must be changed" } }; DownloadStationTaskMessages = new Dictionary @@ -76,7 +82,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses public int Code { get; set; } - public bool SessionError => Code == 105 || Code == 106 || Code == 107; + public bool SessionError => Code == 105 || Code == 106 || Code == 107 || Code == 119; public string GetMessage(DiskStationApi api) { @@ -85,7 +91,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses return AuthMessages[Code]; } - if (api == DiskStationApi.DownloadStationTask && DownloadStationTaskMessages.ContainsKey(Code)) + if ((api == DiskStationApi.DownloadStationTask || api == DiskStationApi.DownloadStation2Task) && DownloadStationTaskMessages.ContainsKey(Code)) { return DownloadStationTaskMessages[Code]; } diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationInfoResponse.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationInfoResponse.cs index 6c40ae75c..c80b213e0 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationInfoResponse.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationInfoResponse.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationResponse.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationResponse.cs index 43c981669..6354adeb3 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationResponse.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DiskStationResponse.cs @@ -1,4 +1,4 @@ -namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses +namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { public class DiskStationResponse where T : new() diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DownloadStation2TaskInfoResponse.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DownloadStation2TaskInfoResponse.cs new file mode 100644 index 000000000..4d98c16d7 --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DownloadStation2TaskInfoResponse.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses +{ + public class DownloadStation2TaskInfoResponse + { + public int Offset { get; set; } + public List Task { get; set; } + public int Total { get; set; } + } +} diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DownloadStationTaskInfoResponse.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DownloadStationTaskInfoResponse.cs index ebd79f3d7..877b1890a 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DownloadStationTaskInfoResponse.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/DownloadStationTaskInfoResponse.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/FileStationListFileInfoResponse.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/FileStationListFileInfoResponse.cs index f31d51a68..927fd242b 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/FileStationListFileInfoResponse.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/FileStationListFileInfoResponse.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/FileStationListResponse.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/FileStationListResponse.cs index e12c60094..823465bbe 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/FileStationListResponse.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Responses/FileStationListResponse.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses { diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/SerialNumberProvider.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/SerialNumberProvider.cs index 88a419d22..dfeb227a2 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/SerialNumberProvider.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/SerialNumberProvider.cs @@ -1,4 +1,4 @@ -using System; +using System; using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Crypto; @@ -16,6 +16,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { private readonly IDSMInfoProxy _proxy; private readonly ILogger _logger; + private ICached _cache; public SerialNumberProvider(ICacheManager cacheManager, diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/SharedFolderMapping.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/SharedFolderMapping.cs index 15946e861..354e1d50b 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/SharedFolderMapping.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/SharedFolderMapping.cs @@ -1,4 +1,4 @@ -using NzbDrone.Common.Disk; +using NzbDrone.Common.Disk; namespace NzbDrone.Core.Download.Clients.DownloadStation { diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/SharedFolderResolver.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/SharedFolderResolver.cs index 25ff176f6..b5a308a37 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/SharedFolderResolver.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/SharedFolderResolver.cs @@ -1,4 +1,4 @@ -using System; +using System; using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Disk; @@ -15,6 +15,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { private readonly IFileStationProxy _proxy; private readonly ILogger _logger; + private ICached _cache; public SharedFolderResolver(ICacheManager cacheManager, diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs index 09db5a136..17cf57246 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs @@ -19,7 +19,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation public class TorrentDownloadStation : TorrentClientBase { protected readonly IDownloadStationInfoProxy _dsInfoProxy; - protected readonly IDownloadStationTaskProxy _dsTaskProxy; + protected readonly IDownloadStationTaskProxySelector _dsTaskProxySelector; protected readonly ISharedFolderResolver _sharedFolderResolver; protected readonly ISerialNumberProvider _serialNumberProvider; protected readonly IFileStationProxy _fileStationProxy; @@ -28,7 +28,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation ISerialNumberProvider serialNumberProvider, IFileStationProxy fileStationProxy, IDownloadStationInfoProxy dsInfoProxy, - IDownloadStationTaskProxy dsTaskProxy, + IDownloadStationTaskProxySelector dsTaskProxySelector, ITorrentFileInfoReader torrentFileInfoReader, ISeedConfigProvider seedConfigProvider, IConfigService configService, @@ -37,7 +37,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) { _dsInfoProxy = dsInfoProxy; - _dsTaskProxy = dsTaskProxy; + _dsTaskProxySelector = dsTaskProxySelector; _fileStationProxy = fileStationProxy; _sharedFolderResolver = sharedFolderResolver; _serialNumberProvider = serialNumberProvider; @@ -48,16 +48,18 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation public override ProviderMessage Message => new ProviderMessage("Prowlarr is unable to connect to Download Station if 2-Factor Authentication is enabled on your DSM account", ProviderMessageType.Warning); + private IDownloadStationTaskProxy DsTaskProxy => _dsTaskProxySelector.GetProxy(Settings); + protected IEnumerable GetTasks() { - return _dsTaskProxy.GetTasks(Settings).Where(v => v.Type.ToLower() == DownloadStationTaskType.BT.ToString().ToLower()); + return DsTaskProxy.GetTasks(Settings).Where(v => v.Type.ToLower() == DownloadStationTaskType.BT.ToString().ToLower()); } protected override string AddFromMagnetLink(TorrentInfo release, string hash, string magnetLink) { var hashedSerialNumber = _serialNumberProvider.GetSerialNumber(Settings); - _dsTaskProxy.AddTaskFromUrl(magnetLink, GetDownloadDirectory(), Settings); + DsTaskProxy.AddTaskFromUrl(magnetLink, GetDownloadDirectory(), Settings); var item = GetTasks().SingleOrDefault(t => t.Additional.Detail["uri"] == magnetLink); @@ -76,7 +78,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { var hashedSerialNumber = _serialNumberProvider.GetSerialNumber(Settings); - _dsTaskProxy.AddTaskFromData(fileContent, filename, GetDownloadDirectory(), Settings); + DsTaskProxy.AddTaskFromData(fileContent, filename, GetDownloadDirectory(), Settings); var items = GetTasks().Where(t => t.Additional.Detail["uri"] == Path.GetFileNameWithoutExtension(filename)); @@ -217,6 +219,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation } catch (DownloadClientAuthenticationException ex) { + // User could not have permission to access to downloadstation _logger.Error(ex, ex.Message); return new NzbDroneValidationFailure(string.Empty, ex.Message); } @@ -268,7 +271,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation protected ValidationFailure ValidateVersion() { - var info = _dsTaskProxy.GetApiInfo(Settings); + var info = DsTaskProxy.GetApiInfo(Settings); _logger.Debug("Download Station api version information: Min {0} - Max {1}", info.MinVersion, info.MaxVersion); diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs index 1759cf600..562d6d975 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs @@ -18,7 +18,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation public class UsenetDownloadStation : UsenetClientBase { protected readonly IDownloadStationInfoProxy _dsInfoProxy; - protected readonly IDownloadStationTaskProxy _dsTaskProxy; + protected readonly IDownloadStationTaskProxySelector _dsTaskProxySelector; protected readonly ISharedFolderResolver _sharedFolderResolver; protected readonly ISerialNumberProvider _serialNumberProvider; protected readonly IFileStationProxy _fileStationProxy; @@ -27,15 +27,15 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation ISerialNumberProvider serialNumberProvider, IFileStationProxy fileStationProxy, IDownloadStationInfoProxy dsInfoProxy, - IDownloadStationTaskProxy dsTaskProxy, + IDownloadStationTaskProxySelector dsTaskProxySelector, IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, Logger logger) - : base(httpClient, configService, diskProvider, logger) + : base(httpClient, configService, diskProvider, logger) { _dsInfoProxy = dsInfoProxy; - _dsTaskProxy = dsTaskProxy; + _dsTaskProxySelector = dsTaskProxySelector; _fileStationProxy = fileStationProxy; _sharedFolderResolver = sharedFolderResolver; _serialNumberProvider = serialNumberProvider; @@ -46,16 +46,18 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation public override ProviderMessage Message => new ProviderMessage("Prowlarr is unable to connect to Download Station if 2-Factor Authentication is enabled on your DSM account", ProviderMessageType.Warning); + private IDownloadStationTaskProxy DsTaskProxy => _dsTaskProxySelector.GetProxy(Settings); + protected IEnumerable GetTasks() { - return _dsTaskProxy.GetTasks(Settings).Where(v => v.Type.ToLower() == DownloadStationTaskType.NZB.ToString().ToLower()); + return DsTaskProxy.GetTasks(Settings).Where(v => v.Type.ToLower() == DownloadStationTaskType.NZB.ToString().ToLower()); } protected override string AddFromNzbFile(ReleaseInfo release, string filename, byte[] fileContent) { var hashedSerialNumber = _serialNumberProvider.GetSerialNumber(Settings); - _dsTaskProxy.AddTaskFromData(fileContent, filename, GetDownloadDirectory(), Settings); + DsTaskProxy.AddTaskFromData(fileContent, filename, GetDownloadDirectory(), Settings); var items = GetTasks().Where(t => t.Additional.Detail["uri"] == filename); @@ -127,6 +129,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation } catch (DownloadClientAuthenticationException ex) { + // User could not have permission to access to downloadstation _logger.Error(ex, ex.Message); return new NzbDroneValidationFailure(string.Empty, ex.Message); } @@ -178,7 +181,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation protected ValidationFailure ValidateVersion() { - var info = _dsTaskProxy.GetApiInfo(Settings); + var info = DsTaskProxy.GetApiInfo(Settings); _logger.Debug("Download Station api version information: Min {0} - Max {1}", info.MinVersion, info.MaxVersion); From 2321d278d6f52910729a0c1db7bdd56bf3b61ca3 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 4 Aug 2023 14:21:12 +0000 Subject: [PATCH 079/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Albert Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: Ivan Mazzoli Co-authored-by: Magnus Co-authored-by: Stjepan Co-authored-by: Thirrian Co-authored-by: Weblate Co-authored-by: stormaac Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/fr.json | 19 ++++++- src/NzbDrone.Core/Localization/Core/hr.json | 51 ++++++++++++++++- src/NzbDrone.Core/Localization/Core/it.json | 4 +- .../Localization/Core/nb_NO.json | 5 +- src/NzbDrone.Core/Localization/Core/nl.json | 33 +++++------ .../Localization/Core/pt_BR.json | 17 +++--- src/NzbDrone.Core/Localization/Core/ro.json | 24 +++++--- .../Localization/Core/zh_CN.json | 55 +++++++++++++++---- 8 files changed, 158 insertions(+), 50 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index b21eb0428..6ce799ffc 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -283,7 +283,7 @@ "MIA": "MIA", "LaunchBrowserHelpText": " Ouvrer un navigateur Web et accéder à la page d'accueil de Prowlarr au démarrage de l'application.", "CloseCurrentModal": "Fermer le modal actuel", - "AddingTag": "Ajout d'un tag", + "AddingTag": "Ajouter un tag", "OnHealthIssueHelpText": "Sur un problème de santé", "AcceptConfirmationModal": "Accepter la fenêtre de confirmation", "OpenThisModal": "Ouvrer ce modal", @@ -514,5 +514,20 @@ "DeleteSelectedDownloadClients": "Supprimer le client de téléchargement", "DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", "StopSelecting": "Arrêtez la sélection", - "UpdateAvailable": "Une nouvelle mise à jour est disponible" + "UpdateAvailable": "Une nouvelle mise à jour est disponible", + "AdvancedSettingsHiddenClickToShow": "Paramètres avancés masqués, cliquez pour afficher", + "AdvancedSettingsShownClickToHide": "Paramètres avancés affichés, cliquez pour masquer", + "AppsMinimumSeeders": "Apps avec le nombre minimum de seeders disponibles", + "AppsMinimumSeedersHelpText": "Minimum de seeders requis par les applications pour que l’indexeur les récupère, laisser vide utilise la valeur par défaut du profil Sync", + "BasicSearch": "Recherche de base", + "CountIndexersAvailable": "{0} indexeur(s) disponible(s)", + "DeleteSelectedApplications": "Supprimer les applications sélectionnées", + "DeleteSelectedIndexer": "Supprimer les indexeurs sélectionnés", + "DeleteSelectedIndexers": "Supprimer les indexeurs sélectionnés", + "EditSelectedDownloadClients": "Modifier les clients de téléchargement sélectionnés", + "EditSelectedIndexers": "Modifier les indexeurs sélectionnés", + "AreYouSureYouWantToDeleteIndexer": "Êtes-vous sûr de vouloir supprimer “{0}” de Prowlarr ?", + "AuthQueries": "Requêtes d’authentification", + "CountApplicationsSelected": "{0} application(s) sélectionnée(s)", + "CountDownloadClientsSelected": "{0} client(s) de téléchargement sélectionné(s)" } diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index 02267f5c8..5d2c76af9 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -63,7 +63,7 @@ "Protocol": "Protokol", "Torrent": "Torrent", "Torrents": "Torrenti", - "UI": "Korisničko Sučelje", + "UI": "Korisničko sučelje", "Updates": "Ažuriraj", "Username": "Korisničko Ime", "Add": "Dodaj", @@ -123,5 +123,52 @@ "AllIndexersHiddenDueToFilter": "Svi filmovi su skriveni zbog primjenjenog filtera.", "Publisher": "Izdavač", "Album": "album", - "Artist": "umjetnik" + "Artist": "umjetnik", + "Size": "Veličina", + "Sort": "Sortiraj", + "QueryType": "Tip upita", + "No": "Ne", + "Stats": "Statistika", + "Style": "Stil", + "Year": "Godina", + "Private": "Privatno", + "RemoveFilter": "Ukloni filter", + "Restart": "Resetiraj", + "RestartNow": "Resetiraj sad", + "RestartProwlarr": "Resetiraj Prowlarr", + "Save": "Spremi", + "SelectAll": "Odaberi sve", + "Security": "Sigurnost", + "System": "Sustav", + "UnselectAll": "Odznači sve", + "QueryResults": "Rezultati upita", + "Version": "Verzija", + "Options": "Opcije", + "Source": "Izvor", + "Status": "Status", + "Ok": "Ok", + "Parameters": "Parametri", + "Query": "Upit", + "Public": "Javno", + "Tomorrow": "Sutra", + "Today": "Danas", + "Time": "Vrijeme", + "Type": "Tip", + "UseProxy": "Koristi proxy", + "Yes": "Da", + "YesCancel": "Da, otkaži", + "Yesterday": "Jučer", + "minutes": "minute", + "days": "dani", + "Redirect": "Preusmjeri", + "SaveSettings": "Spremi postavke", + "History": "Povijest", + "Genre": "Žanr", + "Health": "Zdravlje", + "Name": "Ime", + "Privacy": "Privatnost", + "Priority": "Prioritet", + "Url": "Url", + "Result": "Rezultat", + "SaveChanges": "Spremi izmjene" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 2e7aadad7..bf0f27394 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -472,7 +472,7 @@ "ApplyTagsHelpTextAdd": "Aggiungi: Aggiunge le etichette alla lista esistente di etichette", "ApplyTagsHelpTextHowToApplyApplications": "Come applicare etichette agli autori selezionati", "ApplyTagsHelpTextHowToApplyIndexers": "Come applicare etichette agli indicizzatori selezionati", - "CountIndexersSelected": "{0} Indicizzatore(i) Selezionato(i)", + "CountIndexersSelected": "{0} indicizzatore(i) selezionato(i)", "DeleteSelectedApplicationsMessageText": "Sei sicuro di voler eliminare l'indexer '{0}'?", "DeleteSelectedDownloadClientsMessageText": "Sei sicuro di voler eliminare l'indexer '{0}'?", "SelectIndexers": "Cerca Indicizzatori", @@ -482,7 +482,7 @@ "ApplyTagsHelpTextRemove": "Rimuovi: Rimuove le etichette inserite", "ApplyTagsHelpTextReplace": "Sostituire: Sostituisce le etichette con quelle inserite (non inserire nessuna etichette per eliminarle tutte)", "DownloadClientPriorityHelpText": "Dai priorità a multipli Client di download. Round-Robin è usato per i client con la stessa priorità.", - "DeleteSelectedDownloadClients": "Cancella il Client di Download", + "DeleteSelectedDownloadClients": "Cancella i Client di Download", "DeleteSelectedIndexersMessageText": "Sei sicuro di voler eliminare l'indexer '{0}'?", "Album": "Album", "Artist": "Artista", diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 5c4672609..8fbeef439 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -127,5 +127,8 @@ "Track": "spor", "Categories": "Kategorier", "Album": "album", - "Artist": "artist" + "Artist": "artist", + "ApplicationUrlHelpText": "Denne applikasjonens eksterne URL inkludert http(s)://, port og URL base", + "ApplyChanges": "Bekreft endringer", + "ApiKeyValidationHealthCheckMessage": "Vennligst oppdater din API-nøkkel til å være minst {0} tegn lang. Du kan gjøre dette via innstillinger eller konfigurasjonsfilen" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 31d9a3a1d..da646a467 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -15,16 +15,16 @@ "AddToDownloadClient": "Release toevoegen aan download client", "Added": "Toegevoegd", "AddedToDownloadClient": "Release toegevoegd aan client", - "AddingTag": "Tag toevoegen", - "Age": "Leeftijd", + "AddingTag": "Tag wordt toegevoegd", + "Age": "Ouderdom", "Album": "Album", - "All": "Alles", + "All": "Alle", "AllIndexersHiddenDueToFilter": "Alle indexeerders zijn verborgen door actieve filter.", "Analytics": "Statistieken", "AnalyticsEnabledHelpText": "Stuur anonieme gebruiks- en foutinformatie naar de servers van Prowlarr. Dit omvat informatie over uw browser, welke Prowlarr WebUI pagina's u gebruikt, foutrapportage en OS en runtime versie. We zullen deze informatie gebruiken om prioriteiten te stellen voor functies en het verhelpen van fouten.", "ApiKey": "API-sleutel", "ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {0} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand", - "AppDataDirectory": "AppData map", + "AppDataDirectory": "AppData folder", "AppDataLocationHealthCheckMessage": "Updaten zal niet mogelijk zijn om het verwijderen van AppData te voorkomen", "AppProfileDeleteConfirm": "Weet u zeker dat u {0} wilt verwijderen?", "AppProfileInUse": "App-profiel in gebruik", @@ -37,7 +37,7 @@ "ApplicationStatusCheckSingleClientMessage": "Applicaties onbeschikbaar door fouten", "Applications": "Applicaties", "Apply": "Toepassen", - "ApplyTags": "Tags Toepassen", + "ApplyTags": "Pas Tags Toe", "Apps": "Applicaties", "AreYouSureYouWantToResetYourAPIKey": "Bent u zeker dat u uw API-sleutel wilt resetten?", "AudioSearch": "auditief zoeken", @@ -49,10 +49,10 @@ "Backup": "Veiligheidskopie", "BackupFolderHelpText": "Relatieve paden zullen t.o.v. de Prowlarr AppData map bekeken worden", "BackupIntervalHelpText": "Tussentijd voor automatische back-up", - "BackupNow": "Veiligheidskopie Maken", + "BackupNow": "Nu backup nemen", "BackupRetentionHelpText": "Automatische veiligheidskopieën ouder dan de retentie periode zullen worden opgeruimd", "Backups": "Veiligheidskopieën", - "BeforeUpdate": "Voor de update", + "BeforeUpdate": "Voor Update", "BindAddress": "Aanhaak Adres", "BindAddressHelpText": "Geldig IP-adres, localhost of '*' voor alle interfaces", "Branch": "Branch", @@ -60,13 +60,13 @@ "BranchUpdateMechanism": "Gebruikte branch door extern update mechanisme", "BypassProxyForLocalAddresses": "Omzeil Proxy voor Lokale Adressen", "Cancel": "Annuleer", - "CancelPendingTask": "Bent u zeker dat u deze taak in afwachting wilt annuleren?", + "CancelPendingTask": "Ben je zeker dat je deze onafgewerkte taak wil annuleren?", "Categories": "Categorieën", "Category": "Categorie", "CertificateValidation": "Certificaat Validatie", "CertificateValidationHelpText": "Wijzig hoe strikt HTTPS certificaat validatie is", "ChangeHasNotBeenSavedYet": "Wijziging is nog niet opgeslagen", - "Clear": "Wissen", + "Clear": "Wis", "ClearHistory": "Geschiedenis verwijderen", "ClearHistoryMessageText": "Weet je zeker dat je alle geschiedenis van Prowlarr wilt verwijderen?", "ClientPriority": "Client Prioriteit", @@ -74,7 +74,7 @@ "Close": "Sluit", "CloseCurrentModal": "Sluit Huidig Bericht", "Columns": "Kolommen", - "Component": "Onderdeel", + "Component": "Component", "Connect": "Meldingen", "ConnectSettings": "Connecties Instellingen", "ConnectSettingsSummary": "Meldingen en aangepaste scripts", @@ -89,11 +89,11 @@ "Database": "Databasis", "Date": "Datum", "Dates": "Datum en tijd", - "Delete": "Verwijderen", + "Delete": "Verwijder", "DeleteAppProfile": "App-profiel verwijderen", "DeleteApplication": "Applicatie verwijderen", "DeleteApplicationMessageText": "Weet u zeker dat u de applicatie '{0}' wilt verwijderen?", - "DeleteBackup": "Verwijder Veiligheidskopie", + "DeleteBackup": "Verwijder Backup", "DeleteBackupMessageText": "Bent u zeker dat u de veiligheidskopie '{0}' wilt verwijderen?", "DeleteDownloadClient": "Verwijder Downloader", "DeleteDownloadClientMessageText": "Bent u zeker dat u de downloader '{0}' wilt verwijderen?", @@ -425,11 +425,11 @@ "Yesterday": "Gisteren", "ApplicationURL": "Applicatie URL", "ApplicationUrlHelpText": "De externe URL van deze applicatie inclusief http(s)://,Port en URL base", - "ApplyTagsHelpTextAdd": "Toevoegen: Voeg de tags toe aan de lijst met bestaande tags", + "ApplyTagsHelpTextAdd": "Toevoegen: Voeg de tags toe aan de bestaande tag lijst", "ApplyTagsHelpTextHowToApplyApplications": "Hoe tags toe te passen op de geselecteerd films", - "ApplyTagsHelpTextHowToApplyIndexers": "Hoe tags toe te passen op de geselecteerd films", + "ApplyTagsHelpTextHowToApplyIndexers": "Hoe tags toepassen op de geselecteerde indexeerders", "ApplyTagsHelpTextRemove": "Verwijderen: Verwijder de ingevoerde tags", - "ApplyTagsHelpTextReplace": "Vervangen: Vervang de tags met de ingevoerde tags (voer geen tags in om alle tags te wissen)", + "ApplyTagsHelpTextReplace": "Vervangen: Vervang de tags met de ingevoerde tags (vul geen tags in om alle tags te wissen)", "CountIndexersSelected": "{0} Indexer(s) Geselecteerd", "DeleteSelectedApplicationsMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?", "DeleteSelectedDownloadClients": "Verwijder Downloader", @@ -445,5 +445,6 @@ "Year": "Jaar", "UpdateAvailable": "Nieuwe update is beschikbaar", "Label": "Label", - "Publisher": "Uitgever" + "Publisher": "Uitgever", + "ApplyChanges": "Pas Wijzigingen Toe" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 2faae631a..60580d98e 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -16,7 +16,7 @@ "Added": "Adicionado", "AddedToDownloadClient": "Lançamento adicionado ao cliente", "AddingTag": "Adicionar tag", - "Age": "Tempo de vida", + "Age": "Idade", "Album": "Álbum", "All": "Todos", "AllIndexersHiddenDueToFilter": "Todos os indexadores estão ocultos devido ao filtro aplicado.", @@ -124,7 +124,7 @@ "Discord": "Discord", "Docker": "Docker", "Donations": "Doações", - "DownloadClient": "Cliente de download", + "DownloadClient": "Cliente de Download", "DownloadClientCategory": "Categoria de Download do Cliente", "DownloadClientSettings": "Configurações do cliente de download", "DownloadClientStatusCheckAllClientMessage": "Todos os clientes de download estão indisponíveis devido a falhas", @@ -153,7 +153,7 @@ "Episode": "Episódio", "Error": "Erro", "ErrorLoadingContents": "Erro ao carregar conteúdo", - "EventType": "Tipo de evento", + "EventType": "Tipo de Evento", "Events": "Eventos", "Exception": "Exceção", "ExistingTag": "Etiqueta existente", @@ -224,7 +224,7 @@ "IndexerVipCheckExpiringClientMessage": "Os benefícios VIPS do Indexador expirarão em breve: {0}", "Indexers": "Indexadores", "IndexersSelectedInterp": "{0} indexador(es) selecionado(s)", - "Info": "Informações", + "Info": "Info", "InitialFailure": "Falha Inicial", "InstanceName": "Nome da instância", "InstanceNameHelpText": "Nome da instância na guia e para o nome do aplicativo do Syslog", @@ -375,7 +375,7 @@ "SearchTypes": "Tipos de pesquisa", "Season": "Temporada", "Security": "Segurança", - "Seeders": "Semeadores", + "Seeders": "Sementes", "SelectAll": "Selecionar tudo", "SemiPrivate": "Semi-Privado", "SendAnonymousUsageData": "Enviar dados de uso anônimos", @@ -411,7 +411,7 @@ "Status": "Estado", "StopSelecting": "Parar Seleção", "Style": "Estilo", - "SuggestTranslationChange": "Sugerir alteração para a tradução", + "SuggestTranslationChange": "Sugerir mudança de tradução", "SyncAppIndexers": "Sincronizar indexadores do aplicativo", "SyncLevel": "Nível de sincronização", "SyncLevelAddRemove": "Adicione e remova somente: quando os indexadores são adicionados ou removidos do Prowlarr, ele atualizará este aplicativo remoto.", @@ -497,7 +497,7 @@ "Version": "Versão", "View": "Exibir", "VipExpiration": "Expiração VIP", - "Warn": "Avisar", + "Warn": "Alerta", "Website": "Website", "Wiki": "Wiki", "Year": "Ano", @@ -558,5 +558,6 @@ "RssQueries": "Consultas RSS", "SearchQueries": "Consultas de pesquisa", "minutes": "minutos", - "days": "dias" + "days": "dias", + "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}." } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 1c7f88eb7..1e34e186f 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -32,7 +32,7 @@ "Folder": "Dosar", "Filter": "Filtru", "Files": "Fișiere", - "Filename": "Numele fișierului", + "Filename": "Nume fișier", "Failed": "Eșuat", "EventType": "Tip de eveniment", "Events": "Evenimente", @@ -164,9 +164,9 @@ "IndexerProxyStatusCheckSingleClientMessage": "Proxiuri indisponibile datorită erorilor: {0}", "Add": "Adaugă", "Custom": "Personalizat", - "DeleteBackup": "Ștergeți copie de siguranță", + "DeleteBackup": "Ștergeți copia de rezervă", "MovieIndexScrollBottom": "Index film: Derulați partea de jos", - "NoLinks": "Fără legături", + "NoLinks": "Fără linkuri", "NoUpdatesAreAvailable": "Nu sunt disponibile actualizări", "Fixed": "Fix", "OnHealthIssueHelpText": "Cu privire la problema sănătății", @@ -320,7 +320,7 @@ "OnGrab": "Pe Grab", "OnHealthIssue": "Cu privire la problema sănătății", "TestAllIndexers": "Testați toate indexatoarele", - "Link": "Link-uri", + "Link": "Link", "NetCore": ".NET Core", "UnableToLoadIndexers": "Nu se pot încărca indexatoarele", "GrabReleases": "Descarcă fișier(e)", @@ -335,7 +335,7 @@ "IndexerNoDefCheckMessage": "Indexatorii nu au definiție și nu vor funcționa: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în Prowlarr", "IndexerRss": "RSS indexator", "EnabledRedirected": "Activat, Redirecționat", - "Ended": "Finalizat", + "Ended": "Încheiat", "EnableIndexer": "Activați indexator", "GrabTitle": "Descarcă titlu", "HistoryCleanup": "Istoric curățare", @@ -350,7 +350,7 @@ "IndexersSelectedInterp": "{0} Indexatoare selectate", "IndexerTagsHelpText": "Folosiți etichete pentru a specifica proxiurile indexatoarelor, cu ce aplicații sunt sincronizate indexatoarele, sau doar pentru a le organiza.", "SyncAppIndexers": "Sincronizați indexatoare aplicații", - "SyncLevelAddRemove": "Doar Adaugă sau Șterge: Când indexatoarele sunt adăugate sau șterse din Prowlarr, va actualiza această aplicație.", + "SyncLevelAddRemove": "Doar adaugă și șterge: Când indexatoarele sunt adăugate sau șterse din Prowlarr, va actualiza această aplicație.", "DeleteIndexerProxy": "Ștergeți proxy indexator", "UnableToLoadIndexerProxies": "Nu se pot încărca proxiurile indexatoarelor", "SettingsIndexerLoggingHelpText": "Logați informații adiționale despre indexatoare, inclusiv răspunsul", @@ -362,7 +362,7 @@ "RedirectHelpText": "Redirecționați cererile de descărcare pentru indexator și predați descărcarea direct, in loc de a-o trece prin Prowlarr", "SearchIndexers": "Căutare folosind indexatoare", "SettingsIndexerLogging": "Logare îmbunătățită indexator", - "SyncLevelFull": "Sincronizare Completă: Va păstra indexatoarele acestei aplicații sincronizate complet. Schimbările făcute indexatoarelor în Prowlarr sunt sincronizate cu această aplicație. Orice schimbare făcută indexatoarelor în această aplicație vor fi șterse la următoarea sincronizare cu Prowlarr.", + "SyncLevelFull": "Sincronizare completă: Va păstra indexatoarele acestei aplicații sincronizate complet. Schimbările făcute indexatoarelor în Prowlarr sunt sincronizate cu această aplicație. Orice schimbare făcută indexatoarelor în această aplicație vor fi șterse la următoarea sincronizare cu Prowlarr.", "Encoding": "Encodare", "FullSync": "Sincronizare completă", "IndexerObsoleteCheckMessage": "Indexatorii sunt învechiți sau nu au fost actualizați: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în Prowlarr", @@ -370,7 +370,7 @@ "IndexerVipCheckExpiringClientMessage": "Beneficiile VIP pentru indexator expiră în curând: {0}", "ApplicationLongTermStatusCheckAllClientMessage": "Toți indexatorii nu sunt disponibili din cauza unor eșecuri de mai mult de 6 ore", "ApplicationLongTermStatusCheckSingleClientMessage": "Indexatori indisponibili din cauza unor eșecuri de mai mult de 6 ore: {0}", - "LastDuration": "lastDuration", + "LastDuration": "Ultima durată", "LastExecution": "Ultima executare", "Queued": "În așteptare", "Application": "Aplicații", @@ -421,5 +421,11 @@ "SemiPrivate": "Semi-Privat", "Query": "Interogare", "QueryOptions": "Opțiuni interogare", - "Publisher": "Editor" + "Publisher": "Editor", + "Categories": "Categorii", + "MappedCategories": "Categoriile mapate", + "IndexerCategories": "Categorii indexator", + "Episode": "Episod", + "Category": "Categorie", + "AddRemoveOnly": "Doar adaugă și șterge" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 30fdba817..9b6a5537a 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1,7 +1,7 @@ { "About": "关于", "AcceptConfirmationModal": "接受确认模组Accept Confirmation Modal", - "Actions": "操作", + "Actions": "动作", "Add": "添加", "AddApplication": "添加应用程序", "AddCustomFilter": "添加自定义过滤", @@ -59,7 +59,7 @@ "BackupIntervalHelpText": "自动备份时间间隔", "BackupNow": "马上备份", "BackupRetentionHelpText": "早于保留周期的自动备份将被自动清除", - "Backups": "备份", + "Backups": "历史备份", "BeforeUpdate": "更新前", "BindAddress": "绑定地址", "BindAddressHelpText": "有效的 IPv4 地址、localhost、或以'*'代表所有接口", @@ -192,7 +192,7 @@ "IllRestartLater": "稍后重启", "IncludeHealthWarningsHelpText": "包含健康度警告", "IncludeManualGrabsHelpText": "安装手动抓取Prowlarr", - "Indexer": "搜刮器", + "Indexer": "索引器", "IndexerAlreadySetup": "至少已经设置了一个索引器", "IndexerAuth": "搜刮器认证", "IndexerDetails": "‎索引器‎‎详细信息‎", @@ -221,7 +221,7 @@ "IndexerTagsHelpText": "使用标签指定索引器代理, 索引器同步到哪些应用程序,或者只是为了组织索引器。未指定索引器的应用程序将不会同步。", "IndexerVipCheckExpiredClientMessage": "索引器VIP特权已过期:{0}", "IndexerVipCheckExpiringClientMessage": "索引器VIP特权即将过期:{0}", - "Indexers": "搜刮器", + "Indexers": "索引器", "IndexersSelectedInterp": "已选择 {0} 个搜刮器", "Info": "信息", "InitialFailure": "初始化失败", @@ -376,7 +376,7 @@ "SelectAll": "选择全部", "SemiPrivate": "‎半私有‎", "SendAnonymousUsageData": "发送匿名使用数据", - "SetTags": "设定标签", + "SetTags": "设置标签", "Settings": "设置", "SettingsConsoleLogLevel": "控制台日志级别", "SettingsEnableColorImpairedMode": "启用色障模式", @@ -398,7 +398,7 @@ "ShowSearch": "显示搜索按钮", "ShowSearchHelpText": "在选项中显示搜索框", "Shutdown": "关机", - "Size": "文件大小", + "Size": "大小", "Sort": "排序", "Source": "源", "StartTypingOrSelectAPathBelow": "输入路径或者从下面选择", @@ -406,7 +406,7 @@ "StartupDirectory": "启动目录", "Stats": "统计数据", "Status": "状态", - "StopSelecting": "停止选择", + "StopSelecting": "停止选中", "Style": "类型", "SuggestTranslationChange": "建议翻译改变 Suggest translation change", "SyncAppIndexers": "同步应用索引", @@ -491,8 +491,8 @@ "Website": "‎网站‎", "Wiki": "Wiki", "Year": "年", - "Yes": "是", - "YesCancel": "是,取消", + "Yes": "确定", + "YesCancel": "确定,取消", "Yesterday": "昨天", "Album": "专辑", "Track": "追踪", @@ -517,5 +517,40 @@ "EditSelectedIndexers": "编辑选定的索引器", "OnHealthRestored": "健康度恢复", "OnHealthRestoredHelpText": "健康度恢复", - "ApplyTagsHelpTextRemove": "移除: 移除已输入的标签" + "ApplyTagsHelpTextRemove": "移除: 移除已输入的标签", + "TotalHostGrabs": "主机总抓取数", + "TotalHostQueries": "主机总请求数", + "AdvancedSettingsHiddenClickToShow": "高级设置已隐藏,点击展开", + "AdvancedSettingsShownClickToHide": "高级设置已展开,点击隐藏", + "AppsMinimumSeedersHelpText": "使用索引器抓去所需的最低种子数,如果为空,则同步配置文件的默认值", + "BasicSearch": "基础搜索", + "CountIndexersAvailable": "{0} 个索引器可用", + "DeleteSelectedApplications": "删除选中的应用程序", + "DeleteSelectedIndexer": "删除选中的索引器", + "DeleteSelectedIndexers": "删除选中的索引器", + "FoundCountReleases": "发现 {0} 个版本", + "IndexerCategories": "索引器分类", + "IndexerDownloadClientHelpText": "请确认在Prowlarr内从此索引器中抓取时使用的下载客户端", + "IndexerStatus": "索引器状态", + "NewznabUrl": "Newznab链接", + "PackSeedTimeHelpText": "种子下载的时间(季或专辑)应在停止前保持上传状态,应用程序默认设定为empty", + "QueryType": "请求类型", + "SeedRatioHelpText": "种子停止下载前应达到的比率,应用的默认设置为空", + "SeedTime": "做种时间", + "SearchCountIndexers": "搜索了{0}个索引器", + "SeedRatio": "种子分享率", + "GoToApplication": "前往应用程序", + "NoHistoryFound": "未发现历史记录", + "SelectedCountOfCountReleases": "选中{1}中的{0}版本", + "AreYouSureYouWantToDeleteIndexer": "你确定从Prowlarr删除'{0}'?", + "AuthQueries": "认证请求", + "CountApplicationsSelected": "选中 {0}个应用程序", + "ManageApplications": "管理应用程序", + "RssQueries": "RSS请求", + "SearchAllIndexers": "搜索所有索引器", + "SearchQueries": "搜索请求", + "SeedTimeHelpText": "种子停止下载前应做种的时长,应用的默认设置为空", + "TorznabUrl": "Torznab链接", + "days": "天", + "minutes": "分钟" } From 3dae84705c614d246b09243283f9af0fe9a06a69 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 5 Aug 2023 10:02:55 +0300 Subject: [PATCH 080/964] Fixed: Ensure failing providers are marked as failed when testing all --- src/NzbDrone.Core/Applications/ApplicationFactory.cs | 11 ++++++++++- src/NzbDrone.Core/Download/DownloadClientFactory.cs | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Applications/ApplicationFactory.cs b/src/NzbDrone.Core/Applications/ApplicationFactory.cs index 31386ad50..1366744b4 100644 --- a/src/NzbDrone.Core/Applications/ApplicationFactory.cs +++ b/src/NzbDrone.Core/Applications/ApplicationFactory.cs @@ -62,10 +62,19 @@ namespace NzbDrone.Core.Applications { var result = base.Test(definition); - if ((result == null || result.IsValid) && definition.Id != 0) + if (definition.Id == 0) + { + return result; + } + + if (result == null || result.IsValid) { _applicationStatusService.RecordSuccess(definition.Id); } + else + { + _applicationStatusService.RecordFailure(definition.Id); + } return result; } diff --git a/src/NzbDrone.Core/Download/DownloadClientFactory.cs b/src/NzbDrone.Core/Download/DownloadClientFactory.cs index d692d36ee..bcad10a57 100644 --- a/src/NzbDrone.Core/Download/DownloadClientFactory.cs +++ b/src/NzbDrone.Core/Download/DownloadClientFactory.cs @@ -75,10 +75,19 @@ namespace NzbDrone.Core.Download { var result = base.Test(definition); - if ((result == null || result.IsValid) && definition.Id != 0) + if (definition.Id == 0) + { + return result; + } + + if (result == null || result.IsValid) { _downloadClientStatusService.RecordSuccess(definition.Id); } + else + { + _downloadClientStatusService.RecordFailure(definition.Id); + } return result; } From b2c5448cbfe1f7e0d97bf0047862a7aafddff41c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 5 Aug 2023 11:40:15 +0300 Subject: [PATCH 081/964] Fixed: Run health checks for applications and download clients on bulk events --- .../Checks/ApplicationLongTermStatusCheck.cs | 2 ++ .../HealthCheck/Checks/ApplicationStatusCheck.cs | 15 ++++++++------- .../Checks/DownloadClientStatusCheck.cs | 2 ++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ApplicationLongTermStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ApplicationLongTermStatusCheck.cs index 48fafadae..59dc79c5b 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ApplicationLongTermStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ApplicationLongTermStatusCheck.cs @@ -9,6 +9,8 @@ namespace NzbDrone.Core.HealthCheck.Checks { [CheckOn(typeof(ProviderUpdatedEvent))] [CheckOn(typeof(ProviderDeletedEvent))] + [CheckOn(typeof(ProviderBulkUpdatedEvent))] + [CheckOn(typeof(ProviderBulkDeletedEvent))] [CheckOn(typeof(ProviderStatusChangedEvent))] public class ApplicationLongTermStatusCheck : HealthCheckBase { diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ApplicationStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ApplicationStatusCheck.cs index 2f7c76dfe..5d9c87184 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ApplicationStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ApplicationStatusCheck.cs @@ -9,6 +9,8 @@ namespace NzbDrone.Core.HealthCheck.Checks { [CheckOn(typeof(ProviderUpdatedEvent))] [CheckOn(typeof(ProviderDeletedEvent))] + [CheckOn(typeof(ProviderBulkUpdatedEvent))] + [CheckOn(typeof(ProviderBulkDeletedEvent))] [CheckOn(typeof(ProviderStatusChangedEvent))] public class ApplicationStatusCheck : HealthCheckBase { @@ -26,13 +28,12 @@ namespace NzbDrone.Core.HealthCheck.Checks { var enabledProviders = _providerFactory.GetAvailableProviders(); var backOffProviders = enabledProviders.Join(_providerStatusService.GetBlockedProviders(), - i => i.Definition.Id, - s => s.ProviderId, - (i, s) => new { Provider = i, Status = s }) - .Where(p => p.Status.InitialFailure.HasValue && - p.Status.InitialFailure.Value.After( - DateTime.UtcNow.AddHours(-6))) - .ToList(); + i => i.Definition.Id, + s => s.ProviderId, + (i, s) => new { Provider = i, Status = s }) + .Where(p => p.Status.InitialFailure.HasValue && + p.Status.InitialFailure.Value.After(DateTime.UtcNow.AddHours(-6))) + .ToList(); if (backOffProviders.Empty()) { diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs index 9582ddcab..cef8b239e 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs @@ -8,6 +8,8 @@ namespace NzbDrone.Core.HealthCheck.Checks { [CheckOn(typeof(ProviderUpdatedEvent))] [CheckOn(typeof(ProviderDeletedEvent))] + [CheckOn(typeof(ProviderBulkUpdatedEvent))] + [CheckOn(typeof(ProviderBulkDeletedEvent))] [CheckOn(typeof(ProviderStatusChangedEvent))] public class DownloadClientStatusCheck : HealthCheckBase { From 5cbbffb0180f2d5584149eb10e2c516817fe044e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 5 Aug 2023 14:05:50 +0300 Subject: [PATCH 082/964] Fix translation typo in sync level options --- .../Manage/Edit/ManageApplicationsEditModalContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx b/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx index 4840b89fa..fbb718b3c 100644 --- a/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx +++ b/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx @@ -41,7 +41,7 @@ const syncLevelOptions = [ { key: ApplicationSyncLevel.AddOnly, get value() { - return translate('AddOnly'); + return translate('AddRemoveOnly'); }, }, { From 765f354c514dbb7847e9b6d1231c8685b18f700b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 5 Aug 2023 14:06:05 +0300 Subject: [PATCH 083/964] New: Add test all action for apps and download clients to status health --- frontend/src/System/Status/Health/Health.js | 24 ++++++++++++++++++- .../System/Status/Health/HealthConnector.js | 10 +++++++- .../Applications/ApplicationFactory.cs | 5 ++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/frontend/src/System/Status/Health/Health.js b/frontend/src/System/Status/Health/Health.js index 2747050f6..b4e9a2ed8 100644 --- a/frontend/src/System/Status/Health/Health.js +++ b/frontend/src/System/Status/Health/Health.js @@ -42,6 +42,25 @@ function getInternalLink(source) { function getTestLink(source, props) { switch (source) { + case 'ApplicationStatusCheck': + case 'ApplicationLongTermStatusCheck': + return ( + + ); + case 'DownloadClientStatusCheck': + return ( + + ); case 'IndexerStatusCheck': case 'IndexerLongTermStatusCheck': return ( @@ -52,7 +71,6 @@ function getTestLink(source, props) { onPress={props.dispatchTestAllIndexers} /> ); - default: break; } @@ -188,7 +206,11 @@ Health.propTypes = { isFetching: PropTypes.bool.isRequired, isPopulated: PropTypes.bool.isRequired, items: PropTypes.array.isRequired, + isTestingAllApplications: PropTypes.bool.isRequired, + isTestingAllDownloadClients: PropTypes.bool.isRequired, isTestingAllIndexers: PropTypes.bool.isRequired, + dispatchTestAllApplications: PropTypes.func.isRequired, + dispatchTestAllDownloadClients: PropTypes.func.isRequired, dispatchTestAllIndexers: PropTypes.func.isRequired }; diff --git a/frontend/src/System/Status/Health/HealthConnector.js b/frontend/src/System/Status/Health/HealthConnector.js index 885faa424..687e0ed87 100644 --- a/frontend/src/System/Status/Health/HealthConnector.js +++ b/frontend/src/System/Status/Health/HealthConnector.js @@ -3,6 +3,8 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { testAllIndexers } from 'Store/Actions/indexerActions'; +import { testAllApplications } from 'Store/Actions/Settings/applications'; +import { testAllDownloadClients } from 'Store/Actions/Settings/downloadClients'; import { fetchHealth } from 'Store/Actions/systemActions'; import createHealthCheckSelector from 'Store/Selectors/createHealthCheckSelector'; import Health from './Health'; @@ -11,8 +13,10 @@ function createMapStateToProps() { return createSelector( createHealthCheckSelector(), (state) => state.system.health, + (state) => state.settings.applications.isTestingAll, + (state) => state.settings.downloadClients.isTestingAll, (state) => state.indexers.isTestingAll, - (items, health, isTestingAllIndexers) => { + (items, health, isTestingAllApplications, isTestingAllDownloadClients, isTestingAllIndexers) => { const { isFetching, isPopulated @@ -22,6 +26,8 @@ function createMapStateToProps() { isFetching, isPopulated, items, + isTestingAllApplications, + isTestingAllDownloadClients, isTestingAllIndexers }; } @@ -30,6 +36,8 @@ function createMapStateToProps() { const mapDispatchToProps = { dispatchFetchHealth: fetchHealth, + dispatchTestAllApplications: testAllApplications, + dispatchTestAllDownloadClients: testAllDownloadClients, dispatchTestAllIndexers: testAllIndexers }; diff --git a/src/NzbDrone.Core/Applications/ApplicationFactory.cs b/src/NzbDrone.Core/Applications/ApplicationFactory.cs index 1366744b4..492710fee 100644 --- a/src/NzbDrone.Core/Applications/ApplicationFactory.cs +++ b/src/NzbDrone.Core/Applications/ApplicationFactory.cs @@ -42,6 +42,11 @@ namespace NzbDrone.Core.Applications return enabledClients.ToList(); } + protected override List Active() + { + return base.Active().Where(c => c.Enable).ToList(); + } + private IEnumerable FilterBlockedApplications(IEnumerable applications) { var blockedApplications = _applicationStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v); From cae1da0ce2997ade4c051aed678040150c052fa6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 5 Aug 2023 13:58:10 +0300 Subject: [PATCH 084/964] Fixed: (Apps) Lower the severity for testing messages --- .../Applications/LazyLibrarian/LazyLibrarian.cs | 2 +- src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs | 4 ++-- src/NzbDrone.Core/Applications/Mylar/Mylar.cs | 2 +- src/NzbDrone.Core/Applications/Radarr/Radarr.cs | 4 ++-- src/NzbDrone.Core/Applications/Readarr/Readarr.cs | 4 ++-- src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs | 6 +++--- src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/NzbDrone.Core/Applications/LazyLibrarian/LazyLibrarian.cs b/src/NzbDrone.Core/Applications/LazyLibrarian/LazyLibrarian.cs index 47890594e..205bbe472 100644 --- a/src/NzbDrone.Core/Applications/LazyLibrarian/LazyLibrarian.cs +++ b/src/NzbDrone.Core/Applications/LazyLibrarian/LazyLibrarian.cs @@ -33,7 +33,7 @@ namespace NzbDrone.Core.Applications.LazyLibrarian } catch (Exception ex) { - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to LazyLibrarian. {ex.Message}")); } diff --git a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs index 84e6c4f72..8a0615156 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs @@ -68,7 +68,7 @@ namespace NzbDrone.Core.Applications.Lidarr failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Lidarr URL is invalid, Prowlarr cannot connect to Lidarr - are you missing a URL base?")); break; default: - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Lidarr. {ex.Message}")); break; } @@ -80,7 +80,7 @@ namespace NzbDrone.Core.Applications.Lidarr } catch (Exception ex) { - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Lidarr. {ex.Message}")); } diff --git a/src/NzbDrone.Core/Applications/Mylar/Mylar.cs b/src/NzbDrone.Core/Applications/Mylar/Mylar.cs index 45b5667e7..245e38930 100644 --- a/src/NzbDrone.Core/Applications/Mylar/Mylar.cs +++ b/src/NzbDrone.Core/Applications/Mylar/Mylar.cs @@ -33,7 +33,7 @@ namespace NzbDrone.Core.Applications.Mylar } catch (Exception ex) { - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Mylar. {ex.Message}")); } diff --git a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs index 7ab8bf0ab..cdb1ba5ac 100644 --- a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs +++ b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs @@ -68,7 +68,7 @@ namespace NzbDrone.Core.Applications.Radarr failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Radarr URL is invalid, Prowlarr cannot connect to Radarr - are you missing a URL base?")); break; default: - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Radarr. {ex.Message}")); break; } @@ -80,7 +80,7 @@ namespace NzbDrone.Core.Applications.Radarr } catch (Exception ex) { - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Radarr. {ex.Message}")); } diff --git a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs index a75ccacc3..b2bf74ebb 100644 --- a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs +++ b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs @@ -68,7 +68,7 @@ namespace NzbDrone.Core.Applications.Readarr failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Readarr URL is invalid, Prowlarr cannot connect to Readarr - are you missing a URL base?")); break; default: - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Readarr. {ex.Message}")); break; } @@ -80,7 +80,7 @@ namespace NzbDrone.Core.Applications.Readarr } catch (Exception ex) { - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Readarr. {ex.Message}")); } diff --git a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs index 4805cf5bd..ec3db29ca 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs @@ -68,11 +68,11 @@ namespace NzbDrone.Core.Applications.Sonarr failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Sonarr URL is invalid, Prowlarr cannot connect to Sonarr - are you missing a URL base?")); break; case HttpStatusCode.NotFound: - _logger.Error(ex, "Sonarr not found"); + _logger.Warn(ex, "Sonarr not found"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Sonarr URL is invalid, Prowlarr cannot connect to Sonarr. Is Sonarr running and accessible? Sonarr v2 is not supported.")); break; default: - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Sonarr. {ex.Message}")); break; } @@ -84,7 +84,7 @@ namespace NzbDrone.Core.Applications.Sonarr } catch (Exception ex) { - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Sonarr. {ex.Message}")); } diff --git a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs index 855692d07..9d7cc56ce 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs @@ -68,7 +68,7 @@ namespace NzbDrone.Core.Applications.Whisparr failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Whisparr URL is invalid, Prowlarr cannot connect to Whisparr - are you missing a URL base?")); break; default: - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Whisparr. {ex.Message}")); break; } @@ -80,7 +80,7 @@ namespace NzbDrone.Core.Applications.Whisparr } catch (Exception ex) { - _logger.Error(ex, "Unable to complete application test"); + _logger.Warn(ex, "Unable to complete application test"); failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Whisparr. {ex.Message}")); } From cdea548ce2a5ce249198634346b5c55378b579d5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 5 Aug 2023 14:26:53 +0300 Subject: [PATCH 085/964] New: Add internal links for apps and download clients health checks --- frontend/src/System/Status/Health/Health.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/frontend/src/System/Status/Health/Health.js b/frontend/src/System/Status/Health/Health.js index b4e9a2ed8..015a8aa6e 100644 --- a/frontend/src/System/Status/Health/Health.js +++ b/frontend/src/System/Status/Health/Health.js @@ -16,6 +16,23 @@ import styles from './Health.css'; function getInternalLink(source) { switch (source) { + case 'ApplicationStatusCheck': + case 'ApplicationLongTermStatusCheck': + return ( + + ); + case 'DownloadClientStatusCheck': + return ( + + ); case 'IndexerRssCheck': case 'IndexerSearchCheck': case 'IndexerStatusCheck': From f83828cc2209ee665a037a60a47997d3cf5463fe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 5 Aug 2023 17:56:13 +0300 Subject: [PATCH 086/964] Fixed border for actions in health status --- frontend/src/System/Status/Health/Health.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/System/Status/Health/Health.css b/frontend/src/System/Status/Health/Health.css index dc1a9676e..ceeefa0de 100644 --- a/frontend/src/System/Status/Health/Health.css +++ b/frontend/src/System/Status/Health/Health.css @@ -20,5 +20,7 @@ } .actions { + composes: cell from '~Components/Table/Cells/TableRowCell.css'; + min-width: 90px; } From 95c2531107c4141cd54c91ec9b49e2f7a5d23142 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 5 Aug 2023 13:35:50 -0500 Subject: [PATCH 087/964] Filter user issues from Sentry (cherry picked from commit 03d361f5537bfc0caba1b86085f974570942fdbc) --- .../Instrumentation/Sentry/SentryTarget.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs index 164c14a7d..fb0fa1ce5 100644 --- a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs +++ b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs @@ -50,7 +50,13 @@ namespace NzbDrone.Common.Instrumentation.Sentry "UnauthorizedAccessException", // Filter out people stuck in boot loops - "CorruptDatabaseException" + "CorruptDatabaseException", + + // Filter SingleInstance Termination Exceptions + "TerminateApplicationException", + + // User config issue, root folder missing, etc. + "DirectoryNotFoundException" }; public static readonly List FilteredExceptionMessages = new List From 6f09b0f4f5d84b88a443c2e8b3e3c955604a1dfe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 6 Aug 2023 08:42:24 +0300 Subject: [PATCH 088/964] Bump version to 1.8.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b39bddc56..133bdf4fe 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.8.1' + majorVersion: '1.8.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 5f643b2cedadc5fe25ceb8888dd3af0395bfed55 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 5 Aug 2023 16:33:36 +0300 Subject: [PATCH 089/964] Fixed: (Indexers) Don't fetch releases when using unsupported capabilities --- .../IndexerSearch/ReleaseSearchService.cs | 11 +--- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 58 +++++++++++++++++++ .../Indexers/IndexerCapabilities.cs | 6 +- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index 526d69ea0..0a10db176 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -128,19 +128,12 @@ namespace NzbDrone.Core.IndexerSearch private TSpec Get(NewznabRequest query, List indexerIds, bool interactiveSearch) where TSpec : SearchCriteriaBase, new() { - var spec = new TSpec() + var spec = new TSpec { InteractiveSearch = interactiveSearch }; - if (query.cat != null) - { - spec.Categories = query.cat.Split(',').Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => int.Parse(s)).ToArray(); - } - else - { - spec.Categories = Array.Empty(); - } + spec.Categories = query.cat != null ? query.cat.Split(',').Where(s => !string.IsNullOrWhiteSpace(s)).Select(int.Parse).ToArray() : Array.Empty(); spec.SearchTerm = query.q?.Trim(); spec.SearchType = query.t; diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index 2a1151a6e..845f08a49 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -66,6 +66,20 @@ namespace NzbDrone.Core.Indexers return Task.FromResult(new IndexerPageableQueryResult()); } + var caps = GetCapabilities(); + + if ((searchCriteria.ImdbId.IsNotNullOrWhiteSpace() && !caps.MovieSearchImdbAvailable) || + (searchCriteria.TmdbId.HasValue && !caps.MovieSearchTmdbAvailable) || + (searchCriteria.TraktId.HasValue && !caps.MovieSearchTraktAvailable) || + (searchCriteria.DoubanId.HasValue && !caps.MovieSearchDoubanAvailable) || + (searchCriteria.Genre.IsNotNullOrWhiteSpace() && !caps.MovieSearchGenreAvailable) || + (searchCriteria.Year.HasValue && !caps.MovieSearchYearAvailable)) + { + _logger.Debug("Movie search skipped due to unsupported capabilities used: {0}", Definition.Name); + + return Task.FromResult(new IndexerPageableQueryResult()); + } + return FetchReleases(g => SetCookieFunctions(g).GetSearchRequests(searchCriteria), searchCriteria); } @@ -81,6 +95,20 @@ namespace NzbDrone.Core.Indexers return Task.FromResult(new IndexerPageableQueryResult()); } + var caps = GetCapabilities(); + + if ((searchCriteria.Album.IsNotNullOrWhiteSpace() && !caps.MusicSearchAlbumAvailable) || + (searchCriteria.Artist.IsNotNullOrWhiteSpace() && !caps.MusicSearchArtistAvailable) || + (searchCriteria.Label.IsNotNullOrWhiteSpace() && !caps.MusicSearchLabelAvailable) || + (searchCriteria.Track.IsNotNullOrWhiteSpace() && !caps.MusicSearchTrackAvailable) || + (searchCriteria.Genre.IsNotNullOrWhiteSpace() && !caps.MusicSearchGenreAvailable) || + (searchCriteria.Year.HasValue && !caps.MusicSearchYearAvailable)) + { + _logger.Debug("Music search skipped due to unsupported capabilities used: {0}", Definition.Name); + + return Task.FromResult(new IndexerPageableQueryResult()); + } + return FetchReleases(g => SetCookieFunctions(g).GetSearchRequests(searchCriteria), searchCriteria); } @@ -96,6 +124,23 @@ namespace NzbDrone.Core.Indexers return Task.FromResult(new IndexerPageableQueryResult()); } + var caps = GetCapabilities(); + + if ((searchCriteria.ImdbId.IsNotNullOrWhiteSpace() && !caps.TvSearchImdbAvailable) || + (searchCriteria.TvdbId.HasValue && !caps.TvSearchTvdbAvailable) || + (searchCriteria.RId.HasValue && !caps.TvSearchTvRageAvailable) || + (searchCriteria.TvMazeId.HasValue && !caps.TvSearchTvMazeAvailable) || + (searchCriteria.TraktId.HasValue && !caps.TvSearchTraktAvailable) || + (searchCriteria.TmdbId.HasValue && !caps.TvSearchTmdbAvailable) || + (searchCriteria.DoubanId.HasValue && !caps.TvSearchDoubanAvailable) || + (searchCriteria.Genre.IsNotNullOrWhiteSpace() && !caps.TvSearchGenreAvailable) || + (searchCriteria.Year.HasValue && !caps.TvSearchYearAvailable)) + { + _logger.Debug("TV search skipped due to unsupported capabilities used: {0}", Definition.Name); + + return Task.FromResult(new IndexerPageableQueryResult()); + } + return FetchReleases(g => SetCookieFunctions(g).GetSearchRequests(searchCriteria), searchCriteria); } @@ -111,6 +156,19 @@ namespace NzbDrone.Core.Indexers return Task.FromResult(new IndexerPageableQueryResult()); } + var caps = GetCapabilities(); + + if ((searchCriteria.Title.IsNotNullOrWhiteSpace() && !caps.BookSearchTitleAvailable) || + (searchCriteria.Author.IsNotNullOrWhiteSpace() && !caps.BookSearchAuthorAvailable) || + (searchCriteria.Publisher.IsNotNullOrWhiteSpace() && !caps.BookSearchPublisherAvailable) || + (searchCriteria.Genre.IsNotNullOrWhiteSpace() && !caps.BookSearchGenreAvailable) || + (searchCriteria.Year.HasValue && !caps.BookSearchYearAvailable)) + { + _logger.Debug("Book search skipped due to unsupported capabilities used: {0}", Definition.Name); + + return Task.FromResult(new IndexerPageableQueryResult()); + } + return FetchReleases(g => SetCookieFunctions(g).GetSearchRequests(searchCriteria), searchCriteria); } diff --git a/src/NzbDrone.Core/Indexers/IndexerCapabilities.cs b/src/NzbDrone.Core/Indexers/IndexerCapabilities.cs index cec80e194..ae8842f39 100644 --- a/src/NzbDrone.Core/Indexers/IndexerCapabilities.cs +++ b/src/NzbDrone.Core/Indexers/IndexerCapabilities.cs @@ -89,9 +89,9 @@ namespace NzbDrone.Core.Indexers public bool MovieSearchImdbAvailable => MovieSearchParams.Contains(MovieSearchParam.ImdbId); public bool MovieSearchTmdbAvailable => MovieSearchParams.Contains(MovieSearchParam.TmdbId); public bool MovieSearchTraktAvailable => MovieSearchParams.Contains(MovieSearchParam.TraktId); + public bool MovieSearchDoubanAvailable => MovieSearchParams.Contains(MovieSearchParam.DoubanId); public bool MovieSearchGenreAvailable => MovieSearchParams.Contains(MovieSearchParam.Genre); public bool MovieSearchYearAvailable => MovieSearchParams.Contains(MovieSearchParam.Year); - public bool MovieSearchDoubanAvailable => MovieSearchParams.Contains(MovieSearchParam.DoubanId); public List MusicSearchParams; public bool MusicSearchAvailable => MusicSearchParams.Count > 0; @@ -99,16 +99,16 @@ namespace NzbDrone.Core.Indexers public bool MusicSearchArtistAvailable => MusicSearchParams.Contains(MusicSearchParam.Artist); public bool MusicSearchLabelAvailable => MusicSearchParams.Contains(MusicSearchParam.Label); public bool MusicSearchTrackAvailable => MusicSearchParams.Contains(MusicSearchParam.Track); - public bool MusicSearchYearAvailable => MusicSearchParams.Contains(MusicSearchParam.Year); public bool MusicSearchGenreAvailable => MusicSearchParams.Contains(MusicSearchParam.Genre); + public bool MusicSearchYearAvailable => MusicSearchParams.Contains(MusicSearchParam.Year); public List BookSearchParams; public bool BookSearchAvailable => BookSearchParams.Count > 0; public bool BookSearchTitleAvailable => BookSearchParams.Contains(BookSearchParam.Title); public bool BookSearchAuthorAvailable => BookSearchParams.Contains(BookSearchParam.Author); public bool BookSearchPublisherAvailable => BookSearchParams.Contains(BookSearchParam.Publisher); - public bool BookSearchYearAvailable => BookSearchParams.Contains(BookSearchParam.Year); public bool BookSearchGenreAvailable => BookSearchParams.Contains(BookSearchParam.Genre); + public bool BookSearchYearAvailable => BookSearchParams.Contains(BookSearchParam.Year); public readonly IndexerCapabilitiesCategories Categories; public List Flags; From fc4a0979c31eff060c10150b05105e9b43a634f0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 7 Aug 2023 19:15:21 +0300 Subject: [PATCH 090/964] Fixed: Detect Docker when using control group v2 --- src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs index 23b3ab885..f016b08bb 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs @@ -77,7 +77,9 @@ namespace NzbDrone.Common.EnvironmentInfo FullName = Name; } - if (IsLinux && File.Exists("/proc/1/cgroup") && File.ReadAllText("/proc/1/cgroup").Contains("/docker/")) + if (IsLinux && + ((File.Exists("/proc/1/cgroup") && File.ReadAllText("/proc/1/cgroup").Contains("/docker/")) || + (File.Exists("/proc/1/mountinfo") && File.ReadAllText("/proc/1/mountinfo").Contains("/docker/")))) { IsDocker = true; } From bcb8afadf8a2c322e549e6adc3b13427514ccc0d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 8 Aug 2023 18:26:09 +0300 Subject: [PATCH 091/964] New: Add Content Summary for requests to apps --- src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs | 3 +++ src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs | 3 +++ src/NzbDrone.Core/Applications/Readarr/ReadarrV1Proxy.cs | 3 +++ src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs | 3 +++ src/NzbDrone.Core/Applications/Whisparr/WhisparrV3Proxy.cs | 3 +++ 5 files changed, 15 insertions(+) diff --git a/src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs b/src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs index 010619216..9b7f37685 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs @@ -84,6 +84,7 @@ namespace NzbDrone.Core.Applications.Lidarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -104,6 +105,7 @@ namespace NzbDrone.Core.Applications.Lidarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/{indexer.Id}", HttpMethod.Put); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -124,6 +126,7 @@ namespace NzbDrone.Core.Applications.Lidarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/test", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); var applicationVersion = _httpClient.Post(request).Headers.GetSingleValue("X-Application-Version"); diff --git a/src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs b/src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs index aa5204f68..e74baad21 100644 --- a/src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs +++ b/src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs @@ -85,6 +85,7 @@ namespace NzbDrone.Core.Applications.Radarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -105,6 +106,7 @@ namespace NzbDrone.Core.Applications.Radarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/{indexer.Id}", HttpMethod.Put); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -125,6 +127,7 @@ namespace NzbDrone.Core.Applications.Radarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/test", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); var applicationVersion = _httpClient.Post(request).Headers.GetSingleValue("X-Application-Version"); diff --git a/src/NzbDrone.Core/Applications/Readarr/ReadarrV1Proxy.cs b/src/NzbDrone.Core/Applications/Readarr/ReadarrV1Proxy.cs index ae5f5beb2..71e8a2c45 100644 --- a/src/NzbDrone.Core/Applications/Readarr/ReadarrV1Proxy.cs +++ b/src/NzbDrone.Core/Applications/Readarr/ReadarrV1Proxy.cs @@ -81,6 +81,7 @@ namespace NzbDrone.Core.Applications.Readarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -101,6 +102,7 @@ namespace NzbDrone.Core.Applications.Readarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/{indexer.Id}", HttpMethod.Put); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -121,6 +123,7 @@ namespace NzbDrone.Core.Applications.Readarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/test", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); _httpClient.Post(request); diff --git a/src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs b/src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs index 35d4896eb..48dcea40d 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs @@ -84,6 +84,7 @@ namespace NzbDrone.Core.Applications.Sonarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -104,6 +105,7 @@ namespace NzbDrone.Core.Applications.Sonarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/{indexer.Id}", HttpMethod.Put); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -124,6 +126,7 @@ namespace NzbDrone.Core.Applications.Sonarr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/test", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); var applicationVersion = _httpClient.Post(request).Headers.GetSingleValue("X-Application-Version"); diff --git a/src/NzbDrone.Core/Applications/Whisparr/WhisparrV3Proxy.cs b/src/NzbDrone.Core/Applications/Whisparr/WhisparrV3Proxy.cs index 2d1e8a853..530005c5f 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/WhisparrV3Proxy.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/WhisparrV3Proxy.cs @@ -81,6 +81,7 @@ namespace NzbDrone.Core.Applications.Whisparr var request = BuildRequest(settings, $"{AppIndexerApiRoute}", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -99,6 +100,7 @@ namespace NzbDrone.Core.Applications.Whisparr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/{indexer.Id}", HttpMethod.Put); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); try { @@ -119,6 +121,7 @@ namespace NzbDrone.Core.Applications.Whisparr var request = BuildRequest(settings, $"{AppIndexerApiRoute}/test", HttpMethod.Post); request.SetContent(indexer.ToJson()); + request.ContentSummary = indexer.ToJson(Formatting.None); _httpClient.Post(request); From e0dddfa215a68a15473ab3301077931ff07537ea Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 8 Aug 2023 18:30:25 +0300 Subject: [PATCH 092/964] Remove Order and Help columns from Apps Fields --- src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs | 3 --- src/NzbDrone.Core/Applications/Radarr/RadarrField.cs | 3 --- src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs | 3 --- src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs | 3 --- src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs | 3 --- 5 files changed, 15 deletions(-) diff --git a/src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs b/src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs index bfbf59dea..be058fe53 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs @@ -2,12 +2,9 @@ namespace NzbDrone.Core.Applications.Lidarr { public class LidarrField { - public int Order { get; set; } public string Name { get; set; } public string Label { get; set; } public string Unit { get; set; } - public string HelpText { get; set; } - public string HelpLink { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } diff --git a/src/NzbDrone.Core/Applications/Radarr/RadarrField.cs b/src/NzbDrone.Core/Applications/Radarr/RadarrField.cs index 322b97116..5fc1415b5 100644 --- a/src/NzbDrone.Core/Applications/Radarr/RadarrField.cs +++ b/src/NzbDrone.Core/Applications/Radarr/RadarrField.cs @@ -2,12 +2,9 @@ namespace NzbDrone.Core.Applications.Radarr { public class RadarrField { - public int Order { get; set; } public string Name { get; set; } public string Label { get; set; } public string Unit { get; set; } - public string HelpText { get; set; } - public string HelpLink { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } diff --git a/src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs b/src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs index c615b9938..274c91389 100644 --- a/src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs +++ b/src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs @@ -2,12 +2,9 @@ namespace NzbDrone.Core.Applications.Readarr { public class ReadarrField { - public int Order { get; set; } public string Name { get; set; } public string Label { get; set; } public string Unit { get; set; } - public string HelpText { get; set; } - public string HelpLink { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } diff --git a/src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs b/src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs index d0350c0ce..fa3a20f46 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs @@ -2,12 +2,9 @@ namespace NzbDrone.Core.Applications.Sonarr { public class SonarrField { - public int Order { get; set; } public string Name { get; set; } public string Label { get; set; } public string Unit { get; set; } - public string HelpText { get; set; } - public string HelpLink { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } diff --git a/src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs b/src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs index e3b1139b1..3838dd760 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs @@ -2,12 +2,9 @@ namespace NzbDrone.Core.Applications.Whisparr { public class WhisparrField { - public int Order { get; set; } public string Name { get; set; } public string Label { get; set; } public string Unit { get; set; } - public string HelpText { get; set; } - public string HelpLink { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } From e66ecf5c95075194dd551a0b65cca9641dd7f532 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 8 Aug 2023 13:53:23 +0000 Subject: [PATCH 093/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Havok Dan Co-authored-by: byakurau Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/pl.json | 12 +- .../Localization/Core/pt_BR.json | 112 +++++++++--------- 2 files changed, 63 insertions(+), 61 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 966d8f0eb..fa1d663c8 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -105,8 +105,8 @@ "AnalyticsEnabledHelpText": "Wysyłaj anonimowe informacje o użytkowaniu i błędach do serwerów Prowlarr. Obejmuje to informacje o Twojej przeglądarce, z których stron Prowlarr WebUI używasz, raportowanie błędów, a także wersję systemu operacyjnego i środowiska wykonawczego. Wykorzystamy te informacje, aby nadać priorytet funkcjom i poprawkom błędów.", "ApplicationStatusCheckAllClientMessage": "Wszystkie listy są niedostępne z powodu błędów", "ApplicationStatusCheckSingleClientMessage": "Listy niedostępne z powodu błędów: {0}", - "Apply": "Zastosować", - "Authentication": "Poświadczenie", + "Apply": "Zastosuj", + "Authentication": "Autoryzacja", "AuthenticationMethodHelpText": "Wymagaj nazwy użytkownika i hasła, aby uzyskać dostęp do Prowlarr", "BackupFolderHelpText": "Względne ścieżki będą znajdować się w katalogu AppData Prowlarr", "BackupRetentionHelpText": "Automatyczne kopie zapasowe starsze niż okres przechowywania zostaną automatycznie wyczyszczone", @@ -346,10 +346,10 @@ "Replace": "Zastąpić", "TheLatestVersionIsAlreadyInstalled": "Najnowsza wersja Prowlarr jest już zainstalowana", "ApplicationURL": "Link do aplikacji", - "ApplicationUrlHelpText": "Zewnętrzny URL tej aplikacji zawiera http(s)://, port i adres URL", + "ApplicationUrlHelpText": "Zewnętrzny URL tej aplikacji zawierający http(s)://, port i adres URL", "ApplyTagsHelpTextAdd": "Dodaj: dodaj tagi do istniejącej listy tagów", "ApplyTagsHelpTextHowToApplyApplications": "Jak zastosować tagi do wybranych filmów", - "ApplyTagsHelpTextHowToApplyIndexers": "Jak zastosować tagi do wybranych filmów", + "ApplyTagsHelpTextHowToApplyIndexers": "Jak zastosować tagi do wybranych indeksatorów", "DeleteSelectedApplicationsMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?", "DeleteSelectedDownloadClients": "Usuń klienta pobierania", "DeleteSelectedDownloadClientsMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?", @@ -361,5 +361,7 @@ "DownloadClientPriorityHelpText": "Nadaj priorytet wielu klientom pobierania. W przypadku klientów o tym samym priorytecie używane jest działanie okrężne.", "Track": "Ślad", "UpdateAvailable": "Dostępna jest aktualizacja", - "Genre": "Gatunki" + "Genre": "Gatunki", + "ApplyChanges": "Zastosuj zmiany", + "ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {0} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 60580d98e..566c699ac 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -5,9 +5,9 @@ "Add": "Adicionar", "AddApplication": "Adicionar Aplicativo", "AddCustomFilter": "Adicionar Filtro Personalizado", - "AddDownloadClient": "Adicionar cliente de download", + "AddDownloadClient": "Adicionar Cliente de Download", "AddDownloadClientToProwlarr": "Adicionar um cliente de download possibilita que o Prowlarr envie lançamentos diretamente da interface ao executar uma pesquisa manual.", - "AddIndexer": "Adicionar indexador", + "AddIndexer": "Adicionar Indexador", "AddIndexerProxy": "Adicionar Proxy ao Indexador", "AddNewIndexer": "Adicionar novo indexador", "AddRemoveOnly": "Adicionar e remover apenas", @@ -20,9 +20,9 @@ "Album": "Álbum", "All": "Todos", "AllIndexersHiddenDueToFilter": "Todos os indexadores estão ocultos devido ao filtro aplicado.", - "Analytics": "Análises", + "Analytics": "Analítica", "AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do Prowlarr. Isso inclui informações sobre seu navegador, quais páginas da interface Web do Prowlarr você usa, relatórios de erros, e a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.", - "ApiKey": "Chave da API", + "ApiKey": "Chave API", "ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração", "AppDataDirectory": "Diretório AppData", "AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização", @@ -35,7 +35,7 @@ "ApplicationLongTermStatusCheckSingleClientMessage": "Aplicativos indisponíveis devido a falhas por mais de 6 horas: {0}", "ApplicationStatusCheckAllClientMessage": "Não há aplicativos disponíveis devido a falhas", "ApplicationStatusCheckSingleClientMessage": "Aplicativos indisponíveis devido a falhas: {0}", - "ApplicationURL": "URL do aplicativo", + "ApplicationURL": "URL do Aplicativo", "ApplicationUrlHelpText": "A URL externa deste aplicativo, incluindo http(s)://, porta e base da URL", "Applications": "Aplicativos", "Apply": "Aplicar", @@ -49,11 +49,11 @@ "Authentication": "Autenticação", "AuthenticationMethodHelpText": "Requer nome de usuário e senha para acessar o Prowlarr", "AuthenticationRequired": "Autenticação Requerida", - "AuthenticationRequiredHelpText": "Altera para quais solicitações a autenticação é necessária. Não mude a menos que você entenda os riscos.", + "AuthenticationRequiredHelpText": "Altere para quais solicitações a autenticação é necessária. Não mude a menos que você entenda os riscos.", "AuthenticationRequiredWarning": "Para impedir o acesso remoto sem autenticação, o Prowlarr agora exige que a autenticação seja habilitada. Configure seu método de autenticação e credenciais. Você pode, opcionalmente, desabilitar a autenticação de endereços locais. Consulte o FAQ para obter informações adicionais.", "Author": "Autor", "Automatic": "Automático", - "AutomaticSearch": "Pesquisa automática", + "AutomaticSearch": "Pesquisa Automática", "AverageResponseTimesMs": "Tempos Médios de Resposta (Ms)", "Backup": "Backup", "BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do Prowlarr", @@ -62,40 +62,40 @@ "BackupRetentionHelpText": "Backups automáticos anteriores ao período de retenção serão limpos automaticamente", "Backups": "Backups", "BeforeUpdate": "Antes de atualizar", - "BindAddress": "Endereço de vínculo", + "BindAddress": "Fixar Endereço", "BindAddressHelpText": "Endereço IP válido, localhost ou '*' para todas as interfaces", "Book": "Livro", "BookSearch": "Pesquisar Livro", "BookSearchTypes": "Tipos de Pesquisa de Livros", "Branch": "Ramificação", "BranchUpdate": "Ramificação para atualização do Prowlarr", - "BranchUpdateMechanism": "Ramificação usada pelo mecanismo de atualização externo", + "BranchUpdateMechanism": "Ramificação usada pelo mecanismo externo de atualização", "BypassProxyForLocalAddresses": "Ignorar proxy para endereços locais", "Cancel": "Cancelar", "CancelPendingTask": "Tem certeza de que deseja cancelar esta tarefa pendente?", "Categories": "Categorias", "Category": "Categoria", - "CertificateValidation": "Validação de certificado", + "CertificateValidation": "Validação de Certificado", "CertificateValidationHelpText": "Alterar o quão estrita é a validação da certificação HTTPS", "ChangeHasNotBeenSavedYet": "A alteração ainda não foi salva", "Clear": "Limpar", "ClearHistory": "Limpar histórico", "ClearHistoryMessageText": "Tem certeza de que deseja limpar o histórico do Prowlarr?", - "ClientPriority": "Prioridade do cliente", - "CloneProfile": "Clonar perfil", + "ClientPriority": "Prioridade do Cliente", + "CloneProfile": "Clonar Perfil", "Close": "Fechar", "CloseCurrentModal": "Fechar modal atual", "Columns": "Colunas", "Component": "Componente", "Connect": "Notificações", - "ConnectSettings": "Configurações de conexão", + "ConnectSettings": "Configurações de Conexão", "ConnectSettingsSummary": "Notificações e scripts personalizados", "ConnectionLost": "Conexão perdida", "ConnectionLostAutomaticMessage": "O Prowlarr tentará se conectar automaticamente, ou você pode clicar em Recarregar abaixo.", "ConnectionLostMessage": "O Prowlarr perdeu sua conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", "Connections": "Conexões", "CouldNotConnectSignalR": "Não é possível conectar ao SignalR, a interface não atualizará", - "Custom": "Personalizado", + "Custom": "Personalizar", "CustomFilters": "Filtros Personalizados", "DBMigration": "Migração de banco de dados", "Database": "Banco de dados", @@ -108,11 +108,11 @@ "DeleteBackup": "Excluir Backup", "DeleteBackupMessageText": "Tem certeza que deseja excluir o backup \"{0}\"?", "DeleteClientCategory": "Excluir Categoria de Cliente de Download", - "DeleteDownloadClient": "Excluir cliente de download", + "DeleteDownloadClient": "Excluir Cliente de Download", "DeleteDownloadClientMessageText": "Tem certeza que deseja excluir o cliente de download \"{0}\"?", "DeleteIndexerProxy": "Apagar Proxy do Indexador", "DeleteIndexerProxyMessageText": "Tem certeza que deseja apagar o proxy '{0}'?", - "DeleteNotification": "Excluir notificação", + "DeleteNotification": "Excluir Notificação", "DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação \"{0}\"?", "DeleteTag": "Excluir tag", "DeleteTagMessageText": "Tem certeza de que deseja excluir a tag \"{0}\"?", @@ -126,14 +126,14 @@ "Donations": "Doações", "DownloadClient": "Cliente de Download", "DownloadClientCategory": "Categoria de Download do Cliente", - "DownloadClientSettings": "Configurações do cliente de download", + "DownloadClientSettings": "Configurações do Cliente de Download", "DownloadClientStatusCheckAllClientMessage": "Todos os clientes de download estão indisponíveis devido a falhas", "DownloadClientStatusCheckSingleClientMessage": "Clientes de download indisponíveis devido a falhas: {0}", "DownloadClients": "Clientes de download", "DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do usuário do Prowlarr", "Duration": "Duração", "Edit": "Editar", - "EditIndexer": "Editar indexador", + "EditIndexer": "Editar Indexador", "EditSyncProfile": "Editar Perfil de Sincronização", "ElapsedTime": "Tempo Decorrido", "Enable": "Habilitar", @@ -141,7 +141,7 @@ "EnableAutomaticSearchHelpText": "Será usado ao realizar pesquisas automáticas pela interface ou pelo Prowlarr", "EnableIndexer": "Habilitar indexador", "EnableInteractiveSearch": "Ativar pesquisa interativa", - "EnableInteractiveSearchHelpText": "Será usado com a pesquisa interativa", + "EnableInteractiveSearchHelpText": "Será usado quando a pesquisa interativa for usada", "EnableRss": "Habilitar RSS", "EnableRssHelpText": "Habilitar feed RSS para o indexador", "EnableSSL": "Habilitar SSL", @@ -187,9 +187,9 @@ "HistoryDetails": "Detalhes do histórico", "HomePage": "Página Inicial", "Host": "Host", - "Hostname": "Nome do host", + "Hostname": "Hostname", "Id": "ID", - "IgnoredAddresses": "Endereços ignorados", + "IgnoredAddresses": "Endereços Ignorados", "IllRestartLater": "Reiniciarei mais tarde", "IncludeHealthWarningsHelpText": "Incluir avisos de integridade", "IncludeManualGrabsHelpText": "Incluir Capturas Manuais feitas no Prowlarr", @@ -207,7 +207,7 @@ "IndexerName": "Nome do Indexador", "IndexerNoDefCheckMessage": "Os indexadores não têm definição e não funcionarão: {0}. Por favor, remova e (ou) adicione novamente ao Prowlarr", "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao Prowlarr", - "IndexerPriority": "Prioridade do indexador", + "IndexerPriority": "Prioridade do Indexador", "IndexerPriorityHelpText": "Prioridade do Indexador de 1 (Mais Alta) a 50 (Mais Baixa). Padrão: 25.", "IndexerProxies": "Proxies do Indexador", "IndexerProxy": "Proxy do Indexador", @@ -226,9 +226,9 @@ "IndexersSelectedInterp": "{0} indexador(es) selecionado(s)", "Info": "Info", "InitialFailure": "Falha Inicial", - "InstanceName": "Nome da instância", - "InstanceNameHelpText": "Nome da instância na guia e para o nome do aplicativo do Syslog", - "InteractiveSearch": "Pesquisa interativa", + "InstanceName": "Nome da Instância", + "InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog", + "InteractiveSearch": "Pesquisa Interativa", "Interval": "Intervalo", "KeyboardShortcuts": "Atalhos de teclado", "Label": "Rótulo", @@ -241,10 +241,10 @@ "Level": "Nível", "Link": "Link", "LogFiles": "Arquivos de log", - "LogLevel": "Nível do log", + "LogLevel": "Nível de Registro", "LogLevelTraceHelpTextWarning": "O registro de rastreamento deve ser ativado apenas temporariamente", - "Logging": "Registro em log", - "Logs": "Logs", + "Logging": "Registrando", + "Logs": "Registros", "MIA": "Desaparecidos", "MaintenanceRelease": "Versão de manutenção: correções de bugs e outras melhorias. Veja Github Commit History para mais detalhes", "Manual": "Manual", @@ -270,25 +270,25 @@ "No": "Não", "NoBackupsAreAvailable": "Não há backups disponíveis", "NoChange": "Sem alteração", - "NoChanges": "Sem alterações", + "NoChanges": "Sem Alterações", "NoLeaveIt": "Não, deixe-o", "NoLinks": "Sem Links", "NoLogFiles": "Nenhum arquivo de log", "NoSearchResultsFound": "Nenhum resultado encontrado, tente fazer uma nova busca abaixo.", - "NoTagsHaveBeenAddedYet": "Você ainda não adicionou tags", + "NoTagsHaveBeenAddedYet": "Nenhuma tag foi adicionada ainda", "NoUpdatesAreAvailable": "Nenhuma atualização está disponível", "NotSupported": "Não Suportado", "Notification": "Notificação", - "NotificationTriggers": "Acionadores da notificação", - "NotificationTriggersHelpText": "Selecionar quais eventos devem acionar esta notificação", + "NotificationTriggers": "Gatilhos de Notificação", + "NotificationTriggersHelpText": "Selecione quais eventos devem acionar esta notificação", "Notifications": "Notificações", "OAuthPopupMessage": "Os pop-ups estão bloqueados em seu navegador", "Ok": "Ok", - "OnApplicationUpdate": "Ao atualizar o aplicativo", + "OnApplicationUpdate": "Na Atualização do Aplicativo", "OnApplicationUpdateHelpText": "Ao atualizar o aplicativo", "OnGrab": "Ao Obter Lançamento", "OnGrabHelpText": "Ao obter lançamento", - "OnHealthIssue": "Ao ter problema de integridade", + "OnHealthIssue": "Ao Problema de Saúde", "OnHealthIssueHelpText": "Ao ter problema de integridade", "OnHealthRestored": "Com a Saúde Restaurada", "OnHealthRestoredHelpText": "Com a Saúde Restaurada", @@ -301,12 +301,12 @@ "Parameters": "Parâmetros", "Password": "Senha", "Peers": "Pares", - "PendingChangesDiscardChanges": "Descartar alterações e sair", - "PendingChangesMessage": "Há alterações não salvas. Tem certeza que deseja sair desta página?", - "PendingChangesStayReview": "Ficar e revisar alterações", + "PendingChangesDiscardChanges": "Descartar mudanças e sair", + "PendingChangesMessage": "Você tem alterações não salvas. Tem certeza de que deseja sair desta página?", + "PendingChangesStayReview": "Ficar e revisar mudanças", "Port": "Porta", - "PortNumber": "Número da porta", - "Presets": "Predefinições", + "PortNumber": "Número da Porta", + "Presets": "Definições", "Priority": "Prioridade", "Privacy": "Privacidade", "Private": "Privado", @@ -315,13 +315,13 @@ "ProwlarrSupportsAnyIndexer": "Prowlarr suporte muitos indexadores em adição a qualquer indexador que use o padrão Newznab/Torznab usando 'Newznab Genérico' (para usenet) ou 'Torznab Genérico' (para torrents). Busque & Selecione seu indexador dos abaixo.", "Proxies": "Proxies", "Proxy": "Proxy", - "ProxyBypassFilterHelpText": "Usar \",\" como separador e \"*.\" como curinga para subdomínios", + "ProxyBypassFilterHelpText": "Use ',' como separador e '*.' como curinga para subdomínios", "ProxyCheckBadRequestMessage": "Falha ao testar o proxy. Código de status: {0}", "ProxyCheckFailedToTestMessage": "Falha ao testar o proxy: {0}", "ProxyCheckResolveIpMessage": "Falha ao resolver o endereço IP do host de proxy configurado {0}", - "ProxyPasswordHelpText": "Você só precisa inserir um nome de usuário e uma senha se solicitado. Caso contrário, deixe em branco.", - "ProxyType": "Tipo de proxy", - "ProxyUsernameHelpText": "Você só precisa inserir um nome de usuário e uma senha se solicitado. Caso contrário, deixe em branco.", + "ProxyPasswordHelpText": "Você só precisa digitar um nome de usuário e senha se for necessário. Caso contrário, deixe-os em branco.", + "ProxyType": "Tipo de Proxy", + "ProxyUsernameHelpText": "Você só precisa digitar um nome de usuário e senha se for necessário. Caso contrário, deixe-os em branco.", "Public": "Público", "Publisher": "Editora", "Query": "Consulta", @@ -348,11 +348,11 @@ "RepeatSearch": "Repetir pesquisa", "Replace": "Substituir", "Reset": "Redefinir", - "ResetAPIKey": "Redefinir chave da API", + "ResetAPIKey": "Redefinir chave de API", "Restart": "Reiniciar", - "RestartNow": "Reiniciar agora", + "RestartNow": "Reiniciar Agora", "RestartProwlarr": "Reiniciar o Prowlarr", - "RestartRequiredHelpTextWarning": "Requer reinicialização para ter efeito", + "RestartRequiredHelpTextWarning": "Requer reinicialização para entrar em vigor", "Restore": "Restaurar", "RestoreBackup": "Restaurar backup", "Result": "Resultado", @@ -364,10 +364,10 @@ "SSLCertPathHelpText": "Caminho para o arquivo pfx", "SSLPort": "Porta SSL", "Save": "Salvar", - "SaveChanges": "Salvar alterações", - "SaveSettings": "Salvar configurações", + "SaveChanges": "Salvar Mudanças", + "SaveSettings": "Salvar Configurações", "Scheduled": "Agendado", - "ScriptPath": "Caminho do script", + "ScriptPath": "Caminho do Script", "Search": "Pesquisar", "SearchCapabilities": "Recursos de Pesquisa", "SearchIndexers": "Pesquisar indexadores", @@ -424,10 +424,10 @@ "TableOptions": "Opções da tabela", "TableOptionsColumnsMessage": "Escolha quais colunas são visíveis e em que ordem aparecem", "TagCannotBeDeletedWhileInUse": "Não pode ser excluído durante o uso", - "TagIsNotUsedAndCanBeDeleted": "A tag não está em uso e pode ser excluída", + "TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída", "Tags": "Tags", "TagsHelpText": "Aplica-se a indexadores com pelo menos uma tag correspondente", - "TagsSettingsSummary": "Veja todas as tags e como são usadas. Tags não utilizadas podem ser removidas", + "TagsSettingsSummary": "Veja todas as tags e como elas são usadas. Tags não utilizadas podem ser removidas", "Tasks": "Tarefas", "Test": "Testar", "TestAll": "Testar Tudo", @@ -477,9 +477,9 @@ "UnableToLoadNotifications": "Não foi possível carregar as notificações", "UnableToLoadTags": "Não foi possível carregar as tags", "UnableToLoadUISettings": "Não foi possível carregar as configurações da interface", - "UnsavedChanges": "Alterações não salvas", + "UnsavedChanges": "Alterações Não Salvas", "UnselectAll": "Desmarcar tudo", - "UpdateAutomaticallyHelpText": "Baixar e instalar atualizações automaticamente. Você ainda poderá instalar a partir de Sistema: Atualizações", + "UpdateAutomaticallyHelpText": "Baixe e instale atualizações automaticamente. Você ainda poderá instalar a partir do Sistema: Atualizações", "UpdateAvailable": "Nova atualização está disponível", "UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.", "UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.", @@ -489,11 +489,11 @@ "Updates": "Atualizações", "Uptime": "Tempo de atividade", "Url": "Url", - "UrlBaseHelpText": "Para suporte de proxy reverso, o padrão é vazio", - "UseProxy": "Usar proxy", + "UrlBaseHelpText": "Para suporte a proxy reverso, o padrão é vazio", + "UseProxy": "Usar Proxy", "Usenet": "Usenet", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fornecido pelo aplicativo que chamou a API", - "Username": "Nome de usuário", + "Username": "Nome do usuário", "Version": "Versão", "View": "Exibir", "VipExpiration": "Expiração VIP", From 03fa9254e37755f008e831b03fed5c6db66c9e83 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 9 Aug 2023 13:35:13 +0300 Subject: [PATCH 094/964] Prevent NullRef in IsPathValid for null paths --- src/NzbDrone.Common/Extensions/PathExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Common/Extensions/PathExtensions.cs b/src/NzbDrone.Common/Extensions/PathExtensions.cs index b7af090bc..2ec434503 100644 --- a/src/NzbDrone.Common/Extensions/PathExtensions.cs +++ b/src/NzbDrone.Common/Extensions/PathExtensions.cs @@ -138,7 +138,7 @@ namespace NzbDrone.Common.Extensions public static bool IsPathValid(this string path, PathValidationType validationType) { - if (path.ContainsInvalidPathChars() || string.IsNullOrWhiteSpace(path)) + if (string.IsNullOrWhiteSpace(path) || path.ContainsInvalidPathChars()) { return false; } From 8c9adba516a588b5d2d159354c3c004313f325b4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 9 Aug 2023 18:35:26 +0300 Subject: [PATCH 095/964] Fixed color for links --- frontend/src/Styles/Themes/dark.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Styles/Themes/dark.js b/frontend/src/Styles/Themes/dark.js index 657568982..06c0304ea 100644 --- a/frontend/src/Styles/Themes/dark.js +++ b/frontend/src/Styles/Themes/dark.js @@ -37,8 +37,8 @@ module.exports = { // Links defaultLinkHoverColor: '#fff', - linkColor: '#rgb(230, 96, 0)', - linkHoverColor: '#rgb(230, 96, 0, .8)', + linkColor: '#5d9cec', + linkHoverColor: '#5d9cec', // Header pageHeaderBackgroundColor: '#2a2a2a', From 7cd82321b4ebaea46881f115d02bb4a282a3f1ae Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 9 Aug 2023 23:41:09 +0300 Subject: [PATCH 096/964] Bump Npgsql version to 6.0.9 Fixes #1819 --- src/NzbDrone.Common/Prowlarr.Common.csproj | 2 +- src/NzbDrone.Core/Prowlarr.Core.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index 4cbb90d63..fca22af8c 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 66b260791..5789e62ff 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -10,7 +10,7 @@ - + From 7a937e85a4341f0ac4ff36ab7e3a10fe4f9afca9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 10 Aug 2023 18:05:00 +0300 Subject: [PATCH 097/964] Fixed: Retain user settings not-affiliated with Prowlarr --- src/NzbDrone.Core/Applications/Readarr/Readarr.cs | 3 +++ src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs | 1 + src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs | 3 +++ src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs | 1 + 4 files changed, 8 insertions(+) diff --git a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs index b2bf74ebb..e61a86c6f 100644 --- a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs +++ b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs @@ -182,6 +182,9 @@ namespace NzbDrone.Core.Applications.Readarr // Retain user tags not-affiliated with Prowlarr readarrIndexer.Tags.UnionWith(remoteIndexer.Tags); + // Retain user settings not-affiliated with Prowlarr + readarrIndexer.DownloadClientId = remoteIndexer.DownloadClientId; + // Update the indexer if it still has categories that match _readarrV1Proxy.UpdateIndexer(readarrIndexer, Settings); } diff --git a/src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs b/src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs index ca98f5700..a6c8ab7aa 100644 --- a/src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs +++ b/src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs @@ -17,6 +17,7 @@ namespace NzbDrone.Core.Applications.Readarr public string Implementation { get; set; } public string ConfigContract { get; set; } public string InfoLink { get; set; } + public int? DownloadClientId { get; set; } public HashSet Tags { get; set; } public List Fields { get; set; } diff --git a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs index 9d7cc56ce..070cd5332 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs @@ -182,6 +182,9 @@ namespace NzbDrone.Core.Applications.Whisparr // Retain user tags not-affiliated with Prowlarr whisparrIndexer.Tags.UnionWith(remoteIndexer.Tags); + // Retain user settings not-affiliated with Prowlarr + whisparrIndexer.DownloadClientId = remoteIndexer.DownloadClientId; + // Update the indexer if it still has categories that match _whisparrV3Proxy.UpdateIndexer(whisparrIndexer, Settings); } diff --git a/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs b/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs index 4cbd2d3ff..2edb460da 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs @@ -17,6 +17,7 @@ namespace NzbDrone.Core.Applications.Whisparr public string Implementation { get; set; } public string ConfigContract { get; set; } public string InfoLink { get; set; } + public int? DownloadClientId { get; set; } public HashSet Tags { get; set; } public List Fields { get; set; } From 26afcb0071e7fa19f73c2de1497572672f66be53 Mon Sep 17 00:00:00 2001 From: Robin Dadswell <19610103+RobinDadswell@users.noreply.github.com> Date: Mon, 18 Jul 2022 14:57:15 +0100 Subject: [PATCH 098/964] Fixed: PostgreSQL timezone issues (cherry picked from commit d55864f86914199aa0c4ee37df1e42e6ad71ef4f) --- azure-pipelines.yml | 2 + src/NuGet.config | 1 + .../Datastore/DatabaseFixture.cs | 14 +++++++ ...date_timestamp_columns_to_with_timezone.cs | 39 +++++++++++++++++++ src/NzbDrone.Core/Prowlarr.Core.csproj | 6 +-- 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/036_postgres_update_timestamp_columns_to_with_timezone.cs diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 133bdf4fe..859ba9fd3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -565,6 +565,7 @@ stages: -e POSTGRES_PASSWORD=prowlarr \ -e POSTGRES_USER=prowlarr \ -p 5432:5432/tcp \ + -v /usr/share/zoneinfo/America/Chicago:/etc/localtime:ro \ postgres:14 displayName: Start postgres - bash: | @@ -710,6 +711,7 @@ stages: -e POSTGRES_PASSWORD=prowlarr \ -e POSTGRES_USER=prowlarr \ -p 5432:5432/tcp \ + -v /usr/share/zoneinfo/America/Chicago:/etc/localtime:ro \ postgres:14 displayName: Start postgres - bash: | diff --git a/src/NuGet.config b/src/NuGet.config index 19fea7384..fcbd8bafb 100644 --- a/src/NuGet.config +++ b/src/NuGet.config @@ -7,5 +7,6 @@ + diff --git a/src/NzbDrone.Core.Test/Datastore/DatabaseFixture.cs b/src/NzbDrone.Core.Test/Datastore/DatabaseFixture.cs index 985fbb7d5..7f8a157b0 100644 --- a/src/NzbDrone.Core.Test/Datastore/DatabaseFixture.cs +++ b/src/NzbDrone.Core.Test/Datastore/DatabaseFixture.cs @@ -27,6 +27,20 @@ namespace NzbDrone.Core.Test.Datastore Mocker.Resolve().Vacuum(); } + [Test] + public void postgres_should_not_contain_timestamp_without_timezone_columns() + { + if (Db.DatabaseType != DatabaseType.PostgreSQL) + { + return; + } + + Mocker.Resolve() + .OpenConnection().Query("SELECT table_name, column_name, data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND data_type = 'timestamp without time zone'") + .Should() + .BeNullOrEmpty(); + } + [Test] public void get_version() { diff --git a/src/NzbDrone.Core/Datastore/Migration/036_postgres_update_timestamp_columns_to_with_timezone.cs b/src/NzbDrone.Core/Datastore/Migration/036_postgres_update_timestamp_columns_to_with_timezone.cs new file mode 100644 index 000000000..8a2d6fe9a --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/036_postgres_update_timestamp_columns_to_with_timezone.cs @@ -0,0 +1,39 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(036)] + public class postgres_update_timestamp_columns_to_with_timezone : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Alter.Table("ApplicationStatus").AlterColumn("InitialFailure").AsDateTimeOffset().Nullable(); + Alter.Table("ApplicationStatus").AlterColumn("MostRecentFailure").AsDateTimeOffset().Nullable(); + Alter.Table("ApplicationStatus").AlterColumn("DisabledTill").AsDateTimeOffset().Nullable(); + Alter.Table("Commands").AlterColumn("QueuedAt").AsDateTimeOffset().NotNullable(); + Alter.Table("Commands").AlterColumn("StartedAt").AsDateTimeOffset().Nullable(); + Alter.Table("Commands").AlterColumn("EndedAt").AsDateTimeOffset().Nullable(); + Alter.Table("DownloadClientStatus").AlterColumn("InitialFailure").AsDateTimeOffset().Nullable(); + Alter.Table("DownloadClientStatus").AlterColumn("MostRecentFailure").AsDateTimeOffset().Nullable(); + Alter.Table("DownloadClientStatus").AlterColumn("DisabledTill").AsDateTimeOffset().Nullable(); + Alter.Table("History").AlterColumn("Date").AsDateTimeOffset().NotNullable(); + Alter.Table("IndexerDefinitionVersions").AlterColumn("LastUpdated").AsDateTimeOffset().Nullable(); + Alter.Table("IndexerStatus").AlterColumn("InitialFailure").AsDateTimeOffset().Nullable(); + Alter.Table("IndexerStatus").AlterColumn("MostRecentFailure").AsDateTimeOffset().Nullable(); + Alter.Table("IndexerStatus").AlterColumn("DisabledTill").AsDateTimeOffset().Nullable(); + Alter.Table("IndexerStatus").AlterColumn("CookiesExpirationDate").AsDateTimeOffset().Nullable(); + Alter.Table("Indexers").AlterColumn("Added").AsDateTimeOffset().NotNullable(); + Alter.Table("ScheduledTasks").AlterColumn("LastExecution").AsDateTimeOffset().NotNullable(); + Alter.Table("ScheduledTasks").AlterColumn("LastStartTime").AsDateTimeOffset().Nullable(); + Alter.Table("VersionInfo").AlterColumn("AppliedOn").AsDateTimeOffset().Nullable(); + } + + protected override void LogDbUpgrade() + { + Alter.Table("Logs").AlterColumn("Time").AsDateTimeOffset().NotNullable(); + Alter.Table("UpdateHistory").AlterColumn("Date").AsDateTimeOffset().NotNullable(); + Alter.Table("VersionInfo").AlterColumn("AppliedOn").AsDateTimeOffset().Nullable(); + } + } +} diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 5789e62ff..86b491834 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -5,16 +5,16 @@ - + + + - - From 1e4c67dcdb49225140822fb3679ac3e8c5cd1cbe Mon Sep 17 00:00:00 2001 From: Stepan Goremykin Date: Sat, 18 Mar 2023 23:05:46 +0100 Subject: [PATCH 099/964] Update FluentAssertions (cherry picked from commit 951a9ade00d7c9105f03608cb598450d706b826f) --- .../DiskTests/DirectoryLookupServiceFixture.cs | 4 ++-- .../DiskTests/DiskTransferServiceFixture.cs | 12 ++++++------ .../Datastore/BasicRepositoryFixture.cs | 3 ++- .../FixFutureRunScheduledTasksFixture.cs | 2 +- .../ProviderStatusServiceFixture.cs | 7 ++++--- src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj | 2 +- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/NzbDrone.Common.Test/DiskTests/DirectoryLookupServiceFixture.cs b/src/NzbDrone.Common.Test/DiskTests/DirectoryLookupServiceFixture.cs index 1dc4256ee..dd27f6f1b 100644 --- a/src/NzbDrone.Common.Test/DiskTests/DirectoryLookupServiceFixture.cs +++ b/src/NzbDrone.Common.Test/DiskTests/DirectoryLookupServiceFixture.cs @@ -49,7 +49,7 @@ namespace NzbDrone.Common.Test.DiskTests .Setup(s => s.GetDirectoryInfos(It.IsAny())) .Returns(_folders); - Subject.LookupContents(root, false, false).Directories.Should().NotContain(Path.Combine(root, RECYCLING_BIN)); + Subject.LookupContents(root, false, false).Directories.Should().NotContain(dir => dir.Path == Path.Combine(root, RECYCLING_BIN)); } [Test] @@ -62,7 +62,7 @@ namespace NzbDrone.Common.Test.DiskTests .Setup(s => s.GetDirectoryInfos(It.IsAny())) .Returns(_folders); - Subject.LookupContents(root, false, false).Directories.Should().NotContain(Path.Combine(root, SYSTEM_VOLUME_INFORMATION)); + Subject.LookupContents(root, false, false).Directories.Should().NotContain(dir => dir.Path == Path.Combine(root, SYSTEM_VOLUME_INFORMATION)); } [Test] diff --git a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs index b01ac65db..fac3e20e7 100644 --- a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs +++ b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs @@ -564,7 +564,7 @@ namespace NzbDrone.Common.Test.DiskTests var count = Subject.MirrorFolder(source.FullName, destination.FullName); - count.Should().Equals(0); + count.Should().Be(0); destination.GetFileSystemInfos().Should().BeEmpty(); } @@ -584,7 +584,7 @@ namespace NzbDrone.Common.Test.DiskTests var count = Subject.MirrorFolder(source.FullName, destination.FullName); - count.Should().Equals(0); + count.Should().Be(0); destination.GetFileSystemInfos().Should().HaveCount(1); } @@ -601,7 +601,7 @@ namespace NzbDrone.Common.Test.DiskTests var count = Subject.MirrorFolder(source.FullName, destination.FullName); - count.Should().Equals(3); + count.Should().Be(3); VerifyCopyFolder(original.FullName, destination.FullName); } @@ -618,7 +618,7 @@ namespace NzbDrone.Common.Test.DiskTests var count = Subject.MirrorFolder(source.FullName, destination.FullName); - count.Should().Equals(3); + count.Should().Be(3); File.Exists(Path.Combine(destination.FullName, _nfsFile)).Should().BeFalse(); } @@ -638,7 +638,7 @@ namespace NzbDrone.Common.Test.DiskTests var count = Subject.MirrorFolder(source.FullName, destination.FullName); - count.Should().Equals(0); + count.Should().Be(0); VerifyCopyFolder(original.FullName, destination.FullName); } @@ -655,7 +655,7 @@ namespace NzbDrone.Common.Test.DiskTests var count = Subject.MirrorFolder(source.FullName + Path.DirectorySeparatorChar, destination.FullName); - count.Should().Equals(3); + count.Should().Be(3); VerifyCopyFolder(original.FullName, destination.FullName); } diff --git a/src/NzbDrone.Core.Test/Datastore/BasicRepositoryFixture.cs b/src/NzbDrone.Core.Test/Datastore/BasicRepositoryFixture.cs index 8070f9fda..fac7e7f00 100644 --- a/src/NzbDrone.Core.Test/Datastore/BasicRepositoryFixture.cs +++ b/src/NzbDrone.Core.Test/Datastore/BasicRepositoryFixture.cs @@ -13,6 +13,7 @@ namespace NzbDrone.Core.Test.Datastore [TestFixture] public class BasicRepositoryFixture : DbTest, ScheduledTask> { + private readonly TimeSpan _dateTimePrecision = TimeSpan.FromMilliseconds(20); private List _basicList; [SetUp] @@ -20,7 +21,7 @@ namespace NzbDrone.Core.Test.Datastore { AssertionOptions.AssertEquivalencyUsing(options => { - options.Using(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation.ToUniversalTime())).WhenTypeIs(); + options.Using(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation.ToUniversalTime(), _dateTimePrecision)).WhenTypeIs(); return options; }); diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/FixFutureRunScheduledTasksFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/FixFutureRunScheduledTasksFixture.cs index 39e193368..a0f303609 100644 --- a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/FixFutureRunScheduledTasksFixture.cs +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/FixFutureRunScheduledTasksFixture.cs @@ -42,7 +42,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers Subject.Clean(); // BeCloseTo handles Postgres rounding times - AllStoredModels.ToList().ForEach(t => t.LastExecution.Should().BeCloseTo(expectedTime)); + AllStoredModels.ToList().ForEach(t => t.LastExecution.Should().BeCloseTo(expectedTime, TimeSpan.FromMilliseconds(20))); } } } diff --git a/src/NzbDrone.Core.Test/ThingiProviderTests/ProviderStatusServiceFixture.cs b/src/NzbDrone.Core.Test/ThingiProviderTests/ProviderStatusServiceFixture.cs index 8e2f6b8c6..c91200460 100644 --- a/src/NzbDrone.Core.Test/ThingiProviderTests/ProviderStatusServiceFixture.cs +++ b/src/NzbDrone.Core.Test/ThingiProviderTests/ProviderStatusServiceFixture.cs @@ -34,6 +34,7 @@ namespace NzbDrone.Core.Test.ThingiProviderTests public class ProviderStatusServiceFixture : CoreTest { + private readonly TimeSpan _disabledTillPrecision = TimeSpan.FromMilliseconds(500); private DateTime _epoch; [SetUp] @@ -90,7 +91,7 @@ namespace NzbDrone.Core.Test.ThingiProviderTests var status = Subject.GetBlockedProviders().FirstOrDefault(); status.Should().NotBeNull(); status.DisabledTill.Should().HaveValue(); - status.DisabledTill.Value.Should().BeCloseTo(_epoch + TimeSpan.FromMinutes(1), 500); + status.DisabledTill.Value.Should().BeCloseTo(_epoch + TimeSpan.FromMinutes(1), _disabledTillPrecision); } [Test] @@ -133,7 +134,7 @@ namespace NzbDrone.Core.Test.ThingiProviderTests var status = Subject.GetBlockedProviders().FirstOrDefault(); status.Should().NotBeNull(); status.DisabledTill.Should().HaveValue(); - status.DisabledTill.Value.Should().BeCloseTo(_epoch + TimeSpan.FromMinutes(5), 500); + status.DisabledTill.Value.Should().BeCloseTo(_epoch + TimeSpan.FromMinutes(5), _disabledTillPrecision); } [Test] @@ -160,7 +161,7 @@ namespace NzbDrone.Core.Test.ThingiProviderTests status.Should().NotBeNull(); origStatus.EscalationLevel.Should().Be(3); - status.DisabledTill.Should().BeCloseTo(_epoch + TimeSpan.FromMinutes(1), 500); + status.DisabledTill.Should().BeCloseTo(_epoch + TimeSpan.FromMinutes(1), _disabledTillPrecision); } } } diff --git a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj index 87e84af7d..2b6c7e54b 100644 --- a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj @@ -3,7 +3,7 @@ net6.0 - + From f7727855b56aae5bf27b6c6f67bc9176cae8a6a1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 12 Aug 2023 07:19:27 +0300 Subject: [PATCH 100/964] Rework adding one minute back-off level for all providers (cherry picked from commit d8f314ff0ef64e8d90b21b7865e46be74db5e570) --- .../ThingiProviderTests/ProviderStatusServiceFixture.cs | 2 +- .../ThingiProvider/Status/ProviderStatusServiceBase.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/ThingiProviderTests/ProviderStatusServiceFixture.cs b/src/NzbDrone.Core.Test/ThingiProviderTests/ProviderStatusServiceFixture.cs index c91200460..dfe58dbb0 100644 --- a/src/NzbDrone.Core.Test/ThingiProviderTests/ProviderStatusServiceFixture.cs +++ b/src/NzbDrone.Core.Test/ThingiProviderTests/ProviderStatusServiceFixture.cs @@ -161,7 +161,7 @@ namespace NzbDrone.Core.Test.ThingiProviderTests status.Should().NotBeNull(); origStatus.EscalationLevel.Should().Be(3); - status.DisabledTill.Should().BeCloseTo(_epoch + TimeSpan.FromMinutes(1), _disabledTillPrecision); + status.DisabledTill.Should().BeCloseTo(_epoch + TimeSpan.FromMinutes(5), _disabledTillPrecision); } } } diff --git a/src/NzbDrone.Core/ThingiProvider/Status/ProviderStatusServiceBase.cs b/src/NzbDrone.Core/ThingiProvider/Status/ProviderStatusServiceBase.cs index 9d1eef9a5..15cf84d3b 100644 --- a/src/NzbDrone.Core/ThingiProvider/Status/ProviderStatusServiceBase.cs +++ b/src/NzbDrone.Core/ThingiProvider/Status/ProviderStatusServiceBase.cs @@ -116,7 +116,7 @@ namespace NzbDrone.Core.ThingiProvider.Status if (inStartupGracePeriod && minimumBackOff == TimeSpan.Zero && status.DisabledTill.HasValue) { - var maximumDisabledTill = now.AddSeconds(EscalationBackOff.Periods[1]); + var maximumDisabledTill = now + TimeSpan.FromSeconds(EscalationBackOff.Periods[2]); if (maximumDisabledTill < status.DisabledTill) { status.DisabledTill = maximumDisabledTill; From dfb00d9bb1cf0bfb5a98d5bfdde6fde4aa20d727 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 12 Aug 2023 12:07:17 +0300 Subject: [PATCH 101/964] Fixed: Ensure grab notifications are sent according to tags requirements --- src/NzbDrone.Core/Download/DownloadService.cs | 3 +++ .../Indexers/Events/IndexerDownloadEvent.cs | 1 + .../Notifications/NotificationService.cs | 27 ++++++++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/DownloadService.cs b/src/NzbDrone.Core/Download/DownloadService.cs index d5e6368f1..675ab3b8e 100644 --- a/src/NzbDrone.Core/Download/DownloadService.cs +++ b/src/NzbDrone.Core/Download/DownloadService.cs @@ -74,6 +74,7 @@ namespace NzbDrone.Core.Download DownloadClientId = downloadClient.Definition.Id, DownloadClientName = downloadClient.Definition.Name, Redirect = redirect, + Indexer = indexer, GrabTrigger = source == "Prowlarr" ? GrabTrigger.Manual : GrabTrigger.Api }; @@ -152,6 +153,7 @@ namespace NzbDrone.Core.Download var grabEvent = new IndexerDownloadEvent(release, success, source, host, release.Title, release.DownloadUrl) { + Indexer = indexer, GrabTrigger = source == "Prowlarr" ? GrabTrigger.Manual : GrabTrigger.Api }; @@ -204,6 +206,7 @@ namespace NzbDrone.Core.Download var grabEvent = new IndexerDownloadEvent(release, true, source, host, release.Title, release.DownloadUrl) { Redirect = true, + Indexer = indexer, GrabTrigger = source == "Prowlarr" ? GrabTrigger.Manual : GrabTrigger.Api }; diff --git a/src/NzbDrone.Core/Indexers/Events/IndexerDownloadEvent.cs b/src/NzbDrone.Core/Indexers/Events/IndexerDownloadEvent.cs index ae1495dd0..43bf8cd60 100644 --- a/src/NzbDrone.Core/Indexers/Events/IndexerDownloadEvent.cs +++ b/src/NzbDrone.Core/Indexers/Events/IndexerDownloadEvent.cs @@ -16,6 +16,7 @@ namespace NzbDrone.Core.Indexers.Events public string DownloadClient { get; set; } public string DownloadClientName { get; set; } public string DownloadId { get; set; } + public IIndexer Indexer { get; set; } public GrabTrigger GrabTrigger { get; set; } public IndexerDownloadEvent(ReleaseInfo release, bool successful, string source, string host, string title, string url) diff --git a/src/NzbDrone.Core/Notifications/NotificationService.cs b/src/NzbDrone.Core/Notifications/NotificationService.cs index 9ee85d0a0..8f5610975 100644 --- a/src/NzbDrone.Core/Notifications/NotificationService.cs +++ b/src/NzbDrone.Core/Notifications/NotificationService.cs @@ -1,10 +1,13 @@ using System; +using System.Linq; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.HealthCheck; +using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers.Events; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Update.History.Events; namespace NzbDrone.Core.Notifications @@ -185,7 +188,8 @@ namespace NzbDrone.Core.Notifications { try { - if (ShouldHandleOnGrab(grabMessage, ((NotificationDefinition)notification.Definition).IncludeManualGrabs)) + if (ShouldHandleIndexer(notification.Definition, (IndexerDefinition)message.Indexer.Definition) && + ShouldHandleOnGrab(grabMessage, ((NotificationDefinition)notification.Definition).IncludeManualGrabs)) { notification.OnGrab(grabMessage); } @@ -196,5 +200,26 @@ namespace NzbDrone.Core.Notifications } } } + + private bool ShouldHandleIndexer(ProviderDefinition definition, ProviderDefinition indexer) + { + if (definition.Tags.Empty()) + { + _logger.Debug("No tags set for this notification."); + + return true; + } + + if (definition.Tags.Intersect(indexer.Tags).Any()) + { + _logger.Debug("Notification and indexer have one or more intersecting tags."); + + return true; + } + + _logger.Debug("{0} does not have any intersecting tags with {1}. Notification will not be sent.", definition.Name, indexer.Name); + + return false; + } } } From 9f4c9d3344d4892a6b180067941f6bde82939758 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 12 Aug 2023 12:12:51 +0300 Subject: [PATCH 102/964] Show successful grabs in Search with green icon --- frontend/src/Search/Mobile/SearchIndexOverview.js | 14 +++++++++++++- frontend/src/Search/Table/SearchIndexRow.js | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/frontend/src/Search/Mobile/SearchIndexOverview.js b/frontend/src/Search/Mobile/SearchIndexOverview.js index 235ceb65d..1a14ae66c 100644 --- a/frontend/src/Search/Mobile/SearchIndexOverview.js +++ b/frontend/src/Search/Mobile/SearchIndexOverview.js @@ -37,6 +37,18 @@ function getDownloadIcon(isGrabbing, isGrabbed, grabError) { return icons.DOWNLOAD; } +function getDownloadKind(isGrabbed, grabError) { + if (isGrabbed) { + return kinds.SUCCESS; + } + + if (grabError) { + return kinds.DANGER; + } + + return kinds.DEFAULT; +} + function getDownloadTooltip(isGrabbing, isGrabbed, grabError) { if (isGrabbing) { return ''; @@ -115,7 +127,7 @@ class SearchIndexOverview extends Component {
Date: Thu, 10 Aug 2023 22:03:32 +0000 Subject: [PATCH 103/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Fixer Co-authored-by: Nir Israel Hen Co-authored-by: Weblate Co-authored-by: wilfriedarma Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/fr.json | 26 ++++++++++----------- src/NzbDrone.Core/Localization/Core/he.json | 2 +- src/NzbDrone.Core/Localization/Core/ro.json | 5 ++-- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 6ce799ffc..0b2d4153c 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -22,8 +22,8 @@ "Clear": "Effacer", "BackupNow": "Sauvegarder maintenant", "Backup": "Sauvegarde", - "AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible pour empêcher la suppression de AppData lors de la mise à jour", - "Analytics": "Analytique", + "AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour", + "Analytics": "Statistiques", "All": "Tout", "About": "À propos", "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", @@ -80,7 +80,7 @@ "EventType": "Type d'événement", "Details": "Détails", "ConnectSettingsSummary": "Notifications et scripts personnalisés", - "Added": "Ajouter", + "Added": "Ajouté", "Actions": "Actions", "Info": "Info", "Error": "Erreur", @@ -130,14 +130,14 @@ "PendingChangesStayReview": "Rester et vérifier les changements", "PendingChangesMessage": "Vous avez effectué des changements non sauvegardés, souhaitez vous quitter cette page ?", "PendingChangesDiscardChanges": "Abandonner les changements et quitter", - "CloneProfile": "Cloner le profil", + "CloneProfile": "Dupliqué le profil", "ClientPriority": "Priorité du client", "ChangeHasNotBeenSavedYet": "Les changements n'ont pas encore été sauvegardés", "CertificateValidationHelpText": "Change la rigueur de la vérification du certificat HTTPS", "CertificateValidation": "Validation du certificat", "BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales", "Branch": "Branche", - "BindAddressHelpText": "Adresse IPv4 valide, localhost ou '*' pour toutes les interfaces", + "BindAddressHelpText": "Adresse IP valide, localhost ou '*' pour toutes les interfaces", "BindAddress": "Adresse d'attache", "Backups": "Sauvegardes", "BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de conservation seront automatiquement effacées", @@ -146,9 +146,9 @@ "AuthenticationMethodHelpText": "Exiger un identifiant et un mot de passe pour accéder à Prowlarr", "Authentication": "Authentification", "AreYouSureYouWantToResetYourAPIKey": "Êtes vous sûr de vouloir réinitialiser votre Clé d'API ?", - "ApplyTags": "Appliquer les Étiquettes", + "ApplyTags": "Appliquer les tags", "AppDataDirectory": "Dossier AppData", - "ApiKey": "Clé d'API", + "ApiKey": "Clé API", "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Prowlarr. Cela inclut des informations sur votre navigateur, quelle page Prowlarr WebUI vous utilisez, les rapports d'erreurs, ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.", "IgnoredAddresses": "Adresses ignorées", "Hostname": "Nom d'hôte", @@ -172,7 +172,7 @@ "CancelPendingTask": "Êtes-vous sur de vouloir annuler cette tâche en attente ?", "BranchUpdateMechanism": "Branche utilisée par le mécanisme de mise à jour extérieur", "BranchUpdate": "Branche à utiliser pour mettre Prowlarr à jour", - "BeforeUpdate": "Avant mise à jour", + "BeforeUpdate": "Avant la mise à jour", "DeleteDownloadClientMessageText": "Êtes-vous sûr de vouloir supprimer le client de téléchargement '{0}' ?", "DeleteBackupMessageText": "Êtes-vous sûr de vouloir supprimer la sauvegarde '{0}' ?", "ErrorLoadingContents": "Erreur lors du chargement du contenu", @@ -285,7 +285,7 @@ "CloseCurrentModal": "Fermer le modal actuel", "AddingTag": "Ajouter un tag", "OnHealthIssueHelpText": "Sur un problème de santé", - "AcceptConfirmationModal": "Accepter la fenêtre de confirmation", + "AcceptConfirmationModal": "Accepter les modalités d'utilisations", "OpenThisModal": "Ouvrer ce modal", "IndexerLongTermStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison de pannes pendant plus de 6 heures : {0}", "IndexerLongTermStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs de plus de 6 heures", @@ -499,17 +499,17 @@ "Year": "Année", "ApplicationURL": "URL de l'application", "ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration", - "ApplicationUrlHelpText": "URL externe de cette application, y compris http(s)://, le port et l'URL de base", + "ApplicationUrlHelpText": "URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL", "ApplyChanges": "Appliquer les modifications", - "ApplyTagsHelpTextAdd": "Ajouter : Ajouter les étiquettes à la liste des étiquettes existantes", + "ApplyTagsHelpTextAdd": "Ajouter : Ajouter les tags à la liste de tags existantes", "ApplyTagsHelpTextHowToApplyApplications": "Comment appliquer des tags à l'auteur sélectionné", "CountIndexersSelected": "{0} indexeur(s) sélectionné(s)", "DeleteSelectedApplicationsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", "DeleteSelectedIndexersMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", "DownloadClientPriorityHelpText": "Donnez la priorité à plusieurs clients de téléchargement. Le Round-Robin est utilisé pour les clients ayant la même priorité.", "SelectIndexers": "Recherche indexeurs", - "ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des étiquettes aux indexeurs sélectionnés", - "ApplyTagsHelpTextRemove": "Retirer : Retire les étiquettes renseignées", + "ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des tags aux indexeurs sélectionnés", + "ApplyTagsHelpTextRemove": "Suprimer : Suprime les étiquettes renseignées", "ApplyTagsHelpTextReplace": "Remplacer : Remplace les tags par les tags renseignés (ne pas renseigner de tags pour effacer tous les tags)", "DeleteSelectedDownloadClients": "Supprimer le client de téléchargement", "DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 66d96291d..37cf0dc40 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -246,7 +246,7 @@ "InteractiveSearch": "חיפוש אינטראקטיבי", "IllRestartLater": "אתחיל מאוחר יותר", "IncludeHealthWarningsHelpText": "כלול אזהרות בריאות", - "Indexer": "מַפתְחָן", + "Indexer": "אינדקסר", "IndexerFlags": "אינדקס דגלים", "NoChanges": "אין שינויים", "NoLeaveIt": "לא, עזוב את זה", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 1e34e186f..b00f17d74 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -138,7 +138,7 @@ "AppDataDirectory": "Directorul AppData", "ApplicationStatusCheckAllClientMessage": "Toate aplicațiile sunt indisponibile datorită erorilor", "AreYouSureYouWantToResetYourAPIKey": "Sigur doriți să vă resetați cheia API?", - "Authentication": "Autentificare", + "Authentication": "", "AuthenticationMethodHelpText": "Solicitați numele de utilizator și parola pentru a accesa Prowlarr", "AutomaticSearch": "Căutare automată", "BackupFolderHelpText": "Căile relative vor fi în directorul AppData al lui Prowlarr", @@ -427,5 +427,6 @@ "IndexerCategories": "Categorii indexator", "Episode": "Episod", "Category": "Categorie", - "AddRemoveOnly": "Doar adaugă și șterge" + "AddRemoveOnly": "Doar adaugă și șterge", + "AuthenticationRequired": "Autentificare necesara" } From 5dbb59dfaaca8c0741a70b861329921588d080d3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 13 Aug 2023 13:04:41 +0300 Subject: [PATCH 104/964] Bump version to 1.8.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 859ba9fd3..64ed551d2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.8.2' + majorVersion: '1.8.3' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 31261f66ad7a186f5d179c2b318e9a6b0ac934b9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 13 Aug 2023 21:03:38 +0300 Subject: [PATCH 105/964] Use named tokens in frontend translate function --- .../src/Indexer/Add/AddIndexerModalContent.js | 2 +- .../Delete/DeleteIndexerModalContent.tsx | 2 +- .../Delete/DeleteIndexerModalContent.tsx | 4 +- .../Select/Edit/EditIndexerModalContent.tsx | 2 +- .../Index/Select/IndexerIndexSelectFooter.tsx | 2 +- frontend/src/Search/SearchFooter.js | 4 +- .../Applications/Applications/Application.js | 2 +- .../ManageApplicationsEditModalContent.tsx | 2 +- .../Manage/ManageApplicationsModalContent.tsx | 6 +-- .../DownloadClients/Categories/Category.js | 2 +- .../DownloadClients/DownloadClient.js | 2 +- .../ManageDownloadClientsEditModalContent.tsx | 2 +- .../ManageDownloadClientsModalContent.tsx | 6 +-- .../Indexers/IndexerProxies/IndexerProxy.js | 2 +- .../Notifications/Notification.js | 2 +- .../src/Settings/Profiles/App/AppProfile.js | 2 +- frontend/src/Settings/Tags/Tag.js | 2 +- frontend/src/Settings/UI/UISettings.js | 2 +- frontend/src/System/Backup/BackupRow.js | 2 +- frontend/src/System/Updates/Updates.js | 2 +- frontend/src/Utilities/String/translate.ts | 13 ++++-- src/NzbDrone.Core/Localization/Core/en.json | 43 +++++++++---------- 22 files changed, 57 insertions(+), 51 deletions(-) diff --git a/frontend/src/Indexer/Add/AddIndexerModalContent.js b/frontend/src/Indexer/Add/AddIndexerModalContent.js index 7925167e6..7d205dc11 100644 --- a/frontend/src/Indexer/Add/AddIndexerModalContent.js +++ b/frontend/src/Indexer/Add/AddIndexerModalContent.js @@ -288,7 +288,7 @@ class AddIndexerModalContent extends Component {
{ isPopulated ? - translate('CountIndexersAvailable', [filteredIndexers.length]) : + translate('CountIndexersAvailable', { count: filteredIndexers.length }) : null }
diff --git a/frontend/src/Indexer/Delete/DeleteIndexerModalContent.tsx b/frontend/src/Indexer/Delete/DeleteIndexerModalContent.tsx index 4052d13bc..aeae273a9 100644 --- a/frontend/src/Indexer/Delete/DeleteIndexerModalContent.tsx +++ b/frontend/src/Indexer/Delete/DeleteIndexerModalContent.tsx @@ -37,7 +37,7 @@ function DeleteIndexerModalContent(props: DeleteIndexerModalContentProps) { - {translate('AreYouSureYouWantToDeleteIndexer', [name])} + {translate('AreYouSureYouWantToDeleteIndexer', { name })} diff --git a/frontend/src/Indexer/Index/Select/Delete/DeleteIndexerModalContent.tsx b/frontend/src/Indexer/Index/Select/Delete/DeleteIndexerModalContent.tsx index 6a972b0d9..0793af82d 100644 --- a/frontend/src/Indexer/Index/Select/Delete/DeleteIndexerModalContent.tsx +++ b/frontend/src/Indexer/Index/Select/Delete/DeleteIndexerModalContent.tsx @@ -48,7 +48,9 @@ function DeleteIndexerModalContent(props: DeleteIndexerModalContentProps) {
- {translate('DeleteSelectedIndexersMessageText', [indexers.length])} + {translate('DeleteSelectedIndexersMessageText', { + count: indexers.length, + })}
    diff --git a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx index a25a15d2f..b0bba5b94 100644 --- a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx +++ b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx @@ -257,7 +257,7 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) {
    - {translate('CountIndexersSelected', [selectedCount])} + {translate('CountIndexersSelected', { count: selectedCount })}
    diff --git a/frontend/src/Indexer/Index/Select/IndexerIndexSelectFooter.tsx b/frontend/src/Indexer/Index/Select/IndexerIndexSelectFooter.tsx index fe3082d0b..64fe8c1cb 100644 --- a/frontend/src/Indexer/Index/Select/IndexerIndexSelectFooter.tsx +++ b/frontend/src/Indexer/Index/Select/IndexerIndexSelectFooter.tsx @@ -165,7 +165,7 @@ function IndexerIndexSelectFooter() {
    - {translate('CountIndexersSelected', [selectedCount])} + {translate('CountIndexersSelected', { count: selectedCount })}
    - {translate('CountApplicationsSelected', [selectedCount])} + {translate('CountApplicationsSelected', { count: selectedCount })}
    diff --git a/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx b/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx index b3235aa32..8c45cf8a5 100644 --- a/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx +++ b/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx @@ -268,9 +268,9 @@ function ManageApplicationsModalContent( isOpen={isDeleteModalOpen} kind={kinds.DANGER} title={translate('DeleteSelectedApplications')} - message={translate('DeleteSelectedApplicationsMessageText', [ - selectedIds.length, - ])} + message={translate('DeleteSelectedApplicationsMessageText', { + count: selectedIds.length, + })} confirmLabel={translate('Delete')} onConfirm={onConfirmDelete} onCancel={onDeleteModalClose} diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Categories/Category.js b/frontend/src/Settings/DownloadClients/DownloadClients/Categories/Category.js index 6e0a25a2d..1d1f61469 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Categories/Category.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Categories/Category.js @@ -88,7 +88,7 @@ class Category extends Component { message={
    - {translate('AreYouSureYouWantToDeleteCategory', [name])} + {translate('AreYouSureYouWantToDeleteCategory')}
    } diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClient.js b/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClient.js index 7136f531e..13b24343d 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClient.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClient.js @@ -105,7 +105,7 @@ class DownloadClient extends Component { isOpen={this.state.isDeleteDownloadClientModalOpen} kind={kinds.DANGER} title={translate('DeleteDownloadClient')} - message={translate('DeleteDownloadClientMessageText', [name])} + message={translate('DeleteDownloadClientMessageText', { name })} confirmLabel={translate('Delete')} onConfirm={this.onConfirmDeleteDownloadClient} onCancel={this.onDeleteDownloadClientModalClose} diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx index 5770a6255..a2e0f89c6 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx @@ -129,7 +129,7 @@ function ManageDownloadClientsEditModalContent(
    - {translate('CountDownloadClientsSelected', [selectedCount])} + {translate('CountDownloadClientsSelected', { count: selectedCount })}
    diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx index a6a4b501f..8e257ae7a 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx @@ -226,9 +226,9 @@ function ManageDownloadClientsModalContent( isOpen={isDeleteModalOpen} kind={kinds.DANGER} title={translate('DeleteSelectedDownloadClients')} - message={translate('DeleteSelectedDownloadClientsMessageText', [ - selectedIds.length, - ])} + message={translate('DeleteSelectedDownloadClientsMessageText', { + count: selectedIds.length, + })} confirmLabel={translate('Delete')} onConfirm={onConfirmDelete} onCancel={onDeleteModalClose} diff --git a/frontend/src/Settings/Indexers/IndexerProxies/IndexerProxy.js b/frontend/src/Settings/Indexers/IndexerProxies/IndexerProxy.js index 84292ae65..dcd7e1f35 100644 --- a/frontend/src/Settings/Indexers/IndexerProxies/IndexerProxy.js +++ b/frontend/src/Settings/Indexers/IndexerProxies/IndexerProxy.js @@ -122,7 +122,7 @@ class IndexerProxy extends Component { isOpen={this.state.isDeleteIndexerProxyModalOpen} kind={kinds.DANGER} title={translate('DeleteIndexerProxy')} - message={translate('DeleteIndexerProxyMessageText', [name])} + message={translate('DeleteIndexerProxyMessageText', { name })} confirmLabel={translate('Delete')} onConfirm={this.onConfirmDeleteIndexerProxy} onCancel={this.onDeleteIndexerProxyModalClose} diff --git a/frontend/src/Settings/Notifications/Notifications/Notification.js b/frontend/src/Settings/Notifications/Notifications/Notification.js index 0ffd49b40..4ecf33047 100644 --- a/frontend/src/Settings/Notifications/Notifications/Notification.js +++ b/frontend/src/Settings/Notifications/Notifications/Notification.js @@ -137,7 +137,7 @@ class Notification extends Component { isOpen={this.state.isDeleteNotificationModalOpen} kind={kinds.DANGER} title={translate('DeleteNotification')} - message={translate('DeleteNotificationMessageText', [name])} + message={translate('DeleteNotificationMessageText', { name })} confirmLabel={translate('Delete')} onConfirm={this.onConfirmDeleteNotification} onCancel={this.onDeleteNotificationModalClose} diff --git a/frontend/src/Settings/Profiles/App/AppProfile.js b/frontend/src/Settings/Profiles/App/AppProfile.js index 546006ff5..db123d006 100644 --- a/frontend/src/Settings/Profiles/App/AppProfile.js +++ b/frontend/src/Settings/Profiles/App/AppProfile.js @@ -130,7 +130,7 @@ class AppProfile extends Component { isOpen={this.state.isDeleteAppProfileModalOpen} kind={kinds.DANGER} title={translate('DeleteAppProfile')} - message={translate('AppProfileDeleteConfirm', [name])} + message={translate('DeleteAppProfileMessageText', { name })} confirmLabel={translate('Delete')} isSpinning={isDeleting} onConfirm={this.onConfirmDeleteAppProfile} diff --git a/frontend/src/Settings/Tags/Tag.js b/frontend/src/Settings/Tags/Tag.js index 607a67543..afeb3863a 100644 --- a/frontend/src/Settings/Tags/Tag.js +++ b/frontend/src/Settings/Tags/Tag.js @@ -137,7 +137,7 @@ class Tag extends Component { isOpen={isDeleteTagModalOpen} kind={kinds.DANGER} title={translate('DeleteTag')} - message={translate('DeleteTagMessageText', [label])} + message={translate('DeleteTagMessageText', { label })} confirmLabel={translate('Delete')} onConfirm={this.onConfirmDeleteTag} onCancel={this.onDeleteTagModalClose} diff --git a/frontend/src/Settings/UI/UISettings.js b/frontend/src/Settings/UI/UISettings.js index 614fd2fe0..cfb7c04f6 100644 --- a/frontend/src/Settings/UI/UISettings.js +++ b/frontend/src/Settings/UI/UISettings.js @@ -147,7 +147,7 @@ class UISettings extends Component {
    - {translate('TheLatestVersionIsAlreadyInstalled', ['Prowlarr'])} + {translate('TheLatestVersionIsAlreadyInstalled', { appName: 'Prowlarr' })}
    { diff --git a/frontend/src/Utilities/String/translate.ts b/frontend/src/Utilities/String/translate.ts index 9c6fa778b..2ee319bc8 100644 --- a/frontend/src/Utilities/String/translate.ts +++ b/frontend/src/Utilities/String/translate.ts @@ -25,14 +25,19 @@ export async function fetchTranslations(): Promise { export default function translate( key: string, - args?: (string | number | boolean)[] + tokens?: Record ) { const translation = translations[key] || key; - if (args) { - return translation.replace(/\{(\d+)\}/g, (match, index) => { - return String(args[index]) ?? match; + if (tokens) { + // Fallback to the old behaviour for translations not yet updated to use named tokens + Object.values(tokens).forEach((value, index) => { + tokens[index] = value; }); + + return translation.replace(/\{([a-z0-9]+?)\}/gi, (match, tokenMatch) => + String(tokens[tokenMatch] ?? match) + ); } return translation; diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 8c267fcae..289b7103c 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -28,7 +28,6 @@ "ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file", "AppDataDirectory": "AppData directory", "AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update", - "AppProfileDeleteConfirm": "Are you sure you want to delete {0}?", "AppProfileInUse": "App Profile in Use", "AppProfileSelectHelpText": "App profiles are used to control RSS, Automatic Search and Interactive Search settings on application sync", "AppSettingsSummary": "Applications and settings to configure how Prowlarr interacts with your PVR programs", @@ -52,7 +51,7 @@ "AppsMinimumSeeders": "Apps Minimum Seeders", "AppsMinimumSeedersHelpText": "Minimum seeders required by the Applications for the indexer to grab, empty is Sync profile's default", "AreYouSureYouWantToDeleteCategory": "Are you sure you want to delete mapped category?", - "AreYouSureYouWantToDeleteIndexer": "Are you sure you want to delete '{0}' from Prowlarr?", + "AreYouSureYouWantToDeleteIndexer": "Are you sure you want to delete '{name}' from Prowlarr?", "AreYouSureYouWantToResetYourAPIKey": "Are you sure you want to reset your API Key?", "Artist": "Artist", "AudioSearch": "Audio Search", @@ -108,10 +107,10 @@ "ConnectionLostMessage": "Prowlarr has lost its connection to the backend and will need to be reloaded to restore functionality.", "Connections": "Connections", "CouldNotConnectSignalR": "Could not connect to SignalR, UI won't update", - "CountApplicationsSelected": "{0} application(s) selected", - "CountDownloadClientsSelected": "{0} download client(s) selected", - "CountIndexersAvailable": "{0} indexer(s) available", - "CountIndexersSelected": "{0} indexer(s) selected", + "CountApplicationsSelected": "{count} application(s) selected", + "CountDownloadClientsSelected": "{count} download client(s) selected", + "CountIndexersAvailable": "{count} indexer(s) available", + "CountIndexersSelected": "{count} indexer(s) selected", "Custom": "Custom", "CustomFilters": "Custom Filters", "DBMigration": "DB Migration", @@ -120,26 +119,27 @@ "Dates": "Dates", "Delete": "Delete", "DeleteAppProfile": "Delete App Profile", + "DeleteAppProfileMessageText": "Are you sure you want to delete the app profile '{name}'?", "DeleteApplication": "Delete Application", - "DeleteApplicationMessageText": "Are you sure you want to delete the application '{0}'?", + "DeleteApplicationMessageText": "Are you sure you want to delete the application '{name}'?", "DeleteBackup": "Delete Backup", - "DeleteBackupMessageText": "Are you sure you want to delete the backup '{0}'?", + "DeleteBackupMessageText": "Are you sure you want to delete the backup '{name}'?", "DeleteClientCategory": "Delete Download Client Category", "DeleteDownloadClient": "Delete Download Client", - "DeleteDownloadClientMessageText": "Are you sure you want to delete the download client '{0}'?", + "DeleteDownloadClientMessageText": "Are you sure you want to delete the download client '{name}'?", "DeleteIndexerProxy": "Delete Indexer Proxy", - "DeleteIndexerProxyMessageText": "Are you sure you want to delete the proxy '{0}'?", + "DeleteIndexerProxyMessageText": "Are you sure you want to delete the indexer proxy '{name}'?", "DeleteNotification": "Delete Notification", - "DeleteNotificationMessageText": "Are you sure you want to delete the notification '{0}'?", + "DeleteNotificationMessageText": "Are you sure you want to delete the notification '{name}'?", "DeleteSelectedApplications": "Delete Selected Applications", - "DeleteSelectedApplicationsMessageText": "Are you sure you want to delete {0} selected application(s)?", + "DeleteSelectedApplicationsMessageText": "Are you sure you want to delete {count} selected application(s)?", "DeleteSelectedDownloadClients": "Delete Download Client(s)", - "DeleteSelectedDownloadClientsMessageText": "Are you sure you want to delete {0} selected download client(s)?", + "DeleteSelectedDownloadClientsMessageText": "Are you sure you want to delete {count} selected download client(s)?", "DeleteSelectedIndexer": "Delete Selected Indexer", "DeleteSelectedIndexers": "Delete Selected Indexers", - "DeleteSelectedIndexersMessageText": "Are you sure you want to delete {0} selected indexer(s)?", + "DeleteSelectedIndexersMessageText": "Are you sure you want to delete {count} selected indexer(s)?", "DeleteTag": "Delete Tag", - "DeleteTagMessageText": "Are you sure you want to delete the tag '{0}'?", + "DeleteTagMessageText": "Are you sure you want to delete the tag '{label}'?", "Description": "Description", "Details": "Details", "DevelopmentSettings": "Development Settings", @@ -195,7 +195,7 @@ "FocusSearchBox": "Focus Search Box", "Folder": "Folder", "ForMoreInformationOnTheIndividualDownloadClients": "For more information on the individual download clients, click on the info buttons.", - "FoundCountReleases": "Found {0} releases", + "FoundCountReleases": "Found {itemCount} releases", "FullSync": "Full Sync", "General": "General", "GeneralSettings": "General Settings", @@ -257,7 +257,6 @@ "IndexerVipCheckExpiredClientMessage": "Indexer VIP benefits have expired: {0}", "IndexerVipCheckExpiringClientMessage": "Indexer VIP benefits expiring soon: {0}", "Indexers": "Indexers", - "IndexersSelectedInterp": "{0} Indexer(s) Selected", "Info": "Info", "InitialFailure": "Initial Failure", "InstanceName": "Instance Name", @@ -358,7 +357,7 @@ "Proxies": "Proxies", "Proxy": "Proxy", "ProxyBypassFilterHelpText": "Use ',' as a separator, and '*.' as a wildcard for subdomains", - "ProxyCheckBadRequestMessage": "Failed to test proxy. StatusCode: {0}", + "ProxyCheckBadRequestMessage": "Failed to test proxy. Status code: {0}", "ProxyCheckFailedToTestMessage": "Failed to test proxy: {0}", "ProxyCheckResolveIpMessage": "Failed to resolve the IP Address for the Configured Proxy Host {0}", "ProxyPasswordHelpText": "You only need to enter a username and password if one is required. Leave them blank otherwise.", @@ -415,7 +414,7 @@ "Search": "Search", "SearchAllIndexers": "Search all indexers", "SearchCapabilities": "Search Capabilities", - "SearchCountIndexers": "Search {0} indexers", + "SearchCountIndexers": "Search {count} indexer(s)", "SearchIndexers": "Search Indexers", "SearchQueries": "Search Queries", "SearchType": "Search Type", @@ -429,7 +428,7 @@ "Seeders": "Seeders", "SelectAll": "Select All", "SelectIndexers": "Select Indexers", - "SelectedCountOfCountReleases": "Selected {0} of {1} releases", + "SelectedCountOfCountReleases": "Selected {selectedCount} of {itemCount} releases", "SemiPrivate": "Semi-Private", "SendAnonymousUsageData": "Send Anonymous Usage Data", "SetTags": "Set Tags", @@ -487,9 +486,9 @@ "TestAllApps": "Test All Apps", "TestAllClients": "Test All Clients", "TestAllIndexers": "Test All Indexers", - "TheLatestVersionIsAlreadyInstalled": "The latest version of {0} is already installed", + "TheLatestVersionIsAlreadyInstalled": "The latest version of {appName} is already installed", "Theme": "Theme", - "ThemeHelpText": "Change Application UI Theme, 'Auto' Theme will use your OS Theme to set Light or Dark mode. Inspired by {0}", + "ThemeHelpText": "Change Application UI Theme, 'Auto' Theme will use your OS Theme to set Light or Dark mode. Inspired by {inspiredBy}.", "Time": "Time", "Title": "Title", "Today": "Today", From 307adf053e6fee914519c2416cef58c88060c530 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Sun, 13 Aug 2023 23:03:52 +0200 Subject: [PATCH 106/964] Translate Updated and Connection Lost Modals in frontend (cherry picked from commit 074aa6f4457bf83173e6ba7209c452a6e0659a35) --- frontend/src/App/AppUpdatedModalContent.css | 1 + frontend/src/App/AppUpdatedModalContent.js | 15 ++++--- frontend/src/App/ConnectionLostModal.js | 4 +- .../src/Components/Markdown/InlineMarkdown.js | 41 ++++++++++++++++--- src/NzbDrone.Core/Localization/Core/en.json | 8 +++- 5 files changed, 51 insertions(+), 18 deletions(-) diff --git a/frontend/src/App/AppUpdatedModalContent.css b/frontend/src/App/AppUpdatedModalContent.css index 37b89c9be..0df4183a6 100644 --- a/frontend/src/App/AppUpdatedModalContent.css +++ b/frontend/src/App/AppUpdatedModalContent.css @@ -1,6 +1,7 @@ .version { margin: 0 3px; font-weight: bold; + font-family: var(--defaultFontFamily); } .maintenance { diff --git a/frontend/src/App/AppUpdatedModalContent.js b/frontend/src/App/AppUpdatedModalContent.js index d03609a69..71dc7702c 100644 --- a/frontend/src/App/AppUpdatedModalContent.js +++ b/frontend/src/App/AppUpdatedModalContent.js @@ -2,6 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import Button from 'Components/Link/Button'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; +import InlineMarkdown from 'Components/Markdown/InlineMarkdown'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; @@ -64,12 +65,12 @@ function AppUpdatedModalContent(props) { return ( - Prowlarr Updated + {translate('AppUpdated', { appName: 'Prowlarr' })}
    - Version {version} of Prowlarr has been installed, in order to get the latest changes you'll need to reload Prowlarr. +
    { @@ -77,16 +78,14 @@ function AppUpdatedModalContent(props) {
    { !update.changes && -
    - {translate('MaintenanceRelease')} -
    +
    {translate('MaintenanceRelease')}
    } { !!update.changes &&
    - What's new? + {translate('WhatsNew')}
    - Recent Changes + {translate('RecentChanges')} diff --git a/frontend/src/App/ConnectionLostModal.js b/frontend/src/App/ConnectionLostModal.js index 16adf78f5..71cfa907e 100644 --- a/frontend/src/App/ConnectionLostModal.js +++ b/frontend/src/App/ConnectionLostModal.js @@ -28,11 +28,11 @@ function ConnectionLostModal(props) {
    - {translate('ConnectionLostMessage')} + {translate('ConnectionLostToBackend', { appName: 'Prowlarr' })}
    - {translate('ConnectionLostAutomaticMessage')} + {translate('ConnectionLostReconnect', { appName: 'Prowlarr' })}
    diff --git a/frontend/src/Components/Markdown/InlineMarkdown.js b/frontend/src/Components/Markdown/InlineMarkdown.js index dc9ea9bf3..993bb241e 100644 --- a/frontend/src/Components/Markdown/InlineMarkdown.js +++ b/frontend/src/Components/Markdown/InlineMarkdown.js @@ -10,27 +10,55 @@ class InlineMarkdown extends Component { render() { const { className, - data + data, + blockClassName } = this.props; - // For now only replace links + // For now only replace links or code blocks (not both) const markdownBlocks = []; if (data) { - const regex = RegExp(/\[(.+?)\]\((.+?)\)/g); + const linkRegex = RegExp(/\[(.+?)\]\((.+?)\)/g); let endIndex = 0; let match = null; - while ((match = regex.exec(data)) !== null) { + + while ((match = linkRegex.exec(data)) !== null) { if (match.index > endIndex) { markdownBlocks.push(data.substr(endIndex, match.index - endIndex)); } + markdownBlocks.push({match[1]}); endIndex = match.index + match[0].length; } - if (endIndex !== data.length) { + if (endIndex !== data.length && markdownBlocks.length > 0) { markdownBlocks.push(data.substr(endIndex, data.length - endIndex)); } + + const codeRegex = RegExp(/(?=`)`(?!`)[^`]*(?=`)`(?!`)/g); + + endIndex = 0; + match = null; + let matchedCode = false; + + while ((match = codeRegex.exec(data)) !== null) { + matchedCode = true; + + if (match.index > endIndex) { + markdownBlocks.push(data.substr(endIndex, match.index - endIndex)); + } + + markdownBlocks.push({match[0].substring(1, match[0].length - 1)}); + endIndex = match.index + match[0].length; + } + + if (endIndex !== data.length && markdownBlocks.length > 0 && matchedCode) { + markdownBlocks.push(data.substr(endIndex, data.length - endIndex)); + } + + if (markdownBlocks.length === 0) { + markdownBlocks.push(data); + } } return {markdownBlocks}; @@ -39,7 +67,8 @@ class InlineMarkdown extends Component { InlineMarkdown.propTypes = { className: PropTypes.string, - data: PropTypes.string + data: PropTypes.string, + blockClassName: PropTypes.string }; export default InlineMarkdown; diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 289b7103c..66ccfad7a 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -31,6 +31,8 @@ "AppProfileInUse": "App Profile in Use", "AppProfileSelectHelpText": "App profiles are used to control RSS, Automatic Search and Interactive Search settings on application sync", "AppSettingsSummary": "Applications and settings to configure how Prowlarr interacts with your PVR programs", + "AppUpdated": "{appName} Updated", + "AppUpdatedVersion": "{appName} has been updated to version `{version}`, in order to get the latest changes you'll need to reload {appName}", "Application": "Application", "ApplicationLongTermStatusCheckAllClientMessage": "All applications are unavailable due to failures for more than 6 hours", "ApplicationLongTermStatusCheckSingleClientMessage": "Applications unavailable due to failures for more than 6 hours: {0}", @@ -103,8 +105,8 @@ "ConnectSettings": "Connect Settings", "ConnectSettingsSummary": "Notifications and custom scripts", "ConnectionLost": "Connection Lost", - "ConnectionLostAutomaticMessage": "Prowlarr will try to connect automatically, or you can click reload below.", - "ConnectionLostMessage": "Prowlarr has lost its connection to the backend and will need to be reloaded to restore functionality.", + "ConnectionLostReconnect": "{appName} will try to connect automatically, or you can click reload below.", + "ConnectionLostToBackend": "{appName} has lost its connection to the backend and will need to be reloaded to restore functionality.", "Connections": "Connections", "CouldNotConnectSignalR": "Could not connect to SignalR, UI won't update", "CountApplicationsSelected": "{count} application(s) selected", @@ -375,6 +377,7 @@ "RSSIsNotSupportedWithThisIndexer": "RSS is not supported with this indexer", "RawSearchSupported": "Raw Search Supported", "ReadTheWikiForMoreInformation": "Read the Wiki for more information", + "RecentChanges": "Recent Changes", "Reddit": "Reddit", "Redirect": "Redirect", "RedirectHelpText": "Redirect incoming download request for indexer and pass the grab directly instead of proxying the request via Prowlarr", @@ -552,6 +555,7 @@ "VipExpiration": "VIP Expiration", "Warn": "Warn", "Website": "Website", + "WhatsNew": "What's New?", "Wiki": "Wiki", "Year": "Year", "Yes": "Yes", From d5b3961e8ab4fcc7ec5eb85da85c724a77b7506e Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 14 Aug 2023 10:41:08 +0000 Subject: [PATCH 107/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: David Molero Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: Weblate Co-authored-by: deepserket Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ar.json | 2 - src/NzbDrone.Core/Localization/Core/bg.json | 2 - src/NzbDrone.Core/Localization/Core/ca.json | 1 - src/NzbDrone.Core/Localization/Core/cs.json | 2 - src/NzbDrone.Core/Localization/Core/da.json | 2 - src/NzbDrone.Core/Localization/Core/de.json | 3 - src/NzbDrone.Core/Localization/Core/el.json | 4 - src/NzbDrone.Core/Localization/Core/es.json | 75 +++++++++++-------- src/NzbDrone.Core/Localization/Core/fi.json | 4 - src/NzbDrone.Core/Localization/Core/fr.json | 4 - src/NzbDrone.Core/Localization/Core/he.json | 3 - src/NzbDrone.Core/Localization/Core/hi.json | 2 - src/NzbDrone.Core/Localization/Core/hu.json | 3 - src/NzbDrone.Core/Localization/Core/id.json | 1 - src/NzbDrone.Core/Localization/Core/is.json | 2 - src/NzbDrone.Core/Localization/Core/it.json | 11 ++- src/NzbDrone.Core/Localization/Core/ja.json | 2 - src/NzbDrone.Core/Localization/Core/ko.json | 2 - .../Localization/Core/nb_NO.json | 2 - src/NzbDrone.Core/Localization/Core/nl.json | 3 - src/NzbDrone.Core/Localization/Core/pl.json | 2 - src/NzbDrone.Core/Localization/Core/pt.json | 3 - .../Localization/Core/pt_BR.json | 53 ++++++------- src/NzbDrone.Core/Localization/Core/ro.json | 21 ++++-- src/NzbDrone.Core/Localization/Core/ru.json | 2 - src/NzbDrone.Core/Localization/Core/sv.json | 3 - src/NzbDrone.Core/Localization/Core/th.json | 2 - src/NzbDrone.Core/Localization/Core/tr.json | 2 - src/NzbDrone.Core/Localization/Core/uk.json | 1 - src/NzbDrone.Core/Localization/Core/vi.json | 2 - .../Localization/Core/zh_CN.json | 3 - 31 files changed, 88 insertions(+), 136 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index d5aff9f85..1eedf2375 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -80,7 +80,6 @@ "UpdateCheckStartupNotWritableMessage": "لا يمكن تثبيت التحديث لأن مجلد بدء التشغيل \"{0}\" غير قابل للكتابة بواسطة المستخدم \"{1}\".", "UpdateMechanismHelpText": "استخدم المحدث أو البرنامج النصي المدمج في Prowlarr", "AppDataDirectory": "دليل AppData", - "ConnectionLostAutomaticMessage": "سيحاول Prowlarr الاتصال تلقائيًا ، أو يمكنك النقر فوق إعادة التحميل أدناه.", "ConnectSettings": "ربط الإعدادات", "CouldNotConnectSignalR": "تعذر الاتصال بـ SignalR ، لن يتم تحديث واجهة المستخدم", "Dates": "تواريخ", @@ -316,7 +315,6 @@ "OnGrab": "عند الاستيلاء", "OnHealthIssue": "في قضية الصحة", "TestAllIndexers": "اختبار كافة المفهرسات", - "ConnectionLostMessage": "فقد Whisparr اتصاله بالواجهة الخلفية وسيحتاج إلى إعادة تحميله لاستعادة الوظائف.", "Link": "الروابط", "MappedDrivesRunningAsService": "لا تتوفر محركات أقراص الشبكة المعينة عند التشغيل كخدمة Windows. يرجى الاطلاع على التعليمات لمزيد من المعلومات", "UnableToLoadIndexers": "تعذر تحميل المفهرسات", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index aea8c45dc..dab40a533 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -57,7 +57,6 @@ "CertificateValidationHelpText": "Променете колко строго е валидирането на HTTPS сертифициране", "Clear": "Ясно", "ClientPriority": "Приоритет на клиента", - "ConnectionLostAutomaticMessage": "Prowlarr ще се опита да се свърже автоматично или можете да щракнете върху презареждане по-долу.", "Connections": "Връзки", "CouldNotConnectSignalR": "Не можах да се свържа със SignalR, потребителският интерфейс няма да се актуализира", "DeleteBackupMessageText": "Наистина ли искате да изтриете резервното копие '{0}'?", @@ -321,7 +320,6 @@ "No": "Не", "UnableToLoadIndexers": "Индексаторите не могат да се заредят", "Yes": "Да", - "ConnectionLostMessage": "Whisparr е загубил връзката си с бекенда и ще трябва да се презареди, за да възстанови функционалността.", "MappedDrivesRunningAsService": "Картографираните мрежови устройства не са налични, когато се изпълняват като услуга на Windows. Моля, вижте често задаваните въпроси за повече информация", "ApplicationLongTermStatusCheckSingleClientMessage": "Индексатори не са налични поради неуспехи за повече от 6 часа: {0}", "Ended": "Приключи", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 10ba7e019..230360072 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -302,7 +302,6 @@ "Yesterday": "Ahir", "ApplicationStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}", "AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de Prowlarr. Això inclou informació sobre el vostre navegador, quines pàgines Prowlarr WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.", - "ConnectionLostAutomaticMessage": "Prowlarr intentarà connectar-se automàticament, o podeu fer clic a recarregar.", "ConnectionLostMessage": "Prowlarr ha perdut la connexió amb el backend i s'haurà de tornar a carregar per restaurar la funcionalitat.", "HistoryCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament", "UnableToAddANewAppProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 7d2ff2fc7..931274031 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -241,7 +241,6 @@ "ClientPriority": "Priorita klienta", "CloneProfile": "Klonovat profil", "Close": "Zavřít", - "ConnectionLostAutomaticMessage": "Prowlarr se pokusí připojit automaticky, nebo můžete kliknout na znovu načíst níže.", "CouldNotConnectSignalR": "Nelze se připojit k SignalR, uživatelské rozhraní se neaktualizuje", "CustomFilters": "Vlastní filtry", "Date": "datum", @@ -310,7 +309,6 @@ "UpdateAutomaticallyHelpText": "Automaticky stahovat a instalovat aktualizace. Stále budete moci instalovat ze systému: Aktualizace", "NetCore": ".NET Core", "Filters": "Filtr", - "ConnectionLostMessage": "Prowlarr ztratil spojení s back-endem a pro obnovení funkčnosti bude nutné jej znovu načíst.", "HistoryCleanupDaysHelpText": "Nastavením na 0 zakážete automatické čištění", "HistoryCleanupDaysHelpTextWarning": "Soubory v koši starší než vybraný počet dní budou automaticky vyčištěny", "MaintenanceRelease": "Údržbové vydání: opravy chyb a další vylepšení. Další podrobnosti najdete v GitHub Commit History", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 4a48bf152..599febcf0 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -33,7 +33,6 @@ "CustomFilters": "Bruger Tilpassede Filtere", "ConnectSettingsSummary": "Notifikationer, forbindelser til medieservere/-afspillere og brugerdefinerede scripts", "Connections": "Forbindelser", - "ConnectionLostMessage": "Prowlarr har mistet forbindelsen til backend'en og har brug for at blive genindlæst for at genetablere funktionaliteten.", "ConnectionLostAutomaticMessage": "Prowlarr vil prøve at tilslutte automatisk, eller du kan klikke genindlæs forneden.", "ConnectionLost": "Forbindelse Mistet", "Connect": "Notifikationer", @@ -336,7 +335,6 @@ "AddRemoveOnly": "Tilføj og fjern kun", "AddNewIndexer": "Tilføj en ny indeksør", "AddToDownloadClient": "Føj udgivelse til downloadklient", - "AppProfileDeleteConfirm": "Er du sikker på at du vil fjerne {0}?", "AddIndexerProxy": "Tilføj en indeksørproxy", "AddSyncProfile": "Tilføj synkroniseringsprofil", "EditSyncProfile": "Tilføj synkroniseringsprofil", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 95c47c2cf..dbaddbb3b 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -23,7 +23,6 @@ "ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {0} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen", "AppDataDirectory": "AppData Ordner", "AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern", - "AppProfileDeleteConfirm": "Möchten Sie {0} wirklich löschen?", "AppProfileInUse": "App-Profil im Einsatz", "AppProfileSelectHelpText": "App-Profile werden verwendet, um die Einstellungen für RSS, automatische Suche und interaktive Suche bei der Anwendungssynchronisierung zu steuern", "AppSettingsSummary": "Anwendungen und Einstellungen um zu konfigurieren, wie Prowlarr mit deinen PVR Programmen interagiert", @@ -78,7 +77,6 @@ "ConnectSettings": "Eintellungen für Verbindungen", "ConnectSettingsSummary": "Benachrichtigungen und eigene Scripte", "ConnectionLost": "Verbindung unterbrochen", - "ConnectionLostAutomaticMessage": "Prowlarr wird automatisch versuchen zu verbinden oder klicke unten auf neuladen.", "ConnectionLostMessage": "Prowlarr hat die Verbindung zum Backend verloren und muss neugeladen werden.", "Connections": "Verbindungen", "CouldNotConnectSignalR": "Es konnte keine Verbindung zu SignalR hergestellt werden, die Benutzeroberfläche wird nicht aktualisiert", @@ -201,7 +199,6 @@ "IndexerVipCheckExpiredClientMessage": "Die VIP Indexer Vorteile sind abgelaufen: {0}", "IndexerVipCheckExpiringClientMessage": "Die Indexer VIP Vorteile verfallen bald: {0}", "Indexers": "Indexer", - "IndexersSelectedInterp": "{0} Indexer ausgewählt", "Info": "Info", "InstanceName": "Instanzname", "InstanceNameHelpText": "Instanzname im Browser-Tab und für Syslog-Anwendungsname", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 928948806..9d3e72f70 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -34,7 +34,6 @@ "CustomFilters": "Custom Φιλτρα", "ConnectSettingsSummary": "Ειδοποιήσεις και προσαρμοσμένα σενάρια", "AppDataLocationHealthCheckMessage": "Η ενημέρωση δεν θα είναι δυνατή για να αποτραπεί η διαγραφή των δεδομένων εφαρμογής κατά την ενημέρωση", - "ConnectionLostAutomaticMessage": "Το Prowlarr θα προσπαθήσει να συνδεθεί αυτόματα, αλλιώς μπορείτε να κάνετε reload απο κάτω.", "Component": "Στοιχείο", "Columns": "Στήλες", "Close": "Κλείσιμο", @@ -318,7 +317,6 @@ "OnHealthIssue": "Σχετικά με το θέμα της υγείας", "TestAllIndexers": "Δοκιμάστε όλους τους δείκτες", "MaintenanceRelease": "Έκδοση συντήρησης: επιδιορθώσεις σφαλμάτων και άλλες βελτιώσεις. Δείτε το Github Commit History για περισσότερες λεπτομέρειες", - "ConnectionLostMessage": "Το Prowlarr έχει χάσει τη σύνδεσή του με το backend και θα χρειαστεί να φορτωθεί ξανά για να επαναφέρετε τη λειτουργικότητα.", "NetCore": ".NET", "GrabReleases": "Πιάσε την απελευθέρωση", "Link": "Συνδέσεις", @@ -347,7 +345,6 @@ "ThemeHelpText": "Αλλαγή του θέματος διεπαφής χρήστη εφαρμογής, το θέμα «Αυτόματο» θα χρησιμοποιήσει το Θέμα του λειτουργικού σας συστήματος για να ρυθμίσει τη λειτουργία Light ή Dark. Εμπνευσμένο από το Theme.Park", "SettingsFilterSentryEvents": "Φιλτράρισμα συμβάντων Analytics", "SettingsSqlLoggingHelpText": "Καταγράψτε όλα τα ερωτήματα SQL από το Prowlarr", - "AppProfileDeleteConfirm": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το {0};", "SettingsConsoleLogLevel": "Επίπεδο καταγραφής κονσόλας", "SettingsLogRotate": "Περιστροφή καταγραφής", "SettingsLogRotateHelpText": "Μέγιστος αριθμός αρχείων καταγραφής που θα διατηρηθούν αποθηκευμένα στο φάκελο καταγραφής", @@ -415,7 +412,6 @@ "TestAllApps": "Δοκιμάστε όλες τις εφαρμογές", "UnableToLoadIndexerProxies": "Δεν είναι δυνατή η φόρτωση των Proxer Indexer", "AddDownloadClientToProwlarr": "Η προσθήκη ενός προγράμματος-πελάτη λήψης επιτρέπει στο Prowlarr να στέλνει εκδόσεις απευθείας από τη διεπαφή χρήστη ενώ κάνει μια μη αυτόματη αναζήτηση.", - "IndexersSelectedInterp": "{0}Επιλέχτηκε ευρετήριο", "Application": "Εφαρμογή", "IndexerAuth": "Indexer Auth", "AddIndexerProxy": "Προσθήκη Indexer Proxy", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 6c3a95d0b..fc1e42d4c 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -20,12 +20,12 @@ "Connections": "Conexiones", "Connect": "Notificaciones", "Clear": "Borrar", - "BackupNow": "Hacer copia de seguridad", - "Backup": "Backup", - "AppDataLocationHealthCheckMessage": "No será posible actualizar para prevenir que AppData se borre durante la actualización", + "BackupNow": "Hacer copia de seguridad ahora", + "Backup": "Copia de seguridad", + "AppDataLocationHealthCheckMessage": "No será posible actualizar para prevenir la eliminación de AppData al Actualizar", "Analytics": "Analíticas", - "All": "Todas", - "About": "Acerca", + "All": "Todo", + "About": "Acerca de", "View": "Vista", "Updates": "Actualizaciones", "UpdateCheckUINotWritableMessage": "No se puede instalar la actualización porque la carpeta UI '{0}' no tiene permisos de escritura para el usuario '{1}'.", @@ -63,7 +63,7 @@ "LogFiles": "Archivos de Registro", "Language": "Idioma", "IndexerStatusCheckAllClientMessage": "Los indexers no están disponibles debido a errores", - "Added": "An̄adida", + "Added": "Añadido", "Actions": "Acciones", "UISettingsSummary": "Calendario, fecha y opciones de color deteriorado", "TagsSettingsSummary": "Ver todas las etiquetas y cómo se usan. Las etiquetas no utilizadas se pueden eliminar", @@ -73,10 +73,10 @@ "LastWriteTime": "Última Fecha de Escritura", "IndexerStatusCheckSingleClientMessage": "Indexers no disponibles debido a errores: {0}", "Indexer": "Indexador", - "Grabbed": "Capturado", + "Grabbed": "Añadido", "GeneralSettingsSummary": "Puerto, SSL, nombre de usuario/contraseña , proxy, analíticas y actualizaciones", "Filename": "Nombre del archivo", - "Failed": "Ha fallado", + "Failed": "Fallido", "EventType": "Tipo de Evento", "DownloadClientsSettingsSummary": "Gestores de descargas, manipulación de descargas y mapeados remotos", "DownloadClient": "Gestor de Descargas", @@ -85,12 +85,12 @@ "Warn": "Advertencia", "Type": "Tipo", "Title": "Título", - "Time": "Fecha", + "Time": "Tiempo", "TestAll": "Testear Todo", "Test": "Test", "TableOptionsColumnsMessage": "Escoger qué columnas son visibles y en que orden aparecerán", "TableOptions": "Opciones de Tabla", - "Source": "Origen", + "Source": "Fuente", "Shutdown": "Apagar", "Seeders": "Semillas", "Save": "Guardar", @@ -104,10 +104,9 @@ "Message": "Mensaje", "Level": "Nivel", "KeyboardShortcuts": "Atajos de Teclado", - "Info": "Información", + "Info": "Info", "HealthNoIssues": "No hay problemas con tu configuración", "Error": "Error", - "ConnectionLostMessage": "Prowlarr ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", "ConnectionLostAutomaticMessage": "Prowlarr intentará conectarse automáticamente, o haz clic en el botón de recarga abajo.", "ConnectionLost": "Conexión perdida", "Component": "Componente", @@ -115,7 +114,7 @@ "Close": "Cerrar", "Cancel": "Cancelar", "Apply": "Aplicar", - "Age": "Edad", + "Age": "Antigüedad", "SystemTimeCheckMessage": "El reloj del sistema está retrasado más de un día. Las tareas de mantenimiento no se ejecutarán correctamente hasta que se haya corregido", "UnsavedChanges": "Cambios no guardados", "ShowSearchHelpText": "Mostrar botón de búsqueda al pasar el cursor por encima", @@ -148,20 +147,20 @@ "CertificateValidation": "Validación del certificado", "BypassProxyForLocalAddresses": "Omitir Proxy para Direcciones Locales", "Branch": "Rama", - "BindAddressHelpText": "Dirección IP4 válida o '*' para todas las interfaces", + "BindAddressHelpText": "Dirección IP4 válida, localhost o '*' para todas las interfaces", "Backups": "Copias de seguridad", - "BackupRetentionHelpText": "Backups automáticos anteriores al período de retención serán borrados automáticamente", - "BackupIntervalHelpText": "Intervalo entre backups automáticos", + "BackupRetentionHelpText": "Las copias de seguridad automáticas anteriores al período de retención serán borradas automáticamente", + "BackupIntervalHelpText": "Intervalo entre copias de seguridad automáticas", "BackupFolderHelpText": "Las rutas relativas estarán en el directorio AppData de Prowlarr", "Automatic": "Automático", "AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder Prowlarr", "Authentication": "Autenticación", "AreYouSureYouWantToResetYourAPIKey": "¿Está seguro de que desea restablecer su clave API?", - "ApiKey": "Clave API", + "ApiKey": "Clave de API", "ApplyTags": "Aplicar Etiquetas", - "AppDataDirectory": "Directorio de AppData", + "AppDataDirectory": "Directorio AppData", "AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de Prowlarr. Esto incluye información sobre su navegador, qué páginas de Prowlarr WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.", - "YesCancel": "Si, cancelar", + "YesCancel": "Sí, Cancelar", "Version": "Versión", "Username": "Nombre de usuario", "UseProxy": "Usar el Proxy", @@ -192,7 +191,7 @@ "RestartProwlarr": "Reiniciar Prowlarr", "RestartNow": "Reiniciar Ahora", "ResetAPIKey": "Reajustar API", - "Reset": "Reajustar", + "Reset": "Reiniciar", "RemoveFilter": "Eliminar filtro", "RemovedFromTaskQueue": "Eliminar de la cola de tareas", "RefreshMovie": "Actualizar película", @@ -208,7 +207,7 @@ "PackageVersion": "Versión del paquete", "NotificationTriggers": "Desencadenantes de Notificaciones", "NoLeaveIt": "No, Déjalo", - "New": "Nueva", + "New": "Nuevo", "NetCore": ".NET Core", "Mode": "Modo", "MIA": "MIA", @@ -247,7 +246,7 @@ "BranchUpdateMechanism": "Rama usada por el mecanismo de actualización externo", "BranchUpdate": "Qué rama usar para actualizar Prowlarr", "BeforeUpdate": "Antes de actualizar", - "AddingTag": "Añadiendo etiqueta", + "AddingTag": "Añadir etiqueta", "UnableToLoadUISettings": "No se han podido cargar los ajustes de UI", "UnableToLoadHistory": "No se ha podido cargar la historia", "UnableToLoadGeneralSettings": "No se han podido cargar los ajustes Generales", @@ -279,7 +278,7 @@ "EditIndexer": "Editar Indexer", "Disabled": "Deshabilitado", "AutomaticSearch": "Búsqueda Automática", - "AddIndexer": "Añadir Indexer", + "AddIndexer": "Añadir Indexador", "FocusSearchBox": "Enfocar Cuadro de búsqueda", "SaveSettings": "Grabar Ajustes", "OpenThisModal": "Abrir este Modal", @@ -314,7 +313,7 @@ "IndexerProxyStatusCheckAllClientMessage": "Los indexers no están disponibles debido a errores", "IndexerProxyStatusCheckSingleClientMessage": "Indexers no disponibles debido a errores: {0}", "NoLinks": "Sin enlaces", - "AddDownloadClient": "Añadir Gestor de Descargas", + "AddDownloadClient": "Añadir Cliente de Descarga", "CouldNotConnectSignalR": "No se pudo conectar a SignalR, la interfaz de usuario no se actualiza", "EnableRss": "Habilitar RSS", "FeatureRequests": "Peticiones de características", @@ -334,7 +333,6 @@ "AddNewIndexer": "Añadir nuevo indexador", "AddToDownloadClient": "Añadir descarga al cliente de descargas", "Applications": "Aplicaciones", - "AppProfileDeleteConfirm": "¿Seguro que quieres eliminar {0}?", "AppProfileInUse": "Perfil de aplicación en uso", "AddDownloadClientToProwlarr": "Añadir un cliente de descargas permite a Prowlarr enviar descargas directamente desde la interfaz en una búsqueda manual.", "Category": "Categoría", @@ -351,7 +349,7 @@ "Notification": "Notificaciones", "Notifications": "Notificaciones", "UnableToLoadIndexers": "No se pueden cargar los indexers", - "Yes": "si", + "Yes": "Sí", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API", "InstanceName": "Nombre de Instancia", "InstanceNameHelpText": "Nombre de instancia en pestaña y para nombre de aplicación en Syslog", @@ -359,7 +357,7 @@ "Duration": "Duración", "LastDuration": "Duración", "LastExecution": "Última ejecución", - "Queued": "En Cola", + "Queued": "Encolado", "ApplicationLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas", "ApplicationLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}", "Ended": "Terminó", @@ -372,18 +370,18 @@ "AddApplication": "Añadir aplicación", "AddCustomFilter": "Añadir filtro personalizado", "Description": "Descripción", - "ApplicationURL": "", - "ApplicationUrlHelpText": "", + "ApplicationURL": "URL de la aplicación", + "ApplicationUrlHelpText": "La URL externa de la aplicación incluyendo http(s)://, puerto y URL base", "Label": "Etiqueta", "Theme": "Tema", - "ApplyTagsHelpTextAdd": "Añadir: Añadir las etiquetas a la lista de etiquetas existente", + "ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas", "DeleteSelectedApplicationsMessageText": "Seguro que quieres eliminar el indexer '{0}'?", "DeleteSelectedDownloadClients": "Borrar Gestor de Descargas", "DeleteSelectedIndexersMessageText": "Seguro que quieres eliminar el indexer '{0}'?", - "DeleteSelectedDownloadClientsMessageText": "Seguro que quieres eliminar el indexer '{0}'?", + "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {0} cliente(s) de descarga seleccionado(s)?", "ApplyTagsHelpTextHowToApplyApplications": "Cómo añadir etiquetas a las películas seleccionadas", "SelectIndexers": "Buscar películas", - "ApplyTagsHelpTextHowToApplyIndexers": "Cómo añadir etiquetas a las películas seleccionadas", + "ApplyTagsHelpTextHowToApplyIndexers": "Cómo añadir etiquetas a los indexadores seleccionados", "ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas", "ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)", "ThemeHelpText": "Cambia el tema de la interfaz de usuario de la aplicación. El tema \"automático\" utilizará el tema de tu sistema operativo para establecer el modo claro u oscuro. Inspirado por Theme.Park", @@ -394,5 +392,16 @@ "Year": "Año", "UpdateAvailable": "La nueva actualización está disponible", "Genre": "Géneros", - "Publisher": "Editor" + "Publisher": "Editor", + "AuthenticationRequired": "Autenticación Requerida", + "ApplyChanges": "Aplicar Cambios", + "CountIndexersSelected": "{0} indexador(es) seleccionado(s)", + "CountDownloadClientsSelected": "{0} cliente(s) de descarga seleccionado(s)", + "EditSelectedDownloadClients": "Editar Clientes de Descarga Seleccionados", + "EditSelectedIndexers": "Editar Indexadores Seleccionados", + "Implementation": "Implementación", + "ManageDownloadClients": "Gestionar Clientes de Descarga", + "ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {0} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración", + "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.", + "Episode": "Episodio" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 3ac63fdd8..21a5bf5eb 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -176,7 +176,6 @@ "UnsavedChanges": "Tallentamattomia muutoksia", "Yesterday": "Eilen", "ConnectionLost": "Yhteys on katkennut", - "ConnectionLostAutomaticMessage": "Prowlarr pyrkii muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".", "DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun '{0}'?", "DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen '{0}'?", "Discord": "Discord", @@ -354,7 +353,6 @@ "SettingsLogRotate": "Lokitiedostojen kierrätys", "SettingsLogSql": "Kirjaa SQL", "SettingsSqlLoggingHelpText": "Kirjaa kaikki Prowlarrin SQL-kyselyt", - "ConnectionLostMessage": "Prowlarr on menettänyt yhteyden taustajärjestelmään ja sivu on päivitettävä toiminnallisuuden palauttamiseksi.", "ConnectSettingsSummary": "Ilmoitukset ja omat komentosarjat.", "DevelopmentSettings": "Kehittäjäasetukset", "Description": "Kuvaus", @@ -362,7 +360,6 @@ "SettingsConsoleLogLevel": "Valvontalokin taso", "SettingsFilterSentryEvents": "Suodata analytiikan tapahtumia", "SettingsFilterSentryEventsHelpText": "Suodata tunnetut käyttäjävirheet pois analytiikkalähetyksistä", - "AppProfileDeleteConfirm": "Haluatko varmasti poistaa sovellusprofiilin {0}?", "Applications": "Sovellukset", "AppProfileInUse": "Sovellusprofiili on käytössä", "Apps": "Sovellukset", @@ -376,7 +373,6 @@ "DeleteAppProfile": "Poista sovellusprofiili", "IndexerProxies": "Tietolähteiden välityspalvelimet", "IndexerAuth": "Tietolähteen todennus", - "IndexersSelectedInterp": "{0} valittua tietolähdettä", "Notifications": "Kytkennät", "NotificationTriggersHelpText": "Valitse tapahtumat, jotka aiheuttavat ilmoituksen.", "Stats": "Tilastot", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 0b2d4153c..e0ac16d26 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -91,7 +91,6 @@ "Cancel": "Annuler", "Apply": "Appliquer", "Age": "Âge", - "ConnectionLostMessage": "Prowlarr a perdu sa connexion au backend et devra être rechargé pour fonctionner à nouveau.", "Warn": "Avertissement", "Type": "Type", "Title": "Titre", @@ -115,7 +114,6 @@ "Level": "Niveau", "KeyboardShortcuts": "Raccourcis clavier", "HealthNoIssues": "Aucun problème avec votre configuration", - "ConnectionLostAutomaticMessage": "Prowlarr essaiera de se connecter automatiquement, ou bien vous pouvez cliquer sur \"Recharger\" en bas.", "SystemTimeCheckMessage": "L'heure du système est décalée de plus d'un jour. Les tâches planifiées peuvent ne pas s'exécuter correctement tant que l'heure ne sera pas corrigée", "SettingsShowRelativeDates": "Afficher les dates relatives", "UnsavedChanges": "Changement non sauvegardés", @@ -305,7 +303,6 @@ "SettingsFilterSentryEvents": "Filtrer les événements d'analyse", "SettingsConsoleLogLevel": "Niveau de journalisation de la console", "SearchIndexers": "Recherche indexeurs", - "IndexersSelectedInterp": "{0} indexeur(s) sélectionné(s)", "IndexerRss": "Indexeur Rss", "IndexerQuery": "Requête indexeur", "IndexerObsoleteCheckMessage": "Les indexeurs sont obsolètes ou ont été mis à jour : {0}. Veuillez supprimer et (ou) rajouter à Prowlarr", @@ -339,7 +336,6 @@ "NotificationTriggersHelpText": "Sélectionnez les événements qui doivent déclencher cette notification", "AddDownloadClient": "Ajouter un client de téléchargement", "Applications": "Applications", - "AppProfileDeleteConfirm": "Voulez-vous vraiment supprimer {0} ?", "AppProfileInUse": "Profil d'application en cours d'utilisation", "Apps": "Applications", "Auth": "Auth", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 37cf0dc40..512a86a23 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -182,7 +182,6 @@ "CancelPendingTask": "האם אתה בטוח שברצונך לבטל משימה זו בהמתנה?", "CertificateValidationHelpText": "שנה את מידת אימות ההסמכה של HTTPS", "ChangeHasNotBeenSavedYet": "השינוי עדיין לא נשמר", - "ConnectionLostAutomaticMessage": "Prowlarr ינסה להתחבר אוטומטית, או שתלחץ על טען מחדש למטה.", "Connections": "חיבורים", "ConnectSettings": "חבר הגדרות", "Queue": "תוֹר", @@ -315,7 +314,6 @@ "OnGrab": "על לתפוס", "OnHealthIssue": "בנושא הבריאות", "TestAllIndexers": "בדוק את כל האינדקסים", - "ConnectionLostMessage": "Prowlarr איבד את החיבור לשרת הפנימי ובכדי שיהיה פעיל, יש לבצע טעינה מחדש.", "GrabReleases": "שחרור תפוס", "Link": "קישורים", "NetCore": ".NET Core", @@ -356,7 +354,6 @@ "Auth": "אימות", "AudioSearch": "חיפוש שמע", "Application": "אפליקציה", - "AppProfileDeleteConfirm": "האם למחוק את {0}?", "DeleteApplication": "מחיקת אפליקציה", "DeleteAppProfile": "מחיקת פרופיל אפליקציה", "AddIndexerProxy": "הוספת פרוקסי לאינדקסר", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 405f651ce..b2242942a 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -207,7 +207,6 @@ "Warn": "चेतावनी देना", "Wiki": "विकि", "ConnectionLost": "संपर्क टूट गया", - "ConnectionLostAutomaticMessage": "Prowlarr अपने आप कनेक्ट होने का प्रयास करेगा, या आप नीचे पुनः लोड कर सकते हैं।", "ConnectSettings": "कनेक्ट सेटिंग्स", "CouldNotConnectSignalR": "सिग्नलआर से कनेक्ट नहीं हो सका, UI अपडेट नहीं होगा", "Custom": "रिवाज", @@ -316,7 +315,6 @@ "HistoryCleanupDaysHelpText": "स्वचालित सफाई को अक्षम करने के लिए 0 पर सेट करें", "HistoryCleanupDaysHelpTextWarning": "रीसायकल बिन में चयनित दिनों की तुलना में पुरानी फाइलें अपने आप साफ हो जाएंगी", "NetCore": ".NET कोर", - "ConnectionLostMessage": "रैडियर ने बैकएंड से कनेक्शन खो दिया है और कार्यक्षमता को बहाल करने के लिए इसे फिर से लोड करना होगा।", "GrabReleases": "पकड़ो रिलीज", "Yes": "हाँ", "Link": "लिंक", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 5075782a6..0a553eedb 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -34,7 +34,6 @@ "ConnectSettingsSummary": "Értesítések és egyéni szkriptek", "ConnectSettings": "Kapcsolódási Beállítások", "Connections": "Kapcsolatok", - "ConnectionLostMessage": "A Prowlarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.", "ConnectionLostAutomaticMessage": "A Prowlarr megpróbál automatikusan csatlakozni, vagy kattints a frissítés gombra.", "ConnectionLost": "Kapcsolódás Elveszett", "Connect": "Értesítések", @@ -307,7 +306,6 @@ "SettingsFilterSentryEvents": "Az Analytics-események szűrése", "SettingsConsoleLogLevel": "Konzol naplószint", "SearchIndexers": "Indexelők keresése", - "IndexersSelectedInterp": "{0} Indexelő(k) kiválasztva", "IndexerQuery": "Indexelő lekérdezés", "IndexerHealthCheckNoIndexers": "Nincs engedélyezve indexelő, a Prowlarr nem ad vissza keresési eredményeket", "EnableIndexer": "Indexelő engedélyezése", @@ -338,7 +336,6 @@ "UnableToAddANewAppProfilePleaseTryAgain": "Nem lehet új alkalmazásprofilt hozzáadni, próbálkozzon újra.", "AddDownloadClient": "Letöltőkliens hozzáadása", "Applications": "Alkalmazások", - "AppProfileDeleteConfirm": "Biztosan törli a következőt: {0}?", "AppProfileInUse": "Használatban lévő alkalmazásprofil", "Apps": "Appok", "Auth": "Engedélyek", diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index e116732f9..423069dd8 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -53,7 +53,6 @@ "Indexers": "Pengindeks", "Name": "Nama", "NetCore": ".NET", - "ConnectionLostAutomaticMessage": "Radarr akan mencoba untuk menghubungi secara otomatis, atau klik muat ulang di bawah.", "Grabs": "Peroleh", "UILanguageHelpText": "Bahasa yang digunakan UI Sonarr", "Actions": "Tindakan", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 7b0c84419..850b3e5b6 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -158,7 +158,6 @@ "Columns": "Súlur", "Component": "Hluti", "ConnectionLost": "Tenging rofin", - "ConnectionLostAutomaticMessage": "Prowlarr mun reyna að tengjast sjálfkrafa eða þú getur smellt á endurhlaða hér að neðan.", "Folder": "Mappa", "ForMoreInformationOnTheIndividualDownloadClients": "Fyrir frekari upplýsingar um einstaka niðurhal viðskiptavini, smelltu á upplýsingatakkana.", "GeneralSettings": "Almennar stillingar", @@ -322,7 +321,6 @@ "No": "Nei", "UnableToLoadIndexers": "Ekki er hægt að hlaða Indexers", "Yes": "Já", - "ConnectionLostMessage": "Whisparr hefur misst tenginguna við bakendann og þarf að endurhlaða hann til að endurheimta virkni.", "LastExecution": "Síðasta aftaka", "ApplicationLongTermStatusCheckAllClientMessage": "Allir verðtryggingaraðilar eru ekki tiltækir vegna bilana í meira en 6 klukkustundir", "ApplicationLongTermStatusCheckSingleClientMessage": "Vísitölufólk er ekki tiltækt vegna bilana í meira en 6 klukkustundir: {0}", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index bf0f27394..cee191b92 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -94,7 +94,7 @@ "Branch": "Ramo", "BindAddressHelpText": "Indirizzo IP valido, localhost o '*' per tutte le interfacce di rete", "BindAddress": "Indirizzo di Bind", - "Backups": "I Backup", + "Backups": "Backups", "BackupRetentionHelpText": "I backup automatici più vecchi del periodo di conservazione verranno eliminati automaticamente", "BackupIntervalHelpText": "Intervallo tra i backup automatici", "BackupFolderHelpText": "I percorsi relativi saranno nella cartella AppData di Prowlarr", @@ -142,7 +142,6 @@ "DeleteBackup": "Cancella Backup", "DBMigration": "Migrazione DB", "ConnectSettings": "Impostazioni di Connessione", - "ConnectionLostMessage": "Prowlarr ha perso la connessione al backend e dovrà essere ricaricato per ripristinare la funzionalità.", "ConnectionLostAutomaticMessage": "Prowlarr cercherà di connettersi automaticamente, oppure clicca su ricarica qui sotto.", "ConnectionLost": "Connessione Persa", "Component": "Componente", @@ -151,7 +150,7 @@ "CancelPendingTask": "Sei sicuro di voler cancellare questa operazione in sospeso?", "BranchUpdateMechanism": "Ramo utilizzato dal sistema di aggiornamento esterno", "BranchUpdate": "Ramo da usare per aggiornare Prowlarr", - "AddingTag": "Aggiungi etichetta", + "AddingTag": "Aggiungendo etichetta", "Password": "Password", "OnHealthIssueHelpText": "Quando c'è un problema", "NotificationTriggers": "Attivatori di Notifica", @@ -365,7 +364,6 @@ "AppProfileInUse": "Profilo App in Uso", "Application": "Applicazione", "BookSearchTypes": "Tipi di Ricerca Libri", - "AppProfileDeleteConfirm": "Sicuro di voler eliminare {0}?", "AppSettingsSummary": "Applicazioni e impostazioni per configurare come Prowlarr interagisce con i tuoi programmi PVR", "Apps": "Le App", "DevelopmentSettings": "Impostazioni di Sviluppo", @@ -380,7 +378,6 @@ "Proxies": "Proxy", "UnableToLoadApplicationList": "Impossibile careicare la lista applicazioni", "Website": "Sito", - "IndexersSelectedInterp": "{0} Indicizzatore(i) Selezionato(i)", "Privacy": "Privacy", "SettingsIndexerLogging": "Logging Migliorato dell'Indicizzatore", "TestAllApps": "Prova Tutte le App", @@ -491,5 +488,7 @@ "Season": "Stagione", "Year": "Anno", "UpdateAvailable": "É disponibile un nuovo aggiornamento", - "Author": "Autore" + "Author": "Autore", + "ApplyChanges": "Applica Cambiamenti", + "ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {0} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 4b3b402c1..ed5c6c24b 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -131,7 +131,6 @@ "Columns": "列", "Component": "成分", "ConnectionLost": "接続切断", - "ConnectionLostAutomaticMessage": "Prowlarrは自動的に接続を試みます。または、下の[再読み込み]をクリックしてください。", "Connections": "接続", "ConnectSettings": "接続設定", "Options": "オプション", @@ -322,7 +321,6 @@ "No": "番号", "UnableToLoadIndexers": "インデクサーを読み込めません", "Yes": "はい", - "ConnectionLostMessage": "Whisparrはバックエンドへの接続を失ったため、機能を復元するには再ロードする必要があります。", "LastDuration": "lastDuration", "LastExecution": "最後の実行", "ApplicationLongTermStatusCheckAllClientMessage": "6時間以上の障害のため、すべてのインデクサーが使用できなくなります", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 895bae262..cca4f2769 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -111,7 +111,6 @@ "Uptime": "가동 시간", "YesCancel": "예, 취소합니다", "Folder": "폴더", - "ConnectionLostMessage": "Prowlarr는 백엔드와의 연결이 끊어졌으며 기능을 복원하려면 다시 로딩해야 합니다.", "EnableAutomaticSearch": "자동 검색 활성화", "EnableAutomaticSearchHelpText": "UI 또는 Prowlarr를 통해 자동 검색을 수행 할 때 사용됩니다.", "ErrorLoadingContents": "콘텐츠로드 오류", @@ -166,7 +165,6 @@ "UnableToLoadHistory": "기록을로드 할 수 없습니다.", "UnableToLoadTags": "태그를로드 할 수 없습니다.", "UnableToLoadUISettings": "UI 설정을로드 할 수 없습니다.", - "ConnectionLostAutomaticMessage": "Prowlarr가 자동으로 연결을 시도하거나 아래에서 새로고침을 클릭할 수 있습니다.", "RemovingTag": "태그 제거", "IndexerPriority": "인덱서 우선 순위", "Language": "언어", diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 8fbeef439..95d81f4ae 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -57,7 +57,6 @@ "New": "Ny", "RSS": "RSS", "Applications": "Applikasjoner", - "ConnectionLostMessage": "Prowlarr har mistet tilkoblingen til baksystemet og må lastes inn på nytt for å gjenopprette funksjonalitet.", "Connections": "Tilkoblinger", "Usenet": "Usenet", "Username": "Brukernavn", @@ -80,7 +79,6 @@ "Columns": "Kolonner", "Component": "Komponent", "Connect": "Varslinger", - "ConnectionLostAutomaticMessage": "Prowlarr vil forsøke å koble til automatisk, eller du kan klikke oppdater nedenfor.", "ConnectSettings": "Tilkoblingsinnstillinger", "CouldNotConnectSignalR": "Kunne ikke koble til SignalR, grensesnitt vil ikke oppdateres", "Custom": "Tilpass", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index da646a467..c4a7c3e56 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -26,7 +26,6 @@ "ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {0} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand", "AppDataDirectory": "AppData folder", "AppDataLocationHealthCheckMessage": "Updaten zal niet mogelijk zijn om het verwijderen van AppData te voorkomen", - "AppProfileDeleteConfirm": "Weet u zeker dat u {0} wilt verwijderen?", "AppProfileInUse": "App-profiel in gebruik", "AppProfileSelectHelpText": "App-profielen worden gebruikt om de instellingen voor RSS, Automatisch zoeken en Interactief zoeken bij applicatiesynchronisatie te beheren", "AppSettingsSummary": "Applicaties en instellingen om te configureren hoe Prowlarr met uw PVR-programma's omgaat", @@ -79,7 +78,6 @@ "ConnectSettings": "Connecties Instellingen", "ConnectSettingsSummary": "Meldingen en aangepaste scripts", "ConnectionLost": "Verbinding Onderbroken", - "ConnectionLostAutomaticMessage": "Prowlarr zal automatisch proberen te verbinden, of u kunt hieronder op herladen klikken.", "ConnectionLostMessage": "Prowlarr heeft zijn verbinding met de backend verloren en zal moeten worden herladen om functionaliteit te herstellen.", "Connections": "Connecties", "CouldNotConnectSignalR": "Kan geen verbinding maken met SignalR, gebruikersinterface wordt niet bijgewerkt", @@ -192,7 +190,6 @@ "IndexerVipCheckExpiredClientMessage": "Indexeerder VIP-voordelen zijn verlopen: {0}", "IndexerVipCheckExpiringClientMessage": "Indexeerder VIP-voordelen verlopen binnenkort: {0}", "Indexers": "Indexeerders", - "IndexersSelectedInterp": "{0} Indexer(s) Geselecteerd", "Info": "Info", "InstanceName": "Naam van de instantie", "InteractiveSearch": "Interactief Zoeken", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index fa1d663c8..8cf444d00 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -119,7 +119,6 @@ "CloneProfile": "Klonuj profil", "Component": "Składnik", "ConnectionLost": "Utracono połączenie", - "ConnectionLostAutomaticMessage": "Prowlarr spróbuje połączyć się automatycznie lub możesz kliknąć przycisk przeładuj poniżej.", "Custom": "Zwyczaj", "Date": "Data", "Dates": "Daktyle", @@ -315,7 +314,6 @@ "OnGrab": "Na Grab", "OnHealthIssue": "W kwestii zdrowia", "TestAllIndexers": "Przetestuj wszystkie indeksatory", - "ConnectionLostMessage": "Whisparr utracił połączenie z zapleczem i będzie musiał zostać ponownie załadowany, aby przywrócić funkcjonalność.", "GrabReleases": "Grab Release", "No": "Nie", "NetCore": ".NET Core", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 5cb04b20d..be120f91e 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -112,7 +112,6 @@ "CustomFilters": "Filtros personalizados", "ConnectSettingsSummary": "Notificações, ligações para servidores/leitores de multimédia e scripts personalizados", "Connections": "Ligações", - "ConnectionLostMessage": "O Prowlarr perdeu a ligação com o back-end e precisará recarregar para restaurar a funcionalidade.", "ConnectionLostAutomaticMessage": "O Prowlarr tentará ligar automaticamente, ou você pode clicar em Recarregar abaixo.", "ConnectionLost": "Ligação perdida", "Connect": "Conexões", @@ -289,7 +288,6 @@ "MovieIndexScrollBottom": "Índice do filme: deslocar para baixo", "SettingsConsoleLogLevel": "Nível de registo do console", "SearchIndexers": "Pesquisar indexadores", - "IndexersSelectedInterp": "{0} indexador(es) selecionado(s)", "IndexerRss": "RSS do indexador", "IndexerQuery": "Consulta do indexador", "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao Prowlarr", @@ -348,7 +346,6 @@ "Auth": "Autenticação", "Apps": "Aplicações", "AppProfileInUse": "Perfil da aplicação em uso", - "AppProfileDeleteConfirm": "Tem a certeza que quer eliminar {0}?", "Applications": "Aplicações", "AddDownloadClient": "Adicionar cliente de transferências", "CouldNotConnectSignalR": "Não é possível ligar-se ao SignalR, a IU não atualizará", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 566c699ac..ca9334c76 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -26,7 +26,6 @@ "ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração", "AppDataDirectory": "Diretório AppData", "AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização", - "AppProfileDeleteConfirm": "Tem certeza que deseja excluir {0}?", "AppProfileInUse": "Perfil de aplicativo em uso", "AppProfileSelectHelpText": "Os perfis de aplicativos são usados para controlar as configurações de RSS, Pesquisa automática e Pesquisa interativa ao sincronizar o aplicativo", "AppSettingsSummary": "Aplicativos e configurações para configurar como Prowlarr interage com seus programas PVR", @@ -90,9 +89,7 @@ "Connect": "Notificações", "ConnectSettings": "Configurações de Conexão", "ConnectSettingsSummary": "Notificações e scripts personalizados", - "ConnectionLost": "Conexão perdida", - "ConnectionLostAutomaticMessage": "O Prowlarr tentará se conectar automaticamente, ou você pode clicar em Recarregar abaixo.", - "ConnectionLostMessage": "O Prowlarr perdeu sua conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", + "ConnectionLost": "Conexão Perdida", "Connections": "Conexões", "CouldNotConnectSignalR": "Não é possível conectar ao SignalR, a interface não atualizará", "Custom": "Personalizar", @@ -104,18 +101,18 @@ "Delete": "Excluir", "DeleteAppProfile": "Excluir perfil do aplicativo", "DeleteApplication": "Excluir aplicativo", - "DeleteApplicationMessageText": "Tem certeza de que deseja excluir o aplicativo \"{0}\"?", + "DeleteApplicationMessageText": "Tem certeza de que deseja excluir o aplicativo '{name}'?", "DeleteBackup": "Excluir Backup", - "DeleteBackupMessageText": "Tem certeza que deseja excluir o backup \"{0}\"?", + "DeleteBackupMessageText": "Tem certeza de que deseja excluir o backup '{name}'?", "DeleteClientCategory": "Excluir Categoria de Cliente de Download", "DeleteDownloadClient": "Excluir Cliente de Download", - "DeleteDownloadClientMessageText": "Tem certeza que deseja excluir o cliente de download \"{0}\"?", + "DeleteDownloadClientMessageText": "Tem certeza de que deseja excluir o cliente de download '{name}'?", "DeleteIndexerProxy": "Apagar Proxy do Indexador", - "DeleteIndexerProxyMessageText": "Tem certeza que deseja apagar o proxy '{0}'?", + "DeleteIndexerProxyMessageText": "Tem certeza de que deseja excluir o proxy do indexador '{name}'?", "DeleteNotification": "Excluir Notificação", - "DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação \"{0}\"?", + "DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?", "DeleteTag": "Excluir tag", - "DeleteTagMessageText": "Tem certeza de que deseja excluir a tag \"{0}\"?", + "DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?", "Description": "Descrição", "Details": "Detalhes", "DevelopmentSettings": "Configurações de desenvolvimento", @@ -223,7 +220,6 @@ "IndexerVipCheckExpiredClientMessage": "Benefícios VIP do Indexador expiraram: {0}", "IndexerVipCheckExpiringClientMessage": "Os benefícios VIPS do Indexador expirarão em breve: {0}", "Indexers": "Indexadores", - "IndexersSelectedInterp": "{0} indexador(es) selecionado(s)", "Info": "Info", "InitialFailure": "Falha Inicial", "InstanceName": "Nome da Instância", @@ -434,9 +430,9 @@ "TestAllApps": "Testar todos os aplicativos", "TestAllClients": "Testar todos os clientes", "TestAllIndexers": "Testar todos os indexadores", - "TheLatestVersionIsAlreadyInstalled": "A versão mais recente do Prowlarr já está instalada", + "TheLatestVersionIsAlreadyInstalled": "A versão mais recente do {appName} já está instalada", "Theme": "Tema", - "ThemeHelpText": "Alterar o tema da interface do usuário do aplicativo, o tema 'Auto' usará o tema do sistema operacional para definir o modo Claro ou Escuro. Inspirado por {0}", + "ThemeHelpText": "Alterar o tema da interface do usuário do aplicativo, o tema 'Auto' usará o tema do sistema operacional para definir o modo Claro ou Escuro. Inspirado por {inspiredBy}.", "Time": "Horário", "Title": "Título", "Today": "Hoje", @@ -512,12 +508,12 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar tags aos indexadores selecionados", "ApplyTagsHelpTextRemove": "Remover: remove as etiquetas inseridas", "ApplyTagsHelpTextReplace": "Substituir: Substitua as etiquetas pelas etiquetas inseridas (não digite nenhuma etiqueta para limpar todas as etiquetas)", - "CountDownloadClientsSelected": "{0} cliente(s) de download selecionado(s)", - "CountIndexersSelected": "{0} indexador(es) selecionado(s)", - "DeleteSelectedApplicationsMessageText": "Tem certeza de que deseja excluir {0} lista(s) de importação selecionada(s)?", + "CountDownloadClientsSelected": "{count} cliente(s) de download selecionado(s)", + "CountIndexersSelected": "{count} indexador(es) selecionado(s)", + "DeleteSelectedApplicationsMessageText": "Tem certeza de que deseja excluir {count} aplicativos selecionados?", "DeleteSelectedDownloadClients": "Excluir cliente(s) de download", - "DeleteSelectedDownloadClientsMessageText": "Tem certeza de que deseja excluir {0} cliente(s) de download selecionado(s)?", - "DeleteSelectedIndexersMessageText": "Tem certeza de que deseja excluir {0} indexador(es) selecionado(s)?", + "DeleteSelectedDownloadClientsMessageText": "Tem certeza de que deseja excluir {count} cliente(s) de download selecionado(s)?", + "DeleteSelectedIndexersMessageText": "Tem certeza de que deseja excluir {count} indexadores selecionados?", "DownloadClientPriorityHelpText": "Priorizar vários clientes de download. Usamos um rodízio para clientes com a mesma prioridade.", "EditSelectedDownloadClients": "Editar clientes de download selecionados", "EditSelectedIndexers": "Editar indexadores selecionados", @@ -529,11 +525,11 @@ "AppsMinimumSeeders": "Semeadores mínimos de aplicativos", "AppsMinimumSeedersHelpText": "Semeadores mínimos exigidos pelos aplicativos para o indexador pegar, vazio é o padrão do perfil de sincronização", "BasicSearch": "Pesquisa básica", - "CountApplicationsSelected": "{0} aplicativo(s) selecionado(s)", - "CountIndexersAvailable": "{0} indexadores disponíveis", + "CountApplicationsSelected": "{count} aplicativos selecionados", + "CountIndexersAvailable": "{count} indexadores disponíveis", "DeleteSelectedIndexers": "Excluir indexadores selecionados", "DeleteSelectedApplications": "Excluir aplicativos selecionados", - "FoundCountReleases": "Encontrou {0} lançamentos", + "FoundCountReleases": "Encontrou {itemCount} lançamentos", "DeleteSelectedIndexer": "Excluir indexador selecionado", "IndexerCategories": "Categorias do indexador", "IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para capturas feitas no Prowlarr a partir deste indexador", @@ -545,19 +541,26 @@ "QueryType": "Tipo de consulta", "SeedTime": "Tempo de Semeação", "SearchAllIndexers": "Pesquisar todos os indexadores", - "SearchCountIndexers": "Pesquise {0} indexadores", + "SearchCountIndexers": "Pesquisar {count} indexador(es)", "SeedRatio": "Proporção de sementes", "SeedRatioHelpText": "A proporção que um torrent deve atingir antes de parar, vazio é o padrão do aplicativo", "SeedTimeHelpText": "O tempo que um torrent deve ser propagado antes de parar, vazio é o padrão do aplicativo", - "SelectedCountOfCountReleases": "{0} de {1} lançamentos selecionados", + "SelectedCountOfCountReleases": "{selectedCount} de {itemCount} lançamentos selecionados", "NewznabUrl": "Url Newznab", "TorznabUrl": "Url Torznab", "GoToApplication": "Ir para o aplicativo", - "AreYouSureYouWantToDeleteIndexer": "Tem certeza de que deseja excluir '{0}' do Prowlarr?", + "AreYouSureYouWantToDeleteIndexer": "Tem certeza de que deseja excluir '{name}' do Prowlarr?", "AuthQueries": "Consultas de autenticação", "RssQueries": "Consultas RSS", "SearchQueries": "Consultas de pesquisa", "minutes": "minutos", "days": "dias", - "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}." + "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.", + "DeleteAppProfileMessageText": "Tem certeza de que deseja excluir o perfil do aplicativo '{name}'?", + "AppUpdated": "{appName} Atualizado", + "AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}", + "ConnectionLostToBackend": "O Radarr perdeu a conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", + "RecentChanges": "Alterações recentes", + "WhatsNew": "O que há de novo?", + "ConnectionLostReconnect": "O Radarr tentará se conectar automaticamente, ou você pode clicar em Recarregar abaixo." } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index b00f17d74..b47b18c18 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -59,7 +59,6 @@ "IndexerStatusCheckSingleClientMessage": "Indexatoare indisponibile datorită erorilor: {0}", "HealthNoIssues": "Nicio problemă de configurare", "Error": "Eroare", - "ConnectionLostMessage": "Prowlarr a pierdut conexiunea cu backend-ul și trebuie reîncărcat pentru a restabili funcționalitatea.", "ConnectionLostAutomaticMessage": "Prowlarr va încerca să se conecteze automat, sau poți apăsa reîncarcă mai jos.", "ConnectionLost": "Conexiune Pierdută", "Component": "Componentă", @@ -233,7 +232,7 @@ "NoLeaveIt": "Nu, lasă-l", "DBMigration": "Migrarea BD", "DeleteBackupMessageText": "Sigur doriți să ștergeți copia de siguranță „{0}”?", - "DeleteTagMessageText": "Sigur doriți să ștergeți eticheta „{0}”?", + "DeleteTagMessageText": "Sigur doriți să ștergeți eticheta '{label}'?", "EnableInteractiveSearch": "Activați căutarea interactivă", "EnableSSL": "Activați SSL", "EnableSslHelpText": " Necesită repornirea în funcție de administrator pentru a intra în vigoare", @@ -347,7 +346,6 @@ "IndexerInfo": "Informații indexator", "IndexerQuery": "Căutare indexator", "IndexerSite": "Site indexator", - "IndexersSelectedInterp": "{0} Indexatoare selectate", "IndexerTagsHelpText": "Folosiți etichete pentru a specifica proxiurile indexatoarelor, cu ce aplicații sunt sincronizate indexatoarele, sau doar pentru a le organiza.", "SyncAppIndexers": "Sincronizați indexatoare aplicații", "SyncLevelAddRemove": "Doar adaugă și șterge: Când indexatoarele sunt adăugate sau șterse din Prowlarr, va actualiza această aplicație.", @@ -387,10 +385,10 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Cum se aplică etichete indexatoarelor selectate", "ApplyTagsHelpTextRemove": "Eliminați: eliminați etichetele introduse", "CountIndexersSelected": "{0} Indexatoare selectate", - "DeleteSelectedApplicationsMessageText": "Sigur doriți să ștergeți indexatorul „{0}”?", - "DeleteSelectedDownloadClientsMessageText": "Sigur doriți să ștergeți indexatorul „{0}”?", - "DeleteSelectedDownloadClients": "Ștergeți clientul de descărcare", - "DeleteSelectedIndexersMessageText": "Sigur doriți să ștergeți indexatorul „{0}”?", + "DeleteSelectedApplicationsMessageText": "Sigur doriți să ștergeți {count} aplicații selectate?", + "DeleteSelectedDownloadClientsMessageText": "Sigur doriți să ștergeți {count} clienți de descărcare selectați?", + "DeleteSelectedDownloadClients": "Ștergere clienți de descărcare", + "DeleteSelectedIndexersMessageText": "Sigur doriți să ștergeți {count} indexatori selectați?", "DownloadClientPriorityHelpText": "Prioritizați mai mulți clienți de descărcare. Round-Robin este utilizat pentru clienții cu aceeași prioritate.", "Genre": "Genuri", "Label": "Etichetă", @@ -428,5 +426,12 @@ "Episode": "Episod", "Category": "Categorie", "AddRemoveOnly": "Doar adaugă și șterge", - "AuthenticationRequired": "Autentificare necesara" + "AuthenticationRequired": "Autentificare necesara", + "DeleteClientCategory": "Ștergeți categoria din clientul de descărcare", + "Description": "Descriere", + "DeleteSelectedIndexer": "Ștergeți indexatorul selectat", + "DeleteSelectedIndexers": "Ștergeți indexatorii selectați", + "DeleteSelectedApplications": "Ștergeți aplicațiile selectate", + "DevelopmentSettings": "Setări dezvoltare", + "DisabledUntil": "Dezactivat până la" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 8253043e8..855b6e514 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -291,7 +291,6 @@ "NotificationTriggers": "Триггеры уведомления", "ApplicationStatusCheckAllClientMessage": "Все листы недоступны из-за ошибок", "Automatic": "Автоматически", - "ConnectionLostAutomaticMessage": "Prowlarr попытается соединиться автоматически или нажмите кнопку внизу.", "DeleteApplicationMessageText": "Вы уверены, что хотите удалить уведомление '{0}'?", "DeleteDownloadClient": "Удалить программу для скачивания", "EnableInteractiveSearchHelpText": "Будет использовано при автоматических поисках", @@ -308,7 +307,6 @@ "Tags": "Тэги", "ApplicationStatusCheckSingleClientMessage": "Листы недоступны из-за ошибок: {0}", "EditIndexer": "Редактировать индексатор", - "ConnectionLostMessage": "Prowlarr потерял связь с сервером и его необходимо перезагрузить, чтобы восстановить работоспособность.", "MaintenanceRelease": "Техническая версия: исправления ошибок и другие улучшения. См. Историю коммитов Github для более подробной информации", "Filters": "Фильтры", "HistoryCleanupDaysHelpText": "Установите 0, чтобы отключить автоматическую очистку", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index d727a010c..97c084d99 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -107,7 +107,6 @@ "Info": "Info", "HealthNoIssues": "Inga problem hittades med din konfiguration", "Error": "Fel", - "ConnectionLostMessage": "Prowlarr har tappat anslutningen till sin backend och behöver laddas om för att återställa funktionalitet.", "ConnectionLostAutomaticMessage": "Prowlarr kommer försöka ansluta automatiskt, du kan även klicka på ladda om nedan.", "ConnectionLost": "Anslutning saknas", "Component": "Komponent", @@ -348,7 +347,6 @@ "IndexerVipCheckExpiringClientMessage": "Indexer VIP förmåner utgår snart: {0}", "IndexerVipCheckExpiredClientMessage": "Indexer VIP förmåner har utgått: {0}", "IndexerTagsHelpText": "Använd taggar för att specificera standardklient, specificera Indexer Proxies, eller bara för att organisera dina indexers.", - "IndexersSelectedInterp": "{0} Indexer(s) Markerade", "IndexerSettingsSummary": "Konfigurera flera globala Indexerinställningar, includerat Proxies.", "IndexerRss": "Indexer Rss", "IndexerQuery": "Indexer Fråga", @@ -382,7 +380,6 @@ "Apps": "Appar", "AppProfileSelectHelpText": "App profiler är använda för att kontrollera RSS, Automatisk Sökning och interaktiv Sökningsinställningar på applikationen sync", "AppProfileInUse": "App Profil i användning", - "AppProfileDeleteConfirm": "Är du säker på att du vill radera {0}?", "Applications": "Applikationer", "Filters": "Filter", "HistoryCleanupDaysHelpText": "Ställ in på 0 för att inaktivera automatisk rensning", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index b3ac92c03..d39dfbae7 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -133,7 +133,6 @@ "CloneProfile": "โปรไฟล์โคลน", "Close": "ปิด", "ConnectionLost": "ขาดการเชื่อมต่อ", - "ConnectionLostAutomaticMessage": "Prowlarr จะพยายามเชื่อมต่อโดยอัตโนมัติหรือคุณสามารถคลิกโหลดซ้ำด้านล่าง", "Connections": "การเชื่อมต่อ", "ConnectSettings": "เชื่อมต่อการตั้งค่า", "CouldNotConnectSignalR": "ไม่สามารถเชื่อมต่อกับ SignalR UI จะไม่อัปเดต", @@ -315,7 +314,6 @@ "OnGrab": "บน Grab", "OnHealthIssue": "เกี่ยวกับปัญหาสุขภาพ", "TestAllIndexers": "ทดสอบดัชนีทั้งหมด", - "ConnectionLostMessage": "Whisparr สูญเสียการเชื่อมต่อกับแบ็กเอนด์และจะต้องโหลดใหม่เพื่อกู้คืนฟังก์ชันการทำงาน", "GrabReleases": "คว้ารีลีส", "NetCore": ".NET Core", "MappedDrivesRunningAsService": "ไดรฟ์เครือข่ายที่แมปไม่พร้อมใช้งานเมื่อเรียกใช้เป็นบริการ Windows โปรดดูคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติม", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index f9bd8abd8..458dd13b2 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -143,7 +143,6 @@ "OnHealthIssueHelpText": "Sağlık Sorunu Hakkında", "BranchUpdate": "Prowlarr'ı güncellemek için kullanılacak dal", "Close": "Kapat", - "ConnectionLostAutomaticMessage": "Prowlarr otomatik olarak bağlanmayı deneyecek veya aşağıdan yeniden yükle'yi tıklayabilirsiniz.", "ApplicationStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", "ApplyTags": "Etiketleri Uygula", "RSSIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor", @@ -318,7 +317,6 @@ "OnGrab": "Yakalandığında", "OnHealthIssue": "Sağlık Sorunu Hakkında", "TestAllIndexers": "Tüm Dizinleyicileri Test Et", - "ConnectionLostMessage": "Whisparr arka uçla olan bağlantısını kaybetti ve işlevselliği geri yüklemek için yeniden yüklenmesi gerekecek.", "GrabReleases": "Bırakma", "No": "Hayır", "NetCore": ".NET Çekirdeği", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index b9021ebdf..ee6d49080 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -60,7 +60,6 @@ "BranchUpdate": "Гілка для оновлення Prowlarr", "AllIndexersHiddenDueToFilter": "Всі фільми заховані відповідно до фільтра.", "AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери Prowlarr. Це включає інформацію про ваш веб-переглядач, які сторінки Prowlarr WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.", - "ConnectionLostAutomaticMessage": "Prowlarr спробує підключитися автоматично, або ви можете натиснути перезавантажити нижче.", "ConnectionLostMessage": "Prowlarr втратив зв’язок із бекендом, і його потрібно перезавантажити, щоб відновити функціональність.", "Delete": "Видалити", "DeleteApplicationMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{0}'?", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index c0bac4c8d..b841326d1 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -170,7 +170,6 @@ "Columns": "Cột", "Component": "Thành phần", "ConnectionLost": "Kết nối bị mất", - "ConnectionLostAutomaticMessage": "Prowlarr sẽ cố gắng kết nối tự động hoặc bạn có thể nhấp vào tải lại bên dưới.", "Connections": "Kết nối", "ConnectSettings": "Kết nối Cài đặt", "CouldNotConnectSignalR": "Không thể kết nối với SignalR, giao diện người dùng sẽ không cập nhật", @@ -315,7 +314,6 @@ "Filters": "Bộ lọc", "OnGrab": "Trên Grab", "TestAllIndexers": "Kiểm tra tất cả các chỉ mục", - "ConnectionLostMessage": "Whisparr đã mất kết nối với phần phụ trợ và sẽ cần được tải lại để khôi phục chức năng.", "GrabReleases": "Lấy bản phát hành", "Link": "Liên kết", "No": "Không", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 9b6a5537a..afc50cfe5 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -25,7 +25,6 @@ "ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{0}个字符长。您可以通过设置或配置文件执行此操作", "AppDataDirectory": "AppData目录", "AppDataLocationHealthCheckMessage": "正在更新期间的 AppData 不会被更新删除", - "AppProfileDeleteConfirm": "您确认您想删除吗?", "AppProfileInUse": "正在使用的应用程序配置文件", "AppProfileSelectHelpText": "应用程序配置用于控制应用程序同步设置 RSS、自动搜索和交互式搜索设置", "AppSettingsSummary": "配置Prowlarr与PVR程序交互方式的应用和设置", @@ -90,7 +89,6 @@ "ConnectSettings": "连接设置", "ConnectSettingsSummary": "通知和自定义脚本", "ConnectionLost": "连接丢失", - "ConnectionLostAutomaticMessage": "Prowlarr 将会自动重连,您也可以点击下方的重新加载。", "ConnectionLostMessage": "Prowlarr 已与服务端断开链接,请尝试刷新来恢复使用。", "Connections": "连接", "CouldNotConnectSignalR": "无法连接至SignalR,不会升级UI", @@ -222,7 +220,6 @@ "IndexerVipCheckExpiredClientMessage": "索引器VIP特权已过期:{0}", "IndexerVipCheckExpiringClientMessage": "索引器VIP特权即将过期:{0}", "Indexers": "索引器", - "IndexersSelectedInterp": "已选择 {0} 个搜刮器", "Info": "信息", "InitialFailure": "初始化失败", "InstanceName": "中文", From 27928103c5595f013a540c48873bf0aeb22501b5 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 14 Aug 2023 10:49:05 +0000 Subject: [PATCH 108/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 1 - src/NzbDrone.Core/Localization/Core/da.json | 1 - src/NzbDrone.Core/Localization/Core/de.json | 1 - src/NzbDrone.Core/Localization/Core/es.json | 1 - src/NzbDrone.Core/Localization/Core/hu.json | 1 - src/NzbDrone.Core/Localization/Core/it.json | 1 - src/NzbDrone.Core/Localization/Core/nl.json | 1 - src/NzbDrone.Core/Localization/Core/pt.json | 1 - src/NzbDrone.Core/Localization/Core/ro.json | 1 - src/NzbDrone.Core/Localization/Core/sv.json | 1 - src/NzbDrone.Core/Localization/Core/uk.json | 1 - src/NzbDrone.Core/Localization/Core/zh_CN.json | 1 - 12 files changed, 12 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 230360072..9a3945719 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -302,7 +302,6 @@ "Yesterday": "Ahir", "ApplicationStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}", "AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de Prowlarr. Això inclou informació sobre el vostre navegador, quines pàgines Prowlarr WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.", - "ConnectionLostMessage": "Prowlarr ha perdut la connexió amb el backend i s'haurà de tornar a carregar per restaurar la funcionalitat.", "HistoryCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament", "UnableToAddANewAppProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.", "BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del Prowlarr", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 599febcf0..6a19a3e1b 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -33,7 +33,6 @@ "CustomFilters": "Bruger Tilpassede Filtere", "ConnectSettingsSummary": "Notifikationer, forbindelser til medieservere/-afspillere og brugerdefinerede scripts", "Connections": "Forbindelser", - "ConnectionLostAutomaticMessage": "Prowlarr vil prøve at tilslutte automatisk, eller du kan klikke genindlæs forneden.", "ConnectionLost": "Forbindelse Mistet", "Connect": "Notifikationer", "Component": "Komponent", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index dbaddbb3b..d4381a2d0 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -77,7 +77,6 @@ "ConnectSettings": "Eintellungen für Verbindungen", "ConnectSettingsSummary": "Benachrichtigungen und eigene Scripte", "ConnectionLost": "Verbindung unterbrochen", - "ConnectionLostMessage": "Prowlarr hat die Verbindung zum Backend verloren und muss neugeladen werden.", "Connections": "Verbindungen", "CouldNotConnectSignalR": "Es konnte keine Verbindung zu SignalR hergestellt werden, die Benutzeroberfläche wird nicht aktualisiert", "Custom": "Benutzerdefiniert", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index fc1e42d4c..b2e94fff1 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -107,7 +107,6 @@ "Info": "Info", "HealthNoIssues": "No hay problemas con tu configuración", "Error": "Error", - "ConnectionLostAutomaticMessage": "Prowlarr intentará conectarse automáticamente, o haz clic en el botón de recarga abajo.", "ConnectionLost": "Conexión perdida", "Component": "Componente", "Columns": "Columnas", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 0a553eedb..d2879a692 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -34,7 +34,6 @@ "ConnectSettingsSummary": "Értesítések és egyéni szkriptek", "ConnectSettings": "Kapcsolódási Beállítások", "Connections": "Kapcsolatok", - "ConnectionLostAutomaticMessage": "A Prowlarr megpróbál automatikusan csatlakozni, vagy kattints a frissítés gombra.", "ConnectionLost": "Kapcsolódás Elveszett", "Connect": "Értesítések", "Component": "Komponens", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index cee191b92..00dab9d34 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -142,7 +142,6 @@ "DeleteBackup": "Cancella Backup", "DBMigration": "Migrazione DB", "ConnectSettings": "Impostazioni di Connessione", - "ConnectionLostAutomaticMessage": "Prowlarr cercherà di connettersi automaticamente, oppure clicca su ricarica qui sotto.", "ConnectionLost": "Connessione Persa", "Component": "Componente", "Columns": "Colonne", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index c4a7c3e56..fadb9988d 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -78,7 +78,6 @@ "ConnectSettings": "Connecties Instellingen", "ConnectSettingsSummary": "Meldingen en aangepaste scripts", "ConnectionLost": "Verbinding Onderbroken", - "ConnectionLostMessage": "Prowlarr heeft zijn verbinding met de backend verloren en zal moeten worden herladen om functionaliteit te herstellen.", "Connections": "Connecties", "CouldNotConnectSignalR": "Kan geen verbinding maken met SignalR, gebruikersinterface wordt niet bijgewerkt", "Custom": "Aangepast", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index be120f91e..403d6e617 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -112,7 +112,6 @@ "CustomFilters": "Filtros personalizados", "ConnectSettingsSummary": "Notificações, ligações para servidores/leitores de multimédia e scripts personalizados", "Connections": "Ligações", - "ConnectionLostAutomaticMessage": "O Prowlarr tentará ligar automaticamente, ou você pode clicar em Recarregar abaixo.", "ConnectionLost": "Ligação perdida", "Connect": "Conexões", "Component": "Componente", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index b47b18c18..3ea39d30d 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -59,7 +59,6 @@ "IndexerStatusCheckSingleClientMessage": "Indexatoare indisponibile datorită erorilor: {0}", "HealthNoIssues": "Nicio problemă de configurare", "Error": "Eroare", - "ConnectionLostAutomaticMessage": "Prowlarr va încerca să se conecteze automat, sau poți apăsa reîncarcă mai jos.", "ConnectionLost": "Conexiune Pierdută", "Component": "Componentă", "Columns": "Coloane", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 97c084d99..5cd3a1de2 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -107,7 +107,6 @@ "Info": "Info", "HealthNoIssues": "Inga problem hittades med din konfiguration", "Error": "Fel", - "ConnectionLostAutomaticMessage": "Prowlarr kommer försöka ansluta automatiskt, du kan även klicka på ladda om nedan.", "ConnectionLost": "Anslutning saknas", "Component": "Komponent", "Columns": "Kolumner", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index ee6d49080..467703985 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -60,7 +60,6 @@ "BranchUpdate": "Гілка для оновлення Prowlarr", "AllIndexersHiddenDueToFilter": "Всі фільми заховані відповідно до фільтра.", "AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери Prowlarr. Це включає інформацію про ваш веб-переглядач, які сторінки Prowlarr WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.", - "ConnectionLostMessage": "Prowlarr втратив зв’язок із бекендом, і його потрібно перезавантажити, щоб відновити функціональність.", "Delete": "Видалити", "DeleteApplicationMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{0}'?", "DeleteTagMessageText": "Ви впевнені, що хочете видалити тег {0} ?", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index afc50cfe5..453199c4b 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -89,7 +89,6 @@ "ConnectSettings": "连接设置", "ConnectSettingsSummary": "通知和自定义脚本", "ConnectionLost": "连接丢失", - "ConnectionLostMessage": "Prowlarr 已与服务端断开链接,请尝试刷新来恢复使用。", "Connections": "连接", "CouldNotConnectSignalR": "无法连接至SignalR,不会升级UI", "Custom": "自定义", From a758161e31e731f8ba4f7f21f2108c75ac2e640c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 14 Aug 2023 02:27:59 +0300 Subject: [PATCH 109/964] New: Default name when adding providers --- frontend/src/Indexer/Add/AddIndexerModalContent.js | 1 + .../Indexer/Add/AddIndexerModalContentConnector.js | 4 ++-- .../src/Indexer/Add/AddIndexerPresetMenuItem.js | 8 ++++++-- frontend/src/Indexer/Add/SelectIndexerRow.js | 4 +++- .../src/Indexer/Edit/EditIndexerModalContent.js | 2 +- .../Applications/Applications/AddApplicationItem.js | 6 ++++-- .../Applications/AddApplicationPresetMenuItem.js | 8 ++++++-- .../Applications/EditApplicationModalContent.js | 2 +- .../Categories/AddCategoryModalContent.js | 2 +- .../EditDownloadClientModalContent.js | 2 +- .../Indexers/IndexerProxies/AddIndexerProxyItem.js | 6 ++++-- .../IndexerProxies/EditIndexerProxyModalContent.js | 2 +- .../Notifications/AddNotificationModalContent.js | 2 +- .../Notifications/EditNotificationModalContent.js | 2 +- frontend/src/Store/Actions/indexerActions.js | 2 ++ src/NzbDrone.Core/Localization/Core/en.json | 13 +++++++++++++ 16 files changed, 48 insertions(+), 18 deletions(-) diff --git a/frontend/src/Indexer/Add/AddIndexerModalContent.js b/frontend/src/Indexer/Add/AddIndexerModalContent.js index 7d205dc11..81e911467 100644 --- a/frontend/src/Indexer/Add/AddIndexerModalContent.js +++ b/frontend/src/Indexer/Add/AddIndexerModalContent.js @@ -263,6 +263,7 @@ class AddIndexerModalContent extends Component { diff --git a/frontend/src/Indexer/Add/AddIndexerModalContentConnector.js b/frontend/src/Indexer/Add/AddIndexerModalContentConnector.js index 0dc810608..9b9b2d824 100644 --- a/frontend/src/Indexer/Add/AddIndexerModalContentConnector.js +++ b/frontend/src/Indexer/Add/AddIndexerModalContentConnector.js @@ -49,8 +49,8 @@ class AddIndexerModalContentConnector extends Component { // // Listeners - onIndexerSelect = ({ implementation, name }) => { - this.props.selectIndexerSchema({ implementation, name }); + onIndexerSelect = ({ implementation, implementationName, name }) => { + this.props.selectIndexerSchema({ implementation, implementationName, name }); this.props.onSelectIndexer(); }; diff --git a/frontend/src/Indexer/Add/AddIndexerPresetMenuItem.js b/frontend/src/Indexer/Add/AddIndexerPresetMenuItem.js index 03196e526..8f98d0e12 100644 --- a/frontend/src/Indexer/Add/AddIndexerPresetMenuItem.js +++ b/frontend/src/Indexer/Add/AddIndexerPresetMenuItem.js @@ -10,12 +10,14 @@ class AddIndexerPresetMenuItem extends Component { onPress = () => { const { name, - implementation + implementation, + implementationName } = this.props; this.props.onPress({ name, - implementation + implementation, + implementationName }); }; @@ -26,6 +28,7 @@ class AddIndexerPresetMenuItem extends Component { const { name, implementation, + implementationName, ...otherProps } = this.props; @@ -43,6 +46,7 @@ class AddIndexerPresetMenuItem extends Component { AddIndexerPresetMenuItem.propTypes = { name: PropTypes.string.isRequired, implementation: PropTypes.string.isRequired, + implementationName: PropTypes.string.isRequired, onPress: PropTypes.func.isRequired }; diff --git a/frontend/src/Indexer/Add/SelectIndexerRow.js b/frontend/src/Indexer/Add/SelectIndexerRow.js index c3f33220d..7e1c994bf 100644 --- a/frontend/src/Indexer/Add/SelectIndexerRow.js +++ b/frontend/src/Indexer/Add/SelectIndexerRow.js @@ -17,10 +17,11 @@ class SelectIndexerRow extends Component { onPress = () => { const { implementation, + implementationName, name } = this.props; - this.props.onIndexerSelect({ implementation, name }); + this.props.onIndexerSelect({ implementation, implementationName, name }); }; // @@ -81,6 +82,7 @@ SelectIndexerRow.propTypes = { language: PropTypes.string.isRequired, description: PropTypes.string.isRequired, implementation: PropTypes.string.isRequired, + implementationName: PropTypes.string.isRequired, onIndexerSelect: PropTypes.func.isRequired, isExistingIndexer: PropTypes.bool.isRequired }; diff --git a/frontend/src/Indexer/Edit/EditIndexerModalContent.js b/frontend/src/Indexer/Edit/EditIndexerModalContent.js index 4a2ec4c0e..1fdc06eb0 100644 --- a/frontend/src/Indexer/Edit/EditIndexerModalContent.js +++ b/frontend/src/Indexer/Edit/EditIndexerModalContent.js @@ -61,7 +61,7 @@ function EditIndexerModalContent(props) { return ( - {`${id ? translate('EditIndexer') : translate('AddIndexer')} - ${indexerDisplayName}`} + {id ? translate('EditIndexerImplementation', { implementationName: indexerDisplayName }) : translate('AddIndexerImplementation', { implementationName: indexerDisplayName })} diff --git a/frontend/src/Settings/Applications/Applications/AddApplicationItem.js b/frontend/src/Settings/Applications/Applications/AddApplicationItem.js index bb0053824..bae97990b 100644 --- a/frontend/src/Settings/Applications/Applications/AddApplicationItem.js +++ b/frontend/src/Settings/Applications/Applications/AddApplicationItem.js @@ -16,10 +16,11 @@ class AddApplicationItem extends Component { onApplicationSelect = () => { const { - implementation + implementation, + implementationName } = this.props; - this.props.onApplicationSelect({ implementation }); + this.props.onApplicationSelect({ implementation, implementationName }); }; // @@ -77,6 +78,7 @@ class AddApplicationItem extends Component { key={preset.name} name={preset.name} implementation={implementation} + implementationName={implementationName} onPress={onApplicationSelect} /> ); diff --git a/frontend/src/Settings/Applications/Applications/AddApplicationPresetMenuItem.js b/frontend/src/Settings/Applications/Applications/AddApplicationPresetMenuItem.js index 9974f7132..d04aef4f0 100644 --- a/frontend/src/Settings/Applications/Applications/AddApplicationPresetMenuItem.js +++ b/frontend/src/Settings/Applications/Applications/AddApplicationPresetMenuItem.js @@ -10,12 +10,14 @@ class AddApplicationPresetMenuItem extends Component { onPress = () => { const { name, - implementation + implementation, + implementationName } = this.props; this.props.onPress({ name, - implementation + implementation, + implementationName }); }; @@ -26,6 +28,7 @@ class AddApplicationPresetMenuItem extends Component { const { name, implementation, + implementationName, ...otherProps } = this.props; @@ -43,6 +46,7 @@ class AddApplicationPresetMenuItem extends Component { AddApplicationPresetMenuItem.propTypes = { name: PropTypes.string.isRequired, implementation: PropTypes.string.isRequired, + implementationName: PropTypes.string.isRequired, onPress: PropTypes.func.isRequired }; diff --git a/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js b/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js index 88ad57076..33cae830a 100644 --- a/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js +++ b/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js @@ -71,7 +71,7 @@ function EditApplicationModalContent(props) { return ( - {`${id ? translate('Edit') : translate('Add')} ${translate('Application')} - ${implementationName}`} + {id ? translate('EditApplicationImplementation', { implementationName }) : translate('AddApplicationImplementation', { implementationName })} diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Categories/AddCategoryModalContent.js b/frontend/src/Settings/DownloadClients/DownloadClients/Categories/AddCategoryModalContent.js index 71c51849c..e79f615ea 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Categories/AddCategoryModalContent.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Categories/AddCategoryModalContent.js @@ -35,7 +35,7 @@ function AddCategoryModalContent(props) { return ( - {`${id ? 'Edit' : 'Add'} Category`} + {id ? translate('EditCategory') : translate('AddCategory')} diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js b/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js index b9cb2cc9c..b4dd3c1e9 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js @@ -84,7 +84,7 @@ class EditDownloadClientModalContent extends Component { return ( - {`${id ? translate('Edit') : translate('Add')} ${translate('DownloadClient')} - ${implementationName}`} + {id ? translate('EditDownloadClientImplementation', { implementationName }) : translate('AddDownloadClientImplementation', { implementationName })} diff --git a/frontend/src/Settings/Indexers/IndexerProxies/AddIndexerProxyItem.js b/frontend/src/Settings/Indexers/IndexerProxies/AddIndexerProxyItem.js index ff238c915..77e1e6a98 100644 --- a/frontend/src/Settings/Indexers/IndexerProxies/AddIndexerProxyItem.js +++ b/frontend/src/Settings/Indexers/IndexerProxies/AddIndexerProxyItem.js @@ -16,10 +16,11 @@ class AddIndexerProxyItem extends Component { onIndexerProxySelect = () => { const { - implementation + implementation, + implementationName } = this.props; - this.props.onIndexerProxySelect({ implementation }); + this.props.onIndexerProxySelect({ implementation, implementationName }); }; // @@ -77,6 +78,7 @@ class AddIndexerProxyItem extends Component { key={preset.name} name={preset.name} implementation={implementation} + implementationName={implementationName} onPress={onIndexerProxySelect} /> ); diff --git a/frontend/src/Settings/Indexers/IndexerProxies/EditIndexerProxyModalContent.js b/frontend/src/Settings/Indexers/IndexerProxies/EditIndexerProxyModalContent.js index 59ce4e820..8579c2a2f 100644 --- a/frontend/src/Settings/Indexers/IndexerProxies/EditIndexerProxyModalContent.js +++ b/frontend/src/Settings/Indexers/IndexerProxies/EditIndexerProxyModalContent.js @@ -47,7 +47,7 @@ function EditIndexerProxyModalContent(props) { return ( - {`${id ? 'Edit' : 'Add'} Proxy - ${implementationName}`} + {id ? translate('EditIndexerProxyImplementation', { implementationName }) : translate('AddIndexerProxyImplementation', { implementationName })} diff --git a/frontend/src/Settings/Notifications/Notifications/AddNotificationModalContent.js b/frontend/src/Settings/Notifications/Notifications/AddNotificationModalContent.js index aaf784094..a48a8f9d5 100644 --- a/frontend/src/Settings/Notifications/Notifications/AddNotificationModalContent.js +++ b/frontend/src/Settings/Notifications/Notifications/AddNotificationModalContent.js @@ -28,7 +28,7 @@ class AddNotificationModalContent extends Component { return ( - Add Notification + {translate('AddConnection')} diff --git a/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js b/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js index ec20ccff1..60e368617 100644 --- a/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js +++ b/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js @@ -48,7 +48,7 @@ function EditNotificationModalContent(props) { return ( - {`${id ? 'Edit' : 'Add'} Connection - ${implementationName}`} + {id ? translate('EditConnectionImplementation', { implementationName }) : translate('AddConnectionImplementation', { implementationName })} diff --git a/frontend/src/Store/Actions/indexerActions.js b/frontend/src/Store/Actions/indexerActions.js index 39ed90da8..0325891be 100644 --- a/frontend/src/Store/Actions/indexerActions.js +++ b/frontend/src/Store/Actions/indexerActions.js @@ -184,6 +184,8 @@ export const reducers = createHandleActions({ [SELECT_INDEXER_SCHEMA]: (state, { payload }) => { return selectSchema(state, payload, (selectedSchema) => { + selectedSchema.name = payload.name ?? payload.implementationName; + selectedSchema.implementationName = payload.implementationName; selectedSchema.enable = selectedSchema.supportsRss; return selectedSchema; diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 66ccfad7a..451bfb3f7 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -4,11 +4,18 @@ "Actions": "Actions", "Add": "Add", "AddApplication": "Add Application", + "AddApplicationImplementation": "Add Application - {implementationName}", + "AddCategory": "Add Category", + "AddConnection": "Add Connection", + "AddConnectionImplementation": "Add Connection - {implementationName}", "AddCustomFilter": "Add Custom Filter", "AddDownloadClient": "Add Download Client", + "AddDownloadClientImplementation": "Add Download Client - {implementationName}", "AddDownloadClientToProwlarr": "Adding a download client allows Prowlarr to send releases direct from the UI while doing a manual search.", "AddIndexer": "Add Indexer", + "AddIndexerImplementation": "Add Indexer - {implementationName}", "AddIndexerProxy": "Add Indexer Proxy", + "AddIndexerProxyImplementation": "Add Indexer Proxy - {implementationName}", "AddNewIndexer": "Add New Indexer", "AddRemoveOnly": "Add and Remove Only", "AddSyncProfile": "Add Sync Profile", @@ -160,7 +167,13 @@ "DownloadClientsSettingsSummary": "Download clients configuration for integration into Prowlarr UI search", "Duration": "Duration", "Edit": "Edit", + "EditApplicationImplementation": "Edit Application - {implementationName}", + "EditCategory": "Edit Category", + "EditConnectionImplementation": "Edit Connection - {implementationName}", + "EditDownloadClientImplementation": "Edit Download Client - {implementationName}", "EditIndexer": "Edit Indexer", + "EditIndexerImplementation": "Edit Indexer - {implementationName}", + "EditIndexerProxyImplementation": "Edit Indexer Proxy - {implementationName}", "EditSelectedDownloadClients": "Edit Selected Download Clients", "EditSelectedIndexers": "Edit Selected Indexers", "EditSyncProfile": "Edit Sync Profile", From b618f23bc083bc328752be74827534bff3c95447 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 12 Aug 2023 20:49:24 -0500 Subject: [PATCH 110/964] Cleanup other provider status code (cherry picked from commit c281a7818adce8db728d2a104f4444cb9c0baf2c) --- src/NzbDrone.Core/Download/DownloadClientFactory.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Download/DownloadClientFactory.cs b/src/NzbDrone.Core/Download/DownloadClientFactory.cs index bcad10a57..e7eacbbe3 100644 --- a/src/NzbDrone.Core/Download/DownloadClientFactory.cs +++ b/src/NzbDrone.Core/Download/DownloadClientFactory.cs @@ -57,11 +57,11 @@ namespace NzbDrone.Core.Download private IEnumerable FilterBlockedClients(IEnumerable clients) { - var blockedIndexers = _downloadClientStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v); + var blockedClients = _downloadClientStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v); foreach (var client in clients) { - if (blockedIndexers.TryGetValue(client.Definition.Id, out var downloadClientStatus)) + if (blockedClients.TryGetValue(client.Definition.Id, out var downloadClientStatus)) { _logger.Debug("Temporarily ignoring download client {0} till {1} due to recent failures.", client.Definition.Name, downloadClientStatus.DisabledTill.Value.ToLocalTime()); continue; From 130257fdd426a337afa6a7d0872f0fb32df7fee2 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 12 Aug 2023 14:59:22 -0500 Subject: [PATCH 111/964] New: Notifications (Connect) Status (cherry picked from commit e3545801721e00d4e5cac3fa534e66dcbe9d2d05) --- frontend/src/System/Status/Health/Health.js | 8 + .../Checks/NotificationStatusCheckFixture.cs | 89 ++++++++++ ...leanupOrphanedNotificationStatusFixture.cs | 56 ++++++ .../NotificationStatusServiceFixture.cs | 161 ++++++++++++++++++ .../Migration/037_add_notification_status.cs | 19 +++ src/NzbDrone.Core/Datastore/TableMapping.cs | 3 +- .../Checks/NotificationStatusCheck.cs | 52 ++++++ .../CleanupOrphanedNotificationStatus.cs | 27 +++ .../FixFutureNotificationStatusTimes.cs | 12 ++ src/NzbDrone.Core/Localization/Core/en.json | 2 + .../Notifications/NotificationFactory.cs | 59 ++++++- .../Notifications/NotificationService.cs | 42 ++--- .../Notifications/NotificationStatus.cs | 8 + .../NotificationStatusRepository.cs | 18 ++ .../NotificationStatusService.cs | 22 +++ 15 files changed, 546 insertions(+), 32 deletions(-) create mode 100644 src/NzbDrone.Core.Test/HealthCheck/Checks/NotificationStatusCheckFixture.cs create mode 100644 src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedNotificationStatusFixture.cs create mode 100644 src/NzbDrone.Core.Test/NotificationTests/NotificationStatusServiceFixture.cs create mode 100644 src/NzbDrone.Core/Datastore/Migration/037_add_notification_status.cs create mode 100644 src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs create mode 100644 src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedNotificationStatus.cs create mode 100644 src/NzbDrone.Core/Housekeeping/Housekeepers/FixFutureNotificationStatusTimes.cs create mode 100644 src/NzbDrone.Core/Notifications/NotificationStatus.cs create mode 100644 src/NzbDrone.Core/Notifications/NotificationStatusRepository.cs create mode 100644 src/NzbDrone.Core/Notifications/NotificationStatusService.cs diff --git a/frontend/src/System/Status/Health/Health.js b/frontend/src/System/Status/Health/Health.js index 015a8aa6e..372867e56 100644 --- a/frontend/src/System/Status/Health/Health.js +++ b/frontend/src/System/Status/Health/Health.js @@ -33,6 +33,14 @@ function getInternalLink(source) { to="/settings/downloadclients" /> ); + case 'NotificationStatusCheck': + return ( + + ); case 'IndexerRssCheck': case 'IndexerSearchCheck': case 'IndexerStatusCheck': diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/NotificationStatusCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/NotificationStatusCheckFixture.cs new file mode 100644 index 000000000..67b79ae0b --- /dev/null +++ b/src/NzbDrone.Core.Test/HealthCheck/Checks/NotificationStatusCheckFixture.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using Moq; +using NUnit.Framework; +using NzbDrone.Core.HealthCheck.Checks; +using NzbDrone.Core.Localization; +using NzbDrone.Core.Notifications; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.HealthCheck.Checks +{ + [TestFixture] + public class NotificationStatusCheckFixture : CoreTest + { + private List _notifications = new List(); + private List _blockedNotifications = new List(); + + [SetUp] + public void SetUp() + { + Mocker.GetMock() + .Setup(v => v.GetAvailableProviders()) + .Returns(_notifications); + + Mocker.GetMock() + .Setup(v => v.GetBlockedProviders()) + .Returns(_blockedNotifications); + + Mocker.GetMock() + .Setup(s => s.GetLocalizedString(It.IsAny())) + .Returns("Some Warning Message"); + } + + private Mock GivenNotification(int id, double backoffHours, double failureHours) + { + var mockNotification = new Mock(); + mockNotification.SetupGet(s => s.Definition).Returns(new NotificationDefinition { Id = id }); + + _notifications.Add(mockNotification.Object); + + if (backoffHours != 0.0) + { + _blockedNotifications.Add(new NotificationStatus + { + ProviderId = id, + InitialFailure = DateTime.UtcNow.AddHours(-failureHours), + MostRecentFailure = DateTime.UtcNow.AddHours(-0.1), + EscalationLevel = 5, + DisabledTill = DateTime.UtcNow.AddHours(backoffHours) + }); + } + + return mockNotification; + } + + [Test] + public void should_not_return_error_when_no_notifications() + { + Subject.Check().ShouldBeOk(); + } + + [Test] + public void should_return_warning_if_notification_unavailable() + { + GivenNotification(1, 10.0, 24.0); + GivenNotification(2, 0.0, 0.0); + + Subject.Check().ShouldBeWarning(); + } + + [Test] + public void should_return_error_if_all_notifications_unavailable() + { + GivenNotification(1, 10.0, 24.0); + + Subject.Check().ShouldBeError(); + } + + [Test] + public void should_return_warning_if_few_notifications_unavailable() + { + GivenNotification(1, 10.0, 24.0); + GivenNotification(2, 10.0, 24.0); + GivenNotification(3, 0.0, 0.0); + + Subject.Check().ShouldBeWarning(); + } + } +} diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedNotificationStatusFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedNotificationStatusFixture.cs new file mode 100644 index 000000000..20e82ff7f --- /dev/null +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedNotificationStatusFixture.cs @@ -0,0 +1,56 @@ +using FizzWare.NBuilder; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Core.Housekeeping.Housekeepers; +using NzbDrone.Core.Notifications; +using NzbDrone.Core.Notifications.Join; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.Housekeeping.Housekeepers +{ + [TestFixture] + public class CleanupOrphanedNotificationStatusFixture : DbTest + { + private NotificationDefinition _notification; + + [SetUp] + public void Setup() + { + _notification = Builder.CreateNew() + .With(s => s.Settings = new JoinSettings { }) + .BuildNew(); + } + + private void GivenNotification() + { + Db.Insert(_notification); + } + + [Test] + public void should_delete_orphaned_notificationstatus() + { + var status = Builder.CreateNew() + .With(h => h.ProviderId = _notification.Id) + .BuildNew(); + Db.Insert(status); + + Subject.Clean(); + AllStoredModels.Should().BeEmpty(); + } + + [Test] + public void should_not_delete_unorphaned_notificationstatus() + { + GivenNotification(); + + var status = Builder.CreateNew() + .With(h => h.ProviderId = _notification.Id) + .BuildNew(); + Db.Insert(status); + + Subject.Clean(); + AllStoredModels.Should().HaveCount(1); + AllStoredModels.Should().Contain(h => h.ProviderId == _notification.Id); + } + } +} diff --git a/src/NzbDrone.Core.Test/NotificationTests/NotificationStatusServiceFixture.cs b/src/NzbDrone.Core.Test/NotificationTests/NotificationStatusServiceFixture.cs new file mode 100644 index 000000000..183246313 --- /dev/null +++ b/src/NzbDrone.Core.Test/NotificationTests/NotificationStatusServiceFixture.cs @@ -0,0 +1,161 @@ +using System; +using System.Linq; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Core.Notifications; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.NotificationTests +{ + public class NotificationStatusServiceFixture : CoreTest + { + private DateTime _epoch; + + [SetUp] + public void SetUp() + { + _epoch = DateTime.UtcNow; + + Mocker.GetMock() + .SetupGet(v => v.StartTime) + .Returns(_epoch - TimeSpan.FromHours(1)); + } + + private NotificationStatus WithStatus(NotificationStatus status) + { + Mocker.GetMock() + .Setup(v => v.FindByProviderId(1)) + .Returns(status); + + Mocker.GetMock() + .Setup(v => v.All()) + .Returns(new[] { status }); + + return status; + } + + private void VerifyUpdate() + { + Mocker.GetMock() + .Verify(v => v.Upsert(It.IsAny()), Times.Once()); + } + + private void VerifyNoUpdate() + { + Mocker.GetMock() + .Verify(v => v.Upsert(It.IsAny()), Times.Never()); + } + + [Test] + public void should_not_consider_blocked_within_5_minutes_since_initial_failure() + { + WithStatus(new NotificationStatus + { + InitialFailure = _epoch - TimeSpan.FromMinutes(4), + MostRecentFailure = _epoch - TimeSpan.FromSeconds(4), + EscalationLevel = 3 + }); + + Subject.RecordFailure(1); + + VerifyUpdate(); + + var status = Subject.GetBlockedProviders().FirstOrDefault(); + status.Should().BeNull(); + } + + [Test] + public void should_consider_blocked_after_5_minutes_since_initial_failure() + { + WithStatus(new NotificationStatus + { + InitialFailure = _epoch - TimeSpan.FromMinutes(6), + MostRecentFailure = _epoch - TimeSpan.FromSeconds(120), + EscalationLevel = 3 + }); + + Subject.RecordFailure(1); + + VerifyUpdate(); + + var status = Subject.GetBlockedProviders().FirstOrDefault(); + status.Should().NotBeNull(); + } + + [Test] + public void should_not_escalate_further_till_after_5_minutes_since_initial_failure() + { + var origStatus = WithStatus(new NotificationStatus + { + InitialFailure = _epoch - TimeSpan.FromMinutes(4), + MostRecentFailure = _epoch - TimeSpan.FromSeconds(4), + EscalationLevel = 3 + }); + + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + + var status = Subject.GetBlockedProviders().FirstOrDefault(); + status.Should().BeNull(); + + origStatus.EscalationLevel.Should().Be(3); + } + + [Test] + public void should_escalate_further_after_5_minutes_since_initial_failure() + { + WithStatus(new NotificationStatus + { + InitialFailure = _epoch - TimeSpan.FromMinutes(6), + MostRecentFailure = _epoch - TimeSpan.FromSeconds(120), + EscalationLevel = 3 + }); + + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + + var status = Subject.GetBlockedProviders().FirstOrDefault(); + status.Should().NotBeNull(); + + status.EscalationLevel.Should().BeGreaterThan(3); + } + + [Test] + public void should_not_escalate_beyond_3_hours() + { + WithStatus(new NotificationStatus + { + InitialFailure = _epoch - TimeSpan.FromMinutes(6), + MostRecentFailure = _epoch - TimeSpan.FromSeconds(120), + EscalationLevel = 3 + }); + + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + Subject.RecordFailure(1); + + var status = Subject.GetBlockedProviders().FirstOrDefault(); + status.Should().NotBeNull(); + status.DisabledTill.Should().HaveValue(); + status.DisabledTill.Should().NotBeAfter(_epoch + TimeSpan.FromHours(3.1)); + } + } +} diff --git a/src/NzbDrone.Core/Datastore/Migration/037_add_notification_status.cs b/src/NzbDrone.Core/Datastore/Migration/037_add_notification_status.cs new file mode 100644 index 000000000..478b00103 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/037_add_notification_status.cs @@ -0,0 +1,19 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(037)] + public class add_notification_status : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Create.TableForModel("NotificationStatus") + .WithColumn("ProviderId").AsInt32().NotNullable().Unique() + .WithColumn("InitialFailure").AsDateTimeOffset().Nullable() + .WithColumn("MostRecentFailure").AsDateTimeOffset().Nullable() + .WithColumn("EscalationLevel").AsInt32().NotNullable() + .WithColumn("DisabledTill").AsDateTimeOffset().Nullable(); + } + } +} diff --git a/src/NzbDrone.Core/Datastore/TableMapping.cs b/src/NzbDrone.Core/Datastore/TableMapping.cs index aa87b40f2..546d1288b 100644 --- a/src/NzbDrone.Core/Datastore/TableMapping.cs +++ b/src/NzbDrone.Core/Datastore/TableMapping.cs @@ -91,10 +91,9 @@ namespace NzbDrone.Core.Datastore .Ignore(c => c.Message); Mapper.Entity("IndexerStatus").RegisterModel(); - Mapper.Entity("DownloadClientStatus").RegisterModel(); - Mapper.Entity("ApplicationStatus").RegisterModel(); + Mapper.Entity("NotificationStatus").RegisterModel(); Mapper.Entity("CustomFilters").RegisterModel(); Mapper.Entity("UpdateHistory").RegisterModel(); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs new file mode 100644 index 000000000..c9b5e2561 --- /dev/null +++ b/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs @@ -0,0 +1,52 @@ +using System.Linq; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Localization; +using NzbDrone.Core.Notifications; +using NzbDrone.Core.ThingiProvider.Events; + +namespace NzbDrone.Core.HealthCheck.Checks +{ + [CheckOn(typeof(ProviderUpdatedEvent))] + [CheckOn(typeof(ProviderDeletedEvent))] + [CheckOn(typeof(ProviderStatusChangedEvent))] + public class NotificationStatusCheck : HealthCheckBase + { + private readonly INotificationFactory _providerFactory; + private readonly INotificationStatusService _providerStatusService; + + public NotificationStatusCheck(INotificationFactory providerFactory, INotificationStatusService providerStatusService, ILocalizationService localizationService) + : base(localizationService) + { + _providerFactory = providerFactory; + _providerStatusService = providerStatusService; + } + + public override HealthCheck Check() + { + var enabledProviders = _providerFactory.GetAvailableProviders(); + var backOffProviders = enabledProviders.Join(_providerStatusService.GetBlockedProviders(), + i => i.Definition.Id, + s => s.ProviderId, + (i, s) => new { Provider = i, Status = s }) + .ToList(); + + if (backOffProviders.Empty()) + { + return new HealthCheck(GetType()); + } + + if (backOffProviders.Count == enabledProviders.Count) + { + return new HealthCheck(GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString("NotificationStatusAllClientHealthCheckMessage"), + "#notifications-are-unavailable-due-to-failures"); + } + + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + string.Format(_localizationService.GetLocalizedString("NotificationStatusSingleClientHealthCheckMessage"), string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), + "#notifications-are-unavailable-due-to-failures"); + } + } +} diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedNotificationStatus.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedNotificationStatus.cs new file mode 100644 index 000000000..cfc3e1f63 --- /dev/null +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedNotificationStatus.cs @@ -0,0 +1,27 @@ +using Dapper; +using NzbDrone.Core.Datastore; + +namespace NzbDrone.Core.Housekeeping.Housekeepers +{ + public class CleanupOrphanedNotificationStatus : IHousekeepingTask + { + private readonly IMainDatabase _database; + + public CleanupOrphanedNotificationStatus(IMainDatabase database) + { + _database = database; + } + + public void Clean() + { + using var mapper = _database.OpenConnection(); + + mapper.Execute(@"DELETE FROM ""NotificationStatus"" + WHERE ""Id"" IN ( + SELECT ""NotificationStatus"".""Id"" FROM ""NotificationStatus"" + LEFT OUTER JOIN ""Notifications"" + ON ""NotificationStatus"".""ProviderId"" = ""Notifications"".""Id"" + WHERE ""Notifications"".""Id"" IS NULL)"); + } + } +} diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/FixFutureNotificationStatusTimes.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/FixFutureNotificationStatusTimes.cs new file mode 100644 index 000000000..10af6ab42 --- /dev/null +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/FixFutureNotificationStatusTimes.cs @@ -0,0 +1,12 @@ +using NzbDrone.Core.Notifications; + +namespace NzbDrone.Core.Housekeeping.Housekeepers +{ + public class FixFutureNotificationStatusTimes : FixFutureProviderStatusTimes, IHousekeepingTask + { + public FixFutureNotificationStatusTimes(INotificationStatusRepository notificationStatusRepository) + : base(notificationStatusRepository) + { + } + } +} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 451bfb3f7..7f909e29c 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -333,6 +333,8 @@ "NoUpdatesAreAvailable": "No updates are available", "NotSupported": "Not Supported", "Notification": "Notification", + "NotificationStatusAllClientHealthCheckMessage": "All notifications are unavailable due to failures", + "NotificationStatusSingleClientHealthCheckMessage": "Notifications unavailable due to failures: {0}", "NotificationTriggers": "Notification Triggers", "NotificationTriggersHelpText": "Select which events should trigger this notification", "Notifications": "Notifications", diff --git a/src/NzbDrone.Core/Notifications/NotificationFactory.cs b/src/NzbDrone.Core/Notifications/NotificationFactory.cs index 36dc2145e..7694b1837 100644 --- a/src/NzbDrone.Core/Notifications/NotificationFactory.cs +++ b/src/NzbDrone.Core/Notifications/NotificationFactory.cs @@ -9,39 +9,80 @@ namespace NzbDrone.Core.Notifications { public interface INotificationFactory : IProviderFactory { - List OnGrabEnabled(); - List OnHealthIssueEnabled(); - List OnHealthRestoredEnabled(); - List OnApplicationUpdateEnabled(); + List OnGrabEnabled(bool filterBlockedNotifications = true); + List OnHealthIssueEnabled(bool filterBlockedNotifications = true); + List OnHealthRestoredEnabled(bool filterBlockedNotifications = true); + List OnApplicationUpdateEnabled(bool filterBlockedNotifications = true); } public class NotificationFactory : ProviderFactory, INotificationFactory { - public NotificationFactory(INotificationRepository providerRepository, IEnumerable providers, IServiceProvider container, IEventAggregator eventAggregator, Logger logger) + private readonly INotificationStatusService _notificationStatusService; + private readonly Logger _logger; + + public NotificationFactory(INotificationStatusService notificationStatusService, INotificationRepository providerRepository, IEnumerable providers, IServiceProvider container, IEventAggregator eventAggregator, Logger logger) : base(providerRepository, providers, container, eventAggregator, logger) { + _notificationStatusService = notificationStatusService; + _logger = logger; } - public List OnGrabEnabled() + public List OnGrabEnabled(bool filterBlockedNotifications = true) { + if (filterBlockedNotifications) + { + return FilterBlockedNotifications(GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnGrab)).ToList(); + } + return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnGrab).ToList(); } - public List OnHealthIssueEnabled() + public List OnHealthIssueEnabled(bool filterBlockedNotifications = true) { + if (filterBlockedNotifications) + { + return FilterBlockedNotifications(GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnHealthIssue)).ToList(); + } + return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnHealthIssue).ToList(); } - public List OnHealthRestoredEnabled() + public List OnHealthRestoredEnabled(bool filterBlockedNotifications = true) { + if (filterBlockedNotifications) + { + return FilterBlockedNotifications(GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnHealthRestored)).ToList(); + } + return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnHealthRestored).ToList(); } - public List OnApplicationUpdateEnabled() + public List OnApplicationUpdateEnabled(bool filterBlockedNotifications = true) { + if (filterBlockedNotifications) + { + return FilterBlockedNotifications(GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnApplicationUpdate)).ToList(); + } + return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnApplicationUpdate).ToList(); } + private IEnumerable FilterBlockedNotifications(IEnumerable notifications) + { + var blockedNotifications = _notificationStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v); + + foreach (var notification in notifications) + { + if (blockedNotifications.TryGetValue(notification.Definition.Id, out var notificationStatus)) + { + _logger.Debug("Temporarily ignoring notification {0} till {1} due to recent failures.", notification.Definition.Name, notificationStatus.DisabledTill.Value.ToLocalTime()); + continue; + } + + yield return notification; + } + } + public override void SetProviderCharacteristics(INotification provider, NotificationDefinition definition) { base.SetProviderCharacteristics(provider, definition); diff --git a/src/NzbDrone.Core/Notifications/NotificationService.cs b/src/NzbDrone.Core/Notifications/NotificationService.cs index 8f5610975..ab4473023 100644 --- a/src/NzbDrone.Core/Notifications/NotificationService.cs +++ b/src/NzbDrone.Core/Notifications/NotificationService.cs @@ -20,42 +20,34 @@ namespace NzbDrone.Core.Notifications IHandle { private readonly INotificationFactory _notificationFactory; + private readonly INotificationStatusService _notificationStatusService; private readonly Logger _logger; - public NotificationService(INotificationFactory notificationFactory, Logger logger) + public NotificationService(INotificationFactory notificationFactory, INotificationStatusService notificationStatusService, Logger logger) { _notificationFactory = notificationFactory; + _notificationStatusService = notificationStatusService; _logger = logger; } private bool ShouldHandleHealthFailure(HealthCheck.HealthCheck healthCheck, bool includeWarnings) { - if (healthCheck.Type == HealthCheckResult.Error) + return healthCheck.Type switch { - return true; - } - - if (healthCheck.Type == HealthCheckResult.Warning && includeWarnings) - { - return true; - } - - return false; + HealthCheckResult.Error => true, + HealthCheckResult.Warning when includeWarnings => true, + _ => false + }; } private bool ShouldHandleOnGrab(GrabMessage message, bool includeManual) { - if (message.GrabTrigger == GrabTrigger.Api) + return message.GrabTrigger switch { - return true; - } - - if (message.GrabTrigger == GrabTrigger.Manual && includeManual) - { - return true; - } - - return false; + GrabTrigger.Api => true, + GrabTrigger.Manual when includeManual => true, + _ => false + }; } private string GetMessage(ReleaseInfo release, GrabTrigger grabTrigger, string source, string downloadClient) @@ -96,10 +88,12 @@ namespace NzbDrone.Core.Notifications if (ShouldHandleHealthFailure(message.HealthCheck, ((NotificationDefinition)notification.Definition).IncludeHealthWarnings)) { notification.OnHealthIssue(message.HealthCheck); + _notificationStatusService.RecordSuccess(notification.Definition.Id); } } catch (Exception ex) { + _notificationStatusService.RecordFailure(notification.Definition.Id); _logger.Warn(ex, "Unable to send OnHealthIssue notification to: " + notification.Definition.Name); } } @@ -119,10 +113,12 @@ namespace NzbDrone.Core.Notifications if (ShouldHandleHealthFailure(message.PreviousCheck, ((NotificationDefinition)notification.Definition).IncludeHealthWarnings)) { notification.OnHealthRestored(message.PreviousCheck); + _notificationStatusService.RecordSuccess(notification.Definition.Id); } } catch (Exception ex) { + _notificationStatusService.RecordFailure(notification.Definition.Id); _logger.Warn(ex, "Unable to send OnHealthRestored notification to: " + notification.Definition.Name); } } @@ -145,9 +141,11 @@ namespace NzbDrone.Core.Notifications try { notification.OnApplicationUpdate(updateMessage); + _notificationStatusService.RecordSuccess(notification.Definition.Id); } catch (Exception ex) { + _notificationStatusService.RecordFailure(notification.Definition.Id); _logger.Warn(ex, "Unable to send OnApplicationUpdate notification to: " + notification.Definition.Name); } } @@ -192,10 +190,12 @@ namespace NzbDrone.Core.Notifications ShouldHandleOnGrab(grabMessage, ((NotificationDefinition)notification.Definition).IncludeManualGrabs)) { notification.OnGrab(grabMessage); + _notificationStatusService.RecordSuccess(notification.Definition.Id); } } catch (Exception ex) { + _notificationStatusService.RecordFailure(notification.Definition.Id); _logger.Error(ex, "Unable to send OnGrab notification to {0}", notification.Definition.Name); } } diff --git a/src/NzbDrone.Core/Notifications/NotificationStatus.cs b/src/NzbDrone.Core/Notifications/NotificationStatus.cs new file mode 100644 index 000000000..1cb6f4a2e --- /dev/null +++ b/src/NzbDrone.Core/Notifications/NotificationStatus.cs @@ -0,0 +1,8 @@ +using NzbDrone.Core.ThingiProvider.Status; + +namespace NzbDrone.Core.Notifications +{ + public class NotificationStatus : ProviderStatusBase + { + } +} diff --git a/src/NzbDrone.Core/Notifications/NotificationStatusRepository.cs b/src/NzbDrone.Core/Notifications/NotificationStatusRepository.cs new file mode 100644 index 000000000..c5e61647f --- /dev/null +++ b/src/NzbDrone.Core/Notifications/NotificationStatusRepository.cs @@ -0,0 +1,18 @@ +using NzbDrone.Core.Datastore; +using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.ThingiProvider.Status; + +namespace NzbDrone.Core.Notifications +{ + public interface INotificationStatusRepository : IProviderStatusRepository + { + } + + public class NotificationStatusRepository : ProviderStatusRepository, INotificationStatusRepository + { + public NotificationStatusRepository(IMainDatabase database, IEventAggregator eventAggregator) + : base(database, eventAggregator) + { + } + } +} diff --git a/src/NzbDrone.Core/Notifications/NotificationStatusService.cs b/src/NzbDrone.Core/Notifications/NotificationStatusService.cs new file mode 100644 index 000000000..218b21ba8 --- /dev/null +++ b/src/NzbDrone.Core/Notifications/NotificationStatusService.cs @@ -0,0 +1,22 @@ +using System; +using NLog; +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.ThingiProvider.Status; + +namespace NzbDrone.Core.Notifications +{ + public interface INotificationStatusService : IProviderStatusServiceBase + { + } + + public class NotificationStatusService : ProviderStatusServiceBase, INotificationStatusService + { + public NotificationStatusService(INotificationStatusRepository providerStatusRepository, IEventAggregator eventAggregator, IRuntimeInfo runtimeInfo, Logger logger) + : base(providerStatusRepository, eventAggregator, runtimeInfo, logger) + { + MinimumTimeSinceInitialFailure = TimeSpan.FromMinutes(5); + MaximumEscalationLevel = 5; + } + } +} From a7b25b8b9320ec33210cab309db3fac3b65dae59 Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Wed, 16 Aug 2023 09:25:12 -0500 Subject: [PATCH 112/964] Remove reddit from readme --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index e5759c632..a2afa58cb 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,6 @@ Prowlarr is an indexer manager/proxy built on the popular \*arr .net/reactjs bas [![Wiki](https://img.shields.io/badge/servarr-wiki-181717.svg?maxAge=60)](https://wiki.servarr.com/prowlarr) [![Discord](https://img.shields.io/badge/discord-chat-7289DA.svg?maxAge=60)](https://prowlarr.com/discord) -[![Reddit](https://img.shields.io/badge/reddit-discussion-FF4500.svg?maxAge=60)](https://www.reddit.com/r/Prowlarr) Note: GitHub Issues are for Bugs and Feature Requests Only From aeb3b7d8b5e212cb9bcc385489aa530af6075ceb Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 15 Aug 2023 17:49:30 +0300 Subject: [PATCH 113/964] Add retry to flaky automation tests --- src/NzbDrone.Automation.Test/MainPagesTest.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/NzbDrone.Automation.Test/MainPagesTest.cs b/src/NzbDrone.Automation.Test/MainPagesTest.cs index 4b42be06c..e1d411f22 100644 --- a/src/NzbDrone.Automation.Test/MainPagesTest.cs +++ b/src/NzbDrone.Automation.Test/MainPagesTest.cs @@ -18,6 +18,7 @@ namespace NzbDrone.Automation.Test } [Test] + [Retry(3)] public void indexer_page() { _page.MovieNavIcon.Click(); @@ -30,6 +31,7 @@ namespace NzbDrone.Automation.Test } [Test] + [Retry(3)] public void system_page() { _page.SystemNavIcon.Click(); From e024bba6b613405ac8a09e36517e3f3f33a41c25 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 18 Aug 2023 07:58:34 +0300 Subject: [PATCH 114/964] Replace docker detection for cgroup v2 (cherry picked from commit 78d4dee4610c5f3f90cc69469004008aa64900b8) --- src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs index f016b08bb..b9a206e4e 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs @@ -78,8 +78,8 @@ namespace NzbDrone.Common.EnvironmentInfo } if (IsLinux && - ((File.Exists("/proc/1/cgroup") && File.ReadAllText("/proc/1/cgroup").Contains("/docker/")) || - (File.Exists("/proc/1/mountinfo") && File.ReadAllText("/proc/1/mountinfo").Contains("/docker/")))) + (File.Exists("/.dockerenv") || + (File.Exists("/proc/1/cgroup") && File.ReadAllText("/proc/1/cgroup").Contains("/docker/")))) { IsDocker = true; } From 955bc472a11e4562c5a369a9e997069bf5deda10 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 17 Aug 2023 21:21:46 -0700 Subject: [PATCH 115/964] Fixed: Hidden files being ignored (cherry picked from commit d493f8762fcb1684b44e182753c21d7a493db787) --- src/NzbDrone.Common/Disk/DiskProviderBase.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index c386aa001..d92c01d00 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -162,6 +162,7 @@ namespace NzbDrone.Common.Disk return Directory.EnumerateFiles(path, "*", new EnumerationOptions { + AttributesToSkip = FileAttributes.System, RecurseSubdirectories = recursive, IgnoreInaccessible = true }); @@ -528,6 +529,7 @@ namespace NzbDrone.Common.Disk return di.EnumerateFiles("*", new EnumerationOptions { + AttributesToSkip = FileAttributes.System, RecurseSubdirectories = recursive, IgnoreInaccessible = true }).ToList(); From 2b7771bfe080ee95ade793451573df1f357e0486 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 18 Aug 2023 02:39:26 +0000 Subject: [PATCH 116/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: Robert A. Viana Co-authored-by: Weblate Co-authored-by: w2861 Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ar.json | 7 +- src/NzbDrone.Core/Localization/Core/bg.json | 7 +- src/NzbDrone.Core/Localization/Core/ca.json | 8 ++- src/NzbDrone.Core/Localization/Core/cs.json | 8 ++- src/NzbDrone.Core/Localization/Core/da.json | 7 +- src/NzbDrone.Core/Localization/Core/de.json | 8 ++- src/NzbDrone.Core/Localization/Core/el.json | 8 ++- src/NzbDrone.Core/Localization/Core/es.json | 10 ++- src/NzbDrone.Core/Localization/Core/fi.json | 8 ++- src/NzbDrone.Core/Localization/Core/fr.json | 8 ++- src/NzbDrone.Core/Localization/Core/he.json | 10 ++- src/NzbDrone.Core/Localization/Core/hi.json | 7 +- src/NzbDrone.Core/Localization/Core/hr.json | 3 +- src/NzbDrone.Core/Localization/Core/hu.json | 8 ++- src/NzbDrone.Core/Localization/Core/id.json | 3 +- src/NzbDrone.Core/Localization/Core/is.json | 7 +- src/NzbDrone.Core/Localization/Core/it.json | 8 ++- src/NzbDrone.Core/Localization/Core/ja.json | 7 +- src/NzbDrone.Core/Localization/Core/ko.json | 5 +- .../Localization/Core/nb_NO.json | 5 +- src/NzbDrone.Core/Localization/Core/nl.json | 9 ++- src/NzbDrone.Core/Localization/Core/pl.json | 8 ++- src/NzbDrone.Core/Localization/Core/pt.json | 8 ++- .../Localization/Core/pt_BR.json | 69 +++++++++++-------- src/NzbDrone.Core/Localization/Core/ro.json | 14 ++-- src/NzbDrone.Core/Localization/Core/ru.json | 8 ++- src/NzbDrone.Core/Localization/Core/sk.json | 3 +- src/NzbDrone.Core/Localization/Core/sv.json | 7 +- src/NzbDrone.Core/Localization/Core/th.json | 7 +- src/NzbDrone.Core/Localization/Core/tr.json | 7 +- src/NzbDrone.Core/Localization/Core/uk.json | 8 ++- src/NzbDrone.Core/Localization/Core/vi.json | 7 +- .../Localization/Core/zh_CN.json | 14 +++- 33 files changed, 249 insertions(+), 62 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 1eedf2375..3c7ba60c0 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -341,5 +341,10 @@ "Genre": "الأنواع", "More": "أكثر", "Track": "أثر", - "Year": "عام" + "Year": "عام", + "ConnectionLostReconnect": "سيحاول Radarr الاتصال تلقائيًا ، أو يمكنك النقر فوق إعادة التحميل أدناه.", + "DeleteAppProfileMessageText": "هل أنت متأكد من أنك تريد حذف ملف تعريف الجودة {0}", + "RecentChanges": "التغييرات الأخيرة", + "WhatsNew": "ما هو الجديد؟", + "minutes": "الدقائق" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index dab40a533..6d0256e2f 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -341,5 +341,10 @@ "ApplyTagsHelpTextReplace": "Замяна: Заменете маркерите с въведените маркери (не въвеждайте маркери, за да изчистите всички маркери)", "DownloadClientPriorityHelpText": "Приоритизирайте множество клиенти за изтегляне. Round-Robin се използва за клиенти със същия приоритет.", "Track": "Проследяване", - "Year": "Година" + "Year": "Година", + "ConnectionLostReconnect": "Radarr ще се опита да се свърже автоматично или можете да щракнете върху презареждане по-долу.", + "DeleteAppProfileMessageText": "Наистина ли искате да изтриете качествения профил {0}", + "RecentChanges": "Последни промени", + "WhatsNew": "Какво ново?", + "minutes": "Минути" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 9a3945719..4ee0efd97 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -363,5 +363,11 @@ "Theme": "Tema", "Track": "Traça", "Year": "Any", - "UpdateAvailable": "Nova actualització disponible" + "UpdateAvailable": "Nova actualització disponible", + "ConnectionLostReconnect": "Radarr intentarà connectar-se automàticament, o podeu fer clic a recarregar.", + "ConnectionLostToBackend": "Radarr ha perdut la connexió amb el backend i s'haurà de tornar a carregar per restaurar la funcionalitat.", + "RecentChanges": "Canvis recents", + "WhatsNew": "Que hi ha de nou?", + "minutes": "Minuts", + "DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 931274031..73311a6bb 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -344,5 +344,11 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané filmy", "ApplyTagsHelpTextReplace": "Nahradit: Nahradit tagy zadanými tagy (pro vymazání všech tagů zadejte žádné tagy)", "Track": "Stopa", - "Genre": "Žánry" + "Genre": "Žánry", + "ConnectionLostReconnect": "Radarr se pokusí připojit automaticky, nebo můžete kliknout na znovu načíst níže.", + "RecentChanges": "Nedávné změny", + "WhatsNew": "Co je nového?", + "DeleteAppProfileMessageText": "Opravdu chcete smazat kvalitní profil {0}", + "ConnectionLostToBackend": "Radarr ztratil spojení s back-endem a pro obnovení funkčnosti bude nutné jej znovu načíst.", + "minutes": "Minut" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 6a19a3e1b..48debf4d3 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -357,5 +357,10 @@ "ApplyTagsHelpTextRemove": "Fjern: Fjern de indtastede tags", "ApplyTagsHelpTextReplace": "Erstat: Udskift tags med de indtastede tags (indtast ingen tags for at rydde alle tags)", "DownloadClientPriorityHelpText": "Prioriter flere downloadklienter. Round-Robin bruges til klienter med samme prioritet.", - "Track": "Spor" + "Track": "Spor", + "DeleteAppProfileMessageText": "Er du sikker på, at du vil slette kvalitetsprofilen {0}", + "RecentChanges": "Seneste ændringer", + "WhatsNew": "Hvad er nyt?", + "ConnectionLostReconnect": "Radarr vil prøve at tilslutte automatisk, eller du kan klikke genindlæs forneden.", + "minutes": "Protokoller" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index d4381a2d0..19e8be82a 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -491,5 +491,11 @@ "Album": "Album", "Artist": "Künstler", "Author": "Autor", - "Book": "Buch" + "Book": "Buch", + "ConnectionLostReconnect": "Radarr wird automatisch versuchen zu verbinden oder klicke unten auf neuladen.", + "ConnectionLostToBackend": "Radarr hat die Verbindung zum Backend verloren und muss neugeladen werden.", + "RecentChanges": "Neuste Änderungen", + "WhatsNew": "Was gibt's Neues?", + "minutes": "Minuten", + "DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 9d3e72f70..c92a44a6c 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -493,5 +493,11 @@ "Label": "Επιγραφή", "Episode": "Επεισόδιο", "Genre": "Είδη", - "Publisher": "Εκδότης" + "Publisher": "Εκδότης", + "ConnectionLostReconnect": "Το Radarr θα προσπαθήσει να συνδεθεί αυτόματα, αλλιώς μπορείτε να κάνετε reload απο κάτω.", + "RecentChanges": "Πρόσφατες αλλαγές", + "WhatsNew": "Τι νέα?", + "ConnectionLostToBackend": "Το Radarr έχασε τη σύνδεσή του με το backend και θα χρειαστεί να επαναφορτωθεί για να αποκαταστήσει τη λειτουργικότητά του.", + "minutes": "Λεπτά", + "DeleteAppProfileMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το προφίλ ποιότητας '{0}'?" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index b2e94fff1..2620548d2 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -402,5 +402,13 @@ "ManageDownloadClients": "Gestionar Clientes de Descarga", "ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {0} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración", "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.", - "Episode": "Episodio" + "Episode": "Episodio", + "ConnectionLostReconnect": "Radarr intentará conectarse automáticamente, o haz clic en el botón de recarga abajo.", + "ConnectionLostToBackend": "Radarr ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", + "RecentChanges": "Cambios recientes", + "WhatsNew": "¿Qué hay de nuevo?", + "minutes": "Minutos", + "Album": "álbum", + "Artist": "artista", + "DeleteAppProfileMessageText": "Seguro que quieres eliminar el perfil de calidad {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 21a5bf5eb..ed73607bf 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -485,5 +485,11 @@ "UpdateAvailable": "Uusi päivitys on saatavilla", "Episode": "Jakso", "Label": "Tunniste", - "Theme": "Teema" + "Theme": "Teema", + "ConnectionLostReconnect": "Radarr pyrkii muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".", + "DeleteAppProfileMessageText": "Haluatko varmasti poistaa laatuprofiilin '{0}'?", + "RecentChanges": "Viimeaikaiset muutokset", + "WhatsNew": "Mikä on uutta?", + "ConnectionLostToBackend": "Radarr on menettänyt yhteyden taustajärjestelmään ja sivu on päivitettävä toiminnallisuuden palauttamiseksi.", + "minutes": "Minuuttia" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index e0ac16d26..72ed5dbda 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -525,5 +525,11 @@ "AreYouSureYouWantToDeleteIndexer": "Êtes-vous sûr de vouloir supprimer “{0}” de Prowlarr ?", "AuthQueries": "Requêtes d’authentification", "CountApplicationsSelected": "{0} application(s) sélectionnée(s)", - "CountDownloadClientsSelected": "{0} client(s) de téléchargement sélectionné(s)" + "CountDownloadClientsSelected": "{0} client(s) de téléchargement sélectionné(s)", + "ConnectionLostReconnect": "Radarr essaiera de se connecter automatiquement, ou vous pouvez cliquer sur \"Recharger\" en bas.", + "ConnectionLostToBackend": "Radarr a perdu sa connexion au backend et devra être rechargé pour fonctionner à nouveau.", + "RecentChanges": "Changements récents", + "WhatsNew": "Quoi de neuf ?", + "minutes": "Minutes", + "DeleteAppProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?" } diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 512a86a23..086b5e971 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -392,5 +392,13 @@ "Track": "זֵכֶר", "ApplyTagsHelpTextHowToApplyApplications": "כיצד להחיל תגים על הסרטים שנבחרו", "DeleteSelectedDownloadClientsMessageText": "האם אתה בטוח שברצונך למחוק את האינדקס '{0}'?", - "Year": "שָׁנָה" + "Year": "שָׁנָה", + "DeleteAppProfileMessageText": "האם אתה בטוח שברצונך למחוק את פרופיל האיכות {0}", + "RecentChanges": "שינויים אחרונים", + "WhatsNew": "מה חדש?", + "minutes": "דקות", + "Theme": "ערכת נושא", + "ConnectionLostReconnect": "Radarr ינסה להתחבר אוטומטית, או שתלחץ על טען מחדש למטה.", + "Album": "אלבום", + "Artist": "אמן" } diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index b2242942a..dd4a755fb 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -341,5 +341,10 @@ "ApplyTagsHelpTextReplace": "प्रतिस्थापित करें: दर्ज किए गए टैगों के साथ टैग बदलें (सभी टैग्स को खाली करने के लिए कोई टैग दर्ज न करें)", "DownloadClientPriorityHelpText": "एकाधिक डाउनलोड ग्राहकों को प्राथमिकता दें। राउंड-रॉबिन का उपयोग उसी प्राथमिकता वाले ग्राहकों के लिए किया जाता है।", "Year": "साल", - "Genre": "शैलियां" + "Genre": "शैलियां", + "ConnectionLostReconnect": "Radarr अपने आप कनेक्ट होने का प्रयास करेगा, या आप नीचे पुनः लोड कर सकते हैं।", + "RecentChanges": "हाल में हुए बदलाव", + "WhatsNew": "नया क्या है?", + "minutes": "मिनट", + "DeleteAppProfileMessageText": "क्या आप वाकई गुणवत्ता प्रोफ़ाइल {0} को हटाना चाहते हैं" } diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index 5d2c76af9..6b2be18ed 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -170,5 +170,6 @@ "Priority": "Prioritet", "Url": "Url", "Result": "Rezultat", - "SaveChanges": "Spremi izmjene" + "SaveChanges": "Spremi izmjene", + "DeleteAppProfileMessageText": "Jeste li sigurni da želite obrisati ovaj profil odgode?" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index d2879a692..b0a07efec 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -488,5 +488,11 @@ "Season": "Évad", "Album": "Album", "Artist": "Előadó", - "Author": "Szerző" + "Author": "Szerző", + "ConnectionLostReconnect": "A Radarr megpróbál automatikusan csatlakozni, vagy kattints a frissítés gombra.", + "DeleteAppProfileMessageText": "Biztosan törli a {0} minőségi profilt?", + "RecentChanges": "Friss változtatások", + "WhatsNew": "Mi az újdonság?", + "ConnectionLostToBackend": "A Radarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.", + "minutes": "percek" } diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index 423069dd8..461354461 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -57,5 +57,6 @@ "UILanguageHelpText": "Bahasa yang digunakan UI Sonarr", "Actions": "Tindakan", "AllIndexersHiddenDueToFilter": "Semua film disembunyikan karena penyaringan yang diterapkan.", - "AnalyticsEnabledHelpText": "Kirimkan informasi penggunaan secara anonim ke server Radarr. Informasi tersebut mengandung browser kamu, halaman WebUI Radarr yang kamu gunakan, pelaporan masalah serta OS dan versi runtime. Kami akan memanfaatkan informasi ini untuk memprioritaskan fitur dan perbaikan bug." + "AnalyticsEnabledHelpText": "Kirimkan informasi penggunaan secara anonim ke server Radarr. Informasi tersebut mengandung browser kamu, halaman WebUI Radarr yang kamu gunakan, pelaporan masalah serta OS dan versi runtime. Kami akan memanfaatkan informasi ini untuk memprioritaskan fitur dan perbaikan bug.", + "ConnectionLostReconnect": "Radarr akan mencoba untuk menghubungi secara otomatis, atau klik muat ulang di bawah." } diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 850b3e5b6..6e982dd4a 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -341,5 +341,10 @@ "ApplyTagsHelpTextRemove": "Fjarlægja: Fjarlægðu innsláttarmerkin", "DownloadClientPriorityHelpText": "Forgangsraðaðu mörgum niðurhal viðskiptavinum. Round-Robin er notað fyrir viðskiptavini með sömu forgang.", "Track": "Spor", - "Year": "Ár" + "Year": "Ár", + "DeleteAppProfileMessageText": "Ertu viss um að þú viljir eyða gæðasniðinu {0}", + "RecentChanges": "Nýlegar breytingar", + "WhatsNew": "Hvað er nýtt?", + "ConnectionLostReconnect": "Radarr mun reyna að tengjast sjálfkrafa eða þú getur smellt á endurhlaða hér að neðan.", + "minutes": "Fundargerð" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 00dab9d34..d88a10ae2 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -489,5 +489,11 @@ "UpdateAvailable": "É disponibile un nuovo aggiornamento", "Author": "Autore", "ApplyChanges": "Applica Cambiamenti", - "ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {0} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione" + "ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {0} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione", + "DeleteAppProfileMessageText": "Sicuro di voler cancellare il profilo di qualità {0}", + "RecentChanges": "Cambiamenti recenti", + "WhatsNew": "Cosa c'è di nuovo?", + "ConnectionLostReconnect": "Radarr cercherà di connettersi automaticamente, oppure clicca su ricarica qui sotto.", + "ConnectionLostToBackend": "Radarr ha perso la connessione al backend e dovrà essere ricaricato per ripristinare la funzionalità.", + "minutes": "Minuti" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index ed5c6c24b..8d74b1c2a 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -341,5 +341,10 @@ "ApplyTagsHelpTextHowToApplyIndexers": "選択した映画にタグを適用する方法", "ApplyTagsHelpTextRemove": "削除:入力したタグを削除します", "DownloadClientPriorityHelpText": "複数のダウンロードクライアントに優先順位を付けます。ラウンドロビンは、同じ優先度のクライアントに使用されます。", - "More": "もっと" + "More": "もっと", + "ConnectionLostReconnect": "Radarrは自動的に接続を試みます。または、下の[再読み込み]をクリックしてください。", + "DeleteAppProfileMessageText": "品質プロファイル{0}を削除してもよろしいですか", + "RecentChanges": "最近の変化", + "WhatsNew": "新着情報?", + "minutes": "議事録" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index cca4f2769..7931ca48e 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -342,5 +342,8 @@ "ApplyTagsHelpTextReplace": "바꾸기 : 태그를 입력 한 태그로 바꿉니다 (모든 태그를 지우려면 태그를 입력하지 않음)", "DeleteSelectedIndexersMessageText": "인덱서 '{0}'을 (를) 삭제 하시겠습니까?", "Track": "자취", - "Year": "년" + "Year": "년", + "ConnectionLostReconnect": "Radarr가 자동으로 연결을 시도하거나 아래에서 새로고침을 클릭할 수 있습니다.", + "ConnectionLostToBackend": "Radarr는 백엔드와의 연결이 끊어졌으며 기능을 복원하려면 다시 로딩해야 합니다.", + "DeleteAppProfileMessageText": "품질 프로필 {0}을 (를) 삭제 하시겠습니까?" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 95d81f4ae..7ed09c03f 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -128,5 +128,8 @@ "Artist": "artist", "ApplicationUrlHelpText": "Denne applikasjonens eksterne URL inkludert http(s)://, port og URL base", "ApplyChanges": "Bekreft endringer", - "ApiKeyValidationHealthCheckMessage": "Vennligst oppdater din API-nøkkel til å være minst {0} tegn lang. Du kan gjøre dette via innstillinger eller konfigurasjonsfilen" + "ApiKeyValidationHealthCheckMessage": "Vennligst oppdater din API-nøkkel til å være minst {0} tegn lang. Du kan gjøre dette via innstillinger eller konfigurasjonsfilen", + "ConnectionLostReconnect": "Radarr vil forsøke å koble til automatisk, eller du kan klikke oppdater nedenfor.", + "ConnectionLostToBackend": "Radarr har mistet tilkoblingen til baksystemet og må lastes inn på nytt for å gjenopprette funksjonalitet.", + "DeleteAppProfileMessageText": "Er du sikker på at du vil slette denne forsinkelsesprofilen?" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index fadb9988d..85bfa93da 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -442,5 +442,12 @@ "UpdateAvailable": "Nieuwe update is beschikbaar", "Label": "Label", "Publisher": "Uitgever", - "ApplyChanges": "Pas Wijzigingen Toe" + "ApplyChanges": "Pas Wijzigingen Toe", + "CountDownloadClientsSelected": "{count} download client(s) geselecteerd", + "ConnectionLostReconnect": "Radarr zal automatisch proberen te verbinden, of u kunt hieronder op herladen klikken.", + "RecentChanges": "Recente wijzigingen", + "WhatsNew": "Wat is er nieuw?", + "ConnectionLostToBackend": "Radarr heeft zijn verbinding met de backend verloren en zal moeten worden herladen om de functionaliteit te kunnen herstellen.", + "minutes": "Minuten", + "DeleteAppProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {0} wilt verwijderen" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 8cf444d00..0ddc8cf98 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -361,5 +361,11 @@ "UpdateAvailable": "Dostępna jest aktualizacja", "Genre": "Gatunki", "ApplyChanges": "Zastosuj zmiany", - "ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {0} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny" + "ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {0} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny", + "DeleteAppProfileMessageText": "Czy na pewno chcesz usunąć profil jakości '{0}'?", + "ConnectionLostReconnect": "Radarr spróbuje połączyć się automatycznie lub możesz kliknąć przycisk przeładuj poniżej.", + "RecentChanges": "Ostatnie zmiany", + "WhatsNew": "Co nowego?", + "ConnectionLostToBackend": "Radarr utracił połączenie z silnikiem programu, aby przywrócić funkcjonalność musi zostać zrestartowany.", + "minutes": "Minuty" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 403d6e617..049b05955 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -433,5 +433,11 @@ "Theme": "Tema", "Track": "Rastreio", "UpdateAvailable": "Nova atualização disponível", - "Label": "Rótulo" + "Label": "Rótulo", + "ConnectionLostReconnect": "O Radarr tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.", + "ConnectionLostToBackend": "O Radarr perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.", + "WhatsNew": "O que há de novo?", + "RecentChanges": "Mudanças recentes", + "minutes": "Minutos", + "DeleteAppProfileMessageText": "Tem a certeza que quer eliminar o perfil de qualidade \"{0}\"?" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index ca9334c76..ecb548e8f 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -47,7 +47,7 @@ "Auth": "Autenticação", "Authentication": "Autenticação", "AuthenticationMethodHelpText": "Requer nome de usuário e senha para acessar o Prowlarr", - "AuthenticationRequired": "Autenticação Requerida", + "AuthenticationRequired": "Autentificação Requerida", "AuthenticationRequiredHelpText": "Altere para quais solicitações a autenticação é necessária. Não mude a menos que você entenda os riscos.", "AuthenticationRequiredWarning": "Para impedir o acesso remoto sem autenticação, o Prowlarr agora exige que a autenticação seja habilitada. Configure seu método de autenticação e credenciais. Você pode, opcionalmente, desabilitar a autenticação de endereços locais. Consulte o FAQ para obter informações adicionais.", "Author": "Autor", @@ -57,10 +57,10 @@ "Backup": "Backup", "BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do Prowlarr", "BackupIntervalHelpText": "Intervalo entre backups automáticos", - "BackupNow": "Fazer Backup Agora", + "BackupNow": "Fazer backup agora", "BackupRetentionHelpText": "Backups automáticos anteriores ao período de retenção serão limpos automaticamente", "Backups": "Backups", - "BeforeUpdate": "Antes de atualizar", + "BeforeUpdate": "Antes da atualização", "BindAddress": "Fixar Endereço", "BindAddressHelpText": "Endereço IP válido, localhost ou '*' para todas as interfaces", "Book": "Livro", @@ -71,7 +71,7 @@ "BranchUpdateMechanism": "Ramificação usada pelo mecanismo externo de atualização", "BypassProxyForLocalAddresses": "Ignorar proxy para endereços locais", "Cancel": "Cancelar", - "CancelPendingTask": "Tem certeza de que deseja cancelar esta tarefa pendente?", + "CancelPendingTask": "Tem certeza de que deseja cancelar essa tarefa pendente?", "Categories": "Categorias", "Category": "Categoria", "CertificateValidation": "Validação de Certificado", @@ -134,7 +134,7 @@ "EditSyncProfile": "Editar Perfil de Sincronização", "ElapsedTime": "Tempo Decorrido", "Enable": "Habilitar", - "EnableAutomaticSearch": "Ativar pesquisa automática", + "EnableAutomaticSearch": "Ativar a pesquisa automática", "EnableAutomaticSearchHelpText": "Será usado ao realizar pesquisas automáticas pela interface ou pelo Prowlarr", "EnableIndexer": "Habilitar indexador", "EnableInteractiveSearch": "Ativar pesquisa interativa", @@ -155,7 +155,7 @@ "Exception": "Exceção", "ExistingTag": "Etiqueta existente", "Failed": "Falhou", - "FeatureRequests": "Solicitações de recursos", + "FeatureRequests": "Solicitação de recursos", "Filename": "Nome do arquivo", "Files": "Arquivos", "Filter": "Filtrar", @@ -167,7 +167,7 @@ "ForMoreInformationOnTheIndividualDownloadClients": "Para saber mais sobre cada cliente de download, clique nos botões de informações.", "FullSync": "Sincronização completa", "General": "Geral", - "GeneralSettings": "Configurações Gerais", + "GeneralSettings": "Configurações gerais", "GeneralSettingsSummary": "Porta, SSL, nome de usuário/senha, proxy, análises e atualizações", "Genre": "Gênero", "GrabReleases": "Capturar lançamento(s)", @@ -182,7 +182,7 @@ "HistoryCleanupDaysHelpText": "Defina como 0 para desabilitar a limpeza automática", "HistoryCleanupDaysHelpTextWarning": "Os arquivos na lixeira mais antigos do que o número de dias selecionado serão limpos automaticamente", "HistoryDetails": "Detalhes do histórico", - "HomePage": "Página Inicial", + "HomePage": "Página inicial", "Host": "Host", "Hostname": "Hostname", "Id": "ID", @@ -236,13 +236,13 @@ "LaunchBrowserHelpText": " Abrir o navegador Web e navegar até a página inicial do Prowlarr ao iniciar o aplicativo.", "Level": "Nível", "Link": "Link", - "LogFiles": "Arquivos de log", + "LogFiles": "Arquivos de registro", "LogLevel": "Nível de Registro", "LogLevelTraceHelpTextWarning": "O registro de rastreamento deve ser ativado apenas temporariamente", "Logging": "Registrando", "Logs": "Registros", "MIA": "Desaparecidos", - "MaintenanceRelease": "Versão de manutenção: correções de bugs e outras melhorias. Veja Github Commit History para mais detalhes", + "MaintenanceRelease": "Versão de manutenção: correções de bugs e outros aprimoramentos. Consulte o Histórico de Commit do Github para obter mais detalhes", "Manual": "Manual", "MappedCategories": "Categorias Mapeadas", "MappedDrivesRunningAsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Consulte as Perguntas frequentes para saber mais", @@ -267,12 +267,12 @@ "NoBackupsAreAvailable": "Não há backups disponíveis", "NoChange": "Sem alteração", "NoChanges": "Sem Alterações", - "NoLeaveIt": "Não, deixe-o", + "NoLeaveIt": "Não, deixe", "NoLinks": "Sem Links", - "NoLogFiles": "Nenhum arquivo de log", + "NoLogFiles": "Nenhum arquivo de registro", "NoSearchResultsFound": "Nenhum resultado encontrado, tente fazer uma nova busca abaixo.", "NoTagsHaveBeenAddedYet": "Nenhuma tag foi adicionada ainda", - "NoUpdatesAreAvailable": "Nenhuma atualização está disponível", + "NoUpdatesAreAvailable": "Não há atualizações disponíveis", "NotSupported": "Não Suportado", "Notification": "Notificação", "NotificationTriggers": "Gatilhos de Notificação", @@ -324,11 +324,11 @@ "QueryOptions": "Opções de Consulta", "QueryResults": "Resultados da Consulta", "Queue": "Fila", - "Queued": "Enfileirados", + "Queued": "Na fila", "RSS": "RSS", "RSSIsNotSupportedWithThisIndexer": "O RSS não é compatível com este indexador", "RawSearchSupported": "Pesquisa Bruta Suportada", - "ReadTheWikiForMoreInformation": "Leia o Wiki para mais informações", + "ReadTheWikiForMoreInformation": "Leia o Wiki para obter mais informações", "Reddit": "Reddit", "Redirect": "Redirecionar", "RedirectHelpText": "Redirecionar a solicitação de download de entrada para o indexador e passar diretamente para a obtenção, em vez de por proxy usando o Prowlarr", @@ -339,7 +339,7 @@ "Reload": "Recarregar", "Remove": "Remover", "RemoveFilter": "Remover filtro", - "RemovedFromTaskQueue": "Removido da fila de tarefas", + "RemovedFromTaskQueue": "Removido da Fila de Tarefas", "RemovingTag": "Removendo etiqueta", "RepeatSearch": "Repetir pesquisa", "Replace": "Substituir", @@ -362,7 +362,7 @@ "Save": "Salvar", "SaveChanges": "Salvar Mudanças", "SaveSettings": "Salvar Configurações", - "Scheduled": "Agendado", + "Scheduled": "Programado", "ScriptPath": "Caminho do Script", "Search": "Pesquisar", "SearchCapabilities": "Recursos de Pesquisa", @@ -399,12 +399,12 @@ "Shutdown": "Desligar", "Size": "Tamanho", "Sort": "Classificar", - "Source": "Fonte", + "Source": "Origem", "StartTypingOrSelectAPathBelow": "Comece a digitar ou selecione um caminho abaixo", "Started": "Iniciado", "StartupDirectory": "Diretório de inicialização", "Stats": "Estatísticas", - "Status": "Estado", + "Status": "Status", "StopSelecting": "Parar Seleção", "Style": "Estilo", "SuggestTranslationChange": "Sugerir mudança de tradução", @@ -421,19 +421,19 @@ "TableOptionsColumnsMessage": "Escolha quais colunas são visíveis e em que ordem aparecem", "TagCannotBeDeletedWhileInUse": "Não pode ser excluído durante o uso", "TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída", - "Tags": "Tags", + "Tags": "Etiquetas", "TagsHelpText": "Aplica-se a indexadores com pelo menos uma tag correspondente", "TagsSettingsSummary": "Veja todas as tags e como elas são usadas. Tags não utilizadas podem ser removidas", "Tasks": "Tarefas", "Test": "Testar", - "TestAll": "Testar Tudo", + "TestAll": "Testar tudo", "TestAllApps": "Testar todos os aplicativos", "TestAllClients": "Testar todos os clientes", "TestAllIndexers": "Testar todos os indexadores", "TheLatestVersionIsAlreadyInstalled": "A versão mais recente do {appName} já está instalada", "Theme": "Tema", "ThemeHelpText": "Alterar o tema da interface do usuário do aplicativo, o tema 'Auto' usará o tema do sistema operacional para definir o modo Claro ou Escuro. Inspirado por {inspiredBy}.", - "Time": "Horário", + "Time": "Tempo", "Title": "Título", "Today": "Hoje", "Tomorrow": "Amanhã", @@ -463,7 +463,7 @@ "UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação, tente novamente.", "UnableToLoadAppProfiles": "Não foi possível carregar os perfis de aplicativos", "UnableToLoadApplicationList": "Não é possível carregar a lista de aplicativos", - "UnableToLoadBackups": "Não foi possível carregar os backups", + "UnableToLoadBackups": "Não é possível carregar backups", "UnableToLoadDevelopmentSettings": "Não foi possível carregar as configurações de desenvolvimento", "UnableToLoadDownloadClients": "Não foi possível carregar os clientes de download", "UnableToLoadGeneralSettings": "Não foi possível carregar as configurações gerais", @@ -559,8 +559,23 @@ "DeleteAppProfileMessageText": "Tem certeza de que deseja excluir o perfil do aplicativo '{name}'?", "AppUpdated": "{appName} Atualizado", "AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}", - "ConnectionLostToBackend": "O Radarr perdeu a conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", - "RecentChanges": "Alterações recentes", - "WhatsNew": "O que há de novo?", - "ConnectionLostReconnect": "O Radarr tentará se conectar automaticamente, ou você pode clicar em Recarregar abaixo." + "ConnectionLostToBackend": "{appName} perdeu sua conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", + "RecentChanges": "Mudanças Recentes", + "WhatsNew": "O Que Há De Novo?", + "ConnectionLostReconnect": "{appName} tentará se conectar automaticamente ou você pode clicar em recarregar abaixo.", + "AddApplicationImplementation": "Adicionar Aplicativo - {implementationName}", + "AddConnectionImplementation": "Adicionar Conexão - {implementationName}", + "EditApplicationImplementation": "Editar Aplicativo - {implementationName}", + "AddCategory": "Adicionar Categoria", + "AddConnection": "Adicionar Conexão", + "AddDownloadClientImplementation": "Adicionar Cliente de Download - {implementationName}", + "AddIndexerImplementation": "Adicionar Indexador - {implementationName}", + "AddIndexerProxyImplementation": "Adicionar Proxy do Indexador - {implementationName}", + "EditCategory": "Editar Categoria", + "EditConnectionImplementation": "Editar Conexão - {implementationName}", + "EditDownloadClientImplementation": "Editar Cliente de Download - {implementationName}", + "EditIndexerImplementation": "Editar Indexador - {implementationName}", + "EditIndexerProxyImplementation": "Editar Proxy do Indexador - {implementationName}", + "NotificationStatusAllClientHealthCheckMessage": "Todas as notificações estão indisponíveis devido a falhas", + "NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 3ea39d30d..06cea543c 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -136,8 +136,8 @@ "AppDataDirectory": "Directorul AppData", "ApplicationStatusCheckAllClientMessage": "Toate aplicațiile sunt indisponibile datorită erorilor", "AreYouSureYouWantToResetYourAPIKey": "Sigur doriți să vă resetați cheia API?", - "Authentication": "", - "AuthenticationMethodHelpText": "Solicitați numele de utilizator și parola pentru a accesa Prowlarr", + "Authentication": "Autentificare", + "AuthenticationMethodHelpText": "Solicitați nume utilizator și parola pentru a accesa Prowlarr", "AutomaticSearch": "Căutare automată", "BackupFolderHelpText": "Căile relative vor fi în directorul AppData al lui Prowlarr", "BackupIntervalHelpText": "Interval între crearea copiile de rezervă automate", @@ -309,7 +309,7 @@ "ApplicationStatusCheckSingleClientMessage": "Aplicații indisponibile datorită erorilor: {0}", "ApplyTags": "Aplicați etichete", "Automatic": "Automat", - "DeleteApplicationMessageText": "Sigur doriți să ștergeți aplicația „{0}”?", + "DeleteApplicationMessageText": "Sigur doriți să ștergeți aplicația '{name}'?", "Exception": "Excepție", "MaintenanceRelease": "Versiune de întreținere: remedieri de erori și alte îmbunătățiri. Consultați Istoricul comiterilor Github pentru mai multe detalii", "Filters": "Filtre", @@ -432,5 +432,11 @@ "DeleteSelectedIndexers": "Ștergeți indexatorii selectați", "DeleteSelectedApplications": "Ștergeți aplicațiile selectate", "DevelopmentSettings": "Setări dezvoltare", - "DisabledUntil": "Dezactivat până la" + "DisabledUntil": "Dezactivat până la", + "DeleteApplication": "Şterge aplicaţia", + "ConnectionLostReconnect": "{appName} va încerca să se conecteze automat, sau poți apăsa reîncarcă mai jos.", + "ConnectionLostToBackend": "{appName} a pierdut conexiunea cu backend-ul și trebuie reîncărcat pentru a restabili funcționalitatea.", + "RecentChanges": "Schimbări recente", + "WhatsNew": "Ce mai e nou?", + "DeleteAppProfileMessageText": "Sigur doriți să ștergeți profilul de aplicație '{0}'?" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 855b6e514..a380e3b33 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -375,5 +375,11 @@ "Track": "След", "UpdateAvailable": "Доступно новое обновление", "More": "Более", - "Publisher": "Издатель" + "Publisher": "Издатель", + "ConnectionLostReconnect": "Radarr попытается соединиться автоматически или нажмите кнопку внизу.", + "ConnectionLostToBackend": "Radarr потерял связь с сервером и его необходимо перезагрузить, чтобы восстановить работоспособность.", + "RecentChanges": "Последние изменения", + "WhatsNew": "Что нового?", + "minutes": "Минуты", + "DeleteAppProfileMessageText": "Вы действительно хотите удалить профиль качества {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index d7c9c9324..378c0b7ed 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -113,5 +113,6 @@ "ApplyTagsHelpTextHowToApplyApplications": "Ako použiť značky na vybrané filmy", "ApplyTagsHelpTextHowToApplyIndexers": "Ako použiť značky na vybrané filmy", "Season": "Séria", - "Publisher": "Vydavateľ" + "Publisher": "Vydavateľ", + "DeleteAppProfileMessageText": "Naozaj chcete zmazať tento profil oneskorenia?" } diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 5cd3a1de2..e718d5467 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -426,5 +426,10 @@ "Artist": "Artist", "Author": "Författare", "Book": "Bok", - "Publisher": "Utgivare" + "Publisher": "Utgivare", + "ConnectionLostReconnect": "Radarr kommer försöka ansluta automatiskt, du kan även klicka på ladda om nedan.", + "DeleteAppProfileMessageText": "Är du säker på att du vill ta bort kvalitetsprofilen '{0}'?", + "RecentChanges": "Senaste ändringar", + "WhatsNew": "Vad är nytt?", + "minutes": "Minuter" } diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index d39dfbae7..ec7dd57ba 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -344,5 +344,10 @@ "DeleteSelectedDownloadClientsMessageText": "แน่ใจไหมว่าต้องการลบตัวสร้างดัชนี \"{0}\"", "Genre": "ประเภท", "Year": "ปี", - "More": "มากกว่า" + "More": "มากกว่า", + "ConnectionLostReconnect": "Radarr จะพยายามเชื่อมต่อโดยอัตโนมัติหรือคุณสามารถคลิกโหลดซ้ำด้านล่าง", + "DeleteAppProfileMessageText": "แน่ใจไหมว่าต้องการลบโปรไฟล์คุณภาพ {0}", + "minutes": "นาที", + "WhatsNew": "มีอะไรใหม่", + "RecentChanges": "การเปลี่ยนแปลงล่าสุด" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 458dd13b2..a4cac5961 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -344,5 +344,10 @@ "Genre": "Türler", "Track": "İzleme", "Year": "Yıl", - "More": "Daha" + "More": "Daha", + "DeleteAppProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}", + "RecentChanges": "Son değişiklikler", + "minutes": "Dakika", + "WhatsNew": "Ne var ne yok?", + "ConnectionLostReconnect": "Radarr otomatik olarak bağlanmayı deneyecek veya aşağıdan yeniden yükle'yi tıklayabilirsiniz." } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 467703985..30b3d2fb4 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -355,5 +355,11 @@ "Track": "Трасувати", "Year": "Рік", "UpdateAvailable": "Доступне нове оновлення", - "Genre": "Жанри" + "Genre": "Жанри", + "ConnectionLostReconnect": "Radarr спробує підключитися автоматично, або ви можете натиснути перезавантажити нижче.", + "ConnectionLostToBackend": "Radarr втратив зв’язок із бекендом, і його потрібно перезавантажити, щоб відновити функціональність.", + "DeleteAppProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?", + "RecentChanges": "Останні зміни", + "minutes": "Хвилин", + "WhatsNew": "Що нового?" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index b841326d1..ecd9fb25e 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -342,5 +342,10 @@ "More": "Hơn", "Track": "Dấu vết", "Year": "Năm", - "Genre": "Thể loại" + "Genre": "Thể loại", + "DeleteAppProfileMessageText": "Bạn có chắc chắn muốn xóa cấu hình chất lượng không {0}", + "RecentChanges": "Những thay đổi gần đây", + "minutes": "Phút", + "ConnectionLostReconnect": "Radarr sẽ cố gắng kết nối tự động hoặc bạn có thể nhấp vào tải lại bên dưới.", + "WhatsNew": "Có gì mới?" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 453199c4b..636f9ab3e 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -548,5 +548,17 @@ "SeedTimeHelpText": "种子停止下载前应做种的时长,应用的默认设置为空", "TorznabUrl": "Torznab链接", "days": "天", - "minutes": "分钟" + "minutes": "分钟", + "ConnectionLostReconnect": "Radarr将会尝试自动连接,您也可以点击下方的重新加载。", + "DeleteAppProfileMessageText": "您确定要删除备份“{name}”吗?", + "RecentChanges": "最近修改", + "ConnectionLostToBackend": "Radarr与后端的链接已断开,需要重新加载恢复功能。", + "WhatsNew": "什么是新的?", + "AddApplicationImplementation": "添加应用-{实体名称}", + "AddConnection": "添加连接", + "AddIndexerImplementation": "添加索引器-{实体名称}", + "AddCategory": "添加目录", + "AddConnectionImplementation": "添加连接-{实体名称}", + "AddDownloadClientImplementation": "添加下载客户端-{实体名称}", + "AddIndexerProxyImplementation": "添加搜刮器代理-{实体名称}" } From 66ca47b615c6a6a1ad79f526f79d8bf7a5188f4a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 18 Aug 2023 20:36:44 +0300 Subject: [PATCH 117/964] Fix flaky automation tests --- src/NzbDrone.Automation.Test/MainPagesTest.cs | 2 -- src/NzbDrone.Automation.Test/PageModel/PageBase.cs | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Automation.Test/MainPagesTest.cs b/src/NzbDrone.Automation.Test/MainPagesTest.cs index e1d411f22..4b42be06c 100644 --- a/src/NzbDrone.Automation.Test/MainPagesTest.cs +++ b/src/NzbDrone.Automation.Test/MainPagesTest.cs @@ -18,7 +18,6 @@ namespace NzbDrone.Automation.Test } [Test] - [Retry(3)] public void indexer_page() { _page.MovieNavIcon.Click(); @@ -31,7 +30,6 @@ namespace NzbDrone.Automation.Test } [Test] - [Retry(3)] public void system_page() { _page.SystemNavIcon.Click(); diff --git a/src/NzbDrone.Automation.Test/PageModel/PageBase.cs b/src/NzbDrone.Automation.Test/PageModel/PageBase.cs index a32084602..02078c47e 100644 --- a/src/NzbDrone.Automation.Test/PageModel/PageBase.cs +++ b/src/NzbDrone.Automation.Test/PageModel/PageBase.cs @@ -39,6 +39,10 @@ namespace NzbDrone.Automation.Test.PageModel var element = d.FindElement(By.ClassName("followingBalls")); return !element.Displayed; } + catch (StaleElementReferenceException) + { + return true; + } catch (NoSuchElementException) { return true; From e4569794674e4e5f22944500ed3ced37fd212ffc Mon Sep 17 00:00:00 2001 From: Robin Dadswell <19610103+RobinDadswell@users.noreply.github.com> Date: Thu, 10 Aug 2023 23:06:40 +0100 Subject: [PATCH 118/964] bump Npgsql to 7.0.4 --- src/NzbDrone.Common/Prowlarr.Common.csproj | 2 +- src/NzbDrone.Core/Prowlarr.Core.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index fca22af8c..1f1479210 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 86b491834..44ab93e76 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -9,7 +9,7 @@ - + From f0892eb4b8029c9c1b8d179997e0265dacd06a2b Mon Sep 17 00:00:00 2001 From: Robin Dadswell <19610103+RobinDadswell@users.noreply.github.com> Date: Wed, 9 Aug 2023 21:04:37 +0100 Subject: [PATCH 119/964] Adds Pipeline testing for Postgres15 Databases --- azure-pipelines.yml | 128 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 122 insertions(+), 6 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 64ed551d2..f1a3bda1d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -528,8 +528,8 @@ stages: testRunTitle: '$(testName) Unit Tests' failTaskOnFailedTests: true - - job: Unit_LinuxCore_Postgres - displayName: Unit Native LinuxCore with Postgres Database + - job: Unit_LinuxCore_Postgres14 + displayName: Unit Native LinuxCore with Postgres14 Database dependsOn: Prepare condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0')) variables: @@ -578,7 +578,60 @@ stages: inputs: testResultsFormat: 'NUnit' testResultsFiles: '**/TestResult.xml' - testRunTitle: 'LinuxCore Postgres Unit Tests' + testRunTitle: 'LinuxCore Postgres14 Unit Tests' + failTaskOnFailedTests: true + + - job: Unit_LinuxCore_Postgres15 + displayName: Unit Native LinuxCore with Postgres15 Database + dependsOn: Prepare + condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0')) + variables: + pattern: 'Prowlarr.*.linux-core-x64.tar.gz' + artifactName: linux-x64-tests + Prowlarr__Postgres__Host: 'localhost' + Prowlarr__Postgres__Port: '5432' + Prowlarr__Postgres__User: 'prowlarr' + Prowlarr__Postgres__Password: 'prowlarr' + + pool: + vmImage: ${{ variables.linuxImage }} + + timeoutInMinutes: 10 + + steps: + - task: UseDotNet@2 + displayName: 'Install .net core' + inputs: + version: $(dotnetVersion) + - checkout: none + - task: DownloadPipelineArtifact@2 + displayName: Download Test Artifact + inputs: + buildType: 'current' + artifactName: $(artifactName) + targetPath: $(testsFolder) + - bash: find ${TESTSFOLDER} -name "Prowlarr.Test.Dummy" -exec chmod a+x {} \; + displayName: Make Test Dummy Executable + condition: and(succeeded(), ne(variables['osName'], 'Windows')) + - bash: | + docker run -d --name=postgres15 \ + -e POSTGRES_PASSWORD=prowlarr \ + -e POSTGRES_USER=prowlarr \ + -p 5432:5432/tcp \ + -v /usr/share/zoneinfo/America/Chicago:/etc/localtime:ro \ + postgres:15 + displayName: Start postgres + - bash: | + chmod a+x ${TESTSFOLDER}/test.sh + ls -lR ${TESTSFOLDER} + ${TESTSFOLDER}/test.sh Linux Unit Test + displayName: Run Tests + - task: PublishTestResults@2 + displayName: Publish Test Results + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: '**/TestResult.xml' + testRunTitle: 'LinuxCore Postgres15 Unit Tests' failTaskOnFailedTests: true - stage: Integration @@ -664,8 +717,8 @@ stages: failTaskOnFailedTests: true displayName: Publish Test Results - - job: Integration_LinuxCore_Postgres - displayName: Integration Native LinuxCore with Postgres Database + - job: Integration_LinuxCore_Postgres14 + displayName: Integration Native LinuxCore with Postgres14 Database dependsOn: Prepare condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0')) variables: @@ -722,7 +775,70 @@ stages: inputs: testResultsFormat: 'NUnit' testResultsFiles: '**/TestResult.xml' - testRunTitle: 'Integration LinuxCore Postgres Database Integration Tests' + testRunTitle: 'Integration LinuxCore Postgres14 Database Integration Tests' + failTaskOnFailedTests: true + displayName: Publish Test Results + + + - job: Integration_LinuxCore_Postgres15 + displayName: Integration Native LinuxCore with Postgres Database + dependsOn: Prepare + condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0')) + variables: + pattern: 'Prowlarr.*.linux-core-x64.tar.gz' + Prowlarr__Postgres__Host: 'localhost' + Prowlarr__Postgres__Port: '5432' + Prowlarr__Postgres__User: 'prowlarr' + Prowlarr__Postgres__Password: 'prowlarr' + + pool: + vmImage: ${{ variables.linuxImage }} + + steps: + - task: UseDotNet@2 + displayName: 'Install .net core' + inputs: + version: $(dotnetVersion) + - checkout: none + - task: DownloadPipelineArtifact@2 + displayName: Download Test Artifact + inputs: + buildType: 'current' + artifactName: 'linux-x64-tests' + targetPath: $(testsFolder) + - task: DownloadPipelineArtifact@2 + displayName: Download Build Artifact + inputs: + buildType: 'current' + artifactName: Packages + itemPattern: '**/$(pattern)' + targetPath: $(Build.ArtifactStagingDirectory) + - task: ExtractFiles@1 + inputs: + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' + destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' + displayName: Extract Package + - bash: | + mkdir -p ./bin/ + cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Prowlarr/. ./bin/ + displayName: Move Package Contents + - bash: | + docker run -d --name=postgres15 \ + -e POSTGRES_PASSWORD=prowlarr \ + -e POSTGRES_USER=prowlarr \ + -p 5432:5432/tcp \ + -v /usr/share/zoneinfo/America/Chicago:/etc/localtime:ro \ + postgres:15 + displayName: Start postgres + - bash: | + chmod a+x ${TESTSFOLDER}/test.sh + ${TESTSFOLDER}/test.sh Linux Integration Test + displayName: Run Integration Tests + - task: PublishTestResults@2 + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: '**/TestResult.xml' + testRunTitle: 'Integration LinuxCore Postgres15 Database Integration Tests' failTaskOnFailedTests: true displayName: Publish Test Results From b0162ccc5b9df0c7fd259b6810d1e4a8ca7813ef Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 18 Aug 2023 23:49:30 -0700 Subject: [PATCH 120/964] New: Success check mark on blue buttons is now white instead of green (cherry picked from commit 566fae9d5857a10bd69c718368e7847e5a733faa) --- frontend/src/Components/Link/SpinnerErrorButton.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/Components/Link/SpinnerErrorButton.js b/frontend/src/Components/Link/SpinnerErrorButton.js index 81d34f7c2..b0f39bc26 100644 --- a/frontend/src/Components/Link/SpinnerErrorButton.js +++ b/frontend/src/Components/Link/SpinnerErrorButton.js @@ -97,6 +97,7 @@ class SpinnerErrorButton extends Component { render() { const { + kind, isSpinning, error, children, @@ -112,7 +113,7 @@ class SpinnerErrorButton extends Component { const showIcon = wasSuccessful || hasWarning || hasError; let iconName = icons.CHECK; - let iconKind = kinds.SUCCESS; + let iconKind = kind === kinds.PRIMARY ? kinds.DEFAULT : kinds.SUCCESS; if (hasWarning) { iconName = icons.WARNING; @@ -126,6 +127,7 @@ class SpinnerErrorButton extends Component { return ( @@ -154,6 +156,7 @@ class SpinnerErrorButton extends Component { } SpinnerErrorButton.propTypes = { + kind: PropTypes.oneOf(kinds.all), isSpinning: PropTypes.bool.isRequired, error: PropTypes.object, children: PropTypes.node.isRequired From b36d793d858bd4299380b5698a1b39fc491c718e Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 19 Aug 2023 00:14:54 -0700 Subject: [PATCH 121/964] Allow decimals in number inputs (cherry picked from commit 7f5ddff568ce9f87bd45420cbd36690b190bd633) --- frontend/src/Components/Form/NumberInput.js | 2 +- frontend/src/Helpers/Props/inputTypes.js | 2 ++ src/Prowlarr.Http/ClientSchema/Field.cs | 1 + src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs | 5 +++++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/Components/Form/NumberInput.js b/frontend/src/Components/Form/NumberInput.js index 454aad997..cac274d95 100644 --- a/frontend/src/Components/Form/NumberInput.js +++ b/frontend/src/Components/Form/NumberInput.js @@ -41,7 +41,7 @@ class NumberInput extends Component { componentDidUpdate(prevProps, prevState) { const { value } = this.props; - if (value !== prevProps.value && !this.state.isFocused) { + if (!isNaN(value) && value !== prevProps.value && !this.state.isFocused) { this.setState({ value: value == null ? '' : value.toString() }); diff --git a/frontend/src/Helpers/Props/inputTypes.js b/frontend/src/Helpers/Props/inputTypes.js index d26d08616..6c4564341 100644 --- a/frontend/src/Helpers/Props/inputTypes.js +++ b/frontend/src/Helpers/Props/inputTypes.js @@ -10,6 +10,7 @@ export const INFO = 'info'; export const MOVIE_MONITORED_SELECT = 'movieMonitoredSelect'; export const CATEGORY_SELECT = 'newznabCategorySelect'; export const DOWNLOAD_CLIENT_SELECT = 'downloadClientSelect'; +export const FLOAT = 'float'; export const NUMBER = 'number'; export const OAUTH = 'oauth'; export const PASSWORD = 'password'; @@ -35,6 +36,7 @@ export const all = [ INFO, MOVIE_MONITORED_SELECT, CATEGORY_SELECT, + FLOAT, NUMBER, OAUTH, PASSWORD, diff --git a/src/Prowlarr.Http/ClientSchema/Field.cs b/src/Prowlarr.Http/ClientSchema/Field.cs index 0ef510ca6..7ceed1ae9 100644 --- a/src/Prowlarr.Http/ClientSchema/Field.cs +++ b/src/Prowlarr.Http/ClientSchema/Field.cs @@ -21,6 +21,7 @@ namespace Prowlarr.Http.ClientSchema public string Section { get; set; } public string Hidden { get; set; } public string Placeholder { get; set; } + public bool IsFloat { get; set; } public Field Clone() { diff --git a/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs b/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs index a6866af52..171c9db04 100644 --- a/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs +++ b/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs @@ -125,6 +125,11 @@ namespace Prowlarr.Http.ClientSchema field.Hidden = fieldAttribute.Hidden.ToString().FirstCharToLower(); } + if (fieldAttribute.Type is FieldType.Number && propertyInfo.PropertyType == typeof(double)) + { + field.IsFloat = true; + } + var valueConverter = GetValueConverter(propertyInfo.PropertyType); result.Add(new FieldMapping From bcbeac1e83c899fbea5dbc204629a3915c9313e0 Mon Sep 17 00:00:00 2001 From: Servarr Date: Sat, 19 Aug 2023 10:54:53 +0000 Subject: [PATCH 122/964] Automated API Docs update [skip ci] --- src/Prowlarr.Api.V1/openapi.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index b0d85055e..ff5c1732d 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -4428,6 +4428,9 @@ "placeholder": { "type": "string", "nullable": true + }, + "isFloat": { + "type": "boolean" } }, "additionalProperties": false From 5c8ae82f1125c213580913c87edcf347e4ff2462 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 19 Aug 2023 16:22:36 +0300 Subject: [PATCH 123/964] Prevent useless builds --- azure-pipelines.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f1a3bda1d..ed099dd8d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -16,8 +16,8 @@ variables: sentryOrg: 'servarr' sentryUrl: 'https://sentry.servarr.com' dotnetVersion: '6.0.408' + nodeVersion: '16.X' innoVersion: '6.2.0' - nodeVersion: '16.x' windowsImage: 'windows-2022' linuxImage: 'ubuntu-20.04' macImage: 'macOS-11' @@ -27,6 +27,10 @@ trigger: include: - develop - master + paths: + exclude: + - .github + - src/Prowlarr.Api.*/openapi.json pr: branches: @@ -34,8 +38,9 @@ pr: - develop paths: exclude: + - .github - src/NzbDrone.Core/Localization/Core - - src/Prowlarr.API.*/openapi.json + - src/Prowlarr.Api.*/openapi.json stages: - stage: Setup @@ -349,7 +354,7 @@ stages: includeRootFolder: false rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0 - task: ArchiveFiles@2 - displayName: Create FreeBSD Core Core tar + displayName: Create freebsd-x64 tar inputs: archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).freebsd-core-x64.tar.gz' archiveType: 'tar' @@ -1121,7 +1126,7 @@ stages: git add . if git status | grep -q modified then - git commit -am 'Automated API Docs update [skip ci]' + git commit -am 'Automated API Docs update' git push -f --set-upstream origin api-docs curl -X POST -H "Authorization: token ${GITHUBTOKEN}" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/prowlarr/prowlarr/pulls -d '{"head":"api-docs","base":"develop","title":"Update API docs"}' else From ba2aab6bb3d422f90b7c3800f955ed4c79f111d1 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 19 Aug 2023 10:49:58 +0000 Subject: [PATCH 124/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: Robert A. Viana Co-authored-by: Weblate Co-authored-by: w2861 Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/pt_BR.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index ecb548e8f..951e776de 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -110,7 +110,7 @@ "DeleteIndexerProxy": "Apagar Proxy do Indexador", "DeleteIndexerProxyMessageText": "Tem certeza de que deseja excluir o proxy do indexador '{name}'?", "DeleteNotification": "Excluir Notificação", - "DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?", + "DeleteNotificationMessageText": "Tem certeza de que deseja excluir o perfil de metadados '{name}'?", "DeleteTag": "Excluir tag", "DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?", "Description": "Descrição", @@ -448,7 +448,7 @@ "Track": "Faixa", "TvSearch": "Pesquisar Séries", "Type": "Tipo", - "UI": "Interface", + "UI": "IU", "UILanguage": "Idioma da interface", "UILanguageHelpText": "Idioma que o Prowlarr usará para a interface", "UILanguageHelpTextWarning": "É necessário recarregar o navegador", @@ -561,7 +561,7 @@ "AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}", "ConnectionLostToBackend": "{appName} perdeu sua conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", "RecentChanges": "Mudanças Recentes", - "WhatsNew": "O Que Há De Novo?", + "WhatsNew": "O quê há de novo?", "ConnectionLostReconnect": "{appName} tentará se conectar automaticamente ou você pode clicar em recarregar abaixo.", "AddApplicationImplementation": "Adicionar Aplicativo - {implementationName}", "AddConnectionImplementation": "Adicionar Conexão - {implementationName}", From 9fee4f914f07b96d6b44c02332012cda7f325672 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 20 Aug 2023 12:23:24 +0300 Subject: [PATCH 125/964] Bump version to 1.8.4 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ed099dd8d..5714b00f5 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -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)' From 5ad6237785a537802f3a604a3b3ed64069553cea Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 21 Aug 2023 18:08:43 +0300 Subject: [PATCH 126/964] Improve music and console search results for AnimeBytes Also prevent duplicate categories showing in the indexer info modal --- .../Indexer/Info/IndexerInfoModalContent.tsx | 11 ++++---- .../Indexers/Definitions/AnimeBytes.cs | 27 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx b/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx index fb796a398..8cb10993a 100644 --- a/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx +++ b/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx @@ -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) {
    - {capabilities.categories !== null && - capabilities.categories.length > 0 ? ( + {capabilities?.categories?.length > 0 ? (
    - {capabilities.categories + {uniqBy(capabilities.categories, 'id') .sort((a, b) => a.id - b.id) .map((category) => { return ( @@ -275,9 +275,8 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { {category.id}{category.name} - {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 ( diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index 54f3f4f83..34841a925 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -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 { NewznabStandardCategory.ConsolePSP }; + categories = new List { NewznabStandardCategory.Console, NewznabStandardCategory.ConsolePSP }; } if (properties.Contains("PS3")) { - categories = new List { NewznabStandardCategory.ConsolePS3 }; + categories = new List { NewznabStandardCategory.Console, NewznabStandardCategory.ConsolePS3 }; } if (properties.Contains("PS Vita")) { - categories = new List { NewznabStandardCategory.ConsolePSVita }; + categories = new List { NewznabStandardCategory.Console, NewznabStandardCategory.ConsolePSVita }; } if (properties.Contains("3DS")) { - categories = new List { NewznabStandardCategory.Console3DS }; + categories = new List { NewznabStandardCategory.Console, NewznabStandardCategory.Console3DS }; } if (properties.Contains("NDS")) { - categories = new List { NewznabStandardCategory.ConsoleNDS }; + categories = new List { 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 { NewznabStandardCategory.ConsoleOther }; + categories = new List { 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 { NewznabStandardCategory.AudioLossless }; + categories = new List { NewznabStandardCategory.Audio, NewznabStandardCategory.AudioLossless }; } else if (properties.Any(p => p.Contains("MP3"))) { - categories = new List { NewznabStandardCategory.AudioMP3 }; + categories = new List { NewznabStandardCategory.Audio, NewznabStandardCategory.AudioMP3 }; } else { - categories = new List { NewznabStandardCategory.AudioOther }; + categories = new List { NewznabStandardCategory.Audio, NewznabStandardCategory.AudioOther }; } } From 39a54eb8f63b90f1d8d324c5d84f46cd4e8403cb Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 21 Aug 2023 21:04:30 +0300 Subject: [PATCH 127/964] Prevent health checks warnings for disabled notifications --- src/NzbDrone.Core/Notifications/NotificationFactory.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Core/Notifications/NotificationFactory.cs b/src/NzbDrone.Core/Notifications/NotificationFactory.cs index 7694b1837..ffdbd482c 100644 --- a/src/NzbDrone.Core/Notifications/NotificationFactory.cs +++ b/src/NzbDrone.Core/Notifications/NotificationFactory.cs @@ -27,6 +27,11 @@ namespace NzbDrone.Core.Notifications _logger = logger; } + protected override List Active() + { + return base.Active().Where(c => c.Enable).ToList(); + } + public List OnGrabEnabled(bool filterBlockedNotifications = true) { if (filterBlockedNotifications) From 0eaa538e8a2dc0bbf12b4268a19b902ce71cbd13 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 21 Aug 2023 21:32:26 +0300 Subject: [PATCH 128/964] Allow deselecting values when using search through url query params --- frontend/src/Search/SearchFooter.js | 21 +++++++++++--------- frontend/src/Search/SearchFooterConnector.js | 19 +++++++----------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/frontend/src/Search/SearchFooter.js b/frontend/src/Search/SearchFooter.js index f1de88e3a..5e949fc6e 100644 --- a/frontend/src/Search/SearchFooter.js +++ b/frontend/src/Search/SearchFooter.js @@ -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, diff --git a/frontend/src/Search/SearchFooterConnector.js b/frontend/src/Search/SearchFooterConnector.js index 9399fe6ca..1f740e49a 100644 --- a/frontend/src/Search/SearchFooterConnector.js +++ b/frontend/src/Search/SearchFooterConnector.js @@ -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 ( ); From 1b0c9adf243f2a2934c0ab00313db7b01951ff9c Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Mon, 21 Aug 2023 22:20:02 +0100 Subject: [PATCH 129/964] Remove Reddit from issues config --- .github/ISSUE_TEMPLATE/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index ad1dd9115..eb800532e 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -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. From 74a9fa784ae3656d56a66de4c10deb3e09c2c515 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 26 Aug 2023 20:21:41 +0300 Subject: [PATCH 130/964] Fixed: (Nebulance) Detect TV UHD releases --- .../Indexers/Definitions/Nebulance.cs | 1 + .../Parser/TvCategoryFromQualityParser.cs | 25 +++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index c2459dcfb..3d80d2e81 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -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; } diff --git a/src/NzbDrone.Core/Parser/TvCategoryFromQualityParser.cs b/src/NzbDrone.Core/Parser/TvCategoryFromQualityParser.cs index 33a5275ce..156e8738b 100644 --- a/src/NzbDrone.Core/Parser/TvCategoryFromQualityParser.cs +++ b/src/NzbDrone.Core/Parser/TvCategoryFromQualityParser.cs @@ -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|Blu-Ray|HDDVD|BD)| (?WEB[-_. ]DL|WEBDL|WebRip|iTunesHD|WebHD)| (?HDTV)| @@ -19,16 +19,16 @@ namespace NzbDrone.Core.Parser )\b", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); - private static readonly Regex RawHdRegex = new Regex(@"\b(?TrollHD|RawHD|1080i[-_. ]HDTV|Raw[-_. ]HD|MPEG[-_. ]?2)\b", + private static readonly Regex RawHdRegex = new (@"\b(?TrollHD|RawHD|1080i[-_. ]HDTV|Raw[-_. ]HD|MPEG[-_. ]?2)\b", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static readonly Regex ResolutionRegex = new Regex(@"\b(?:(?480p|640x480|848x480)|(?576p)|(?720p|1280x720)|(?1080p|1920x1080))\b", + private static readonly Regex ResolutionRegex = new (@"\b(?:(?480p|640x480|848x480)|(?576p)|(?720p|1280x720)|(?1080p|1920x1080)|(?2160p))\b", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static readonly Regex CodecRegex = new Regex(@"\b(?:(?x264)|(?h264)|(?XvidHD)|(?Xvid)|(?divx))\b", + private static readonly Regex CodecRegex = new (@"\b(?:(?x264)|(?h264)|(?XvidHD)|(?Xvid)|(?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; From e4c0edf24c6aa1ab200e68ddf552f5f893c1ef22 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 26 Aug 2023 21:14:23 +0300 Subject: [PATCH 131/964] Remove Reddit from issue templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/label-actions.yml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 30d988d53..f70e2c23e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,5 @@ name: Bug Report -description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Reddit or Discord first' +description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Discord first' labels: ['Type: Bug', 'Status: Needs Triage'] body: - type: checkboxes diff --git a/.github/label-actions.yml b/.github/label-actions.yml index 24fc04567..ce6d46c73 100644 --- a/.github/label-actions.yml +++ b/.github/label-actions.yml @@ -4,8 +4,7 @@ comment: > :wave: @{issue-author}, we use the issue tracker exclusively for bug reports and feature requests. However, this issue appears - to be a support request. Please hop over onto our [Discord](https://prowlarr.com/discord) - or [Subreddit](https://reddit.com/r/prowlarr) + to be a support request. Please hop over onto our [Discord](https://prowlarr.com/discord). close: true close-reason: 'not planned' From 6300eb1442962dc251ece88e61e85e5dbbd2c0e9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 27 Aug 2023 08:00:53 +0300 Subject: [PATCH 132/964] Bump version to 1.8.5 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5714b00f5..fbf4e8f44 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.8.4' + majorVersion: '1.8.5' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 4c42907eb22a2d1c3ad993011ca3d0fe10d7b55f Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 26 Aug 2023 17:22:18 +0000 Subject: [PATCH 133/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: AlexR-sf Co-authored-by: Anonymous Co-authored-by: ChewyGlitter Co-authored-by: DavidJares Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: He Zhu Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ar.json | 4 +- src/NzbDrone.Core/Localization/Core/bg.json | 4 +- src/NzbDrone.Core/Localization/Core/ca.json | 5 +- src/NzbDrone.Core/Localization/Core/cs.json | 86 +++++++++++++------ src/NzbDrone.Core/Localization/Core/da.json | 4 +- src/NzbDrone.Core/Localization/Core/de.json | 5 +- src/NzbDrone.Core/Localization/Core/el.json | 5 +- src/NzbDrone.Core/Localization/Core/es.json | 5 +- src/NzbDrone.Core/Localization/Core/fi.json | 5 +- src/NzbDrone.Core/Localization/Core/fr.json | 9 +- src/NzbDrone.Core/Localization/Core/he.json | 4 +- src/NzbDrone.Core/Localization/Core/hi.json | 4 +- src/NzbDrone.Core/Localization/Core/hu.json | 5 +- src/NzbDrone.Core/Localization/Core/is.json | 4 +- src/NzbDrone.Core/Localization/Core/it.json | 5 +- src/NzbDrone.Core/Localization/Core/ja.json | 4 +- src/NzbDrone.Core/Localization/Core/ko.json | 4 +- .../Localization/Core/nb_NO.json | 3 +- src/NzbDrone.Core/Localization/Core/nl.json | 5 +- src/NzbDrone.Core/Localization/Core/pl.json | 5 +- src/NzbDrone.Core/Localization/Core/pt.json | 3 +- .../Localization/Core/pt_BR.json | 14 +-- src/NzbDrone.Core/Localization/Core/ro.json | 3 +- src/NzbDrone.Core/Localization/Core/ru.json | 53 +++++++++--- src/NzbDrone.Core/Localization/Core/sv.json | 4 +- src/NzbDrone.Core/Localization/Core/th.json | 4 +- src/NzbDrone.Core/Localization/Core/tr.json | 4 +- src/NzbDrone.Core/Localization/Core/uk.json | 4 +- src/NzbDrone.Core/Localization/Core/vi.json | 4 +- .../Localization/Core/zh_CN.json | 35 +++++--- 30 files changed, 218 insertions(+), 85 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 3c7ba60c0..ddde47617 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -346,5 +346,7 @@ "DeleteAppProfileMessageText": "هل أنت متأكد من أنك تريد حذف ملف تعريف الجودة {0}", "RecentChanges": "التغييرات الأخيرة", "WhatsNew": "ما هو الجديد؟", - "minutes": "الدقائق" + "minutes": "الدقائق", + "NotificationStatusAllClientHealthCheckMessage": "جميع القوائم غير متاحة بسبب الإخفاقات", + "NotificationStatusSingleClientHealthCheckMessage": "القوائم غير متاحة بسبب الإخفاقات: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 6d0256e2f..b37a7db12 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -346,5 +346,7 @@ "DeleteAppProfileMessageText": "Наистина ли искате да изтриете качествения профил {0}", "RecentChanges": "Последни промени", "WhatsNew": "Какво ново?", - "minutes": "Минути" + "minutes": "Минути", + "NotificationStatusSingleClientHealthCheckMessage": "Списъци, недостъпни поради неуспехи: {0}", + "NotificationStatusAllClientHealthCheckMessage": "Всички списъци са недостъпни поради неуспехи" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 4ee0efd97..becf09bec 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -369,5 +369,8 @@ "RecentChanges": "Canvis recents", "WhatsNew": "Que hi ha de nou?", "minutes": "Minuts", - "DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}" + "DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}", + "AddConnection": "Edita la col·lecció", + "NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 73311a6bb..057d2c266 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -3,8 +3,8 @@ "CertificateValidation": "Ověření certifikátu", "DeleteBackupMessageText": "Opravdu chcete smazat zálohu „{0}“?", "YesCancel": "Ano, zrušit", - "About": "O", - "Component": "Součástka", + "About": "O aplikaci", + "Component": "Komponenta", "Info": "Info", "LogFiles": "Záznam souborů", "Logs": "Protokoly", @@ -72,10 +72,10 @@ "AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery Prowlarru. To zahrnuje informace o vašem prohlížeči, které stránky Prowlarr WebUI používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k upřednostnění funkcí a oprav chyb.", "ApiKey": "Klíč API", "AppDataDirectory": "Adresář AppData", - "AppDataLocationHealthCheckMessage": "Aktualizace nebude možné zabránit smazání AppData při aktualizaci", + "AppDataLocationHealthCheckMessage": "Aktualizace nebude možná, aby se zabránilo odstranění AppData při aktualizaci", "ApplicationStatusCheckAllClientMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání", "ApplicationStatusCheckSingleClientMessage": "Seznamy nejsou k dispozici z důvodu selhání: {0}", - "Apply": "Aplikovat", + "Apply": "Použít", "Branch": "Větev", "BranchUpdate": "Pobočka, která se má použít k aktualizaci Prowlarr", "EditIndexer": "Upravit indexátor", @@ -84,7 +84,7 @@ "CloseCurrentModal": "Zavřít aktuální modální", "Columns": "Sloupce", "ConnectionLost": "Spojení ztraceno", - "ConnectSettings": "Připojit nastavení", + "ConnectSettings": "Nastavení připojení", "Custom": "Zvyk", "Error": "Chyba", "Failed": "Selhalo", @@ -113,7 +113,7 @@ "IgnoredAddresses": "Ignorované adresy", "AcceptConfirmationModal": "Přijměte potvrzovací modální okno", "Actions": "Akce", - "Added": "Přidané", + "Added": "Přidáno", "AddIndexer": "Přidat indexátor", "LaunchBrowserHelpText": " Otevřete webový prohlížeč a při spuštění aplikace přejděte na domovskou stránku Prowlarr.", "Logging": "Protokolování", @@ -171,16 +171,16 @@ "UseProxy": "Použij proxy", "Username": "Uživatelské jméno", "Yesterday": "Včera", - "AutomaticSearch": "Automatické vyhledávání", + "AutomaticSearch": "Vyhledat automaticky", "BackupFolderHelpText": "Relativní cesty budou v adresáři AppData společnosti Prowlarr", "BackupIntervalHelpText": "Interval mezi automatickými zálohami", - "BackupNow": "Zálohovat hned", - "BackupRetentionHelpText": "Automatické zálohy starší než doba uchování budou automaticky vyčištěny", - "BeforeUpdate": "Před aktualizací", - "BindAddress": "Vazba adresy", - "BindAddressHelpText": "Platná adresa IP4 nebo '*' pro všechna rozhraní", - "BranchUpdateMechanism": "Pobočka používaná mechanismem externí aktualizace", - "BypassProxyForLocalAddresses": "Obejít proxy pro místní adresy", + "BackupNow": "Ihned zálohovat", + "BackupRetentionHelpText": "Automatické zálohy starší než doba uchovávání budou automaticky vyčištěny", + "BeforeUpdate": "Před zálohováním", + "BindAddress": "Vázat adresu", + "BindAddressHelpText": "Platná IP adresa, localhost nebo '*' pro všechna rozhraní", + "BranchUpdateMechanism": "Větev používaná externím aktualizačním mechanismem", + "BypassProxyForLocalAddresses": "Obcházení proxy serveru pro místní adresy", "DeleteIndexerProxyMessageText": "Opravdu chcete smazat značku „{0}“?", "DeleteTag": "Smazat značku", "IndexerProxyStatusCheckSingleClientMessage": "Indexery nedostupné z důvodu selhání: {0}", @@ -222,22 +222,22 @@ "SettingsShowRelativeDates": "Zobrazit relativní data", "SettingsShowRelativeDatesHelpText": "Zobrazit relativní (dnes / včera / atd.) Nebo absolutní data", "SystemTimeCheckMessage": "Systémový čas je vypnutý o více než 1 den. Naplánované úlohy nemusí fungovat správně, dokud nebude čas opraven", - "AddingTag": "Přidávání značky", + "AddingTag": "Přidání značky", "Age": "Stáří", "All": "Vše", "AllIndexersHiddenDueToFilter": "Všechny filmy jsou skryty kvůli použitému filtru.", - "Analytics": "Analytics", + "Analytics": "Analýzy", "EnableRss": "Povolit RSS", "NoChange": "Žádná změna", "AreYouSureYouWantToResetYourAPIKey": "Opravdu chcete resetovat klíč API?", - "Authentication": "Ověření", + "Authentication": "Ověřování", "AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k Prowlarr", "Automatic": "Automatický", "Backup": "Záloha", - "Cancel": "zrušení", + "Cancel": "Zrušit", "CertificateValidationHelpText": "Změňte, jak přísné je ověření certifikace HTTPS", "ChangeHasNotBeenSavedYet": "Změna ještě nebyla uložena", - "Clear": "Průhledná", + "Clear": "Vyčistit", "ClientPriority": "Priorita klienta", "CloneProfile": "Klonovat profil", "Close": "Zavřít", @@ -332,23 +332,57 @@ "Replace": "Nahradit", "TheLatestVersionIsAlreadyInstalled": "Nejnovější verze aplikace Prowlarr je již nainstalována", "More": "Více", - "ApplyTagsHelpTextAdd": "Přidat: Přidejte značky do existujícího seznamu značek", + "ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu", "ApplyTagsHelpTextHowToApplyApplications": "Jak použít značky na vybrané filmy", "DeleteSelectedDownloadClients": "Odstranit staženého klienta", "DeleteSelectedIndexersMessageText": "Opravdu chcete odstranit indexer „{0}“?", "DeleteSelectedApplicationsMessageText": "Opravdu chcete odstranit indexer „{0}“?", "DeleteSelectedDownloadClientsMessageText": "Opravdu chcete odstranit indexer „{0}“?", "Year": "Rok", - "ApplyTagsHelpTextRemove": "Odebrat: Odebere zadané značky", + "ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky", "DownloadClientPriorityHelpText": "Upřednostněte více klientů pro stahování. Round-Robin se používá pro klienty se stejnou prioritou.", - "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané filmy", - "ApplyTagsHelpTextReplace": "Nahradit: Nahradit tagy zadanými tagy (pro vymazání všech tagů zadejte žádné tagy)", + "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexátory", + "ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (zadáním žádné značky vymažete všechny značky)", "Track": "Stopa", "Genre": "Žánry", - "ConnectionLostReconnect": "Radarr se pokusí připojit automaticky, nebo můžete kliknout na znovu načíst níže.", + "ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.", "RecentChanges": "Nedávné změny", "WhatsNew": "Co je nového?", "DeleteAppProfileMessageText": "Opravdu chcete smazat kvalitní profil {0}", - "ConnectionLostToBackend": "Radarr ztratil spojení s back-endem a pro obnovení funkčnosti bude nutné jej znovu načíst.", - "minutes": "Minut" + "ConnectionLostToBackend": "{appName} ztratila spojení s backendem a pro obnovení funkčnosti bude třeba ji znovu načíst.", + "minutes": "Minut", + "ApplicationURL": "URL aplikace", + "ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základní adresy URL", + "ApplyChanges": "Použít změny", + "ApiKeyValidationHealthCheckMessage": "Aktualizujte svůj klíč API tak, aby měl alespoň {0} znaků. Můžete to provést prostřednictvím nastavení nebo konfiguračního souboru", + "AppUpdated": "{appName} aktualizován", + "AddDownloadClientImplementation": "Přidat klienta pro stahování - {implementationName}", + "AuthenticationRequired": "Vyžadované ověření", + "AuthenticationRequiredHelpText": "Změnit, pro které požadavky je vyžadováno ověření. Pokud nerozumíte rizikům, neměňte je.", + "AddCustomFilter": "Přidat vlastní filtr", + "AddConnection": "Přidat spojení", + "AddConnectionImplementation": "Přidat spojení - {implementationName}", + "AddIndexerImplementation": "Přidat indexátor - {implementationName}", + "Publisher": "Vydavatel", + "Categories": "Kategorie", + "Notification": "Oznámení", + "AddApplicationImplementation": "Přidat spojení - {implementationName}", + "AddIndexerProxyImplementation": "Přidat indexátor - {implementationName}", + "Artist": "umělec", + "EditIndexerImplementation": "Přidat indexátor - {implementationName}", + "Episode": "epizoda", + "NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání", + "NotificationStatusSingleClientHealthCheckMessage": "Seznamy nejsou k dispozici z důvodu selhání: {0}", + "Application": "Aplikace", + "AppUpdatedVersion": "{appName} byla aktualizována na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}.", + "Encoding": "Kódování", + "Notifications": "Oznámení", + "Season": "Řada", + "Theme": "Motiv", + "Label": "Etiketa", + "Album": "album", + "Applications": "Aplikace", + "Connect": "Oznámení", + "EditConnectionImplementation": "Přidat spojení - {implementationName}", + "EditDownloadClientImplementation": "Přidat klienta pro stahování - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 48debf4d3..e8466080a 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -362,5 +362,7 @@ "RecentChanges": "Seneste ændringer", "WhatsNew": "Hvad er nyt?", "ConnectionLostReconnect": "Radarr vil prøve at tilslutte automatisk, eller du kan klikke genindlæs forneden.", - "minutes": "Protokoller" + "minutes": "Protokoller", + "NotificationStatusAllClientHealthCheckMessage": "Alle lister er utilgængelige på grund af fejl", + "NotificationStatusSingleClientHealthCheckMessage": "Lister utilgængelige på grund af fejl: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 19e8be82a..6ab715973 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -497,5 +497,8 @@ "RecentChanges": "Neuste Änderungen", "WhatsNew": "Was gibt's Neues?", "minutes": "Minuten", - "DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?" + "DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?", + "AddConnection": "Sammlung bearbeiten", + "NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar", + "NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index c92a44a6c..ac1151b7c 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -499,5 +499,8 @@ "WhatsNew": "Τι νέα?", "ConnectionLostToBackend": "Το Radarr έχασε τη σύνδεσή του με το backend και θα χρειαστεί να επαναφορτωθεί για να αποκαταστήσει τη λειτουργικότητά του.", "minutes": "Λεπτά", - "DeleteAppProfileMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το προφίλ ποιότητας '{0}'?" + "DeleteAppProfileMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το προφίλ ποιότητας '{0}'?", + "AddConnection": "Προσθήκη Σύνδεσης", + "NotificationStatusAllClientHealthCheckMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", + "NotificationStatusSingleClientHealthCheckMessage": "Μη διαθέσιμες λίστες λόγω αποτυχιών: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 2620548d2..d2a1dbe70 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -410,5 +410,8 @@ "minutes": "Minutos", "Album": "álbum", "Artist": "artista", - "DeleteAppProfileMessageText": "Seguro que quieres eliminar el perfil de calidad {0}" + "DeleteAppProfileMessageText": "Seguro que quieres eliminar el perfil de calidad {0}", + "AddConnection": "Añadir Conexión", + "NotificationStatusAllClientHealthCheckMessage": "Las listas no están disponibles debido a errores", + "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index ed73607bf..163eae3bc 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -491,5 +491,8 @@ "RecentChanges": "Viimeaikaiset muutokset", "WhatsNew": "Mikä on uutta?", "ConnectionLostToBackend": "Radarr on menettänyt yhteyden taustajärjestelmään ja sivu on päivitettävä toiminnallisuuden palauttamiseksi.", - "minutes": "Minuuttia" + "minutes": "Minuuttia", + "AddConnection": "Lisää yhteys", + "NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi", + "NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 72ed5dbda..3f132cc73 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -531,5 +531,12 @@ "RecentChanges": "Changements récents", "WhatsNew": "Quoi de neuf ?", "minutes": "Minutes", - "DeleteAppProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?" + "DeleteAppProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?", + "AddConnection": "Ajouter une connexion", + "AddConnectionImplementation": "Ajouter une connexion - {implementationName}", + "AddApplicationImplementation": "Ajouter une condition - {implementationName}", + "AddIndexerImplementation": "Ajouter une condition - {implementationName}", + "EditConnectionImplementation": "Ajouter une connexion - {implementationName}", + "NotificationStatusAllClientHealthCheckMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements", + "NotificationStatusSingleClientHealthCheckMessage": "Applications indisponibles en raison de dysfonctionnements : {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 086b5e971..fbb59fff9 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -400,5 +400,7 @@ "Theme": "ערכת נושא", "ConnectionLostReconnect": "Radarr ינסה להתחבר אוטומטית, או שתלחץ על טען מחדש למטה.", "Album": "אלבום", - "Artist": "אמן" + "Artist": "אמן", + "NotificationStatusAllClientHealthCheckMessage": "כל הרשימות אינן זמינות בגלל כשלים", + "NotificationStatusSingleClientHealthCheckMessage": "רשימות לא זמינות בגלל כשלים: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index dd4a755fb..216ad74f9 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -346,5 +346,7 @@ "RecentChanges": "हाल में हुए बदलाव", "WhatsNew": "नया क्या है?", "minutes": "मिनट", - "DeleteAppProfileMessageText": "क्या आप वाकई गुणवत्ता प्रोफ़ाइल {0} को हटाना चाहते हैं" + "DeleteAppProfileMessageText": "क्या आप वाकई गुणवत्ता प्रोफ़ाइल {0} को हटाना चाहते हैं", + "NotificationStatusAllClientHealthCheckMessage": "सभी सूचियाँ विफल होने के कारण अनुपलब्ध हैं", + "NotificationStatusSingleClientHealthCheckMessage": "विफलताओं के कारण अनुपलब्ध सूची: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index b0a07efec..9ac6845ff 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -494,5 +494,8 @@ "RecentChanges": "Friss változtatások", "WhatsNew": "Mi az újdonság?", "ConnectionLostToBackend": "A Radarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.", - "minutes": "percek" + "minutes": "percek", + "AddConnection": "Gyűjtemény módosítása", + "NotificationStatusAllClientHealthCheckMessage": "Összes alkalmazás elérhetetlen hiba miatt", + "NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 6e982dd4a..383f64922 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -346,5 +346,7 @@ "RecentChanges": "Nýlegar breytingar", "WhatsNew": "Hvað er nýtt?", "ConnectionLostReconnect": "Radarr mun reyna að tengjast sjálfkrafa eða þú getur smellt á endurhlaða hér að neðan.", - "minutes": "Fundargerð" + "minutes": "Fundargerð", + "NotificationStatusAllClientHealthCheckMessage": "Allir listar eru ekki tiltækir vegna bilana", + "NotificationStatusSingleClientHealthCheckMessage": "Listar ekki tiltækir vegna bilana: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index d88a10ae2..84a60df1f 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -495,5 +495,8 @@ "WhatsNew": "Cosa c'è di nuovo?", "ConnectionLostReconnect": "Radarr cercherà di connettersi automaticamente, oppure clicca su ricarica qui sotto.", "ConnectionLostToBackend": "Radarr ha perso la connessione al backend e dovrà essere ricaricato per ripristinare la funzionalità.", - "minutes": "Minuti" + "minutes": "Minuti", + "AddConnection": "Aggiungi Connessione", + "NotificationStatusAllClientHealthCheckMessage": "Tutte le applicazioni non sono disponibili a causa di errori", + "NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 8d74b1c2a..ca3788788 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -346,5 +346,7 @@ "DeleteAppProfileMessageText": "品質プロファイル{0}を削除してもよろしいですか", "RecentChanges": "最近の変化", "WhatsNew": "新着情報?", - "minutes": "議事録" + "minutes": "議事録", + "NotificationStatusSingleClientHealthCheckMessage": "失敗のため利用できないリスト:{0}", + "NotificationStatusAllClientHealthCheckMessage": "障害のため、すべてのリストを利用できません" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 7931ca48e..273166919 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -345,5 +345,7 @@ "Year": "년", "ConnectionLostReconnect": "Radarr가 자동으로 연결을 시도하거나 아래에서 새로고침을 클릭할 수 있습니다.", "ConnectionLostToBackend": "Radarr는 백엔드와의 연결이 끊어졌으며 기능을 복원하려면 다시 로딩해야 합니다.", - "DeleteAppProfileMessageText": "품질 프로필 {0}을 (를) 삭제 하시겠습니까?" + "DeleteAppProfileMessageText": "품질 프로필 {0}을 (를) 삭제 하시겠습니까?", + "NotificationStatusAllClientHealthCheckMessage": "실패로 인해 모든 목록을 사용할 수 없습니다.", + "NotificationStatusSingleClientHealthCheckMessage": "실패로 인해 사용할 수없는 목록 : {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 7ed09c03f..de2d71f8b 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -131,5 +131,6 @@ "ApiKeyValidationHealthCheckMessage": "Vennligst oppdater din API-nøkkel til å være minst {0} tegn lang. Du kan gjøre dette via innstillinger eller konfigurasjonsfilen", "ConnectionLostReconnect": "Radarr vil forsøke å koble til automatisk, eller du kan klikke oppdater nedenfor.", "ConnectionLostToBackend": "Radarr har mistet tilkoblingen til baksystemet og må lastes inn på nytt for å gjenopprette funksjonalitet.", - "DeleteAppProfileMessageText": "Er du sikker på at du vil slette denne forsinkelsesprofilen?" + "DeleteAppProfileMessageText": "Er du sikker på at du vil slette denne forsinkelsesprofilen?", + "AddConnection": "Legg til kobling" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 85bfa93da..9e7b07052 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -449,5 +449,8 @@ "WhatsNew": "Wat is er nieuw?", "ConnectionLostToBackend": "Radarr heeft zijn verbinding met de backend verloren en zal moeten worden herladen om de functionaliteit te kunnen herstellen.", "minutes": "Minuten", - "DeleteAppProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {0} wilt verwijderen" + "DeleteAppProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {0} wilt verwijderen", + "NotificationStatusSingleClientHealthCheckMessage": "Applicaties onbeschikbaar door fouten", + "AddConnection": "Bewerk collectie", + "NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 0ddc8cf98..5077a54c8 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -367,5 +367,8 @@ "RecentChanges": "Ostatnie zmiany", "WhatsNew": "Co nowego?", "ConnectionLostToBackend": "Radarr utracił połączenie z silnikiem programu, aby przywrócić funkcjonalność musi zostać zrestartowany.", - "minutes": "Minuty" + "minutes": "Minuty", + "NotificationStatusSingleClientHealthCheckMessage": "Listy niedostępne z powodu błędów: {0}", + "AddConnection": "Edytuj kolekcję", + "NotificationStatusAllClientHealthCheckMessage": "Wszystkie listy są niedostępne z powodu błędów" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 049b05955..ae1e412eb 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -439,5 +439,6 @@ "WhatsNew": "O que há de novo?", "RecentChanges": "Mudanças recentes", "minutes": "Minutos", - "DeleteAppProfileMessageText": "Tem a certeza que quer eliminar o perfil de qualidade \"{0}\"?" + "DeleteAppProfileMessageText": "Tem a certeza que quer eliminar o perfil de qualidade \"{0}\"?", + "AddConnection": "Editar Coleção" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 951e776de..59e4da59e 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -110,7 +110,7 @@ "DeleteIndexerProxy": "Apagar Proxy do Indexador", "DeleteIndexerProxyMessageText": "Tem certeza de que deseja excluir o proxy do indexador '{name}'?", "DeleteNotification": "Excluir Notificação", - "DeleteNotificationMessageText": "Tem certeza de que deseja excluir o perfil de metadados '{name}'?", + "DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?", "DeleteTag": "Excluir tag", "DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?", "Description": "Descrição", @@ -149,7 +149,7 @@ "Ended": "Terminou", "Episode": "Episódio", "Error": "Erro", - "ErrorLoadingContents": "Erro ao carregar conteúdo", + "ErrorLoadingContents": "Erro ao carregar o conteúdo", "EventType": "Tipo de Evento", "Events": "Eventos", "Exception": "Exceção", @@ -158,7 +158,7 @@ "FeatureRequests": "Solicitação de recursos", "Filename": "Nome do arquivo", "Files": "Arquivos", - "Filter": "Filtrar", + "Filter": "Filtro", "FilterPlaceHolder": "Pesquisar indexadores", "Filters": "Filtros", "Fixed": "Corrigido", @@ -226,7 +226,7 @@ "InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog", "InteractiveSearch": "Pesquisa Interativa", "Interval": "Intervalo", - "KeyboardShortcuts": "Atalhos de teclado", + "KeyboardShortcuts": "Atalhos do Teclado", "Label": "Rótulo", "Language": "Idioma", "LastDuration": "Última Duração", @@ -398,7 +398,7 @@ "ShowSearchHelpText": "Mostrar botão de pesquisa ao passar o mouse", "Shutdown": "Desligar", "Size": "Tamanho", - "Sort": "Classificar", + "Sort": "Ordenar", "Source": "Origem", "StartTypingOrSelectAPathBelow": "Comece a digitar ou selecione um caminho abaixo", "Started": "Iniciado", @@ -417,7 +417,7 @@ "System": "Sistema", "SystemTimeCheckMessage": "A hora do sistema está desligada por mais de 1 dia. Tarefas agendadas podem não ser executadas corretamente até que o horário seja corrigido", "TVSearchTypes": "Tipos de Pesquisa de Seriados", - "TableOptions": "Opções da tabela", + "TableOptions": "Opções de Tabela", "TableOptionsColumnsMessage": "Escolha quais colunas são visíveis e em que ordem aparecem", "TagCannotBeDeletedWhileInUse": "Não pode ser excluído durante o uso", "TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída", @@ -561,7 +561,7 @@ "AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}", "ConnectionLostToBackend": "{appName} perdeu sua conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", "RecentChanges": "Mudanças Recentes", - "WhatsNew": "O quê há de novo?", + "WhatsNew": "O que há de novo?", "ConnectionLostReconnect": "{appName} tentará se conectar automaticamente ou você pode clicar em recarregar abaixo.", "AddApplicationImplementation": "Adicionar Aplicativo - {implementationName}", "AddConnectionImplementation": "Adicionar Conexão - {implementationName}", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 06cea543c..1899e577a 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -438,5 +438,6 @@ "ConnectionLostToBackend": "{appName} a pierdut conexiunea cu backend-ul și trebuie reîncărcat pentru a restabili funcționalitatea.", "RecentChanges": "Schimbări recente", "WhatsNew": "Ce mai e nou?", - "DeleteAppProfileMessageText": "Sigur doriți să ștergeți profilul de aplicație '{0}'?" + "DeleteAppProfileMessageText": "Sigur doriți să ștergeți profilul de aplicație '{0}'?", + "NotificationStatusSingleClientHealthCheckMessage": "Aplicații indisponibile datorită erorilor: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index a380e3b33..96fe1a6f0 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -19,7 +19,7 @@ "Added": "Добавлено", "Actions": "Действия", "About": "Подробности", - "DeleteBackupMessageText": "Вы уверены, что хотите удалить резервную копию '{0}'?", + "DeleteBackupMessageText": "Вы уверены, что хотите удалить резервную копию '{name}'?", "DeleteBackup": "Удалить резервную копию", "Delete": "Удалить", "NoLinks": "Нет ссылок", @@ -56,7 +56,7 @@ "Manual": "Ручной", "Mechanism": "Механизм", "NoBackupsAreAvailable": "Нет резервных копий", - "DeleteDownloadClientMessageText": "Вы уверены, что хотите удалить программу для скачивания '{0}'?", + "DeleteDownloadClientMessageText": "Вы уверены, что хотите удалить клиент загрузки '{name}'?", "Edit": "Редактирование", "Enable": "Включить", "Indexer": "Индексатор", @@ -121,9 +121,9 @@ "Dates": "Даты", "DBMigration": "Перенос БД", "DeleteNotification": "Удалить уведомление", - "DeleteNotificationMessageText": "Вы уверены, что хотите удалить уведомление '{0}'?", + "DeleteNotificationMessageText": "Вы уверены, что хотите удалить уведомление '{name}'?", "DeleteTag": "Удалить тэг", - "DeleteTagMessageText": "Вы уверены, что хотите удалить тэг '{0}'?", + "DeleteTagMessageText": "Вы уверены, что хотите удалить тэг '{label}'?", "Disabled": "Выключено", "Discord": "Discord", "Donations": "Пожертвования", @@ -356,22 +356,22 @@ "ApplicationURL": "URL-адрес приложения", "ApplicationUrlHelpText": "Внешний URL-адрес этого приложения, включая http(s)://, порт и базовый URL-адрес", "Label": "Ярлык", - "ApplyChanges": "Применять изменения", - "ApplyTagsHelpTextRemove": "Убрать: Убрать введенные тэги", + "ApplyChanges": "Применить изменения", + "ApplyTagsHelpTextRemove": "Удалить: удалить введенные теги", "DeleteSelectedApplicationsMessageText": "Вы уверены что хотите удалить индексер '{0}'?", - "DeleteSelectedDownloadClients": "Удалить программу для скачивания", - "DeleteSelectedDownloadClientsMessageText": "Вы уверены что хотите удалить индексер '{0}'?", - "DeleteSelectedIndexersMessageText": "Вы уверены что хотите удалить индексер '{0}'?", + "DeleteSelectedDownloadClients": "Удалить клиент(ы) загрузки", + "DeleteSelectedDownloadClientsMessageText": "Вы уверены, что хотите удалить {count} выбранных клиента загрузки?", + "DeleteSelectedIndexersMessageText": "Вы уверены, что хотите удалить {count} выбранных индексатора?", "DownloadClientPriorityHelpText": "Установите приоритет нескольких клиентов загрузки. Круговой алгоритм используется для клиентов с таким же приоритетом.", "EditSelectedDownloadClients": "Редактировать выбранные клиенты загрузки", "ApiKeyValidationHealthCheckMessage": "Пожалуйста, обновите свой ключ API, чтобы он был длиной не менее {0} символов. Вы можете сделать это через настройки или файл конфигурации", "Genre": "Жанры", "Theme": "Тема", "Year": "Год", - "ApplyTagsHelpTextAdd": "Добавить: добавить ярлыки к существующему списку", + "ApplyTagsHelpTextAdd": "Добавить: Добавьте теги в существующий список тегов", "ApplyTagsHelpTextHowToApplyApplications": "Как добавить ярлыки к выбранным фильмам", - "ApplyTagsHelpTextHowToApplyIndexers": "Как добавить ярлыки к выбранным фильмам", - "ApplyTagsHelpTextReplace": "Заменить: Изменить существующие тэги на введенные тэги (оставьте пустым чтобы очистить все тэги)", + "ApplyTagsHelpTextHowToApplyIndexers": "Как применить теги к выбранным индексаторам", + "ApplyTagsHelpTextReplace": "Заменить: заменить теги введенными тегами (оставьте поле пустым, чтобы удалить все теги)", "Track": "След", "UpdateAvailable": "Доступно новое обновление", "More": "Более", @@ -381,5 +381,32 @@ "RecentChanges": "Последние изменения", "WhatsNew": "Что нового?", "minutes": "Минуты", - "DeleteAppProfileMessageText": "Вы действительно хотите удалить профиль качества {0}" + "DeleteAppProfileMessageText": "Вы действительно хотите удалить профиль качества {0}", + "EditDownloadClientImplementation": "Редактировать клиент загрузки - {implementationName}", + "EditIndexerImplementation": "Редактировать индексатор - {implementationName}", + "NoIndexersFound": "Индексаторы не найдены", + "AuthenticationRequiredHelpText": "Отредактируйте, для каких запросов требуется аутентификация. Не меняйте, пока не поймете все риски.", + "AuthenticationRequired": "Требуется авторизация", + "CountDownloadClientsSelected": "{count} выбранных клиентов загрузки", + "CountIndexersSelected": "{count} выбранных индексаторов", + "EditSelectedIndexers": "Редактировать выбранный индексатор", + "OnHealthRestored": "При восстановлении работоспособности", + "OnHealthRestoredHelpText": "При восстановлении работоспособности", + "Implementation": "Реализация", + "NoDownloadClientsFound": "Клиенты для загрузки не найдены", + "IndexerDownloadClientHealthCheckMessage": "Индексаторы с недопустимыми клиентами загрузки: {0}.", + "StopSelecting": "Прекратить выбор", + "AddDownloadClientImplementation": "Добавить клиент загрузки - {implementationName}", + "AddConnection": "Добавить соединение", + "AddConnectionImplementation": "Добавить соединение - {implementationName}", + "ManageDownloadClients": "Менеджер клиентов загрузки", + "NotificationStatusAllClientHealthCheckMessage": "Все уведомления недоступны из-за сбоев", + "NotificationStatusSingleClientHealthCheckMessage": "Уведомления недоступны из-за сбоев: {0}", + "AddIndexerImplementation": "Добавить индексатор - {implementationName}", + "AddIndexerProxyImplementation": "Добавить индексатор - {implementationName}", + "EditConnectionImplementation": "Добавить соединение - {implementationName}", + "EditIndexerProxyImplementation": "Редактировать индексатор - {implementationName}", + "Season": "Сезон", + "AddApplicationImplementation": "Добавить соединение - {implementationName}", + "EditApplicationImplementation": "Редактировать уведомление - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index e718d5467..de916a00b 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -431,5 +431,7 @@ "DeleteAppProfileMessageText": "Är du säker på att du vill ta bort kvalitetsprofilen '{0}'?", "RecentChanges": "Senaste ändringar", "WhatsNew": "Vad är nytt?", - "minutes": "Minuter" + "minutes": "Minuter", + "NotificationStatusSingleClientHealthCheckMessage": "Listor otillgängliga på grund av fel: {0}", + "NotificationStatusAllClientHealthCheckMessage": "Samtliga listor otillgängliga på grund av fel" } diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index ec7dd57ba..4ef37f411 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -349,5 +349,7 @@ "DeleteAppProfileMessageText": "แน่ใจไหมว่าต้องการลบโปรไฟล์คุณภาพ {0}", "minutes": "นาที", "WhatsNew": "มีอะไรใหม่", - "RecentChanges": "การเปลี่ยนแปลงล่าสุด" + "RecentChanges": "การเปลี่ยนแปลงล่าสุด", + "NotificationStatusAllClientHealthCheckMessage": "รายการทั้งหมดไม่พร้อมใช้งานเนื่องจากความล้มเหลว", + "NotificationStatusSingleClientHealthCheckMessage": "รายการไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index a4cac5961..000dae8f8 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -349,5 +349,7 @@ "RecentChanges": "Son değişiklikler", "minutes": "Dakika", "WhatsNew": "Ne var ne yok?", - "ConnectionLostReconnect": "Radarr otomatik olarak bağlanmayı deneyecek veya aşağıdan yeniden yükle'yi tıklayabilirsiniz." + "ConnectionLostReconnect": "Radarr otomatik olarak bağlanmayı deneyecek veya aşağıdan yeniden yükle'yi tıklayabilirsiniz.", + "NotificationStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", + "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 30b3d2fb4..995cca94e 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -361,5 +361,7 @@ "DeleteAppProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?", "RecentChanges": "Останні зміни", "minutes": "Хвилин", - "WhatsNew": "Що нового?" + "WhatsNew": "Що нового?", + "NotificationStatusAllClientHealthCheckMessage": "Усі списки недоступні через помилки", + "NotificationStatusSingleClientHealthCheckMessage": "Списки недоступні через помилки: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index ecd9fb25e..c3b13e89e 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -347,5 +347,7 @@ "RecentChanges": "Những thay đổi gần đây", "minutes": "Phút", "ConnectionLostReconnect": "Radarr sẽ cố gắng kết nối tự động hoặc bạn có thể nhấp vào tải lại bên dưới.", - "WhatsNew": "Có gì mới?" + "WhatsNew": "Có gì mới?", + "NotificationStatusAllClientHealthCheckMessage": "Tất cả danh sách không có sẵn do lỗi", + "NotificationStatusSingleClientHealthCheckMessage": "Danh sách không có sẵn do lỗi: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 636f9ab3e..dbde605a3 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -34,7 +34,7 @@ "ApplicationStatusCheckAllClientMessage": "由于故障所用应用程序都不可用", "ApplicationStatusCheckSingleClientMessage": "由于故障应用程序不可用", "ApplicationURL": "应用程序 URL", - "ApplicationUrlHelpText": "此应用程序的外部URL,包括http(s)://,端口和基本URL", + "ApplicationUrlHelpText": "此应用的外部URL,包含 http(s)://、端口和基本URL", "Applications": "程序", "Apply": "应用", "ApplyTags": "应用标签", @@ -61,7 +61,7 @@ "Backups": "历史备份", "BeforeUpdate": "更新前", "BindAddress": "绑定地址", - "BindAddressHelpText": "有效的 IPv4 地址、localhost、或以'*'代表所有接口", + "BindAddressHelpText": "有效的 IP 地址、localhost、或以'*'代表所有接口", "Book": "图书", "BookSearch": "图书搜索", "BookSearchTypes": "搜索图书类型", @@ -105,13 +105,13 @@ "DeleteBackupMessageText": "您确定要删除备份 '{0}' 吗?", "DeleteClientCategory": "删除下载客户端类别", "DeleteDownloadClient": "删除下载客户端", - "DeleteDownloadClientMessageText": "您确定要删除下载客户端 '{0}' 吗?", + "DeleteDownloadClientMessageText": "你确定要删除下载客户端 “{name}” 吗?", "DeleteIndexerProxy": "删除搜刮器代理", "DeleteIndexerProxyMessageText": "您确定要删除列表 '{0}'?", "DeleteNotification": "删除消息推送", - "DeleteNotificationMessageText": "您确定要删除推送 '{0}' 吗?", + "DeleteNotificationMessageText": "您确定要删除消息推送 “{name}” 吗?", "DeleteTag": "删除标签", - "DeleteTagMessageText": "您确定要删除标签 '{0}' 吗?", + "DeleteTagMessageText": "您确定要删除标签 '{label}' 吗?", "Description": "描述", "Details": "详情", "DevelopmentSettings": "开发设置", @@ -494,8 +494,8 @@ "Track": "追踪", "ApplyChanges": "应用更改", "ApplyTagsHelpTextAdd": "添加: 添加标签至已有的标签列表中", - "CountDownloadClientsSelected": "已选择 {0} 个下载客户端", - "CountIndexersSelected": "已选择 {0} 个索引器", + "CountDownloadClientsSelected": "已选择 {count} 个下载客户端", + "CountIndexersSelected": "已选择 {count} 个索引器", "DeleteSelectedDownloadClientsMessageText": "您确定要删除 {0} 个选定的下载客户端吗?", "DeleteSelectedIndexersMessageText": "您确定要删除 {0} 个选定的索引器吗?", "EditSelectedDownloadClients": "编辑选定的下载客户端", @@ -549,16 +549,25 @@ "TorznabUrl": "Torznab链接", "days": "天", "minutes": "分钟", - "ConnectionLostReconnect": "Radarr将会尝试自动连接,您也可以点击下方的重新加载。", + "ConnectionLostReconnect": "{appName} 将会尝试自动连接,您也可以点击下方的重新加载。", "DeleteAppProfileMessageText": "您确定要删除备份“{name}”吗?", "RecentChanges": "最近修改", - "ConnectionLostToBackend": "Radarr与后端的链接已断开,需要重新加载恢复功能。", + "ConnectionLostToBackend": "{appName} 与后端的链接已断开,需要重新加载恢复功能。", "WhatsNew": "什么是新的?", "AddApplicationImplementation": "添加应用-{实体名称}", "AddConnection": "添加连接", - "AddIndexerImplementation": "添加索引器-{实体名称}", + "AddIndexerImplementation": "添加索引器 - {implementationName}", "AddCategory": "添加目录", - "AddConnectionImplementation": "添加连接-{实体名称}", - "AddDownloadClientImplementation": "添加下载客户端-{实体名称}", - "AddIndexerProxyImplementation": "添加搜刮器代理-{实体名称}" + "AddConnectionImplementation": "添加集合 - {implementationName}", + "AddDownloadClientImplementation": "添加下载客户端 - {implementationName}", + "AddIndexerProxyImplementation": "添加搜刮器代理-{实体名称}", + "AppUpdated": "{appName} 升级", + "EditDownloadClientImplementation": "添加下载客户端 - {implementationName}", + "EditIndexerImplementation": "添加索引器 - {implementationName}", + "EditIndexerProxyImplementation": "添加搜刮器代理-{实体名称}", + "AppUpdatedVersion": "{appName} 已经更新到 {version} 版本,重新加载 {appName} 使更新生效", + "EditApplicationImplementation": "添加应用-{实体名称}", + "EditConnectionImplementation": "添加集合 - {implementationName}", + "NotificationStatusAllClientHealthCheckMessage": "由于故障所用应用程序都不可用", + "NotificationStatusSingleClientHealthCheckMessage": "由于故障应用程序不可用" } From 288a3d1495c582f9eed1ee5ceac96cd7215c238e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 29 Aug 2023 03:05:44 +0300 Subject: [PATCH 134/964] Fix loading translations --- .../Builder/PrivacyFilterBuilderRowValue.js | 21 ++++++++++++-- frontend/src/Components/keyboardShortcuts.js | 28 ++++++++++++++----- frontend/src/History/HistoryRow.js | 22 +++++++-------- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/frontend/src/Components/Filter/Builder/PrivacyFilterBuilderRowValue.js b/frontend/src/Components/Filter/Builder/PrivacyFilterBuilderRowValue.js index 4004f0ced..4f6250151 100644 --- a/frontend/src/Components/Filter/Builder/PrivacyFilterBuilderRowValue.js +++ b/frontend/src/Components/Filter/Builder/PrivacyFilterBuilderRowValue.js @@ -3,9 +3,24 @@ import translate from 'Utilities/String/translate'; import FilterBuilderRowValue from './FilterBuilderRowValue'; const privacyTypes = [ - { id: 'public', name: translate('Public') }, - { id: 'private', name: translate('Private') }, - { id: 'semiPrivate', name: translate('SemiPrivate') } + { + id: 'public', + get name() { + return translate('Public'); + } + }, + { + id: 'private', + get name() { + return translate('Private'); + } + }, + { + id: 'semiPrivate', + get name() { + return translate('SemiPrivate'); + } + } ]; function PrivacyFilterBuilderRowValue(props) { diff --git a/frontend/src/Components/keyboardShortcuts.js b/frontend/src/Components/keyboardShortcuts.js index b576a988c..8513a65eb 100644 --- a/frontend/src/Components/keyboardShortcuts.js +++ b/frontend/src/Components/keyboardShortcuts.js @@ -6,37 +6,51 @@ import translate from 'Utilities/String/translate'; export const shortcuts = { OPEN_KEYBOARD_SHORTCUTS_MODAL: { key: '?', - name: translate('OpenThisModal') + get name() { + return translate('OpenThisModal'); + } }, CLOSE_MODAL: { key: 'Esc', - name: translate('CloseCurrentModal') + get name() { + return translate('CloseCurrentModal'); + } }, ACCEPT_CONFIRM_MODAL: { key: 'Enter', - name: translate('AcceptConfirmationModal') + get name() { + return translate('AcceptConfirmationModal'); + } }, MOVIE_SEARCH_INPUT: { key: 's', - name: translate('FocusSearchBox') + get name() { + return translate('FocusSearchBox'); + } }, SAVE_SETTINGS: { key: 'mod+s', - name: translate('SaveSettings') + get name() { + return translate('SaveSettings'); + } }, SCROLL_TOP: { key: 'mod+home', - name: translate('MovieIndexScrollTop') + get name() { + return translate('MovieIndexScrollTop'); + } }, SCROLL_BOTTOM: { key: 'mod+end', - name: translate('MovieIndexScrollBottom') + get name() { + return translate('MovieIndexScrollBottom'); + } } }; diff --git a/frontend/src/History/HistoryRow.js b/frontend/src/History/HistoryRow.js index c47160f23..d260690a4 100644 --- a/frontend/src/History/HistoryRow.js +++ b/frontend/src/History/HistoryRow.js @@ -21,17 +21,17 @@ const historyParameters = [ { key: historyDataTypes.TRAKT_ID, title: 'Trakt' }, { key: historyDataTypes.R_ID, title: 'TvRage' }, { key: historyDataTypes.TVMAZE_ID, title: 'TvMaze' }, - { key: historyDataTypes.SEASON, title: translate('Season') }, - { key: historyDataTypes.EPISODE, title: translate('Episode') }, - { key: historyDataTypes.ARTIST, title: translate('Artist') }, - { key: historyDataTypes.ALBUM, title: translate('Album') }, - { key: historyDataTypes.LABEL, title: translate('Label') }, - { key: historyDataTypes.TRACK, title: translate('Track') }, - { key: historyDataTypes.YEAR, title: translate('Year') }, - { key: historyDataTypes.GENRE, title: translate('Genre') }, - { key: historyDataTypes.AUTHOR, title: translate('Author') }, - { key: historyDataTypes.TITLE, title: translate('Title') }, - { key: historyDataTypes.PUBLISHER, title: translate('Publisher') } + { key: historyDataTypes.SEASON, title: () => translate('Season') }, + { key: historyDataTypes.EPISODE, title: () => translate('Episode') }, + { key: historyDataTypes.ARTIST, title: () => translate('Artist') }, + { key: historyDataTypes.ALBUM, title: () => translate('Album') }, + { key: historyDataTypes.LABEL, title: () => translate('Label') }, + { key: historyDataTypes.TRACK, title: () => translate('Track') }, + { key: historyDataTypes.YEAR, title: () => translate('Year') }, + { key: historyDataTypes.GENRE, title: () => translate('Genre') }, + { key: historyDataTypes.AUTHOR, title: () => translate('Author') }, + { key: historyDataTypes.TITLE, title: () => translate('Title') }, + { key: historyDataTypes.PUBLISHER, title: () => translate('Publisher') } ]; class HistoryRow extends Component { From 60ca0db26f3c515cdad745d5705a16b82c704e53 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 28 Aug 2023 22:31:12 +0300 Subject: [PATCH 135/964] Improve messaging in Authentication Required modal Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> --- .../AuthenticationRequiredModalContent.js | 82 +++++++++---------- .../src/Settings/General/SecuritySettings.js | 72 +++++++++++++--- src/NzbDrone.Core/Localization/Core/en.json | 15 +++- 3 files changed, 108 insertions(+), 61 deletions(-) diff --git a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js index 920c59a31..2c881d75a 100644 --- a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js +++ b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js @@ -11,7 +11,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes, kinds } from 'Helpers/Props'; -import { authenticationMethodOptions, authenticationRequiredOptions, authenticationRequiredWarning } from 'Settings/General/SecuritySettings'; +import { authenticationMethodOptions, authenticationRequiredOptions } from 'Settings/General/SecuritySettings'; import translate from 'Utilities/String/translate'; import styles from './AuthenticationRequiredModalContent.css'; @@ -63,71 +63,63 @@ function AuthenticationRequiredModalContent(props) { className={styles.authRequiredAlert} kind={kinds.WARNING} > - {authenticationRequiredWarning} + {translate('AuthenticationRequiredWarning', { appName: 'Prowlarr' })} { isPopulated && !error ?
    - {translate('Authentication')} + {translate('AuthenticationMethod')} - { - authenticationEnabled ? - - {translate('AuthenticationRequired')} + + {translate('AuthenticationRequired')} - - : - null - } + + - { - authenticationEnabled ? - - {translate('Username')} + + {translate('Username')} - - : - null - } + + - { - authenticationEnabled ? - - {translate('Password')} + + {translate('Password')} - - : - null - } + +
    : null } diff --git a/frontend/src/Settings/General/SecuritySettings.js b/frontend/src/Settings/General/SecuritySettings.js index 4b382800c..a7d64bdc0 100644 --- a/frontend/src/Settings/General/SecuritySettings.js +++ b/frontend/src/Settings/General/SecuritySettings.js @@ -11,24 +11,69 @@ import ConfirmModal from 'Components/Modal/ConfirmModal'; import { icons, inputTypes, kinds } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; -export const authenticationRequiredWarning = translate('AuthenticationRequiredWarning'); - export const authenticationMethodOptions = [ - { key: 'none', value: 'None', isDisabled: true }, - { key: 'external', value: 'External', isHidden: true }, - { key: 'basic', value: 'Basic (Browser Popup)' }, - { key: 'forms', value: 'Forms (Login Page)' } + { + key: 'none', + get value() { + return translate('None'); + }, + isDisabled: true + }, + { + key: 'external', + get value() { + return translate('External'); + }, + isHidden: true + }, + { + key: 'basic', + get value() { + return translate('AuthBasic'); + } + }, + { + key: 'forms', + get value() { + return translate('AuthForm'); + } + } ]; export const authenticationRequiredOptions = [ - { key: 'enabled', value: 'Enabled' }, - { key: 'disabledForLocalAddresses', value: 'Disabled for Local Addresses' } + { + key: 'enabled', + get value() { + return translate('Enabled'); + } + }, + { + key: 'disabledForLocalAddresses', + get value() { + return translate('DisabledForLocalAddresses'); + } + } ]; const certificateValidationOptions = [ - { key: 'enabled', value: 'Enabled' }, - { key: 'disabledForLocalAddresses', value: 'Disabled for Local Addresses' }, - { key: 'disabled', value: 'Disabled' } + { + key: 'enabled', + get value() { + return translate('Enabled'); + } + }, + { + key: 'disabledForLocalAddresses', + get value() { + return translate('DisabledForLocalAddresses'); + } + }, + { + key: 'disabled', + get value() { + return translate('Disabled'); + } + } ]; class SecuritySettings extends Component { @@ -95,7 +140,7 @@ class SecuritySettings extends Component { name="authenticationMethod" values={authenticationMethodOptions} helpText={translate('AuthenticationMethodHelpText')} - helpTextWarning={authenticationRequiredWarning} + helpTextWarning={translate('AuthenticationRequiredWarning', { appName: 'Prowlarr' })} onChange={onInputChange} {...authenticationMethod} /> @@ -155,6 +200,7 @@ class SecuritySettings extends Component { type={inputTypes.TEXT} name="apiKey" readOnly={true} + helpTextWarning={translate('RestartRequiredHelpTextWarning')} buttons={[ Date: Tue, 29 Aug 2023 03:18:11 +0300 Subject: [PATCH 136/964] Add missing app name token for translation --- frontend/src/Settings/General/SecuritySettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Settings/General/SecuritySettings.js b/frontend/src/Settings/General/SecuritySettings.js index a7d64bdc0..9a930b1d5 100644 --- a/frontend/src/Settings/General/SecuritySettings.js +++ b/frontend/src/Settings/General/SecuritySettings.js @@ -139,7 +139,7 @@ class SecuritySettings extends Component { type={inputTypes.SELECT} name="authenticationMethod" values={authenticationMethodOptions} - helpText={translate('AuthenticationMethodHelpText')} + helpText={translate('AuthenticationMethodHelpText', { appName: 'Prowlarr' })} helpTextWarning={translate('AuthenticationRequiredWarning', { appName: 'Prowlarr' })} onChange={onInputChange} {...authenticationMethod} From bfecf35a8b24050134e85a8715f0c3b58e68bd29 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 29 Aug 2023 18:54:12 +0300 Subject: [PATCH 137/964] Fix user check in Authentication Required for newer installs --- frontend/src/FirstRun/AuthenticationRequiredModalContent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js index 2c881d75a..92e43fd3f 100644 --- a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js +++ b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js @@ -104,7 +104,7 @@ function AuthenticationRequiredModalContent(props) { type={inputTypes.TEXT} name="username" onChange={onInputChange} - helpTextWarning={username.value === '' ? translate('AuthenticationRequiredUsernameHelpTextWarning') : undefined} + helpTextWarning={username === undefined || username.value === '' ? translate('AuthenticationRequiredUsernameHelpTextWarning') : undefined} {...username} /> @@ -116,7 +116,7 @@ function AuthenticationRequiredModalContent(props) { type={inputTypes.PASSWORD} name="password" onChange={onInputChange} - helpTextWarning={password.value === '' ? translate('AuthenticationRequiredPasswordHelpTextWarning') : undefined} + helpTextWarning={password === undefined || password.value === '' ? translate('AuthenticationRequiredPasswordHelpTextWarning') : undefined} {...password} /> From 1b8ff9b98956c8d2a22a1254492cfc76d3d8d57d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 29 Aug 2023 19:12:06 +0300 Subject: [PATCH 138/964] Simplify user check in Authentication Required for newer installs --- frontend/src/FirstRun/AuthenticationRequiredModalContent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js index 92e43fd3f..9e561eae2 100644 --- a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js +++ b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js @@ -104,7 +104,7 @@ function AuthenticationRequiredModalContent(props) { type={inputTypes.TEXT} name="username" onChange={onInputChange} - helpTextWarning={username === undefined || username.value === '' ? translate('AuthenticationRequiredUsernameHelpTextWarning') : undefined} + helpTextWarning={username?.value ? undefined : translate('AuthenticationRequiredUsernameHelpTextWarning')} {...username} /> @@ -116,7 +116,7 @@ function AuthenticationRequiredModalContent(props) { type={inputTypes.PASSWORD} name="password" onChange={onInputChange} - helpTextWarning={password === undefined || password.value === '' ? translate('AuthenticationRequiredPasswordHelpTextWarning') : undefined} + helpTextWarning={password?.value ? undefined : translate('AuthenticationRequiredPasswordHelpTextWarning')} {...password} /> From 56f0c137f844f2b9723b0fe3760efde69d74a664 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 1 Sep 2023 15:50:22 +0300 Subject: [PATCH 139/964] Fixed translations for history parameters --- frontend/src/History/HistoryRow.js | 77 +++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/frontend/src/History/HistoryRow.js b/frontend/src/History/HistoryRow.js index d260690a4..ef5cb12ae 100644 --- a/frontend/src/History/HistoryRow.js +++ b/frontend/src/History/HistoryRow.js @@ -21,17 +21,72 @@ const historyParameters = [ { key: historyDataTypes.TRAKT_ID, title: 'Trakt' }, { key: historyDataTypes.R_ID, title: 'TvRage' }, { key: historyDataTypes.TVMAZE_ID, title: 'TvMaze' }, - { key: historyDataTypes.SEASON, title: () => translate('Season') }, - { key: historyDataTypes.EPISODE, title: () => translate('Episode') }, - { key: historyDataTypes.ARTIST, title: () => translate('Artist') }, - { key: historyDataTypes.ALBUM, title: () => translate('Album') }, - { key: historyDataTypes.LABEL, title: () => translate('Label') }, - { key: historyDataTypes.TRACK, title: () => translate('Track') }, - { key: historyDataTypes.YEAR, title: () => translate('Year') }, - { key: historyDataTypes.GENRE, title: () => translate('Genre') }, - { key: historyDataTypes.AUTHOR, title: () => translate('Author') }, - { key: historyDataTypes.TITLE, title: () => translate('Title') }, - { key: historyDataTypes.PUBLISHER, title: () => translate('Publisher') } + { + key: historyDataTypes.SEASON, + get title() { + return translate('Season'); + } + }, + { + key: historyDataTypes.EPISODE, + get title() { + return translate('Episode'); + } + }, + { + key: historyDataTypes.ARTIST, + get title() { + return translate('Artist'); + } + }, + { + key: historyDataTypes.ALBUM, + get title() { + return translate('Album'); + } + }, + { + key: historyDataTypes.LABEL, + get title() { + return translate('Label'); + } + }, + { + key: historyDataTypes.TRACK, + get title() { + return translate('Track'); + } + }, + { + key: historyDataTypes.YEAR, + get title() { + return translate('Year'); + } + }, + { + key: historyDataTypes.GENRE, + get title() { + return translate('Genre'); + } + }, + { + key: historyDataTypes.AUTHOR, + get title() { + return translate('Author'); + } + }, + { + key: historyDataTypes.TITLE, + get title() { + return translate('Title'); + } + }, + { + key: historyDataTypes.PUBLISHER, + get title() { + return translate('Publisher'); + } + } ]; class HistoryRow extends Component { From b912cc6110dfa13da2ac9f4fddf3920e25e8c17d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 2 Sep 2023 00:41:06 +0300 Subject: [PATCH 140/964] Some logging improvements for filtered releases Closes #1847 --- src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs | 2 +- .../Indexers/Definitions/Cardigann/CardigannBase.cs | 2 +- .../Indexers/Definitions/Cardigann/CardigannParser.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index 0a10db176..7ff28807f 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -214,7 +214,7 @@ namespace NzbDrone.Core.IndexerSearch if (releases.Count != indexerReports.Releases.Count) { - _logger.Trace("{0} {1} Releases which didn't contain search categories [{2}] were filtered", indexerReports.Releases.Count - releases.Count, indexer.Name, string.Join(", ", expandedQueryCats)); + _logger.Trace("{0} releases from {1} ({2}) which didn't contain search categories [{3}] were filtered", indexerReports.Releases.Count - releases.Count, ((IndexerDefinition)indexer.Definition).Name, indexer.Name, string.Join(", ", expandedQueryCats)); } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs index 536fec4dd..7123b3d86 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs @@ -287,7 +287,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann [".Today.Year"] = DateTime.Today.Year.ToString() }; - _logger.Debug("Populating config vars"); + _logger.Trace("Populating config vars"); foreach (var setting in _definition.Settings) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs index cf8fc3b67..78c2b2760 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs @@ -35,7 +35,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann { var releases = new List(); - _logger.Debug("Parsing"); + _logger.Trace("Cardigann ({0}): Parsing response", _definition.Id); var indexerLogging = _configService.LogIndexerResponse; @@ -428,7 +428,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann } }); - _logger.Debug($"Got {releases.Count} releases"); + _logger.Trace("Cardigann ({0}): Got {1} releases", _definition.Id, releases.Count); return releases; } From 00dc55996c052e06dffdfb99acb8f8d803f6268e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 2 Sep 2023 01:59:11 +0300 Subject: [PATCH 141/964] Remove Label and Unit columns from Apps Fields --- src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs | 2 -- src/NzbDrone.Core/Applications/Radarr/RadarrField.cs | 2 -- src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs | 2 -- src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs | 2 -- src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs | 2 -- 5 files changed, 10 deletions(-) diff --git a/src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs b/src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs index be058fe53..9637e48d1 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/LidarrField.cs @@ -3,8 +3,6 @@ namespace NzbDrone.Core.Applications.Lidarr public class LidarrField { public string Name { get; set; } - public string Label { get; set; } - public string Unit { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } diff --git a/src/NzbDrone.Core/Applications/Radarr/RadarrField.cs b/src/NzbDrone.Core/Applications/Radarr/RadarrField.cs index 5fc1415b5..fbafc3b9c 100644 --- a/src/NzbDrone.Core/Applications/Radarr/RadarrField.cs +++ b/src/NzbDrone.Core/Applications/Radarr/RadarrField.cs @@ -3,8 +3,6 @@ namespace NzbDrone.Core.Applications.Radarr public class RadarrField { public string Name { get; set; } - public string Label { get; set; } - public string Unit { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } diff --git a/src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs b/src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs index 274c91389..587559cfd 100644 --- a/src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs +++ b/src/NzbDrone.Core/Applications/Readarr/ReadarrField.cs @@ -3,8 +3,6 @@ namespace NzbDrone.Core.Applications.Readarr public class ReadarrField { public string Name { get; set; } - public string Label { get; set; } - public string Unit { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } diff --git a/src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs b/src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs index fa3a20f46..f9e5fe6f9 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/SonarrField.cs @@ -3,8 +3,6 @@ namespace NzbDrone.Core.Applications.Sonarr public class SonarrField { public string Name { get; set; } - public string Label { get; set; } - public string Unit { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } diff --git a/src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs b/src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs index 3838dd760..2bdafe2f8 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/WhisparrField.cs @@ -3,8 +3,6 @@ namespace NzbDrone.Core.Applications.Whisparr public class WhisparrField { public string Name { get; set; } - public string Label { get; set; } - public string Unit { get; set; } public object Value { get; set; } public string Type { get; set; } public bool Advanced { get; set; } From 4267b8a2442de46888fc5699f06b5ec834f0f93e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 2 Sep 2023 02:07:26 +0300 Subject: [PATCH 142/964] Cleanse API Keys from sync requests sent to applications --- .../InstrumentationTests/CleanseLogMessageFixture.cs | 3 +++ src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs index 782dd405d..e130cea02 100644 --- a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs +++ b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs @@ -104,6 +104,9 @@ namespace NzbDrone.Common.Test.InstrumentationTests // RSS [TestCase(@"")] + // Applications + [TestCase(@"""name"":""apiKey"",""value"":""mySecret""")] + // Internal [TestCase(@"[Info] MigrationController: *** Migrating Database=prowlarr-main;Host=postgres14;Username=mySecret;Password=mySecret;Port=5432;Enlist=False ***")] [TestCase("/readarr/signalr/messages/negotiate?access_token=1234530f422f4aacb6b301233210aaaa&negotiateVersion=1")] diff --git a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs index c2d67203e..1819f0ec7 100644 --- a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs +++ b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs @@ -58,6 +58,9 @@ namespace NzbDrone.Common.Instrumentation new (@"(?:avistaz|exoticaz|cinemaz|privatehd)\.[a-z]{2,3}/rss/download/(?[^&=]+?)/(?[^&=]+?)\.torrent", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"(?:animebytes)\.[a-z]{2,3}/torrent/[0-9]+/download/(?[^&=]+?)[""]", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"""(info_hash|token|((pass|rss)[- _]?key))"":""(?[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase), + + // Applications + new (@"""name"":""apikey"",""value"":""(?[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase), }; private static readonly Regex CleanseRemoteIPRegex = new (@"(?:Auth-\w+(? Date: Sat, 2 Sep 2023 03:40:49 +0300 Subject: [PATCH 143/964] Display a not allowed cursor for disabled select options --- frontend/src/Components/Form/EnhancedSelectInputOption.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/src/Components/Form/EnhancedSelectInputOption.css b/frontend/src/Components/Form/EnhancedSelectInputOption.css index 8dcfa25d5..d7f0e861b 100644 --- a/frontend/src/Components/Form/EnhancedSelectInputOption.css +++ b/frontend/src/Components/Form/EnhancedSelectInputOption.css @@ -9,6 +9,10 @@ &:hover { background-color: var(--inputHoverBackgroundColor); } + + &.isDisabled { + cursor: not-allowed; + } } .optionCheck { From fbcf1b03c5663512ed3936ca3d6aa432aef26788 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Fri, 1 Sep 2023 02:49:38 +0200 Subject: [PATCH 144/964] Translate Frontend Store (cherry picked from commit d31fcbb2dfe98a540a359b98b204d101d554cf03) --- frontend/src/Store/Actions/Settings/appProfiles.js | 3 ++- frontend/src/Store/Actions/indexerActions.js | 2 +- src/NzbDrone.Core/Localization/Core/en.json | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/Store/Actions/Settings/appProfiles.js b/frontend/src/Store/Actions/Settings/appProfiles.js index 357588b75..92a48e0b8 100644 --- a/frontend/src/Store/Actions/Settings/appProfiles.js +++ b/frontend/src/Store/Actions/Settings/appProfiles.js @@ -7,6 +7,7 @@ import createSetSettingValueReducer from 'Store/Actions/Creators/Reducers/create import { createThunk } from 'Store/thunks'; import getSectionState from 'Utilities/State/getSectionState'; import updateSectionState from 'Utilities/State/updateSectionState'; +import translate from 'Utilities/String/translate'; // // Variables @@ -87,7 +88,7 @@ export default { const pendingChanges = { ...item, id: 0 }; delete pendingChanges.id; - pendingChanges.name = `${pendingChanges.name} - Copy`; + pendingChanges.name = translate('DefaultNameCopiedProfile', { name: pendingChanges.name }); newState.pendingChanges = pendingChanges; return updateSectionState(state, section, newState); diff --git a/frontend/src/Store/Actions/indexerActions.js b/frontend/src/Store/Actions/indexerActions.js index 0325891be..ff0cfe5d4 100644 --- a/frontend/src/Store/Actions/indexerActions.js +++ b/frontend/src/Store/Actions/indexerActions.js @@ -210,7 +210,7 @@ export const reducers = createHandleActions({ // Set the name in pendingChanges newState.pendingChanges = { - name: `${item.name} - Copy` + name: translate('DefaultNameCopiedProfile', { name: item.name }) }; return updateSectionState(state, section, newState); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 9baeeebbd..4b26243ab 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -131,6 +131,7 @@ "Database": "Database", "Date": "Date", "Dates": "Dates", + "DefaultNameCopiedProfile": "{name} - Copy", "Delete": "Delete", "DeleteAppProfile": "Delete App Profile", "DeleteAppProfileMessageText": "Are you sure you want to delete the app profile '{name}'?", From 1d79b92fca975bb419262acd4c0681b53ad396b3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 3 Sep 2023 07:26:15 +0300 Subject: [PATCH 145/964] Bump version to 1.8.6 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fbf4e8f44..7adeca7dd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.8.5' + majorVersion: '1.8.6' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 09606af3514b23935e085754d47db330b8fbd89a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 6 Aug 2023 23:29:14 +0300 Subject: [PATCH 146/964] Bump dotnet to 6.0.21 --- azure-pipelines.yml | 2 +- package.json | 2 +- src/NzbDrone.Common/Prowlarr.Common.csproj | 6 +++--- src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj | 2 +- src/NzbDrone.Core/Prowlarr.Core.csproj | 8 ++++---- src/NzbDrone.Host/Prowlarr.Host.csproj | 6 +++--- .../Prowlarr.Integration.Test.csproj | 2 +- src/NzbDrone.Update/Prowlarr.Update.csproj | 4 ++-- yarn.lock | 8 ++++---- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7adeca7dd..c5d08383c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,7 +15,7 @@ variables: buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' sentryOrg: 'servarr' sentryUrl: 'https://sentry.servarr.com' - dotnetVersion: '6.0.408' + dotnetVersion: '6.0.413' nodeVersion: '16.X' innoVersion: '6.2.0' windowsImage: 'windows-2022' diff --git a/package.json b/package.json index 7dd30a2c7..06c5d33a9 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@fortawesome/free-solid-svg-icons": "6.4.0", "@fortawesome/react-fontawesome": "0.2.0", "@juggle/resize-observer": "3.4.0", - "@microsoft/signalr": "6.0.16", + "@microsoft/signalr": "6.0.21", "@sentry/browser": "7.51.2", "@sentry/integrations": "7.51.2", "@types/node": "18.15.11", diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index 1f1479210..dedf52f8a 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -4,9 +4,9 @@ ISMUSL - + - + @@ -19,7 +19,7 @@ - + diff --git a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj index 3609cb943..dbfd06861 100644 --- a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 44ab93e76..a72228da0 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -6,7 +6,7 @@ - + @@ -19,10 +19,10 @@ - + - - + + diff --git a/src/NzbDrone.Host/Prowlarr.Host.csproj b/src/NzbDrone.Host/Prowlarr.Host.csproj index 7d6846b56..02c6b0c96 100644 --- a/src/NzbDrone.Host/Prowlarr.Host.csproj +++ b/src/NzbDrone.Host/Prowlarr.Host.csproj @@ -6,10 +6,10 @@ - + - - + + diff --git a/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj b/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj index 93957718e..66de72830 100644 --- a/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj +++ b/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj @@ -4,7 +4,7 @@ Library - + diff --git a/src/NzbDrone.Update/Prowlarr.Update.csproj b/src/NzbDrone.Update/Prowlarr.Update.csproj index aefe37fed..dca354a24 100644 --- a/src/NzbDrone.Update/Prowlarr.Update.csproj +++ b/src/NzbDrone.Update/Prowlarr.Update.csproj @@ -4,8 +4,8 @@ net6.0 - - + + diff --git a/yarn.lock b/yarn.lock index 3936f0275..cc081ebb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1259,10 +1259,10 @@ resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== -"@microsoft/signalr@6.0.16": - version "6.0.16" - resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.16.tgz#d36498a9b16bf11c0e9213d77d24c0ad8ebffa47" - integrity sha512-wekzRtt2Ti38Ja0OQwLE0EKN0Zm7RI9VilrungwHe5Eej1IwnRYuhpauAqNtwwP3CY2j7uFT4XUk74E2vythTQ== +"@microsoft/signalr@6.0.21": + version "6.0.21" + resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.21.tgz#b45f335df7011abba831cb3d7974b58da7e725c7" + integrity sha512-3MWhSUE7AxkQs3QBuJ/spJJpg1mAHo0/6yRGhs5+Hew3Z+iqYrHVfo0yTElC7W2bVA9t3fW3jliQ9rBN0OvJLA== dependencies: abort-controller "^3.0.0" eventsource "^1.0.7" From 07b98f41374331edb393c394ec73b146ce3faf58 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 3 Sep 2023 11:13:56 +0300 Subject: [PATCH 147/964] Move scene flag to TorrentInfo and return tag in response --- .../IndexerTests/OrpheusTests/OrpheusFixture.cs | 6 +++--- .../IndexerTests/RedactedTests/RedactedFixture.cs | 6 +++--- .../SecretCinemaTests/SecretCinemaFixture.cs | 5 +++-- .../Indexers/Definitions/Gazelle/GazelleInfo.cs | 8 -------- .../Indexers/Definitions/Gazelle/GazelleParser.cs | 4 ++-- .../Indexers/Definitions/GreatPosterWall.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/Redacted.cs | 4 ++-- .../Indexers/Definitions/SecretCinema.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs | 2 +- src/NzbDrone.Core/Indexers/IndexerBase.cs | 13 +++++++++---- src/NzbDrone.Core/Parser/Model/TorrentInfo.cs | 1 + 12 files changed, 29 insertions(+), 30 deletions(-) delete mode 100644 src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleInfo.cs diff --git a/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs index 43ec59c53..f52b248c9 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs @@ -9,8 +9,8 @@ using NUnit.Framework; using NzbDrone.Common.Http; using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers.Definitions; -using NzbDrone.Core.Indexers.Definitions.Gazelle; using NzbDrone.Core.IndexerSearch.Definitions; +using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.IndexerTests.OrpheusTests @@ -40,9 +40,9 @@ namespace NzbDrone.Core.Test.IndexerTests.OrpheusTests var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 3000 } })).Releases; releases.Should().HaveCount(65); - releases.First().Should().BeOfType(); + releases.First().Should().BeOfType(); - var torrentInfo = releases.First() as GazelleInfo; + var torrentInfo = releases.First() as TorrentInfo; torrentInfo.Title.Should().Be("The Beatles - Abbey Road [1969] [Album] [2.0 Mix 2019] [MP3 V2 (VBR)] [BD]"); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); diff --git a/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs index a23162b5d..7a7cc836f 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs @@ -9,8 +9,8 @@ using NUnit.Framework; using NzbDrone.Common.Http; using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers.Definitions; -using NzbDrone.Core.Indexers.Definitions.Gazelle; using NzbDrone.Core.IndexerSearch.Definitions; +using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.IndexerTests.RedactedTests @@ -40,9 +40,9 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 3000 } })).Releases; releases.Should().HaveCount(39); - releases.First().Should().BeOfType(); + releases.First().Should().BeOfType(); - var torrentInfo = releases.First() as GazelleInfo; + var torrentInfo = releases.First() as TorrentInfo; torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication [1999] [Album] [US / Reissue 2020] [FLAC 24bit Lossless] [Vinyl]"); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); diff --git a/src/NzbDrone.Core.Test/IndexerTests/SecretCinemaTests/SecretCinemaFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/SecretCinemaTests/SecretCinemaFixture.cs index e3aa89400..7c5166d26 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/SecretCinemaTests/SecretCinemaFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/SecretCinemaTests/SecretCinemaFixture.cs @@ -11,6 +11,7 @@ using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers.Definitions; using NzbDrone.Core.Indexers.Definitions.Gazelle; using NzbDrone.Core.IndexerSearch.Definitions; +using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.IndexerTests.SecretCinemaTests @@ -40,9 +41,9 @@ namespace NzbDrone.Core.Test.IndexerTests.SecretCinemaTests var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases; releases.Should().HaveCount(3); - releases.First().Should().BeOfType(); + releases.First().Should().BeOfType(); - var torrentInfo = releases.First() as GazelleInfo; + var torrentInfo = releases.First() as TorrentInfo; torrentInfo.Title.Should().Be("Singin' in the Rain (1952) 2160p"); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleInfo.cs b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleInfo.cs deleted file mode 100644 index 3de3e99b8..000000000 --- a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Definitions.Gazelle; - -public class GazelleInfo : TorrentInfo -{ - public bool? Scene { get; set; } -} diff --git a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs index cd6b08ada..998ba835b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs @@ -69,7 +69,7 @@ public class GazelleParser : IParseIndexerResponse var infoUrl = GetInfoUrl(result.GroupId, id); - var release = new GazelleInfo + var release = new TorrentInfo { Guid = infoUrl, Title = WebUtility.HtmlDecode(title), @@ -108,7 +108,7 @@ public class GazelleParser : IParseIndexerResponse var groupName = WebUtility.HtmlDecode(result.GroupName); var infoUrl = GetInfoUrl(result.GroupId, id); - var release = new GazelleInfo + var release = new TorrentInfo { Guid = infoUrl, Title = groupName, diff --git a/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs b/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs index 744dbf642..f00ca9748 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs @@ -171,7 +171,7 @@ public class GreatPosterWallParser : GazelleParser var infoUrl = GetInfoUrl(result.GroupId.ToString(), torrent.TorrentId); var time = DateTime.SpecifyKind(torrent.Time, DateTimeKind.Unspecified); - var release = new GazelleInfo + var release = new TorrentInfo { Title = WebUtility.HtmlDecode(torrent.FileName).Trim(), Guid = infoUrl, diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index 3944bdd1b..f7a519684 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -265,7 +265,7 @@ namespace NzbDrone.Core.Indexers.Definitions var title = GetTitle(result, torrent); var infoUrl = GetInfoUrl(result.GroupId, id); - var release = new GazelleInfo + var release = new TorrentInfo { Guid = infoUrl, InfoUrl = infoUrl, @@ -306,7 +306,7 @@ namespace NzbDrone.Core.Indexers.Definitions var id = result.TorrentId; var infoUrl = GetInfoUrl(result.GroupId, id); - var release = new GazelleInfo + var release = new TorrentInfo { Guid = infoUrl, Title = WebUtility.HtmlDecode(result.GroupName), diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index 03d701acf..7016d8651 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -231,7 +231,7 @@ namespace NzbDrone.Core.Indexers.Definitions var title = GetTitle(result, torrent); var infoUrl = GetInfoUrl(result.GroupId, id); - var release = new GazelleInfo + var release = new TorrentInfo { Guid = infoUrl, InfoUrl = infoUrl, @@ -272,7 +272,7 @@ namespace NzbDrone.Core.Indexers.Definitions var id = result.TorrentId; var infoUrl = GetInfoUrl(result.GroupId, id); - var release = new GazelleInfo + var release = new TorrentInfo { Guid = infoUrl, Title = WebUtility.HtmlDecode(result.GroupName), diff --git a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs index c18111bd6..53b688450 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs @@ -110,7 +110,7 @@ public class SecretCinemaParser : IParseIndexerResponse var title = WebUtility.HtmlDecode(result.GroupName); var time = DateTime.SpecifyKind(torrent.Time, DateTimeKind.Unspecified); - var release = new GazelleInfo + var release = new TorrentInfo { Guid = $"SecretCinema-{id}", Title = title, @@ -170,7 +170,7 @@ public class SecretCinemaParser : IParseIndexerResponse var id = result.TorrentId; var groupName = WebUtility.HtmlDecode(result.GroupName); - var release = new GazelleInfo + var release = new TorrentInfo { Guid = $"SecretCinema-{id}", Title = groupName, diff --git a/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs b/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs index 6e7e83cfe..158ffb6fb 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs @@ -339,7 +339,7 @@ public class ShazbatParser : IParseIndexerResponse Seeders = seeders, Peers = seeders + leechers, PublishDate = publishDate, - IndexerFlags = new HashSet { IndexerFlag.Scene }, + Scene = true, Genres = row.QuerySelectorAll("label.label-tag").Select(t => t.TextContent.Trim()).ToList(), DownloadVolumeFactor = hasGlobalFreeleech ? 0 : 1, UploadVolumeFactor = 1, diff --git a/src/NzbDrone.Core/Indexers/IndexerBase.cs b/src/NzbDrone.Core/Indexers/IndexerBase.cs index e16f6b342..489bdbb27 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBase.cs @@ -131,12 +131,17 @@ namespace NzbDrone.Core.Indexers c.IndexerPrivacy = ((IndexerDefinition)Definition).Privacy; c.IndexerPriority = ((IndexerDefinition)Definition).Priority; - if (Protocol == DownloadProtocol.Torrent) + //Add common flags + if (Protocol == DownloadProtocol.Torrent && c is TorrentInfo torrentRelease) { - //Add common flags - if (((TorrentInfo)c).DownloadVolumeFactor == 0) + if (torrentRelease.DownloadVolumeFactor == 0) { - ((TorrentInfo)c).IndexerFlags.Add(IndexerFlag.FreeLeech); + torrentRelease.IndexerFlags.Add(IndexerFlag.FreeLeech); + } + + if (torrentRelease.Scene.GetValueOrDefault(false)) + { + torrentRelease.IndexerFlags.Add(IndexerFlag.Scene); } } }); diff --git a/src/NzbDrone.Core/Parser/Model/TorrentInfo.cs b/src/NzbDrone.Core/Parser/Model/TorrentInfo.cs index b8081f73b..9a44f58f3 100644 --- a/src/NzbDrone.Core/Parser/Model/TorrentInfo.cs +++ b/src/NzbDrone.Core/Parser/Model/TorrentInfo.cs @@ -13,6 +13,7 @@ namespace NzbDrone.Core.Parser.Model public long? MinimumSeedTime { get; set; } public double? DownloadVolumeFactor { get; set; } public double? UploadVolumeFactor { get; set; } + public bool? Scene { get; set; } public TorrentSeedConfiguration SeedConfiguration { get; set; } From c873b3ffac1e2c27a0e9d496a201f96f98b0507e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 3 Sep 2023 14:14:54 +0300 Subject: [PATCH 148/964] New: (UI) Add clone indexer in info modal --- frontend/src/Indexer/Index/IndexerIndex.tsx | 12 +++++++++++- .../src/Indexer/Index/Table/IndexerIndexRow.tsx | 4 +++- .../src/Indexer/Index/Table/IndexerIndexTable.tsx | 7 ++++++- frontend/src/Indexer/IndexerTitleLink.tsx | 4 +++- frontend/src/Indexer/Info/IndexerInfoModal.tsx | 4 +++- .../src/Indexer/Info/IndexerInfoModalContent.tsx | 15 ++++++++++++--- src/NzbDrone.Core/Localization/Core/en.json | 1 + 7 files changed, 39 insertions(+), 8 deletions(-) diff --git a/frontend/src/Indexer/Index/IndexerIndex.tsx b/frontend/src/Indexer/Index/IndexerIndex.tsx index 644c81493..3407aa05c 100644 --- a/frontend/src/Indexer/Index/IndexerIndex.tsx +++ b/frontend/src/Indexer/Index/IndexerIndex.tsx @@ -22,7 +22,7 @@ import AddIndexerModal from 'Indexer/Add/AddIndexerModal'; import EditIndexerModalConnector from 'Indexer/Edit/EditIndexerModalConnector'; import NoIndexer from 'Indexer/NoIndexer'; import { executeCommand } from 'Store/Actions/commandActions'; -import { testAllIndexers } from 'Store/Actions/indexerActions'; +import { cloneIndexer, testAllIndexers } from 'Store/Actions/indexerActions'; import { setIndexerFilter, setIndexerSort, @@ -98,6 +98,15 @@ const IndexerIndex = withScrollPosition((props: IndexerIndexProps) => { setIsEditIndexerModalOpen(false); }, [setIsEditIndexerModalOpen]); + const onCloneIndexerPress = useCallback( + (id: number) => { + dispatch(cloneIndexer({ id })); + + setIsEditIndexerModalOpen(true); + }, + [dispatch, setIsEditIndexerModalOpen] + ); + const onAppIndexerSyncPress = useCallback(() => { dispatch( executeCommand({ @@ -303,6 +312,7 @@ const IndexerIndex = withScrollPosition((props: IndexerIndexProps) => { jumpToCharacter={jumpToCharacter} isSelectMode={isSelectMode} isSmallScreen={isSmallScreen} + onCloneIndexerPress={onCloneIndexerPress} /> diff --git a/frontend/src/Indexer/Index/Table/IndexerIndexRow.tsx b/frontend/src/Indexer/Index/Table/IndexerIndexRow.tsx index 69afaeeba..721964298 100644 --- a/frontend/src/Indexer/Index/Table/IndexerIndexRow.tsx +++ b/frontend/src/Indexer/Index/Table/IndexerIndexRow.tsx @@ -27,10 +27,11 @@ interface IndexerIndexRowProps { sortKey: string; columns: Column[]; isSelectMode: boolean; + onCloneIndexerPress(id: number): void; } function IndexerIndexRow(props: IndexerIndexRowProps) { - const { indexerId, columns, isSelectMode } = props; + const { indexerId, columns, isSelectMode, onCloneIndexerPress } = props; const { indexer, appProfile, status, longDateFormat, timeFormat } = useSelector(createIndexerIndexItemSelector(props.indexerId)); @@ -153,6 +154,7 @@ function IndexerIndexRow(props: IndexerIndexRowProps) { ); diff --git a/frontend/src/Indexer/Index/Table/IndexerIndexTable.tsx b/frontend/src/Indexer/Index/Table/IndexerIndexTable.tsx index 7889b547d..ee717317a 100644 --- a/frontend/src/Indexer/Index/Table/IndexerIndexTable.tsx +++ b/frontend/src/Indexer/Index/Table/IndexerIndexTable.tsx @@ -26,6 +26,7 @@ interface RowItemData { sortKey: string; columns: Column[]; isSelectMode: boolean; + onCloneIndexerPress(id: number): void; } interface IndexerIndexTableProps { @@ -37,6 +38,7 @@ interface IndexerIndexTableProps { scrollerRef: RefObject; isSelectMode: boolean; isSmallScreen: boolean; + onCloneIndexerPress(id: number): void; } const columnsSelector = createSelector( @@ -49,7 +51,7 @@ const Row: React.FC> = ({ style, data, }) => { - const { items, sortKey, columns, isSelectMode } = data; + const { items, sortKey, columns, isSelectMode, onCloneIndexerPress } = data; if (index >= items.length) { return null; @@ -71,6 +73,7 @@ const Row: React.FC> = ({ sortKey={sortKey} columns={columns} isSelectMode={isSelectMode} + onCloneIndexerPress={onCloneIndexerPress} /> ); @@ -89,6 +92,7 @@ function IndexerIndexTable(props: IndexerIndexTableProps) { isSelectMode, isSmallScreen, scrollerRef, + onCloneIndexerPress, } = props; const columns = useSelector(columnsSelector); @@ -198,6 +202,7 @@ function IndexerIndexTable(props: IndexerIndexTableProps) { sortKey, columns, isSelectMode, + onCloneIndexerPress, }} > {Row} diff --git a/frontend/src/Indexer/IndexerTitleLink.tsx b/frontend/src/Indexer/IndexerTitleLink.tsx index 82f294d69..3c22b87f2 100644 --- a/frontend/src/Indexer/IndexerTitleLink.tsx +++ b/frontend/src/Indexer/IndexerTitleLink.tsx @@ -7,10 +7,11 @@ import styles from './IndexerTitleLink.css'; interface IndexerTitleLinkProps { indexerName: string; indexerId: number; + onCloneIndexerPress(id: number): void; } function IndexerTitleLink(props: IndexerTitleLinkProps) { - const { indexerName, indexerId } = props; + const { indexerName, indexerId, onCloneIndexerPress } = props; const [isIndexerInfoModalOpen, setIsIndexerInfoModalOpen] = useState(false); @@ -32,6 +33,7 @@ function IndexerTitleLink(props: IndexerTitleLinkProps) { indexerId={indexerId} isOpen={isIndexerInfoModalOpen} onModalClose={onIndexerInfoModalClose} + onCloneIndexerPress={onCloneIndexerPress} /> ); diff --git a/frontend/src/Indexer/Info/IndexerInfoModal.tsx b/frontend/src/Indexer/Info/IndexerInfoModal.tsx index df2ead86d..0c19dca1e 100644 --- a/frontend/src/Indexer/Info/IndexerInfoModal.tsx +++ b/frontend/src/Indexer/Info/IndexerInfoModal.tsx @@ -7,16 +7,18 @@ interface IndexerInfoModalProps { isOpen: boolean; indexerId: number; onModalClose(): void; + onCloneIndexerPress(id: number): void; } function IndexerInfoModal(props: IndexerInfoModalProps) { - const { isOpen, onModalClose, indexerId } = props; + const { isOpen, indexerId, onModalClose, onCloneIndexerPress } = props; return ( ); diff --git a/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx b/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx index 8cb10993a..24f93c39b 100644 --- a/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx +++ b/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx @@ -41,12 +41,13 @@ function createIndexerInfoItemSelector(indexerId: number) { interface IndexerInfoModalContentProps { indexerId: number; onModalClose(): void; + onCloneIndexerPress(id: number): void; } function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { - const { indexer } = useSelector( - createIndexerInfoItemSelector(props.indexerId) - ); + const { indexerId, onCloneIndexerPress } = props; + + const { indexer } = useSelector(createIndexerInfoItemSelector(indexerId)); const { id, @@ -92,6 +93,11 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { onModalClose(); }, [setIsDeleteIndexerModalOpen, onModalClose]); + const onCloneIndexerPressWrapper = useCallback(() => { + onCloneIndexerPress(id); + onModalClose(); + }, [id, onCloneIndexerPress, onModalClose]); + return ( {`${name}`} @@ -304,6 +310,9 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { > {translate('Delete')} + diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 4b26243ab..3412a360b 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -108,6 +108,7 @@ "ClearHistory": "Clear History", "ClearHistoryMessageText": "Are you sure you want to clear all Prowlarr history?", "ClientPriority": "Client Priority", + "Clone": "Clone", "CloneProfile": "Clone Profile", "Close": "Close", "CloseCurrentModal": "Close Current Modal", From b608e384543b5479957a303aa067ca6074fe8624 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 3 Sep 2023 10:56:43 -0500 Subject: [PATCH 149/964] New: Custom Filters for Stats --- .../src/App/State/IndexerStatsAppState.ts | 4 +- frontend/src/Indexer/Stats/IndexerStats.css | 11 +- .../src/Indexer/Stats/IndexerStats.css.d.ts | 1 + frontend/src/Indexer/Stats/IndexerStats.tsx | 118 +++++++++++------- .../Indexer/Stats/IndexerStatsFilterMenu.tsx | 27 ---- .../Indexer/Stats/IndexerStatsFilterModal.tsx | 56 +++++++++ .../src/Store/Actions/indexerStatsActions.js | 46 ++++--- frontend/src/Styles/Themes/dark.js | 1 + frontend/src/Styles/Themes/light.js | 1 + .../IndexerStatisticsServiceFixture.cs | 2 +- .../IndexerStats/IndexerStatisticsService.cs | 12 +- .../Indexers/IndexerStatsController.cs | 32 ++++- 12 files changed, 214 insertions(+), 97 deletions(-) delete mode 100644 frontend/src/Indexer/Stats/IndexerStatsFilterMenu.tsx create mode 100644 frontend/src/Indexer/Stats/IndexerStatsFilterModal.tsx diff --git a/frontend/src/App/State/IndexerStatsAppState.ts b/frontend/src/App/State/IndexerStatsAppState.ts index a696860b3..8d3ae660a 100644 --- a/frontend/src/App/State/IndexerStatsAppState.ts +++ b/frontend/src/App/State/IndexerStatsAppState.ts @@ -1,9 +1,11 @@ import { AppSectionItemState } from 'App/State/AppSectionState'; -import { Filter } from 'App/State/AppState'; +import { Filter, FilterBuilderProp } from 'App/State/AppState'; +import Indexer from 'Indexer/Indexer'; import { IndexerStats } from 'typings/IndexerStats'; export interface IndexerStatsAppState extends AppSectionItemState { + filterBuilderProps: FilterBuilderProp[]; selectedFilterKey: string; filters: Filter[]; } diff --git a/frontend/src/Indexer/Stats/IndexerStats.css b/frontend/src/Indexer/Stats/IndexerStats.css index 249dcc448..a6ec01190 100644 --- a/frontend/src/Indexer/Stats/IndexerStats.css +++ b/frontend/src/Indexer/Stats/IndexerStats.css @@ -1,20 +1,25 @@ .fullWidthChart { display: inline-block; - padding: 15px 25px; width: 100%; - height: 300px; } .halfWidthChart { display: inline-block; - padding: 15px 25px; width: 50%; +} + +.chartContainer { + margin: 5px; + padding: 15px 25px; height: 300px; + border-radius: 10px; + background-color: var(--chartBackgroundColor); } @media only screen and (max-width: $breakpointSmall) { .halfWidthChart { display: inline-block; + margin: 5px; padding: 15px 25px; width: 100%; height: 300px; diff --git a/frontend/src/Indexer/Stats/IndexerStats.css.d.ts b/frontend/src/Indexer/Stats/IndexerStats.css.d.ts index ce2364202..6bb12271e 100644 --- a/frontend/src/Indexer/Stats/IndexerStats.css.d.ts +++ b/frontend/src/Indexer/Stats/IndexerStats.css.d.ts @@ -1,6 +1,7 @@ // This file is automatically generated. // Please do not change this file! interface CssExports { + 'chartContainer': string; 'fullWidthChart': string; 'halfWidthChart': string; } diff --git a/frontend/src/Indexer/Stats/IndexerStats.tsx b/frontend/src/Indexer/Stats/IndexerStats.tsx index 0a61fc8fc..312690d6a 100644 --- a/frontend/src/Indexer/Stats/IndexerStats.tsx +++ b/frontend/src/Indexer/Stats/IndexerStats.tsx @@ -8,6 +8,7 @@ import BarChart from 'Components/Chart/BarChart'; import DoughnutChart from 'Components/Chart/DoughnutChart'; import StackedBarChart from 'Components/Chart/StackedBarChart'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; +import FilterMenu from 'Components/Menu/FilterMenu'; import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; import PageToolbar from 'Components/Page/Toolbar/PageToolbar'; @@ -17,6 +18,7 @@ import { fetchIndexerStats, setIndexerStatsFilter, } from 'Store/Actions/indexerStatsActions'; +import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector'; import { IndexerStatsHost, IndexerStatsIndexer, @@ -24,7 +26,7 @@ import { } from 'typings/IndexerStats'; import getErrorMessage from 'Utilities/Object/getErrorMessage'; import translate from 'Utilities/String/translate'; -import IndexerStatsFilterMenu from './IndexerStatsFilterMenu'; +import IndexerStatsFilterModal from './IndexerStatsFilterModal'; import styles from './IndexerStats.css'; function getAverageResponseTimeData(indexerStats: IndexerStatsIndexer[]) { @@ -165,15 +167,26 @@ function getHostQueryData(indexerStats: IndexerStatsHost[]) { const indexerStatsSelector = () => { return createSelector( (state: AppState) => state.indexerStats, - (indexerStats: IndexerStatsAppState) => { - return indexerStats; + createCustomFiltersSelector('indexerStats'), + (indexerStats: IndexerStatsAppState, customFilters) => { + return { + ...indexerStats, + customFilters, + }; } ); }; function IndexerStats() { - const { isFetching, isPopulated, item, error, filters, selectedFilterKey } = - useSelector(indexerStatsSelector()); + const { + isFetching, + isPopulated, + item, + error, + filters, + customFilters, + selectedFilterKey, + } = useSelector(indexerStatsSelector()); const dispatch = useDispatch(); useEffect(() => { @@ -193,10 +206,13 @@ function IndexerStats() { - @@ -213,57 +229,73 @@ function IndexerStats() { {isLoaded && (
    - +
    + +
    - +
    + +
    - +
    + +
    - +
    + +
    - +
    + +
    - +
    + +
    - +
    + +
    - +
    + +
    )} diff --git a/frontend/src/Indexer/Stats/IndexerStatsFilterMenu.tsx b/frontend/src/Indexer/Stats/IndexerStatsFilterMenu.tsx deleted file mode 100644 index 7b30be4c3..000000000 --- a/frontend/src/Indexer/Stats/IndexerStatsFilterMenu.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react'; -import FilterMenu from 'Components/Menu/FilterMenu'; -import { align } from 'Helpers/Props'; - -interface IndexerStatsFilterMenuProps { - selectedFilterKey: string | number; - filters: object[]; - isDisabled: boolean; - onFilterSelect(filterName: string): unknown; -} - -function IndexerStatsFilterMenu(props: IndexerStatsFilterMenuProps) { - const { selectedFilterKey, filters, isDisabled, onFilterSelect } = props; - - return ( - - ); -} - -export default IndexerStatsFilterMenu; diff --git a/frontend/src/Indexer/Stats/IndexerStatsFilterModal.tsx b/frontend/src/Indexer/Stats/IndexerStatsFilterModal.tsx new file mode 100644 index 000000000..6e3a49dfb --- /dev/null +++ b/frontend/src/Indexer/Stats/IndexerStatsFilterModal.tsx @@ -0,0 +1,56 @@ +import React, { useCallback } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; +import FilterModal from 'Components/Filter/FilterModal'; +import { setIndexerStatsFilter } from 'Store/Actions/indexerStatsActions'; + +function createIndexerStatsSelector() { + return createSelector( + (state: AppState) => state.indexerStats.item, + (indexerStats) => { + return indexerStats; + } + ); +} + +function createFilterBuilderPropsSelector() { + return createSelector( + (state: AppState) => state.indexerStats.filterBuilderProps, + (filterBuilderProps) => { + return filterBuilderProps; + } + ); +} + +interface IndexerStatsFilterModalProps { + isOpen: boolean; +} + +export default function IndexerStatsFilterModal( + props: IndexerStatsFilterModalProps +) { + const sectionItems = [useSelector(createIndexerStatsSelector())]; + const filterBuilderProps = useSelector(createFilterBuilderPropsSelector()); + const customFilterType = 'indexerStats'; + + const dispatch = useDispatch(); + + const dispatchSetFilter = useCallback( + (payload: unknown) => { + dispatch(setIndexerStatsFilter(payload)); + }, + [dispatch] + ); + + return ( + + ); +} diff --git a/frontend/src/Store/Actions/indexerStatsActions.js b/frontend/src/Store/Actions/indexerStatsActions.js index 9171ee340..dc928d9b5 100644 --- a/frontend/src/Store/Actions/indexerStatsActions.js +++ b/frontend/src/Store/Actions/indexerStatsActions.js @@ -3,6 +3,7 @@ import { batchActions } from 'redux-batched-actions'; import { filterBuilderTypes, filterBuilderValueTypes } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; +import findSelectedFilters from 'Utilities/Filter/findSelectedFilters'; import translate from 'Utilities/String/translate'; import { set, update } from './baseActions'; import createHandleActions from './Creators/createHandleActions'; @@ -55,19 +56,20 @@ export const defaultState = { filterBuilderProps: [ { - name: 'startDate', - label: 'Start Date', - type: filterBuilderTypes.EXACT, - valueType: filterBuilderValueTypes.DATE + name: 'indexers', + label: () => translate('Indexers'), + type: filterBuilderTypes.CONTAINS, + valueType: filterBuilderValueTypes.INDEXER }, { - name: 'endDate', - label: 'End Date', - type: filterBuilderTypes.EXACT, - valueType: filterBuilderValueTypes.DATE + name: 'tags', + label: () => translate('Tags'), + type: filterBuilderTypes.CONTAINS, + valueType: filterBuilderValueTypes.TAG } ], - selectedFilterKey: 'all' + selectedFilterKey: 'all', + customFilters: [] }; export const persistState = [ @@ -81,6 +83,10 @@ export const persistState = [ export const FETCH_INDEXER_STATS = 'indexerStats/fetchIndexerStats'; export const SET_INDEXER_STATS_FILTER = 'indexerStats/setIndexerStatsFilter'; +function getCustomFilters(state, type) { + return state.customFilters.items.filter((customFilter) => customFilter.type === type); +} + // // Action Creators @@ -94,23 +100,35 @@ export const actionHandlers = handleThunks({ [FETCH_INDEXER_STATS]: function(getState, payload, dispatch) { const state = getState(); const indexerStats = state.indexerStats; + const customFilters = getCustomFilters(state, section); + const selectedFilters = findSelectedFilters(indexerStats.selectedFilterKey, indexerStats.filters, customFilters); const requestParams = { endDate: moment().toISOString() }; + selectedFilters.forEach((selectedFilter) => { + if (selectedFilter.key === 'indexers') { + requestParams.indexers = selectedFilter.value.join(','); + } + + if (selectedFilter.key === 'tags') { + requestParams.tags = selectedFilter.value.join(','); + } + }); + if (indexerStats.selectedFilterKey !== 'all') { - let dayCount = 7; + if (indexerStats.selectedFilterKey === 'lastSeven') { + requestParams.startDate = moment().add(-7, 'days').endOf('day').toISOString(); + } if (indexerStats.selectedFilterKey === 'lastThirty') { - dayCount = 30; + requestParams.startDate = moment().add(-30, 'days').endOf('day').toISOString(); } if (indexerStats.selectedFilterKey === 'lastNinety') { - dayCount = 90; + requestParams.startDate = moment().add(-90, 'days').endOf('day').toISOString(); } - - requestParams.startDate = moment().add(-dayCount, 'days').endOf('day').toISOString(); } const basesAttrs = { diff --git a/frontend/src/Styles/Themes/dark.js b/frontend/src/Styles/Themes/dark.js index 06c0304ea..79911686f 100644 --- a/frontend/src/Styles/Themes/dark.js +++ b/frontend/src/Styles/Themes/dark.js @@ -187,6 +187,7 @@ module.exports = { // // Charts + chartBackgroundColor: '#262626', failedColors: ['#ffbeb2', '#feb4a6', '#fdab9b', '#fca290', '#fb9984', '#fa8f79', '#f9856e', '#f77b66', '#f5715d', '#f36754', '#f05c4d', '#ec5049', '#e74545', '#e13b42', '#da323f', '#d3293d', '#ca223c', '#c11a3b', '#b8163a', '#ae123a'], chartColorsDiversified: ['#90caf9', '#f4d166', '#ff8a65', '#ce93d8', '#80cba9', '#ffab91', '#8097ea', '#bcaaa4', '#a57583', '#e4e498', '#9e96af', '#c6ab81', '#6972c6', '#619fc6', '#81ad81', '#f48fb1', '#82afca', '#b5b071', '#8b959b', '#7ec0b4'], chartColors: ['#f4d166', '#f6c760', '#f8bc58', '#f8b252', '#f7a84a', '#f69e41', '#f49538', '#f38b2f', '#f28026', '#f0751e', '#eb6c1c', '#e4641e', '#de5d1f', '#d75521', '#cf4f22', '#c64a22', '#bc4623', '#b24223', '#a83e24', '#9e3a26'] diff --git a/frontend/src/Styles/Themes/light.js b/frontend/src/Styles/Themes/light.js index 5ff84460c..8a6d123b2 100644 --- a/frontend/src/Styles/Themes/light.js +++ b/frontend/src/Styles/Themes/light.js @@ -187,6 +187,7 @@ module.exports = { // // Charts + chartBackgroundColor: '#fff', failedColors: ['#ffbeb2', '#feb4a6', '#fdab9b', '#fca290', '#fb9984', '#fa8f79', '#f9856e', '#f77b66', '#f5715d', '#f36754', '#f05c4d', '#ec5049', '#e74545', '#e13b42', '#da323f', '#d3293d', '#ca223c', '#c11a3b', '#b8163a', '#ae123a'], chartColorsDiversified: ['#90caf9', '#f4d166', '#ff8a65', '#ce93d8', '#80cba9', '#ffab91', '#8097ea', '#bcaaa4', '#a57583', '#e4e498', '#9e96af', '#c6ab81', '#6972c6', '#619fc6', '#81ad81', '#f48fb1', '#82afca', '#b5b071', '#8b959b', '#7ec0b4'], chartColors: ['#f4d166', '#f6c760', '#f8bc58', '#f8b252', '#f7a84a', '#f69e41', '#f49538', '#f38b2f', '#f28026', '#f0751e', '#eb6c1c', '#e4641e', '#de5d1f', '#d75521', '#cf4f22', '#c64a22', '#bc4623', '#b24223', '#a83e24', '#9e3a26'] diff --git a/src/NzbDrone.Core.Test/IndexerStatsTests/IndexerStatisticsServiceFixture.cs b/src/NzbDrone.Core.Test/IndexerStatsTests/IndexerStatisticsServiceFixture.cs index c0ec172b4..b8f4ef702 100644 --- a/src/NzbDrone.Core.Test/IndexerStatsTests/IndexerStatisticsServiceFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerStatsTests/IndexerStatisticsServiceFixture.cs @@ -46,7 +46,7 @@ namespace NzbDrone.Core.Test.IndexerStatsTests .Setup(o => o.Between(It.IsAny(), It.IsAny())) .Returns((s, f) => history); - var statistics = Subject.IndexerStatistics(DateTime.UtcNow.AddMonths(-1), DateTime.UtcNow); + var statistics = Subject.IndexerStatistics(DateTime.UtcNow.AddMonths(-1), DateTime.UtcNow, new List { 5 }); statistics.IndexerStatistics.Count.Should().Be(1); statistics.IndexerStatistics.First().AverageResponseTime.Should().Be(0); diff --git a/src/NzbDrone.Core/IndexerStats/IndexerStatisticsService.cs b/src/NzbDrone.Core/IndexerStats/IndexerStatisticsService.cs index bb92b2d1d..fd603ece8 100644 --- a/src/NzbDrone.Core/IndexerStats/IndexerStatisticsService.cs +++ b/src/NzbDrone.Core/IndexerStats/IndexerStatisticsService.cs @@ -8,7 +8,7 @@ namespace NzbDrone.Core.IndexerStats { public interface IIndexerStatisticsService { - CombinedStatistics IndexerStatistics(DateTime start, DateTime end); + CombinedStatistics IndexerStatistics(DateTime start, DateTime end, List indexerIds); } public class IndexerStatisticsService : IIndexerStatisticsService @@ -22,13 +22,15 @@ namespace NzbDrone.Core.IndexerStats _indexerFactory = indexerFactory; } - public CombinedStatistics IndexerStatistics(DateTime start, DateTime end) + public CombinedStatistics IndexerStatistics(DateTime start, DateTime end, List indexerIds) { var history = _historyService.Between(start, end); - var groupedByIndexer = history.GroupBy(h => h.IndexerId); - var groupedByUserAgent = history.GroupBy(h => h.Data.GetValueOrDefault("source") ?? ""); - var groupedByHost = history.GroupBy(h => h.Data.GetValueOrDefault("host") ?? ""); + var filteredHistory = history.Where(h => indexerIds.Contains(h.IndexerId)); + + var groupedByIndexer = filteredHistory.GroupBy(h => h.IndexerId); + var groupedByUserAgent = filteredHistory.GroupBy(h => h.Data.GetValueOrDefault("source") ?? ""); + var groupedByHost = filteredHistory.GroupBy(h => h.Data.GetValueOrDefault("host") ?? ""); var indexerStatsList = new List(); var userAgentStatsList = new List(); diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerStatsController.cs b/src/Prowlarr.Api.V1/Indexers/IndexerStatsController.cs index 0e352506c..1b9b1ec91 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerStatsController.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerStatsController.cs @@ -1,6 +1,11 @@ using System; +using System.Collections.Generic; +using System.Linq; using Microsoft.AspNetCore.Mvc; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Indexers; using NzbDrone.Core.IndexerStats; +using NzbDrone.Core.Tags; using Prowlarr.Http; namespace Prowlarr.Api.V1.Indexers @@ -9,20 +14,41 @@ namespace Prowlarr.Api.V1.Indexers public class IndexerStatsController : Controller { private readonly IIndexerStatisticsService _indexerStatisticsService; + private readonly IIndexerFactory _indexerFactory; + private readonly ITagService _tagService; - public IndexerStatsController(IIndexerStatisticsService indexerStatisticsService) + public IndexerStatsController(IIndexerStatisticsService indexerStatisticsService, IIndexerFactory indexerFactory, ITagService tagService) { _indexerStatisticsService = indexerStatisticsService; + _indexerFactory = indexerFactory; + _tagService = tagService; } [HttpGet] [Produces("application/json")] - public IndexerStatsResource GetAll(DateTime? startDate, DateTime? endDate) + public IndexerStatsResource GetAll(DateTime? startDate, DateTime? endDate, string indexers, string tags) { var statsStartDate = startDate ?? DateTime.MinValue; var statsEndDate = endDate ?? DateTime.Now; + var parsedIndexers = new List(); + var parsedTags = new List(); + var indexerIds = _indexerFactory.All().Select(i => i.Id).ToList(); - var indexerStats = _indexerStatisticsService.IndexerStatistics(statsStartDate, statsEndDate); + if (tags.IsNotNullOrWhiteSpace()) + { + parsedTags.AddRange(tags.Split(',').Select(_tagService.GetTag).Select(t => t.Id)); + + indexerIds = indexerIds.Intersect(parsedTags.SelectMany(t => _indexerFactory.AllForTag(t).Select(i => i.Id))).ToList(); + } + + if (indexers.IsNotNullOrWhiteSpace()) + { + parsedIndexers.AddRange(indexers.Split(',').Select(x => Convert.ToInt32(x))); + + indexerIds = indexerIds.Intersect(parsedIndexers).ToList(); + } + + var indexerStats = _indexerStatisticsService.IndexerStatistics(statsStartDate, statsEndDate, indexerIds); var indexerResource = new IndexerStatsResource { From 0f160707d3df41c8ba57a1e09b812b964e083a28 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 3 Sep 2023 11:58:24 -0500 Subject: [PATCH 150/964] Chart style updates --- frontend/src/Components/Chart/BarChart.js | 11 ++++++++++- frontend/src/Components/Chart/DoughnutChart.js | 11 ++++++++++- frontend/src/Components/Chart/StackedBarChart.js | 11 ++++++++++- frontend/src/Indexer/Stats/IndexerStats.tsx | 2 ++ src/NzbDrone.Core/Localization/Core/en.json | 2 +- 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/frontend/src/Components/Chart/BarChart.js b/frontend/src/Components/Chart/BarChart.js index b9d7f0acc..83176c989 100644 --- a/frontend/src/Components/Chart/BarChart.js +++ b/frontend/src/Components/Chart/BarChart.js @@ -2,6 +2,7 @@ import Chart from 'chart.js/auto'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { kinds } from 'Helpers/Props'; +import { defaultFontFamily } from 'Styles/Variables/fonts'; function getColors(kind) { @@ -39,7 +40,15 @@ class BarChart extends Component { plugins: { title: { display: true, - text: this.props.title + align: 'start', + text: this.props.title, + padding: { + bottom: 30 + }, + font: { + size: 14, + family: defaultFontFamily + } }, legend: { display: this.props.legend diff --git a/frontend/src/Components/Chart/DoughnutChart.js b/frontend/src/Components/Chart/DoughnutChart.js index dd5052e23..d10979aa1 100644 --- a/frontend/src/Components/Chart/DoughnutChart.js +++ b/frontend/src/Components/Chart/DoughnutChart.js @@ -1,6 +1,7 @@ import Chart from 'chart.js/auto'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import { defaultFontFamily } from 'Styles/Variables/fonts'; function getColors(kind) { @@ -22,7 +23,15 @@ class DoughnutChart extends Component { plugins: { title: { display: true, - text: this.props.title + align: 'start', + text: this.props.title, + padding: { + bottom: 30 + }, + font: { + size: 14, + family: defaultFontFamily + } }, legend: { position: 'bottom' diff --git a/frontend/src/Components/Chart/StackedBarChart.js b/frontend/src/Components/Chart/StackedBarChart.js index d6e4879d2..3cca1ba81 100644 --- a/frontend/src/Components/Chart/StackedBarChart.js +++ b/frontend/src/Components/Chart/StackedBarChart.js @@ -1,6 +1,7 @@ import Chart from 'chart.js/auto'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import { defaultFontFamily } from 'Styles/Variables/fonts'; function getColors(index) { @@ -36,7 +37,15 @@ class StackedBarChart extends Component { plugins: { title: { display: true, - text: this.props.title + align: 'start', + text: this.props.title, + padding: { + bottom: 30 + }, + font: { + size: 14, + family: defaultFontFamily + } } } }, diff --git a/frontend/src/Indexer/Stats/IndexerStats.tsx b/frontend/src/Indexer/Stats/IndexerStats.tsx index 312690d6a..88e2c3a62 100644 --- a/frontend/src/Indexer/Stats/IndexerStats.tsx +++ b/frontend/src/Indexer/Stats/IndexerStats.tsx @@ -233,6 +233,7 @@ function IndexerStats() { @@ -241,6 +242,7 @@ function IndexerStats() { diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 3412a360b..6b1f429e6 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -79,7 +79,7 @@ "Author": "Author", "Automatic": "Automatic", "AutomaticSearch": "Automatic Search", - "AverageResponseTimesMs": "Average Response Times (Ms)", + "AverageResponseTimesMs": "Average Indexer Response Times (ms)", "Backup": "Backup", "BackupFolderHelpText": "Relative paths will be under Prowlarr's AppData directory", "BackupIntervalHelpText": "Interval between automatic backups", From 3dd3c80b54e016a8377c603769878b84f3c7eb99 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 3 Sep 2023 14:47:07 -0500 Subject: [PATCH 151/964] New: Indexer history in indexer info modal --- frontend/src/App/State/AppState.ts | 4 + frontend/src/App/State/HistoryAppState.ts | 8 + frontend/src/App/State/IndexerAppState.ts | 3 + .../Table/Cells/RelativeDateCell.js | 80 ++-- .../Table/Cells/RelativeDateCellConnector.js | 20 - .../History/Details/HistoryDetailsModal.css | 5 - .../History/Details/HistoryDetailsModal.js | 19 - frontend/src/History/HistoryRow.js | 4 +- .../Indexer/Index/Table/IndexerIndexRow.tsx | 6 +- .../Indexer/Info/History/IndexerHistory.tsx | 134 ++++++ .../Info/History/IndexerHistoryRow.css | 18 + .../Info/History/IndexerHistoryRow.css.d.ts} | 5 +- .../Info/History/IndexerHistoryRow.tsx | 83 ++++ .../src/Indexer/Info/IndexerInfoModal.tsx | 2 +- .../Indexer/Info/IndexerInfoModalContent.css | 31 ++ .../Info/IndexerInfoModalContent.css.d.ts | 5 + .../Indexer/Info/IndexerInfoModalContent.tsx | 432 ++++++++++-------- frontend/src/Store/Actions/index.js | 2 + .../Store/Actions/indexerHistoryActions.js | 81 ++++ frontend/src/System/Backup/BackupRow.js | 4 +- frontend/src/System/Events/LogsTableRow.js | 4 +- .../src/System/Logs/Files/LogFilesTableRow.js | 4 +- frontend/src/typings/History.ts | 21 + package.json | 1 + src/NzbDrone.Core/Localization/Core/en.json | 2 + .../History/HistoryController.cs | 7 +- yarn.lock | 10 +- 27 files changed, 707 insertions(+), 288 deletions(-) create mode 100644 frontend/src/App/State/HistoryAppState.ts delete mode 100644 frontend/src/Components/Table/Cells/RelativeDateCellConnector.js delete mode 100644 frontend/src/History/Details/HistoryDetailsModal.css create mode 100644 frontend/src/Indexer/Info/History/IndexerHistory.tsx create mode 100644 frontend/src/Indexer/Info/History/IndexerHistoryRow.css rename frontend/src/{History/Details/HistoryDetailsModal.css.d.ts => Indexer/Info/History/IndexerHistoryRow.css.d.ts} (66%) create mode 100644 frontend/src/Indexer/Info/History/IndexerHistoryRow.tsx create mode 100644 frontend/src/Store/Actions/indexerHistoryActions.js create mode 100644 frontend/src/typings/History.ts diff --git a/frontend/src/App/State/AppState.ts b/frontend/src/App/State/AppState.ts index 3d8f78443..2490f739f 100644 --- a/frontend/src/App/State/AppState.ts +++ b/frontend/src/App/State/AppState.ts @@ -1,5 +1,7 @@ import CommandAppState from './CommandAppState'; +import HistoryAppState from './HistoryAppState'; import IndexerAppState, { + IndexerHistoryAppState, IndexerIndexAppState, IndexerStatusAppState, } from './IndexerAppState'; @@ -42,6 +44,8 @@ export interface CustomFilter { interface AppState { commands: CommandAppState; + history: HistoryAppState; + indexerHistory: IndexerHistoryAppState; indexerIndex: IndexerIndexAppState; indexerStats: IndexerStatsAppState; indexerStatus: IndexerStatusAppState; diff --git a/frontend/src/App/State/HistoryAppState.ts b/frontend/src/App/State/HistoryAppState.ts new file mode 100644 index 000000000..dbce6bd7c --- /dev/null +++ b/frontend/src/App/State/HistoryAppState.ts @@ -0,0 +1,8 @@ +import AppSectionState from 'App/State/AppSectionState'; +import History from 'typings/History'; + +interface HistoryAppState extends AppSectionState { + pageSize: number; +} + +export default HistoryAppState; diff --git a/frontend/src/App/State/IndexerAppState.ts b/frontend/src/App/State/IndexerAppState.ts index c75c8abb0..d070986af 100644 --- a/frontend/src/App/State/IndexerAppState.ts +++ b/frontend/src/App/State/IndexerAppState.ts @@ -1,6 +1,7 @@ import Column from 'Components/Table/Column'; import SortDirection from 'Helpers/Props/SortDirection'; import Indexer, { IndexerStatus } from 'Indexer/Indexer'; +import History from 'typings/History'; import AppSectionState, { AppSectionDeleteState, AppSectionSaveState, @@ -34,4 +35,6 @@ interface IndexerAppState export type IndexerStatusAppState = AppSectionState; +export type IndexerHistoryAppState = AppSectionState; + export default IndexerAppState; diff --git a/frontend/src/Components/Table/Cells/RelativeDateCell.js b/frontend/src/Components/Table/Cells/RelativeDateCell.js index 207b97752..4bf94cf57 100644 --- a/frontend/src/Components/Table/Cells/RelativeDateCell.js +++ b/frontend/src/Components/Table/Cells/RelativeDateCell.js @@ -1,58 +1,66 @@ import PropTypes from 'prop-types'; -import React, { PureComponent } from 'react'; +import React from 'react'; +import { useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; import formatDateTime from 'Utilities/Date/formatDateTime'; import getRelativeDate from 'Utilities/Date/getRelativeDate'; import TableRowCell from './TableRowCell'; import styles from './RelativeDateCell.css'; -class RelativeDateCell extends PureComponent { +function createRelativeDateCellSelector() { + return createSelector(createUISettingsSelector(), (uiSettings) => { + return { + showRelativeDates: uiSettings.showRelativeDates, + shortDateFormat: uiSettings.shortDateFormat, + longDateFormat: uiSettings.longDateFormat, + timeFormat: uiSettings.timeFormat + }; + }); +} +function RelativeDateCell(props) { // // Render - render() { - const { - className, - date, - includeSeconds, - showRelativeDates, - shortDateFormat, - longDateFormat, - timeFormat, - component: Component, - dispatch, - ...otherProps - } = this.props; + const { + className, + date, + includeSeconds, + component: Component, + dispatch, + ...otherProps + } = props; - if (!date) { - return ( - - ); - } + const { showRelativeDates, shortDateFormat, longDateFormat, timeFormat } = + useSelector(createRelativeDateCellSelector()); - return ( - - {getRelativeDate(date, shortDateFormat, showRelativeDates, { timeFormat, includeSeconds, timeForToday: true })} - - ); + if (!date) { + return ; } + + return ( + + {getRelativeDate(date, shortDateFormat, showRelativeDates, { + timeFormat, + includeSeconds, + timeForToday: true + })} + + ); } RelativeDateCell.propTypes = { className: PropTypes.string.isRequired, date: PropTypes.string, includeSeconds: PropTypes.bool.isRequired, - showRelativeDates: PropTypes.bool.isRequired, - shortDateFormat: PropTypes.string.isRequired, - longDateFormat: PropTypes.string.isRequired, - timeFormat: PropTypes.string.isRequired, component: PropTypes.elementType, dispatch: PropTypes.func }; diff --git a/frontend/src/Components/Table/Cells/RelativeDateCellConnector.js b/frontend/src/Components/Table/Cells/RelativeDateCellConnector.js deleted file mode 100644 index 38783e7a5..000000000 --- a/frontend/src/Components/Table/Cells/RelativeDateCellConnector.js +++ /dev/null @@ -1,20 +0,0 @@ -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; -import RelativeDateCell from './RelativeDateCell'; - -function createMapStateToProps() { - return createSelector( - createUISettingsSelector(), - (uiSettings) => { - return { - showRelativeDates: uiSettings.showRelativeDates, - shortDateFormat: uiSettings.shortDateFormat, - longDateFormat: uiSettings.longDateFormat, - timeFormat: uiSettings.timeFormat - }; - } - ); -} - -export default connect(createMapStateToProps, null)(RelativeDateCell); diff --git a/frontend/src/History/Details/HistoryDetailsModal.css b/frontend/src/History/Details/HistoryDetailsModal.css deleted file mode 100644 index 271d422ff..000000000 --- a/frontend/src/History/Details/HistoryDetailsModal.css +++ /dev/null @@ -1,5 +0,0 @@ -.markAsFailedButton { - composes: button from '~Components/Link/Button.css'; - - margin-right: auto; -} diff --git a/frontend/src/History/Details/HistoryDetailsModal.js b/frontend/src/History/Details/HistoryDetailsModal.js index e6f960c48..fbc3114ad 100644 --- a/frontend/src/History/Details/HistoryDetailsModal.js +++ b/frontend/src/History/Details/HistoryDetailsModal.js @@ -1,16 +1,13 @@ import PropTypes from 'prop-types'; import React from 'react'; import Button from 'Components/Link/Button'; -import SpinnerButton from 'Components/Link/SpinnerButton'; import Modal from 'Components/Modal/Modal'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; -import { kinds } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import HistoryDetails from './HistoryDetails'; -import styles from './HistoryDetailsModal.css'; function getHeaderTitle(eventType) { switch (eventType) { @@ -33,10 +30,8 @@ function HistoryDetailsModal(props) { eventType, indexer, data, - isMarkingAsFailed, shortDateFormat, timeFormat, - onMarkAsFailedPress, onModalClose } = props; @@ -61,18 +56,6 @@ function HistoryDetailsModal(props) { - { - eventType === 'grabbed' && - - Mark as Failed - - } -
    + + {items.map((item) => { + return ( + + ); + })} + +
    + ); + } + + return null; +} + +export default IndexerHistory; diff --git a/frontend/src/Indexer/Info/History/IndexerHistoryRow.css b/frontend/src/Indexer/Info/History/IndexerHistoryRow.css new file mode 100644 index 000000000..9e9bae9c0 --- /dev/null +++ b/frontend/src/Indexer/Info/History/IndexerHistoryRow.css @@ -0,0 +1,18 @@ +.query { + composes: cell from '~Components/Table/Cells/TableRowCell.css'; + + width: 120px; +} + +.elapsedTime, +.source { + composes: cell from '~Components/Table/Cells/TableRowCell.css'; + + width: 150px; +} + +.details { + composes: cell from '~Components/Table/Cells/TableRowCell.css'; + + width: 70px; +} diff --git a/frontend/src/History/Details/HistoryDetailsModal.css.d.ts b/frontend/src/Indexer/Info/History/IndexerHistoryRow.css.d.ts similarity index 66% rename from frontend/src/History/Details/HistoryDetailsModal.css.d.ts rename to frontend/src/Indexer/Info/History/IndexerHistoryRow.css.d.ts index a8cc499e2..b2c4d327a 100644 --- a/frontend/src/History/Details/HistoryDetailsModal.css.d.ts +++ b/frontend/src/Indexer/Info/History/IndexerHistoryRow.css.d.ts @@ -1,7 +1,10 @@ // This file is automatically generated. // Please do not change this file! interface CssExports { - 'markAsFailedButton': string; + 'details': string; + 'elapsedTime': string; + 'query': string; + 'source': string; } export const cssExports: CssExports; export default cssExports; diff --git a/frontend/src/Indexer/Info/History/IndexerHistoryRow.tsx b/frontend/src/Indexer/Info/History/IndexerHistoryRow.tsx new file mode 100644 index 000000000..d115cc026 --- /dev/null +++ b/frontend/src/Indexer/Info/History/IndexerHistoryRow.tsx @@ -0,0 +1,83 @@ +import React, { useCallback, useState } from 'react'; +import IconButton from 'Components/Link/IconButton'; +import RelativeDateCell from 'Components/Table/Cells/RelativeDateCell'; +import TableRowCell from 'Components/Table/Cells/TableRowCell'; +import TableRow from 'Components/Table/TableRow'; +import { icons } from 'Helpers/Props'; +import HistoryDetailsModal from 'History/Details/HistoryDetailsModal'; +import HistoryEventTypeCell from 'History/HistoryEventTypeCell'; +import Indexer from 'Indexer/Indexer'; +import { HistoryData } from 'typings/History'; +import translate from 'Utilities/String/translate'; +import styles from './IndexerHistoryRow.css'; + +interface IndexerHistoryRowProps { + data: HistoryData; + date: string; + eventType: string; + successful: boolean; + indexer: Indexer; + shortDateFormat: string; + timeFormat: string; +} + +function IndexerHistoryRow(props: IndexerHistoryRowProps) { + const { + data, + date, + eventType, + successful, + indexer, + shortDateFormat, + timeFormat, + } = props; + + const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false); + + const onDetailsModalPress = useCallback(() => { + setIsDetailsModalOpen(true); + }, [setIsDetailsModalOpen]); + + const onDetailsModalClose = useCallback(() => { + setIsDetailsModalOpen(false); + }, [setIsDetailsModalOpen]); + + return ( + + + + {data.query} + + + + + {data.source ? data.source : null} + + + + + + + + + ); +} + +export default IndexerHistoryRow; diff --git a/frontend/src/Indexer/Info/IndexerInfoModal.tsx b/frontend/src/Indexer/Info/IndexerInfoModal.tsx index 0c19dca1e..c15af5247 100644 --- a/frontend/src/Indexer/Info/IndexerInfoModal.tsx +++ b/frontend/src/Indexer/Info/IndexerInfoModal.tsx @@ -14,7 +14,7 @@ function IndexerInfoModal(props: IndexerInfoModalProps) { const { isOpen, indexerId, onModalClose, onCloneIndexerPress } = props; return ( - + field.name === 'vipExpiration')?.value ?? undefined; + const [selectedTab, setSelectedTab] = useState(tabs[0]); const [isEditIndexerModalOpen, setIsEditIndexerModalOpen] = useState(false); const [isDeleteIndexerModalOpen, setIsDeleteIndexerModalOpen] = useState(false); + const onTabSelect = useCallback( + (index: number) => { + const selectedTab = tabs[index]; + setSelectedTab(selectedTab); + }, + [setSelectedTab] + ); + const onEditIndexerPress = useCallback(() => { setIsEditIndexerModalOpen(true); }, [setIsEditIndexerModalOpen]); @@ -103,204 +116,237 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { {`${name}`} -
    -
    - - - - - - {vipExpiration ? ( - - ) : null} - - {translate('IndexerSite')} - - - {baseUrl ? ( - - {baseUrl.replace(/(:\/\/)api\./, '$1')} - - ) : ( - '-' - )} - - - {protocol === 'usenet' - ? translate('NewznabUrl') - : translate('TorznabUrl')} - - - {`${window.location.origin}${window.Prowlarr.urlBase}/${id}/api`} - - {tags.length > 0 ? ( - <> - - {translate('Tags')} - - - - - - ) : null} - -
    -
    + + + + {translate('Details')} + -
    -
    - - - - {capabilities.searchParams[0]} - - ) - } - /> - { - return ( - - ); - }) - } - /> - { - return ( - - ); - }) - } - /> - { - return ( - - ); - }) - } - /> - { - return ( - - ); - }) - } - /> - -
    -
    + + {translate('Categories')} + - {capabilities?.categories?.length > 0 ? ( -
    - - {uniqBy(capabilities.categories, 'id') - .sort((a, b) => a.id - b.id) - .map((category) => { - return ( - - - {category.id} - {category.name} - - {category?.subCategories?.length > 0 - ? uniqBy(category.subCategories, 'id') - .sort((a, b) => a.id - b.id) - .map((subCategory) => { + + {translate('History')} + + + +
    +
    +
    + + + + + + {vipExpiration ? ( + + ) : null} + + {translate('IndexerSite')} + + + {baseUrl ? ( + + {baseUrl.replace(/(:\/\/)api\./, '$1')} + + ) : ( + '-' + )} + + + {protocol === 'usenet' + ? translate('NewznabUrl') + : translate('TorznabUrl')} + + + {`${window.location.origin}${window.Prowlarr.urlBase}/${id}/api`} + + {tags.length > 0 ? ( + <> + + {translate('Tags')} + + + + + + ) : null} + +
    +
    + +
    +
    + + + + {capabilities.searchParams[0]} + + ) + } + /> + { return ( - - {subCategory.id} - - {subCategory.name} - - + ); }) - : null} - - ); - })} -
    -
    - ) : null} + } + /> + { + return ( + + ); + }) + } + /> + { + return ( + + ); + }) + } + /> + { + return ( + + ); + }) + } + /> + +
    + +
    + + +
    + {capabilities?.categories?.length > 0 ? ( +
    + + {uniqBy(capabilities.categories, 'id') + .sort((a, b) => a.id - b.id) + .map((category) => { + return ( + + + {category.id} + {category.name} + + {category?.subCategories?.length > 0 + ? uniqBy(category.subCategories, 'id') + .sort((a, b) => a.id - b.id) + .map((subCategory) => { + return ( + + + {subCategory.id} + + + {subCategory.name} + + + ); + }) + : null} + + ); + })} +
    +
    + ) : null} +
    +
    + +
    + +
    +
    + - - - + +
    + + +
    +
    + + +
    Date: Tue, 5 Sep 2023 06:45:16 +0300 Subject: [PATCH 164/964] Add hourly limits as defaults for FL and BTN --- .../Definitions/BroadcastheNet/BroadcastheNetSettings.cs | 6 ++++++ .../Indexers/Definitions/FileList/FileListSettings.cs | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetSettings.cs index 7e95c01d5..e52b96888 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetSettings.cs @@ -17,6 +17,12 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet { private static readonly BroadcastheNetSettingsValidator Validator = new (); + public BroadcastheNetSettings() + { + BaseSettings.QueryLimit = 150; + BaseSettings.LimitsUnit = (int)IndexerLimitsUnit.Hour; + } + [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListSettings.cs index eec54ea34..5fdcc4744 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListSettings.cs @@ -18,6 +18,12 @@ public class FileListSettings : NoAuthTorrentBaseSettings { private static readonly FileListSettingsValidator Validator = new (); + public FileListSettings() + { + BaseSettings.QueryLimit = 150; + BaseSettings.LimitsUnit = (int)IndexerLimitsUnit.Hour; + } + [FieldDefinition(2, Label = "Username", HelpText = "Site Username", Privacy = PrivacyLevel.UserName)] public string Username { get; set; } From 96413f99c76157728784387b9cf5bfb68ed2ae8a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 5 Sep 2023 05:23:20 +0300 Subject: [PATCH 165/964] New: Add hour as interval unit for indexer limits --- .../Indexers/IndexerBaseSettings.cs | 25 +++++++--- .../Indexers/IndexerLimitService.cs | 48 +++++++++++++------ .../Indexers/NewznabController.cs | 10 +++- 3 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/IndexerBaseSettings.cs b/src/NzbDrone.Core/Indexers/IndexerBaseSettings.cs index 5849571e4..0992cbacf 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBaseSettings.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBaseSettings.cs @@ -7,20 +7,33 @@ namespace NzbDrone.Core.Indexers { public IndexerCommonSettingsValidator() { - RuleFor(c => c.QueryLimit).GreaterThan(0).When(c => c.QueryLimit.HasValue).WithMessage("Should be greater than zero"); + RuleFor(c => c.QueryLimit) + .GreaterThan(0) + .When(c => c.QueryLimit.HasValue) + .WithMessage("Should be greater than zero"); - RuleFor(c => c.GrabLimit).GreaterThan(0).When(c => c.GrabLimit.HasValue).WithMessage("Should be greater than zero"); + RuleFor(c => c.GrabLimit) + .GreaterThan(0) + .When(c => c.GrabLimit.HasValue) + .WithMessage("Should be greater than zero"); } } public class IndexerBaseSettings { - private static readonly IndexerCommonSettingsValidator Validator = new (); - - [FieldDefinition(1, Type = FieldType.Number, Label = "Query Limit", HelpText = "The number of queries within a rolling 24 hour period Prowlarr will allow to the site", Advanced = true)] + [FieldDefinition(1, Type = FieldType.Number, Label = "Query Limit", HelpText = "The number of max queries as specified by the respective unit that Prowlarr will allow to the site", Advanced = true)] public int? QueryLimit { get; set; } - [FieldDefinition(2, Type = FieldType.Number, Label = "Grab Limit", HelpText = "The number of grabs within a rolling 24 hour period Prowlarr will allow to the site", Advanced = true)] + [FieldDefinition(2, Type = FieldType.Number, Label = "Grab Limit", HelpText = "The number of max grabs as specified by the respective unit that Prowlarr will allow to the site", Advanced = true)] public int? GrabLimit { get; set; } + + [FieldDefinition(3, Type = FieldType.Select, SelectOptions = typeof(IndexerLimitsUnit), Label = "Limits Unit", HelpText = "The unit of time for counting limits per indexer", Advanced = true)] + public int LimitsUnit { get; set; } = (int)IndexerLimitsUnit.Day; + } + + public enum IndexerLimitsUnit + { + Day = 0, + Hour = 1 } } diff --git a/src/NzbDrone.Core/Indexers/IndexerLimitService.cs b/src/NzbDrone.Core/Indexers/IndexerLimitService.cs index bad49daab..112255f17 100644 --- a/src/NzbDrone.Core/Indexers/IndexerLimitService.cs +++ b/src/NzbDrone.Core/Indexers/IndexerLimitService.cs @@ -11,6 +11,7 @@ namespace NzbDrone.Core.Indexers bool AtQueryLimit(IndexerDefinition indexer); int CalculateRetryAfterDownloadLimit(IndexerDefinition indexer); int CalculateRetryAfterQueryLimit(IndexerDefinition indexer); + int CalculateIntervalLimitHours(IndexerDefinition indexer); } public class IndexerLimitService : IIndexerLimitService @@ -27,19 +28,20 @@ namespace NzbDrone.Core.Indexers public bool AtDownloadLimit(IndexerDefinition indexer) { - if (indexer.Id > 0 && ((IIndexerSettings)indexer.Settings).BaseSettings.GrabLimit.HasValue) + if (indexer is { Id: > 0 } && ((IIndexerSettings)indexer.Settings).BaseSettings.GrabLimit.HasValue) { - var grabCount = _historyService.CountSince(indexer.Id, DateTime.Now.AddHours(-24), new List { HistoryEventType.ReleaseGrabbed }); + var intervalLimitHours = CalculateIntervalLimitHours(indexer); + var grabCount = _historyService.CountSince(indexer.Id, DateTime.Now.AddHours(-1 * intervalLimitHours), new List { HistoryEventType.ReleaseGrabbed }); var grabLimit = ((IIndexerSettings)indexer.Settings).BaseSettings.GrabLimit; if (grabCount >= grabLimit) { - _logger.Info("Indexer {0} has performed {1} of possible {2} grabs in last 24 hours, exceeding the maximum grab limit", indexer.Name, grabCount, grabLimit); + _logger.Info("Indexer {0} has performed {1} of possible {2} grabs in last {3} hour(s), exceeding the maximum grab limit", indexer.Name, grabCount, grabLimit, intervalLimitHours); return true; } - _logger.Debug("Indexer {0} has performed {1} of possible {2} grabs in last 24 hours, proceeding", indexer.Name, grabCount, grabLimit); + _logger.Debug("Indexer {0} has performed {1} of possible {2} grabs in last {3} hour(s), proceeding", indexer.Name, grabCount, grabLimit, intervalLimitHours); } return false; @@ -47,19 +49,20 @@ namespace NzbDrone.Core.Indexers public bool AtQueryLimit(IndexerDefinition indexer) { - if (indexer.Id > 0 && ((IIndexerSettings)indexer.Settings).BaseSettings.QueryLimit.HasValue) + if (indexer is { Id: > 0 } && ((IIndexerSettings)indexer.Settings).BaseSettings.QueryLimit.HasValue) { - var queryCount = _historyService.CountSince(indexer.Id, DateTime.Now.AddHours(-24), new List { HistoryEventType.IndexerQuery, HistoryEventType.IndexerRss }); + var intervalLimitHours = CalculateIntervalLimitHours(indexer); + var queryCount = _historyService.CountSince(indexer.Id, DateTime.Now.AddHours(-1 * intervalLimitHours), new List { HistoryEventType.IndexerQuery, HistoryEventType.IndexerRss }); var queryLimit = ((IIndexerSettings)indexer.Settings).BaseSettings.QueryLimit; if (queryCount >= queryLimit) { - _logger.Info("Indexer {0} has performed {1} of possible {2} queries in last 24 hours, exceeding the maximum query limit", indexer.Name, queryCount, queryLimit); + _logger.Info("Indexer {0} has performed {1} of possible {2} queries in last {3} hour(s), exceeding the maximum query limit", indexer.Name, queryCount, queryLimit, intervalLimitHours); return true; } - _logger.Debug("Indexer {0} has performed {1} of possible {2} queries in last 24 hours, proceeding", indexer.Name, queryCount, queryLimit); + _logger.Debug("Indexer {0} has performed {1} of possible {2} queries in last {3} hour(s), proceeding", indexer.Name, queryCount, queryLimit, intervalLimitHours); } return false; @@ -67,15 +70,16 @@ namespace NzbDrone.Core.Indexers public int CalculateRetryAfterDownloadLimit(IndexerDefinition indexer) { - if (indexer.Id > 0 && ((IIndexerSettings)indexer.Settings).BaseSettings.GrabLimit.HasValue) + if (indexer is { Id: > 0 } && ((IIndexerSettings)indexer.Settings).BaseSettings.GrabLimit.HasValue) { + var intervalLimitHours = CalculateIntervalLimitHours(indexer); var grabLimit = ((IIndexerSettings)indexer.Settings).BaseSettings.GrabLimit.GetValueOrDefault(); - var firstHistorySince = _historyService.FindFirstForIndexerSince(indexer.Id, DateTime.Now.AddHours(-24), new List { HistoryEventType.ReleaseGrabbed }, grabLimit); + var firstHistorySince = _historyService.FindFirstForIndexerSince(indexer.Id, DateTime.Now.AddHours(-1 * intervalLimitHours), new List { HistoryEventType.ReleaseGrabbed }, grabLimit); if (firstHistorySince != null) { - return Convert.ToInt32(firstHistorySince.Date.ToLocalTime().AddHours(24).Subtract(DateTime.Now).TotalSeconds); + return Convert.ToInt32(firstHistorySince.Date.ToLocalTime().AddHours(intervalLimitHours).Subtract(DateTime.Now).TotalSeconds); } } @@ -84,19 +88,35 @@ namespace NzbDrone.Core.Indexers public int CalculateRetryAfterQueryLimit(IndexerDefinition indexer) { - if (indexer.Id > 0 && ((IIndexerSettings)indexer.Settings).BaseSettings.QueryLimit.HasValue) + if (indexer is { Id: > 0 } && ((IIndexerSettings)indexer.Settings).BaseSettings.QueryLimit.HasValue) { + var intervalLimitHours = CalculateIntervalLimitHours(indexer); var queryLimit = ((IIndexerSettings)indexer.Settings).BaseSettings.QueryLimit.GetValueOrDefault(); - var firstHistorySince = _historyService.FindFirstForIndexerSince(indexer.Id, DateTime.Now.AddHours(-24), new List { HistoryEventType.IndexerQuery, HistoryEventType.IndexerRss }, queryLimit); + var firstHistorySince = _historyService.FindFirstForIndexerSince(indexer.Id, DateTime.Now.AddHours(-1 * intervalLimitHours), new List { HistoryEventType.IndexerQuery, HistoryEventType.IndexerRss }, queryLimit); if (firstHistorySince != null) { - return Convert.ToInt32(firstHistorySince.Date.ToLocalTime().AddHours(24).Subtract(DateTime.Now).TotalSeconds); + return Convert.ToInt32(firstHistorySince.Date.ToLocalTime().AddHours(intervalLimitHours).Subtract(DateTime.Now).TotalSeconds); } } return 0; } + + public int CalculateIntervalLimitHours(IndexerDefinition indexer) + { + if (indexer is { Id: > 0 }) + { + return ((IIndexerSettings)indexer.Settings).BaseSettings.LimitsUnit switch + { + (int)IndexerLimitsUnit.Hour => 1, + _ => 24 + }; + } + + // Fallback to limits per day + return 24; + } } } diff --git a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs index 45b611dcc..65a617a0f 100644 --- a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs +++ b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs @@ -162,7 +162,10 @@ namespace NzbDrone.Api.V1.Indexers var retryAfterQueryLimit = _indexerLimitService.CalculateRetryAfterQueryLimit(indexerDef); AddRetryAfterHeader(retryAfterQueryLimit); - return CreateResponse(CreateErrorXML(429, $"User configurable Indexer Query Limit of {((IIndexerSettings)indexer.Definition.Settings).BaseSettings.QueryLimit} reached."), statusCode: StatusCodes.Status429TooManyRequests); + var queryLimit = ((IIndexerSettings)indexer.Definition.Settings).BaseSettings.QueryLimit; + var intervalLimitHours = _indexerLimitService.CalculateIntervalLimitHours(indexerDef); + + return CreateResponse(CreateErrorXML(429, $"User configurable Indexer Query Limit of {queryLimit} in last {intervalLimitHours} hour(s) reached."), statusCode: StatusCodes.Status429TooManyRequests); } switch (requestType) @@ -226,7 +229,10 @@ namespace NzbDrone.Api.V1.Indexers var retryAfterDownloadLimit = _indexerLimitService.CalculateRetryAfterDownloadLimit(indexerDef); AddRetryAfterHeader(retryAfterDownloadLimit); - return CreateResponse(CreateErrorXML(429, $"User configurable Indexer Grab Limit of {((IIndexerSettings)indexer.Definition.Settings).BaseSettings.GrabLimit} reached."), statusCode: StatusCodes.Status429TooManyRequests); + var grabLimit = ((IIndexerSettings)indexer.Definition.Settings).BaseSettings.GrabLimit; + var intervalLimitHours = _indexerLimitService.CalculateIntervalLimitHours(indexerDef); + + return CreateResponse(CreateErrorXML(429, $"User configurable Indexer Grab Limit of {grabLimit} in last {intervalLimitHours} hour(s) reached."), statusCode: StatusCodes.Status429TooManyRequests); } if (link.IsNullOrWhiteSpace() || file.IsNullOrWhiteSpace()) From 2af9f7eb8d539085511103b532527b99478fb1c3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 8 Sep 2023 03:12:46 +0300 Subject: [PATCH 166/964] Fixed: macOS version detection (cherry picked from commit 060be6177a5477c94823e6a423c42064dedc1afb) --- .../VersionAdapters/MacOsVersionAdapterFixture.cs | 3 +++ .../EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs index b4df1027a..8bc8c9668 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs @@ -15,6 +15,9 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters [TestCase("10.8")] [TestCase("10.8.1")] [TestCase("10.11.20")] + [TestCase("11.7.9")] + [TestCase("12.6.8")] + [TestCase("13.5.1")] public void should_get_version_info(string versionString) { var fileContent = File.ReadAllText(GetTestPath("Files/macOS/SystemVersion.plist")).Replace("10.0.0", versionString); diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs index 1171334b5..55542809e 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs @@ -10,7 +10,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters { private const string PLIST_DIR = "/System/Library/CoreServices/"; - private static readonly Regex DarwinVersionRegex = new Regex("(?10\\.\\d{1,2}\\.?\\d{0,2}?)<\\/string>", + private static readonly Regex DarwinVersionRegex = new ("ProductVersion<\\/key>\\s*(?1\\d\\.\\d{1,2}\\.?\\d{0,2}?)<\\/string>", RegexOptions.Compiled | RegexOptions.IgnoreCase); private readonly IDiskProvider _diskProvider; From 98e948dbb2147c8b5af07bca97f72c0a4e073cd9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 9 Sep 2023 14:15:58 +0300 Subject: [PATCH 167/964] Fix indexer flags column label --- .../Components/Table/TableOptions/TableOptionsModal.js | 4 ++-- frontend/src/Store/Actions/releaseActions.js | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/frontend/src/Components/Table/TableOptions/TableOptionsModal.js b/frontend/src/Components/Table/TableOptions/TableOptionsModal.js index 7d6f4f2c1..80613de68 100644 --- a/frontend/src/Components/Table/TableOptions/TableOptionsModal.js +++ b/frontend/src/Components/Table/TableOptions/TableOptionsModal.js @@ -192,7 +192,7 @@ class TableOptionsModal extends Component { translate('IndexerFlags'), + label: React.createElement(Icon, { + name: icons.FLAG, + title: () => translate('IndexerFlags') + }), isSortable: true, isVisible: true }, From bbf042ed55dca41fc537a47622ede62577318bc0 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 27 Aug 2023 05:01:06 +0000 Subject: [PATCH 168/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: AlexR-sf Co-authored-by: Anonymous Co-authored-by: ChewyGlitter Co-authored-by: DavidJares Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: He Zhu Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ro.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 1899e577a..95b3713fc 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -439,5 +439,5 @@ "RecentChanges": "Schimbări recente", "WhatsNew": "Ce mai e nou?", "DeleteAppProfileMessageText": "Sigur doriți să ștergeți profilul de aplicație '{0}'?", - "NotificationStatusSingleClientHealthCheckMessage": "Aplicații indisponibile datorită erorilor: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Notificări indisponibile datorită erorilor: {0}" } From 9615c1183dec810ac1954e48fc32da2c366194a7 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 10 Sep 2023 05:32:09 +0000 Subject: [PATCH 169/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ar.json | 1 - src/NzbDrone.Core/Localization/Core/bg.json | 1 - src/NzbDrone.Core/Localization/Core/ca.json | 1 - src/NzbDrone.Core/Localization/Core/cs.json | 1 - src/NzbDrone.Core/Localization/Core/da.json | 1 - src/NzbDrone.Core/Localization/Core/de.json | 1 - src/NzbDrone.Core/Localization/Core/el.json | 1 - src/NzbDrone.Core/Localization/Core/es.json | 1 - src/NzbDrone.Core/Localization/Core/fi.json | 1 - src/NzbDrone.Core/Localization/Core/fr.json | 1 - src/NzbDrone.Core/Localization/Core/he.json | 1 - src/NzbDrone.Core/Localization/Core/hi.json | 1 - src/NzbDrone.Core/Localization/Core/hr.json | 1 - src/NzbDrone.Core/Localization/Core/hu.json | 1 - src/NzbDrone.Core/Localization/Core/is.json | 1 - src/NzbDrone.Core/Localization/Core/it.json | 1 - src/NzbDrone.Core/Localization/Core/ja.json | 1 - src/NzbDrone.Core/Localization/Core/ko.json | 1 - src/NzbDrone.Core/Localization/Core/nb_NO.json | 1 - src/NzbDrone.Core/Localization/Core/nl.json | 1 - src/NzbDrone.Core/Localization/Core/pl.json | 1 - src/NzbDrone.Core/Localization/Core/pt.json | 1 - src/NzbDrone.Core/Localization/Core/pt_BR.json | 1 - src/NzbDrone.Core/Localization/Core/ro.json | 1 - src/NzbDrone.Core/Localization/Core/ru.json | 1 - src/NzbDrone.Core/Localization/Core/sk.json | 1 - src/NzbDrone.Core/Localization/Core/sv.json | 1 - src/NzbDrone.Core/Localization/Core/th.json | 1 - src/NzbDrone.Core/Localization/Core/tr.json | 1 - src/NzbDrone.Core/Localization/Core/uk.json | 1 - src/NzbDrone.Core/Localization/Core/vi.json | 1 - src/NzbDrone.Core/Localization/Core/zh_CN.json | 1 - 32 files changed, 32 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index ddde47617..2f9664bb1 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -12,7 +12,6 @@ "AllIndexersHiddenDueToFilter": "جميع الأفلام مخفية بسبب الفلتر المطبق.", "ApplicationStatusCheckAllClientMessage": "جميع القوائم غير متاحة بسبب الإخفاقات", "ApplicationStatusCheckSingleClientMessage": "القوائم غير متاحة بسبب الإخفاقات: {0}", - "AreYouSureYouWantToResetYourAPIKey": "هل أنت متأكد أنك تريد إعادة تعيين مفتاح API الخاص بك؟", "Authentication": "المصادقة", "BackupIntervalHelpText": "الفاصل الزمني بين النسخ الاحتياطية التلقائية", "BackupNow": "اعمل نسخة احتياطية الان", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index b37a7db12..ae9148636 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -49,7 +49,6 @@ "All": "всичко", "Analytics": "Анализ", "AnalyticsEnabledHelpText": "Изпращайте анонимна информация за използването и грешките до сървърите на Prowlarr. Това включва информация за вашия браузър, кои страници на Prowlarr WebUI използвате, отчитане на грешки, както и версията на операционната система и времето за изпълнение. Ще използваме тази информация, за да дадем приоритет на функциите и корекциите на грешки.", - "AreYouSureYouWantToResetYourAPIKey": "Наистина ли искате да нулирате своя API ключ?", "AuthenticationMethodHelpText": "Изисквайте потребителско име и парола за достъп до Prowlarr", "BackupRetentionHelpText": "Автоматичните архиви, по-стари от периода на съхранение, ще бъдат почистени автоматично", "BindAddressHelpText": "Валиден IP4 адрес или '*' за всички интерфейси", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index becf09bec..14ac8ec04 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -256,7 +256,6 @@ "MIA": "MIA", "Wiki": "Wiki", "Tags": "Etiquetes", - "AreYouSureYouWantToResetYourAPIKey": "Esteu segur que voleu restablir la clau de l'API?", "Backups": "Còpies de seguretat", "Branch": "Branca", "Connections": "Connexions", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 057d2c266..240367082 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -229,7 +229,6 @@ "Analytics": "Analýzy", "EnableRss": "Povolit RSS", "NoChange": "Žádná změna", - "AreYouSureYouWantToResetYourAPIKey": "Opravdu chcete resetovat klíč API?", "Authentication": "Ověřování", "AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k Prowlarr", "Automatic": "Automatický", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index e8466080a..17d318d49 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -273,7 +273,6 @@ "ApplicationStatusCheckAllClientMessage": "Alle lister er utilgængelige på grund af fejl", "ApplicationStatusCheckSingleClientMessage": "Lister utilgængelige på grund af fejl: {0}", "ApplyTags": "Anvend tags", - "AreYouSureYouWantToResetYourAPIKey": "Er du sikker på, at du vil nulstille din API-nøgle?", "Authentication": "Godkendelse", "AuthenticationMethodHelpText": "Kræv brugernavn og adgangskode for at få adgang til Prowlarr", "Automatic": "Automatisk", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 6ab715973..91e2efd30 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -35,7 +35,6 @@ "Apply": "Anwenden", "ApplyTags": "Tags setzen", "Apps": "Anwendungen", - "AreYouSureYouWantToResetYourAPIKey": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?", "AudioSearch": "Audio Suche", "Auth": "Authentifizierung", "Authentication": "Authentifizierung", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index ac1151b7c..1b838855d 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -70,7 +70,6 @@ "Wiki": "Wiki", "AddIndexer": "Προσθήκη ευρετηρίου", "AddingTag": "Προσθήκη ετικέτας", - "AreYouSureYouWantToResetYourAPIKey": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε το κλειδί API σας;", "NoChange": "Καμία αλλαγή", "Port": "Λιμάνι", "PortNumber": "Αριθμός θύρας", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index d2a1dbe70..980c90479 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -154,7 +154,6 @@ "Automatic": "Automático", "AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder Prowlarr", "Authentication": "Autenticación", - "AreYouSureYouWantToResetYourAPIKey": "¿Está seguro de que desea restablecer su clave API?", "ApiKey": "Clave de API", "ApplyTags": "Aplicar Etiquetas", "AppDataDirectory": "Directorio AppData", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 163eae3bc..4dbe8cf48 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -217,7 +217,6 @@ "Warn": "Varoita", "Wiki": "Wiki", "Port": "Portti", - "AreYouSureYouWantToResetYourAPIKey": "Haluatko varmasti uudistaa API-avaimesi?", "Automatic": "Automaattinen", "AutomaticSearch": "Automaattihaku", "Backup": "Varmuuskopio", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 3f132cc73..58794eb43 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -143,7 +143,6 @@ "Automatic": "Automatique", "AuthenticationMethodHelpText": "Exiger un identifiant et un mot de passe pour accéder à Prowlarr", "Authentication": "Authentification", - "AreYouSureYouWantToResetYourAPIKey": "Êtes vous sûr de vouloir réinitialiser votre Clé d'API ?", "ApplyTags": "Appliquer les tags", "AppDataDirectory": "Dossier AppData", "ApiKey": "Clé API", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index fbb59fff9..b9fbf3965 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -258,7 +258,6 @@ "ApplicationStatusCheckSingleClientMessage": "רשימות לא זמינות בגלל כשלים: {0}", "Apply": "להגיש מועמדות", "ApplyTags": "החל תגים", - "AreYouSureYouWantToResetYourAPIKey": "האם אתה בטוח שברצונך לאפס את מפתח ה- API שלך?", "Authentication": "אימות", "AuthenticationMethodHelpText": "דרוש שם משתמש וסיסמה כדי לגשת ל Prowlarr", "Automatic": "אוֹטוֹמָטִי", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 216ad74f9..bb72c62c8 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -218,7 +218,6 @@ "Time": "समय", "UpdateScriptPathHelpText": "एक कस्टम स्क्रिप्ट का पथ जो एक निकाला गया अद्यतन पैकेज लेता है और शेष अद्यतन प्रक्रिया को संभालता है", "ApplicationStatusCheckSingleClientMessage": "विफलताओं के कारण अनुपलब्ध सूची: {0}", - "AreYouSureYouWantToResetYourAPIKey": "क्या आप वाकई अपनी API कुंजी को रीसेट करना चाहते हैं?", "AutomaticSearch": "स्वचालित खोज", "BackupFolderHelpText": "रिलेटिव पाथ रेडर के ऐपडाटा डायरेक्टरी के तहत होगा", "BackupNow": "अब समर्थन देना", diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index 6b2be18ed..ad49c12b4 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -68,7 +68,6 @@ "Username": "Korisničko Ime", "Add": "Dodaj", "AddingTag": "Dodaj oznaku", - "AreYouSureYouWantToResetYourAPIKey": "Jeste li sigurni da želite resetirati vaš API Ključ?", "Added": "Dodano", "AddIndexer": "Dodaj Indexer", "ApplyTags": "Primjeni Oznake", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 9ac6845ff..e4929023f 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -66,7 +66,6 @@ "AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a Prowlarr szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely Prowlarr WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.", "AuthenticationMethodHelpText": "Felhasználónév és Jelszó szükséges a Prowlarr-hoz való hozzáféréshez", "Authentication": "Hitelesítés", - "AreYouSureYouWantToResetYourAPIKey": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?", "ApplyTags": "Címkék alkalmazása", "Age": "Kora", "ApiKey": "API Kulcs", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 383f64922..78536b25d 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -1,6 +1,5 @@ { "Add": "Bæta við", - "AreYouSureYouWantToResetYourAPIKey": "Ertu viss um að þú viljir endurstilla API lykilinn þinn?", "BindAddress": "Bind heimilisfang", "BranchUpdate": "Útibú til að nota til að uppfæra Prowlarr", "Logs": "Logs", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 84a60df1f..bf8993252 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -101,7 +101,6 @@ "Automatic": "Automatico", "AuthenticationMethodHelpText": "Richiedi Nome Utente e Password per accedere a Prowlarr", "Authentication": "Autenticazione", - "AreYouSureYouWantToResetYourAPIKey": "Sei sicuro di voler reimpostare la tua Chiave API?", "ApplyTags": "Applica Etichette", "Apply": "Applica", "AppDataDirectory": "Cartella AppData", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index ca3788788..0cdf375dc 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -45,7 +45,6 @@ "UpdateMechanismHelpText": "Prowlarrの組み込みアップデーターまたはスクリプトを使用する", "Wiki": "ウィキ", "Yesterday": "昨日", - "AreYouSureYouWantToResetYourAPIKey": "APIキーをリセットしてもよろしいですか?", "Type": "タイプ", "General": "一般", "IgnoredAddresses": "無視されたアドレス", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 273166919..74757cb38 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -56,7 +56,6 @@ "Add": "추가", "Apply": "적용", "AppDataLocationHealthCheckMessage": "업데이트 시 AppData 삭제를 방지하기 위해 업데이트 할 수 없습니다.", - "AreYouSureYouWantToResetYourAPIKey": "API 키를 재설정하시겠습니까?", "BranchUpdateMechanism": "외부 업데이트 메커니즘에서 사용하는 파생 버전", "CertificateValidation": "인증서 검증", "CertificateValidationHelpText": "HTTPS 인증 유효성 검사의 엄격한 방법 변경", diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index de2d71f8b..e706989ee 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -29,7 +29,6 @@ "ApiKey": "API Nøkkel", "AppDataLocationHealthCheckMessage": "Oppdatering vil ikke være mulig for å forhindre sletting av AppData på oppdateringen", "Apply": "Bruk", - "AreYouSureYouWantToResetYourAPIKey": "Er du sikker på at du vil tilbakestille API -nøkkelen din?", "AutomaticSearch": "Automatisk Søk", "BackupRetentionHelpText": "Automatiske sikkerhetskopier som er eldre enn oppbevaringsperioden, blir ryddet opp automatisk", "BindAddress": "Bind adresse", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 9e7b07052..d0e3dfc38 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -38,7 +38,6 @@ "Apply": "Toepassen", "ApplyTags": "Pas Tags Toe", "Apps": "Applicaties", - "AreYouSureYouWantToResetYourAPIKey": "Bent u zeker dat u uw API-sleutel wilt resetten?", "AudioSearch": "auditief zoeken", "Auth": "Authenticatie", "Authentication": "Authenticatie", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 5077a54c8..66d9ad4c2 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -66,7 +66,6 @@ "NoChange": "Bez zmiany", "Add": "Dodaj", "AppDataDirectory": "Katalog AppData", - "AreYouSureYouWantToResetYourAPIKey": "Czy na pewno chcesz zresetować swój klucz API?", "AutomaticSearch": "Automatyczne wyszukiwanie", "Branch": "Gałąź", "Connections": "Znajomości", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index ae1e412eb..21595f963 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -131,7 +131,6 @@ "Automatic": "Automático", "AuthenticationMethodHelpText": "Solicitar nome de utilizador e palavra-passe para acessar ao Prowlarr", "Authentication": "Autenticação", - "AreYouSureYouWantToResetYourAPIKey": "Tem a certeza que quer repor a Chave da API?", "ApplyTags": "Aplicar etiquetas", "AppDataDirectory": "Pasta AppData", "ApiKey": "Chave da API", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 59e4da59e..1b6b41b36 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -41,7 +41,6 @@ "ApplyTags": "Aplicar Tags", "Apps": "Aplicativos", "AreYouSureYouWantToDeleteCategory": "Tem certeza de que deseja excluir a categoria mapeada?", - "AreYouSureYouWantToResetYourAPIKey": "Tem certeza de que deseja redefinir sua chave da API?", "Artist": "Artista", "AudioSearch": "Pesquisar Áudio", "Auth": "Autenticação", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 95b3713fc..1dc92139a 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -135,7 +135,6 @@ "LaunchBrowserHelpText": " Deschideți un browser web și navigați la pagina de pornire Prowlarr la pornirea aplicației.", "AppDataDirectory": "Directorul AppData", "ApplicationStatusCheckAllClientMessage": "Toate aplicațiile sunt indisponibile datorită erorilor", - "AreYouSureYouWantToResetYourAPIKey": "Sigur doriți să vă resetați cheia API?", "Authentication": "Autentificare", "AuthenticationMethodHelpText": "Solicitați nume utilizator și parola pentru a accesa Prowlarr", "AutomaticSearch": "Căutare automată", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 96fe1a6f0..6f06f1f97 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -9,7 +9,6 @@ "Backup": "Резервная копия", "AutomaticSearch": "Автоматический поиск", "Authentication": "Аутентификация", - "AreYouSureYouWantToResetYourAPIKey": "Вы уверены, что хотите сбросить Ваш API ключ?", "ApplyTags": "Применить тэги", "Apply": "Применить", "AppDataLocationHealthCheckMessage": "Обновление будет не возможно, во избежание удаления данных программы во время обновления", diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index 378c0b7ed..4769467d0 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -12,7 +12,6 @@ "AppDataDirectory": "Priečinok AppData", "Apply": "Použiť", "ApplyTags": "Použiť značky", - "AreYouSureYouWantToResetYourAPIKey": "Naozaj chcete obnoviť kľúč API?", "Authentication": "Overenie", "Backup": "Záloha", "BackupNow": "Zálohovať teraz", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index de916a00b..d922be4ef 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -187,7 +187,6 @@ "UnableToLoadNotifications": "Det gick inte att läsa in aviseringar", "UnableToLoadTags": "Det gick inte att ladda taggar", "AcceptConfirmationModal": "Acceptera bekräftelsemodal", - "AreYouSureYouWantToResetYourAPIKey": "Är du säker på att du vill nollställa din API-nyckel?", "Authentication": "Autentisera", "LogLevelTraceHelpTextWarning": "Spårloggning bör endast aktiveras tillfälligt", "DeleteIndexerProxyMessageText": "Är du säker på att du vill radera taggen '{0}'?", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 4ef37f411..9538bbec2 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -114,7 +114,6 @@ "Size": "ขนาด", "AppDataDirectory": "ไดเรกทอรี AppData", "ApplyTags": "ใช้แท็ก", - "AreYouSureYouWantToResetYourAPIKey": "แน่ใจไหมว่าต้องการรีเซ็ตคีย์ API", "Authentication": "การรับรองความถูกต้อง", "AuthenticationMethodHelpText": "ต้องการชื่อผู้ใช้และรหัสผ่านเพื่อเข้าถึงเรดาร์", "Automatic": "อัตโนมัติ", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 000dae8f8..661154611 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -303,7 +303,6 @@ "ShowSearch": "Aramayı Göster", "UnableToLoadDownloadClients": "İndirme istemcileri yüklenemiyor", "UnableToLoadGeneralSettings": "Genel ayarlar yüklenemiyor", - "AreYouSureYouWantToResetYourAPIKey": "API Anahtarınızı sıfırlamak istediğinizden emin misiniz?", "Automatic": "Otomatik", "AutomaticSearch": "Otomatik Arama", "Backup": "Destek olmak", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 995cca94e..a30d690f4 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -34,7 +34,6 @@ "DeleteBackupMessageText": "Ви впевнені, що хочете видалити резервну копію '{0}'?", "DeleteDownloadClient": "Видалити клієнт завантаження", "DeleteDownloadClientMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{0}'?", - "AreYouSureYouWantToResetYourAPIKey": "Ви впевнені, що хочете скинути свій ключ API?", "Authentication": "Аутентифікація", "Automatic": "Автоматичний", "AutomaticSearch": "Автоматичний пошук", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index c3b13e89e..cc0430514 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -231,7 +231,6 @@ "Yesterday": "Hôm qua", "Add": "Thêm vào", "AddDownloadClient": "Thêm ứng dụng khách tải xuống", - "AreYouSureYouWantToResetYourAPIKey": "Bạn có chắc chắn muốn đặt lại Khóa API của mình không?", "FocusSearchBox": "Hộp Tìm kiếm Tiêu điểm", "CertificateValidation": "Xác thực chứng chỉ", "Hostname": "Tên máy chủ", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index dbde605a3..bb93047ea 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -40,7 +40,6 @@ "ApplyTags": "应用标签", "Apps": "应用程序", "AreYouSureYouWantToDeleteCategory": "您确定要删除映射类别吗?", - "AreYouSureYouWantToResetYourAPIKey": "你确认希望重置API密钥吗?", "Artist": "艺术家", "AudioSearch": "音频搜索", "Auth": "认证", From bd756214372b6e045d96dea777a6cc9750348597 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Sep 2023 09:40:37 +0300 Subject: [PATCH 170/964] Update magnet trackers --- .../Indexers/MagnetLinkBuilder.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs b/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs index 33b516d96..23c0c8dc4 100644 --- a/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs +++ b/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs @@ -11,25 +11,25 @@ namespace NzbDrone.Core.Indexers private static readonly List Trackers = new () { "udp://tracker.opentrackr.org:1337/announce", + "https://tracker2.ctix.cn:443/announce", + "https://tracker1.520.jp:443/announce", "udp://opentracker.i2p.rocks:6969/announce", + "udp://open.tracker.cl:1337/announce", + "udp://open.demonii.com:1337/announce", "udp://tracker.openbittorrent.com:6969/announce", "http://tracker.openbittorrent.com:80/announce", - "udp://open.demonii.com:1337/announce", "udp://open.stealth.si:80/announce", "udp://exodus.desync.com:6969/announce", "udp://tracker.torrent.eu.org:451/announce", - "udp://tracker.moeking.me:6969/announce", - "udp://tracker.bitsearch.to:1337/announce", - "udp://p4p.arenabg.com:1337/announce", - "udp://movies.zsw.ca:6969/announce", - "udp://explodie.org:6969/announce", - "https://tracker.tamersunion.org:443/announce", - "https://tr.burnabyhighstar.com:443/announce", - "udp://uploads.gamecoast.net:6969/announce", "udp://tracker1.bt.moack.co.kr:80/announce", + "udp://tracker-udp.gbitt.info:80/announce", + "udp://explodie.org:6969/announce", + "https://tracker.gbitt.info:443/announce", + "http://tracker.gbitt.info:80/announce", + "http://bt.endpot.com:80/announce", "udp://tracker.tiny-vps.com:6969/announce", - "udp://tracker.theoks.net:6969/announce", - "udp://tracker.joybomb.tw:6969/announce" + "udp://tracker.auctor.tv:6969/announce", + "udp://tk1.trackerservers.com:8080/announce" }; public static string BuildPublicMagnetLink(string infoHash, string releaseTitle) From 0463e668819847cd9a1b1da19b8a177fc90a06b2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Sep 2023 11:15:46 +0300 Subject: [PATCH 171/964] Rename ISearchForNzb to IReleaseSearchService --- .../IndexerSearch/ReleaseSearchService.cs | 12 ++++++------ src/Prowlarr.Api.V1/Indexers/NewznabController.cs | 10 +++++----- src/Prowlarr.Api.V1/Search/SearchController.cs | 8 ++++---- src/Prowlarr.Http/Extensions/RequestExtensions.cs | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index 281a39b89..6d332d424 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -14,12 +14,12 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.IndexerSearch { - public interface ISearchForNzb + public interface IReleaseSearchService { Task Search(NewznabRequest request, List indexerIds, bool interactiveSearch); } - public class ReleaseSearchService : ISearchForNzb + public class ReleaseSearchService : IReleaseSearchService { private readonly IIndexerLimitService _indexerLimitService; private readonly IEventAggregator _eventAggregator; @@ -222,28 +222,28 @@ namespace NzbDrone.Core.IndexerSearch } } - if (criteriaBase.MinAge.HasValue && criteriaBase.MinAge.Value > 0) + if (criteriaBase.MinAge is > 0) { var cutoffDate = DateTime.UtcNow.Subtract(TimeSpan.FromDays(criteriaBase.MinAge.Value)); releases = releases.Where(r => r.PublishDate <= cutoffDate).ToList(); } - if (criteriaBase.MaxAge.HasValue && criteriaBase.MaxAge.Value > 0) + if (criteriaBase.MaxAge is > 0) { var cutoffDate = DateTime.UtcNow.Subtract(TimeSpan.FromDays(criteriaBase.MaxAge.Value)); releases = releases.Where(r => r.PublishDate >= cutoffDate).ToList(); } - if (criteriaBase.MinSize.HasValue && criteriaBase.MinSize.Value > 0) + if (criteriaBase.MinSize is > 0) { var minSize = criteriaBase.MinSize.Value; releases = releases.Where(r => r.Size >= minSize).ToList(); } - if (criteriaBase.MaxSize.HasValue && criteriaBase.MaxSize.Value > 0) + if (criteriaBase.MaxSize is > 0) { var maxSize = criteriaBase.MaxSize.Value; diff --git a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs index 65a617a0f..2189135a8 100644 --- a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs +++ b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs @@ -30,7 +30,7 @@ namespace NzbDrone.Api.V1.Indexers public class NewznabController : Controller { private IIndexerFactory _indexerFactory { get; set; } - private ISearchForNzb _nzbSearchService { get; set; } + private IReleaseSearchService _releaseSearchService { get; set; } private IIndexerLimitService _indexerLimitService { get; set; } private IIndexerStatusService _indexerStatusService; private IDownloadMappingService _downloadMappingService { get; set; } @@ -38,7 +38,7 @@ namespace NzbDrone.Api.V1.Indexers private readonly Logger _logger; public NewznabController(IndexerFactory indexerFactory, - ISearchForNzb nzbSearchService, + IReleaseSearchService releaseSearchService, IIndexerLimitService indexerLimitService, IIndexerStatusService indexerStatusService, IDownloadMappingService downloadMappingService, @@ -46,7 +46,7 @@ namespace NzbDrone.Api.V1.Indexers Logger logger) { _indexerFactory = indexerFactory; - _nzbSearchService = nzbSearchService; + _releaseSearchService = releaseSearchService; _indexerLimitService = indexerLimitService; _indexerStatusService = indexerStatusService; _downloadMappingService = downloadMappingService; @@ -156,7 +156,7 @@ namespace NzbDrone.Api.V1.Indexers return CreateResponse(CreateErrorXML(429, $"Indexer is disabled till {blockedIndexerStatus.DisabledTill.Value.ToLocalTime()} due to recent failures."), statusCode: StatusCodes.Status429TooManyRequests); } - //TODO Optimize this so it's not called here and in NzbSearchService (for manual search) + // TODO Optimize this so it's not called here and in ReleaseSearchService (for manual search) if (_indexerLimitService.AtQueryLimit(indexerDef)) { var retryAfterQueryLimit = _indexerLimitService.CalculateRetryAfterQueryLimit(indexerDef); @@ -178,7 +178,7 @@ namespace NzbDrone.Api.V1.Indexers case "music": case "book": case "movie": - var results = await _nzbSearchService.Search(request, new List { indexerDef.Id }, false); + var results = await _releaseSearchService.Search(request, new List { indexerDef.Id }, false); foreach (var result in results.Releases) { diff --git a/src/Prowlarr.Api.V1/Search/SearchController.cs b/src/Prowlarr.Api.V1/Search/SearchController.cs index 9f24175c0..bc421f876 100644 --- a/src/Prowlarr.Api.V1/Search/SearchController.cs +++ b/src/Prowlarr.Api.V1/Search/SearchController.cs @@ -23,7 +23,7 @@ namespace Prowlarr.Api.V1.Search [V1ApiController] public class SearchController : RestController { - private readonly ISearchForNzb _nzbSearhService; + private readonly IReleaseSearchService _releaseSearchService; private readonly IDownloadService _downloadService; private readonly IIndexerFactory _indexerFactory; private readonly IDownloadMappingService _downloadMappingService; @@ -31,9 +31,9 @@ namespace Prowlarr.Api.V1.Search private readonly ICached _remoteReleaseCache; - public SearchController(ISearchForNzb nzbSearhService, IDownloadService downloadService, IIndexerFactory indexerFactory, IDownloadMappingService downloadMappingService, ICacheManager cacheManager, Logger logger) + public SearchController(IReleaseSearchService releaseSearchService, IDownloadService downloadService, IIndexerFactory indexerFactory, IDownloadMappingService downloadMappingService, ICacheManager cacheManager, Logger logger) { - _nzbSearhService = nzbSearhService; + _releaseSearchService = releaseSearchService; _downloadService = downloadService; _indexerFactory = indexerFactory; _downloadMappingService = downloadMappingService; @@ -143,7 +143,7 @@ namespace Prowlarr.Api.V1.Search request.QueryToParams(); - var result = await _nzbSearhService.Search(request, payload.IndexerIds, true); + var result = await _releaseSearchService.Search(request, payload.IndexerIds, true); var releases = result.Releases; return MapReleases(releases, Request.GetServerUrl()); diff --git a/src/Prowlarr.Http/Extensions/RequestExtensions.cs b/src/Prowlarr.Http/Extensions/RequestExtensions.cs index bb7a0af5f..6c297f98c 100644 --- a/src/Prowlarr.Http/Extensions/RequestExtensions.cs +++ b/src/Prowlarr.Http/Extensions/RequestExtensions.cs @@ -169,7 +169,7 @@ namespace Prowlarr.Http.Extensions } // Front-End-Https: Non-standard header field used by Microsoft applications and load-balancers - else if (request.Headers.Where(x => x.Key == "Front-End-Https" && x.Value.FirstOrDefault() == "on").Any()) + else if (request.Headers.Any(x => x.Key == "Front-End-Https" && x.Value.FirstOrDefault() == "on")) { scheme = "https"; } From 6338460ff43d40ad8eaa36fe0646a55cb2b27cd0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Sep 2023 19:09:26 +0300 Subject: [PATCH 172/964] Bump version to 1.9.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c5d08383c..ef671d5b2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.8.6' + majorVersion: '1.9.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 73b85e240e7e624b0440813566a3117a8a1fc974 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 10 Sep 2023 15:05:27 +0000 Subject: [PATCH 173/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Havok Dan Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ar.json | 7 ++++- src/NzbDrone.Core/Localization/Core/bg.json | 7 ++++- src/NzbDrone.Core/Localization/Core/ca.json | 7 ++++- src/NzbDrone.Core/Localization/Core/cs.json | 14 +++++++++- src/NzbDrone.Core/Localization/Core/da.json | 7 ++++- src/NzbDrone.Core/Localization/Core/de.json | 7 ++++- src/NzbDrone.Core/Localization/Core/el.json | 8 +++++- src/NzbDrone.Core/Localization/Core/es.json | 21 ++++++++++++++- src/NzbDrone.Core/Localization/Core/fi.json | 7 ++++- src/NzbDrone.Core/Localization/Core/fr.json | 11 +++++++- src/NzbDrone.Core/Localization/Core/hi.json | 7 ++++- src/NzbDrone.Core/Localization/Core/hu.json | 7 ++++- src/NzbDrone.Core/Localization/Core/id.json | 4 ++- src/NzbDrone.Core/Localization/Core/is.json | 7 ++++- src/NzbDrone.Core/Localization/Core/it.json | 7 ++++- src/NzbDrone.Core/Localization/Core/ja.json | 7 ++++- src/NzbDrone.Core/Localization/Core/ko.json | 7 ++++- .../Localization/Core/nb_NO.json | 6 ++++- src/NzbDrone.Core/Localization/Core/nl.json | 7 ++++- src/NzbDrone.Core/Localization/Core/pl.json | 7 ++++- src/NzbDrone.Core/Localization/Core/pt.json | 7 ++++- .../Localization/Core/pt_BR.json | 26 ++++++++++++++++--- src/NzbDrone.Core/Localization/Core/ro.json | 7 ++++- src/NzbDrone.Core/Localization/Core/ru.json | 9 ++++++- src/NzbDrone.Core/Localization/Core/sk.json | 6 ++++- src/NzbDrone.Core/Localization/Core/sv.json | 7 ++++- src/NzbDrone.Core/Localization/Core/th.json | 7 ++++- src/NzbDrone.Core/Localization/Core/tr.json | 11 +++++++- src/NzbDrone.Core/Localization/Core/uk.json | 8 +++++- src/NzbDrone.Core/Localization/Core/vi.json | 7 ++++- .../Localization/Core/zh_CN.json | 15 ++++++++++- .../Localization/Core/zh_TW.json | 4 ++- 32 files changed, 241 insertions(+), 35 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 2f9664bb1..9f8d583ba 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -347,5 +347,10 @@ "WhatsNew": "ما هو الجديد؟", "minutes": "الدقائق", "NotificationStatusAllClientHealthCheckMessage": "جميع القوائم غير متاحة بسبب الإخفاقات", - "NotificationStatusSingleClientHealthCheckMessage": "القوائم غير متاحة بسبب الإخفاقات: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "القوائم غير متاحة بسبب الإخفاقات: {0}", + "AuthBasic": "أساسي (المتصفح المنبثق)", + "AuthForm": "النماذج (صفحة تسجيل الدخول)", + "DisabledForLocalAddresses": "معطل بسبب العناوين المحلية", + "None": "لا شيء", + "ResetAPIKeyMessageText": "هل أنت متأكد أنك تريد إعادة تعيين مفتاح API الخاص بك؟" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index ae9148636..dec9b077d 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -347,5 +347,10 @@ "WhatsNew": "Какво ново?", "minutes": "Минути", "NotificationStatusSingleClientHealthCheckMessage": "Списъци, недостъпни поради неуспехи: {0}", - "NotificationStatusAllClientHealthCheckMessage": "Всички списъци са недостъпни поради неуспехи" + "NotificationStatusAllClientHealthCheckMessage": "Всички списъци са недостъпни поради неуспехи", + "AuthBasic": "Основно (изскачащ прозорец на браузъра)", + "AuthForm": "Формуляри (Страница за вход)", + "DisabledForLocalAddresses": "Забранено за местни адреси", + "None": "Нито един", + "ResetAPIKeyMessageText": "Наистина ли искате да нулирате своя API ключ?" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 14ac8ec04..187cb2fdd 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -371,5 +371,10 @@ "DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}", "NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}", "AddConnection": "Edita la col·lecció", - "NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors" + "NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors", + "AuthBasic": "Basic (finestra emergent del navegador)", + "AuthForm": "Formularis (pàgina d'inici de sessió)", + "DisabledForLocalAddresses": "Desactivat per a adreces locals", + "None": "Cap", + "ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 240367082..4963bb9b6 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -383,5 +383,17 @@ "Applications": "Aplikace", "Connect": "Oznámení", "EditConnectionImplementation": "Přidat spojení - {implementationName}", - "EditDownloadClientImplementation": "Přidat klienta pro stahování - {implementationName}" + "EditDownloadClientImplementation": "Přidat klienta pro stahování - {implementationName}", + "AuthForm": "Formuláře (přihlašovací stránka)", + "Clone": "Klonovat", + "DefaultNameCopiedProfile": "{name} - Kopírovat", + "DisabledForLocalAddresses": "Zakázáno pro místní adresy", + "EditApplicationImplementation": "Přidat spojení - {implementationName}", + "None": "Žádný", + "ResetAPIKeyMessageText": "Opravdu chcete resetovat klíč API?", + "Database": "Databáze", + "CountDownloadClientsSelected": "{count} vybraných klientů ke stahování", + "CountIndexersSelected": "{count} vybraných indexátorů", + "EditIndexerProxyImplementation": "Přidat indexátor - {implementationName}", + "AuthBasic": "Základní (vyskakovací okno prohlížeče)" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 17d318d49..f09fe409e 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -363,5 +363,10 @@ "ConnectionLostReconnect": "Radarr vil prøve at tilslutte automatisk, eller du kan klikke genindlæs forneden.", "minutes": "Protokoller", "NotificationStatusAllClientHealthCheckMessage": "Alle lister er utilgængelige på grund af fejl", - "NotificationStatusSingleClientHealthCheckMessage": "Lister utilgængelige på grund af fejl: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Lister utilgængelige på grund af fejl: {0}", + "AuthForm": "Formularer (login-side)", + "DisabledForLocalAddresses": "Deaktiveret for lokale adresser", + "ResetAPIKeyMessageText": "Er du sikker på, at du vil nulstille din API-nøgle?", + "AuthBasic": "Grundlæggende (pop op-browser)", + "None": "Ingen" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 91e2efd30..54c7d5ebb 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -499,5 +499,10 @@ "DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?", "AddConnection": "Sammlung bearbeiten", "NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar", - "NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}", + "AuthBasic": "Einfach (Browser Popup)", + "AuthForm": "Formular (Login Seite)", + "DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren", + "None": "Keine", + "ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 1b838855d..02bcbf6f7 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -501,5 +501,11 @@ "DeleteAppProfileMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το προφίλ ποιότητας '{0}'?", "AddConnection": "Προσθήκη Σύνδεσης", "NotificationStatusAllClientHealthCheckMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", - "NotificationStatusSingleClientHealthCheckMessage": "Μη διαθέσιμες λίστες λόγω αποτυχιών: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Μη διαθέσιμες λίστες λόγω αποτυχιών: {0}", + "AuthBasic": "Βασικό (Αναδυόμενο παράθυρο προγράμματος περιήγησης)", + "AuthForm": "Φόρμες (σελίδα σύνδεσης)", + "Clone": "Κλωνοποίηση", + "DisabledForLocalAddresses": "Απενεργοποιήθηκε για τοπικές διευθύνσεις", + "None": "Κανένας", + "ResetAPIKeyMessageText": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε το κλειδί API σας;" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 980c90479..d8df172fa 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -412,5 +412,24 @@ "DeleteAppProfileMessageText": "Seguro que quieres eliminar el perfil de calidad {0}", "AddConnection": "Añadir Conexión", "NotificationStatusAllClientHealthCheckMessage": "Las listas no están disponibles debido a errores", - "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}", + "EditIndexerImplementation": "Agregar Condición - { implementationName}", + "AuthBasic": "Básico (ventana emergente del navegador)", + "AuthForm": "Formularios (página de inicio de sesión)", + "Author": "Autor", + "Book": "Libro", + "Clone": "Clonar", + "DisabledForLocalAddresses": "Deshabilitado para direcciones locales", + "External": "Externo", + "None": "Ninguna", + "ResetAPIKeyMessageText": "¿Está seguro de que desea restablecer su clave API?", + "EditIndexerProxyImplementation": "Agregar Condición - { implementationName}", + "AppUpdated": "{appName} Actualizado", + "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}", + "AddApplicationImplementation": "Agregar Condición - { implementationName}", + "AddConnectionImplementation": "Agregar Condición - { implementationName}", + "AddIndexerImplementation": "Agregar Condición - { implementationName}", + "AddIndexerProxyImplementation": "Agregar Condición - { implementationName}", + "EditApplicationImplementation": "Agregar Condición - { implementationName}", + "EditConnectionImplementation": "Agregar Condición - { implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 4dbe8cf48..c286219e0 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -493,5 +493,10 @@ "minutes": "Minuuttia", "AddConnection": "Lisää yhteys", "NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi", - "NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}", + "AuthBasic": "Perus (selaimen ponnahdus)", + "AuthForm": "Lomake (kirjautumissivu)", + "DisabledForLocalAddresses": "Ei käytetä paikallisille osoittelle", + "None": "Ei mitään", + "ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 58794eb43..bf4386ec1 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -537,5 +537,14 @@ "AddIndexerImplementation": "Ajouter une condition - {implementationName}", "EditConnectionImplementation": "Ajouter une connexion - {implementationName}", "NotificationStatusAllClientHealthCheckMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements", - "NotificationStatusSingleClientHealthCheckMessage": "Applications indisponibles en raison de dysfonctionnements : {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Applications indisponibles en raison de dysfonctionnements : {0}", + "EditApplicationImplementation": "Ajouter une condition - {implementationName}", + "EditIndexerImplementation": "Ajouter une condition - {implementationName}", + "EditIndexerProxyImplementation": "Ajouter une condition - {implementationName}", + "AuthBasic": "Authentification de base (Basic) (popup dans le navigateur)", + "AuthForm": "Authentification par un formulaire (page de connexion)", + "DisabledForLocalAddresses": "Désactivé pour les adresses IP locales", + "None": "Aucun", + "ResetAPIKeyMessageText": "Êtes vous sûr de vouloir réinitialiser votre Clé d'API ?", + "AddIndexerProxyImplementation": "Ajouter une condition - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index bb72c62c8..9e61008df 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -347,5 +347,10 @@ "minutes": "मिनट", "DeleteAppProfileMessageText": "क्या आप वाकई गुणवत्ता प्रोफ़ाइल {0} को हटाना चाहते हैं", "NotificationStatusAllClientHealthCheckMessage": "सभी सूचियाँ विफल होने के कारण अनुपलब्ध हैं", - "NotificationStatusSingleClientHealthCheckMessage": "विफलताओं के कारण अनुपलब्ध सूची: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "विफलताओं के कारण अनुपलब्ध सूची: {0}", + "AuthBasic": "बेसिक (ब्राउज़र पॉपअप)", + "AuthForm": "प्रपत्र (लॉग इन पेज)", + "DisabledForLocalAddresses": "स्थानीय पते के लिए अक्षम", + "None": "कोई नहीं", + "ResetAPIKeyMessageText": "क्या आप वाकई अपनी API कुंजी को रीसेट करना चाहते हैं?" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index e4929023f..29787539a 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -496,5 +496,10 @@ "minutes": "percek", "AddConnection": "Gyűjtemény módosítása", "NotificationStatusAllClientHealthCheckMessage": "Összes alkalmazás elérhetetlen hiba miatt", - "NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}", + "AuthBasic": "Alap (Böngésző felugró ablak)", + "AuthForm": "Felhasználó (Bejelentkezési oldal)", + "DisabledForLocalAddresses": "Letiltva a helyi címeknél", + "None": "Nincs", + "ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?" } diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index 461354461..8a538e620 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -58,5 +58,7 @@ "Actions": "Tindakan", "AllIndexersHiddenDueToFilter": "Semua film disembunyikan karena penyaringan yang diterapkan.", "AnalyticsEnabledHelpText": "Kirimkan informasi penggunaan secara anonim ke server Radarr. Informasi tersebut mengandung browser kamu, halaman WebUI Radarr yang kamu gunakan, pelaporan masalah serta OS dan versi runtime. Kami akan memanfaatkan informasi ini untuk memprioritaskan fitur dan perbaikan bug.", - "ConnectionLostReconnect": "Radarr akan mencoba untuk menghubungi secara otomatis, atau klik muat ulang di bawah." + "ConnectionLostReconnect": "Radarr akan mencoba untuk menghubungi secara otomatis, atau klik muat ulang di bawah.", + "AuthBasic": "Dasar (Popup Browser)", + "AuthForm": "Formulir (Halaman Login)" } diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 78536b25d..a653bdb88 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -347,5 +347,10 @@ "ConnectionLostReconnect": "Radarr mun reyna að tengjast sjálfkrafa eða þú getur smellt á endurhlaða hér að neðan.", "minutes": "Fundargerð", "NotificationStatusAllClientHealthCheckMessage": "Allir listar eru ekki tiltækir vegna bilana", - "NotificationStatusSingleClientHealthCheckMessage": "Listar ekki tiltækir vegna bilana: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Listar ekki tiltækir vegna bilana: {0}", + "AuthBasic": "Grunn (sprettiglugga vafra)", + "AuthForm": "Eyðublöð (Innskráningarsíða)", + "DisabledForLocalAddresses": "Óvirkt vegna heimilisfanga", + "None": "Enginn", + "ResetAPIKeyMessageText": "Ertu viss um að þú viljir endurstilla API lykilinn þinn?" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index bf8993252..baea94757 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -497,5 +497,10 @@ "minutes": "Minuti", "AddConnection": "Aggiungi Connessione", "NotificationStatusAllClientHealthCheckMessage": "Tutte le applicazioni non sono disponibili a causa di errori", - "NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {0}", + "AuthForm": "Moduli (Pagina di Accesso)", + "DisabledForLocalAddresses": "Disabilitato per Indirizzi Locali", + "None": "Nessuna", + "ResetAPIKeyMessageText": "Sei sicuro di voler reimpostare la tua chiave API?", + "AuthBasic": "Base (Popup del Browser)" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 0cdf375dc..ba69d6b15 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -347,5 +347,10 @@ "WhatsNew": "新着情報?", "minutes": "議事録", "NotificationStatusSingleClientHealthCheckMessage": "失敗のため利用できないリスト:{0}", - "NotificationStatusAllClientHealthCheckMessage": "障害のため、すべてのリストを利用できません" + "NotificationStatusAllClientHealthCheckMessage": "障害のため、すべてのリストを利用できません", + "AuthBasic": "基本(ブラウザポップアップ)", + "AuthForm": "フォーム(ログインページ)", + "DisabledForLocalAddresses": "ローカルアドレスでは無効", + "None": "なし", + "ResetAPIKeyMessageText": "APIキーをリセットしてもよろしいですか?" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 74757cb38..c379f29c2 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -346,5 +346,10 @@ "ConnectionLostToBackend": "Radarr는 백엔드와의 연결이 끊어졌으며 기능을 복원하려면 다시 로딩해야 합니다.", "DeleteAppProfileMessageText": "품질 프로필 {0}을 (를) 삭제 하시겠습니까?", "NotificationStatusAllClientHealthCheckMessage": "실패로 인해 모든 목록을 사용할 수 없습니다.", - "NotificationStatusSingleClientHealthCheckMessage": "실패로 인해 사용할 수없는 목록 : {0}" + "NotificationStatusSingleClientHealthCheckMessage": "실패로 인해 사용할 수없는 목록 : {0}", + "AuthBasic": "기본 (브라우저 팝업)", + "AuthForm": "양식 (로그인 페이지)", + "DisabledForLocalAddresses": "로컬 주소에 대해 비활성화됨", + "None": "없음", + "ResetAPIKeyMessageText": "API 키를 재설정하시겠습니까?" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index e706989ee..eafe00097 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -131,5 +131,9 @@ "ConnectionLostReconnect": "Radarr vil forsøke å koble til automatisk, eller du kan klikke oppdater nedenfor.", "ConnectionLostToBackend": "Radarr har mistet tilkoblingen til baksystemet og må lastes inn på nytt for å gjenopprette funksjonalitet.", "DeleteAppProfileMessageText": "Er du sikker på at du vil slette denne forsinkelsesprofilen?", - "AddConnection": "Legg til kobling" + "AddConnection": "Legg til kobling", + "AuthBasic": "Grunnleggende (nettleser -popup)", + "AuthForm": "Skjemaer (påloggingsside)", + "DisabledForLocalAddresses": "Deaktivert for lokale adresser", + "ResetAPIKeyMessageText": "Er du sikker på at du vil tilbakestille API -nøkkelen din?" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index d0e3dfc38..aef3a9780 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -451,5 +451,10 @@ "DeleteAppProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {0} wilt verwijderen", "NotificationStatusSingleClientHealthCheckMessage": "Applicaties onbeschikbaar door fouten", "AddConnection": "Bewerk collectie", - "NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten" + "NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten", + "AuthBasic": "Basis (Browser Pop-up)", + "AuthForm": "Formulier (Login Pagina)", + "DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen", + "None": "Geen", + "ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 66d9ad4c2..7e0d8b58f 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -369,5 +369,10 @@ "minutes": "Minuty", "NotificationStatusSingleClientHealthCheckMessage": "Listy niedostępne z powodu błędów: {0}", "AddConnection": "Edytuj kolekcję", - "NotificationStatusAllClientHealthCheckMessage": "Wszystkie listy są niedostępne z powodu błędów" + "NotificationStatusAllClientHealthCheckMessage": "Wszystkie listy są niedostępne z powodu błędów", + "AuthForm": "Formularze (strona logowania)", + "DisabledForLocalAddresses": "Wyłączone dla adresów lokalnych", + "None": "Żaden", + "AuthBasic": "Podstawowe (wyskakujące okienko przeglądarki)", + "ResetAPIKeyMessageText": "Czy na pewno chcesz zresetować swój klucz API?" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 21595f963..ed99e5039 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -439,5 +439,10 @@ "RecentChanges": "Mudanças recentes", "minutes": "Minutos", "DeleteAppProfileMessageText": "Tem a certeza que quer eliminar o perfil de qualidade \"{0}\"?", - "AddConnection": "Editar Coleção" + "AddConnection": "Editar Coleção", + "AuthBasic": "Básico (pop-up do browser)", + "AuthForm": "Formulários (página de início de sessão)", + "DisabledForLocalAddresses": "Desativado para endereços locais", + "None": "Nenhum", + "ResetAPIKeyMessageText": "Tem a certeza que quer repor a Chave da API?" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 1b6b41b36..ec5bac1f8 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -45,14 +45,14 @@ "AudioSearch": "Pesquisar Áudio", "Auth": "Autenticação", "Authentication": "Autenticação", - "AuthenticationMethodHelpText": "Requer nome de usuário e senha para acessar o Prowlarr", + "AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar {appName}", "AuthenticationRequired": "Autentificação Requerida", "AuthenticationRequiredHelpText": "Altere para quais solicitações a autenticação é necessária. Não mude a menos que você entenda os riscos.", - "AuthenticationRequiredWarning": "Para impedir o acesso remoto sem autenticação, o Prowlarr agora exige que a autenticação seja habilitada. Configure seu método de autenticação e credenciais. Você pode, opcionalmente, desabilitar a autenticação de endereços locais. Consulte o FAQ para obter informações adicionais.", + "AuthenticationRequiredWarning": "Para evitar o acesso remoto sem autenticação, {appName} agora exige que a autenticação esteja habilitada. Opcionalmente, você pode desabilitar a autenticação de endereços locais.", "Author": "Autor", "Automatic": "Automático", "AutomaticSearch": "Pesquisa Automática", - "AverageResponseTimesMs": "Tempos Médios de Resposta (Ms)", + "AverageResponseTimesMs": "Tempos Médios de Resposta do Indexador (ms)", "Backup": "Backup", "BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do Prowlarr", "BackupIntervalHelpText": "Intervalo entre backups automáticos", @@ -576,5 +576,23 @@ "EditIndexerImplementation": "Editar Indexador - {implementationName}", "EditIndexerProxyImplementation": "Editar Proxy do Indexador - {implementationName}", "NotificationStatusAllClientHealthCheckMessage": "Todas as notificações estão indisponíveis devido a falhas", - "NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {0}", + "AuthForm": "Formulário (Página de login)", + "AuthenticationMethod": "Método de Autenticação", + "AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido", + "AuthenticationRequiredPasswordHelpTextWarning": "Insira uma nova senha", + "AuthenticationRequiredUsernameHelpTextWarning": "Digite um novo nome de usuário", + "Clone": "Clonar", + "DefaultNameCopiedProfile": "{name} - Cópia", + "DisabledForLocalAddresses": "Desativado para Endereços Locais", + "External": "Externo", + "None": "Vazio", + "ResetAPIKeyMessageText": "Tem certeza de que deseja redefinir sua chave de API?", + "AuthBasic": "Básico (Balão do Navegador)", + "ActiveIndexers": "Indexadores Ativos", + "ActiveApps": "Apps Ativos", + "IndexerHistoryLoadError": "Erro ao carregar o histórico do indexador", + "NoIndexerHistory": "Nenhum histórico encontrado para este indexador", + "TotalGrabs": "Total de Capturas", + "TotalQueries": "Total de Consultas" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 1dc92139a..347a2c8a0 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -438,5 +438,10 @@ "RecentChanges": "Schimbări recente", "WhatsNew": "Ce mai e nou?", "DeleteAppProfileMessageText": "Sigur doriți să ștergeți profilul de aplicație '{0}'?", - "NotificationStatusSingleClientHealthCheckMessage": "Notificări indisponibile datorită erorilor: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Notificări indisponibile datorită erorilor: {0}", + "AuthBasic": "Basic (fereastră pop-up browser)", + "AuthForm": "Formulare (Pagina de autentificare)", + "DisabledForLocalAddresses": "Dezactivat pentru adresele locale", + "None": "Nici unul", + "ResetAPIKeyMessageText": "Sigur doriți să vă resetați cheia API?" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 6f06f1f97..f50958c3e 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -407,5 +407,12 @@ "EditIndexerProxyImplementation": "Редактировать индексатор - {implementationName}", "Season": "Сезон", "AddApplicationImplementation": "Добавить соединение - {implementationName}", - "EditApplicationImplementation": "Редактировать уведомление - {implementationName}" + "EditApplicationImplementation": "Редактировать уведомление - {implementationName}", + "AuthBasic": "Базовый (всплывающее окно браузера)", + "AuthForm": "Формы (Страница авторизации)", + "DisabledForLocalAddresses": "Отключено для локальных адресов", + "None": "Ничто", + "ResetAPIKeyMessageText": "Вы уверены, что хотите сбросить Ваш API ключ?", + "Categories": "Категории", + "Album": "альбом" } diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index 4769467d0..3baebcc99 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -113,5 +113,9 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Ako použiť značky na vybrané filmy", "Season": "Séria", "Publisher": "Vydavateľ", - "DeleteAppProfileMessageText": "Naozaj chcete zmazať tento profil oneskorenia?" + "DeleteAppProfileMessageText": "Naozaj chcete zmazať tento profil oneskorenia?", + "AuthBasic": "Základné (vyskakovacie okno prehliadača)", + "AuthForm": "Formuláre (prihlasovacia stránka)", + "DisabledForLocalAddresses": "Zakázané pre miestne adresy", + "ResetAPIKeyMessageText": "Naozaj chcete obnoviť kľúč API?" } diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index d922be4ef..863f87dc3 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -432,5 +432,10 @@ "WhatsNew": "Vad är nytt?", "minutes": "Minuter", "NotificationStatusSingleClientHealthCheckMessage": "Listor otillgängliga på grund av fel: {0}", - "NotificationStatusAllClientHealthCheckMessage": "Samtliga listor otillgängliga på grund av fel" + "NotificationStatusAllClientHealthCheckMessage": "Samtliga listor otillgängliga på grund av fel", + "AuthBasic": "Grundläggande (Browser Popup)", + "AuthForm": "Blanketter (inloggningssida)", + "DisabledForLocalAddresses": "Inaktiverad för lokala adresser", + "None": "Ingen", + "ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?" } diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 9538bbec2..e4418e817 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -350,5 +350,10 @@ "WhatsNew": "มีอะไรใหม่", "RecentChanges": "การเปลี่ยนแปลงล่าสุด", "NotificationStatusAllClientHealthCheckMessage": "รายการทั้งหมดไม่พร้อมใช้งานเนื่องจากความล้มเหลว", - "NotificationStatusSingleClientHealthCheckMessage": "รายการไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "รายการไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {0}", + "AuthBasic": "พื้นฐาน (เบราว์เซอร์ป๊อปอัพ)", + "AuthForm": "แบบฟอร์ม (หน้าเข้าสู่ระบบ)", + "DisabledForLocalAddresses": "ปิดใช้งานสำหรับที่อยู่ท้องถิ่น", + "None": "ไม่มี", + "ResetAPIKeyMessageText": "แน่ใจไหมว่าต้องการรีเซ็ตคีย์ API" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 661154611..617b7e5e5 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -350,5 +350,14 @@ "WhatsNew": "Ne var ne yok?", "ConnectionLostReconnect": "Radarr otomatik olarak bağlanmayı deneyecek veya aşağıdan yeniden yükle'yi tıklayabilirsiniz.", "NotificationStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", - "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", + "Applications": "Uygulamalar", + "AuthBasic": "Temel (Tarayıcı Açılır Penceresi)", + "AuthForm": "Formlar (Giriş Sayfası)", + "DisabledForLocalAddresses": "Yerel Adresler için Devre Dışı Bırakıldı", + "None": "Yok", + "ResetAPIKeyMessageText": "API Anahtarınızı sıfırlamak istediğinizden emin misiniz?", + "Categories": "Kategoriler", + "Application": "Uygulamalar", + "Episode": "bölüm" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index a30d690f4..0a40b4211 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -362,5 +362,11 @@ "minutes": "Хвилин", "WhatsNew": "Що нового?", "NotificationStatusAllClientHealthCheckMessage": "Усі списки недоступні через помилки", - "NotificationStatusSingleClientHealthCheckMessage": "Списки недоступні через помилки: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Списки недоступні через помилки: {0}", + "AuthBasic": "Основний (спливаюче вікно браузера)", + "AuthForm": "Форми (сторінка входу)", + "DisabledForLocalAddresses": "Відключено для локальних адрес", + "None": "Жодного", + "ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?", + "AddConnection": "Редагувати колекцію" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index cc0430514..98cdc821e 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -348,5 +348,10 @@ "ConnectionLostReconnect": "Radarr sẽ cố gắng kết nối tự động hoặc bạn có thể nhấp vào tải lại bên dưới.", "WhatsNew": "Có gì mới?", "NotificationStatusAllClientHealthCheckMessage": "Tất cả danh sách không có sẵn do lỗi", - "NotificationStatusSingleClientHealthCheckMessage": "Danh sách không có sẵn do lỗi: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "Danh sách không có sẵn do lỗi: {0}", + "AuthBasic": "Cơ bản (Cửa sổ bật lên trình duyệt)", + "AuthForm": "Biểu mẫu (Trang đăng nhập)", + "DisabledForLocalAddresses": "Bị vô hiệu hóa đối với địa chỉ địa phương", + "None": "không ai", + "ResetAPIKeyMessageText": "Bạn có chắc chắn muốn đặt lại Khóa API của mình không?" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index bb93047ea..b504c25f5 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -568,5 +568,18 @@ "EditApplicationImplementation": "添加应用-{实体名称}", "EditConnectionImplementation": "添加集合 - {implementationName}", "NotificationStatusAllClientHealthCheckMessage": "由于故障所用应用程序都不可用", - "NotificationStatusSingleClientHealthCheckMessage": "由于故障应用程序不可用" + "NotificationStatusSingleClientHealthCheckMessage": "由于故障应用程序不可用", + "AuthBasic": "基础(浏览器弹出对话框)", + "AuthForm": "表单(登陆页面)", + "AuthenticationMethod": "认证方式", + "AuthenticationMethodHelpTextWarning": "请选择有效的认证方式", + "AuthenticationRequiredPasswordHelpTextWarning": "输入一个新的密码", + "AuthenticationRequiredUsernameHelpTextWarning": "输入一个新的用户名", + "Clone": "复制", + "DefaultNameCopiedProfile": "{name} - 复制", + "DisabledForLocalAddresses": "对局域网内禁用", + "External": "外部的", + "None": "无", + "ResetAPIKeyMessageText": "您确定要重置您的 API 密钥吗?", + "IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{0}。" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index c112e4b0d..8778a0240 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -102,5 +102,7 @@ "AnalyticsEnabledHelpText": "將使用和錯誤資訊匿名傳送至Radarr的伺服器。這些資訊包括您的瀏覽器資訊、使用的Radarr WebUI頁面、錯誤報告,以及作業系統和執行時版本。我們將使用這些資訊來優先處理功能和錯誤修復。", "ApiKey": "API 金鑰", "AppDataDirectory": "AppData 路徑", - "Applications": "應用程式" + "Applications": "應用程式", + "AuthBasic": "基礎(瀏覽器彈出視窗)", + "AuthForm": "表單(登入頁面)" } From 6449b89eb647e5ce7ff98385952dc17fe19c0c30 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 10 Sep 2023 13:51:02 -0700 Subject: [PATCH 174/964] Fixed parsing of multiple languages from Newznab indexer releases (cherry picked from commit 2a241294b5eeb9e95c46e030828191da09d05e88) --- .../Definitions/Newznab/NewznabRssParser.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRssParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRssParser.cs index 87bea73ed..b1327a15a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRssParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRssParser.cs @@ -156,20 +156,26 @@ namespace NzbDrone.Core.Indexers.Newznab protected override List GetLanguages(XElement item) { - var languages = TryGetMultipleNewznabAttributes(item, "language"); + var languageElements = TryGetMultipleNewznabAttributes(item, "language"); var results = new List(); // Try to find elements for some indexers that suck at following the rules. - if (languages.Count == 0) + if (languageElements.Count == 0) { - languages = item.Elements("language").Select(e => e.Value).ToList(); + languageElements = item.Elements("language").Select(e => e.Value).ToList(); } - foreach (var language in languages) + foreach (var languageElement in languageElements) { - if (language.IsNotNullOrWhiteSpace()) + var languages = languageElement.Split(',', + StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + foreach (var language in languages) { - results.Add(language); + if (language.IsNotNullOrWhiteSpace()) + { + results.Add(language); + } } } From ba278930eda62df26f407a529531258b4bf04852 Mon Sep 17 00:00:00 2001 From: Denis Gheorghescu Date: Sun, 10 Sep 2023 23:09:15 +0300 Subject: [PATCH 175/964] New: Pushcut notifications (cherry picked from commit 5f09f2b25f9144666b8e5182e20e263e74d5f5ca) --- .../Notifications/Pushcut/Pushcut.cs | 49 +++++++++++ .../Notifications/Pushcut/PushcutException.cs | 28 ++++++ .../Notifications/Pushcut/PushcutPayload.cs | 9 ++ .../Notifications/Pushcut/PushcutProxy.cs | 88 +++++++++++++++++++ .../Notifications/Pushcut/PushcutResponse.cs | 7 ++ .../Notifications/Pushcut/PushcutSettings.cs | 35 ++++++++ 6 files changed, 216 insertions(+) create mode 100644 src/NzbDrone.Core/Notifications/Pushcut/Pushcut.cs create mode 100644 src/NzbDrone.Core/Notifications/Pushcut/PushcutException.cs create mode 100644 src/NzbDrone.Core/Notifications/Pushcut/PushcutPayload.cs create mode 100644 src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs create mode 100644 src/NzbDrone.Core/Notifications/Pushcut/PushcutResponse.cs create mode 100644 src/NzbDrone.Core/Notifications/Pushcut/PushcutSettings.cs diff --git a/src/NzbDrone.Core/Notifications/Pushcut/Pushcut.cs b/src/NzbDrone.Core/Notifications/Pushcut/Pushcut.cs new file mode 100644 index 000000000..caec67f60 --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Pushcut/Pushcut.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using FluentValidation.Results; +using NzbDrone.Common.Extensions; + +namespace NzbDrone.Core.Notifications.Pushcut +{ + public class Pushcut : NotificationBase + { + private readonly IPushcutProxy _proxy; + + public Pushcut(IPushcutProxy proxy) + { + _proxy = proxy; + } + + public override string Name => "Pushcut"; + + public override string Link => "https://www.pushcut.io"; + + public override ValidationResult Test() + { + var failures = new List(); + + failures.AddIfNotNull(_proxy.Test(Settings)); + + return new ValidationResult(failures); + } + + public override void OnGrab(GrabMessage grabMessage) + { + _proxy.SendNotification(RELEASE_GRABBED_TITLE_BRANDED, grabMessage.Message, Settings); + } + + public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) + { + _proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, Settings); + } + + public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck) + { + _proxy.SendNotification(HEALTH_RESTORED_TITLE, $"The following issue is now resolved: {previousCheck.Message}", Settings); + } + + public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage) + { + _proxy.SendNotification(APPLICATION_UPDATE_TITLE_BRANDED, updateMessage.Message, Settings); + } + } +} diff --git a/src/NzbDrone.Core/Notifications/Pushcut/PushcutException.cs b/src/NzbDrone.Core/Notifications/Pushcut/PushcutException.cs new file mode 100644 index 000000000..5783063e2 --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Pushcut/PushcutException.cs @@ -0,0 +1,28 @@ +using System; +using NzbDrone.Common.Exceptions; + +namespace NzbDrone.Core.Notifications.Pushcut +{ + public class PushcutException : NzbDroneException + { + public PushcutException(string message, params object[] args) + : base(message, args) + { + } + + public PushcutException(string message) + : base(message) + { + } + + public PushcutException(string message, Exception innerException, params object[] args) + : base(message, innerException, args) + { + } + + public PushcutException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/src/NzbDrone.Core/Notifications/Pushcut/PushcutPayload.cs b/src/NzbDrone.Core/Notifications/Pushcut/PushcutPayload.cs new file mode 100644 index 000000000..41a5d3caf --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Pushcut/PushcutPayload.cs @@ -0,0 +1,9 @@ +namespace NzbDrone.Core.Notifications.Pushcut +{ + public class PushcutPayload + { + public string Title { get; set; } + public string Text { get; set; } + public bool? IsTimeSensitive { get; set; } + } +} diff --git a/src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs b/src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs new file mode 100644 index 000000000..ddae1319a --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs @@ -0,0 +1,88 @@ +using System.Net; +using System.Net.Http; +using FluentValidation.Results; +using NLog; +using NzbDrone.Common.Extensions; +using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; + +namespace NzbDrone.Core.Notifications.Pushcut +{ + public interface IPushcutProxy + { + void SendNotification(string title, string message, PushcutSettings settings); + ValidationFailure Test(PushcutSettings settings); + } + + public class PushcutProxy : IPushcutProxy + { + private readonly IHttpClient _httpClient; + private readonly Logger _logger; + + public PushcutProxy(IHttpClient httpClient, Logger logger) + { + _httpClient = httpClient; + _logger = logger; + } + + public void SendNotification(string title, string message, PushcutSettings settings) + { + var request = new HttpRequestBuilder("https://api.pushcut.io/v1/notifications/{notificationName}") + .SetSegment("notificationName", settings?.NotificationName) + .SetHeader("API-Key", settings?.ApiKey) + .Accept(HttpAccept.Json) + .Build(); + var payload = new PushcutPayload + { + Title = title, + Text = message, + IsTimeSensitive = settings?.TimeSensitive + }; + + request.Method = HttpMethod.Post; + request.Headers.ContentType = "application/json"; + request.SetContent(payload.ToJson()); + + try + { + _httpClient.Execute(request); + } + catch (HttpException exception) + { + _logger.Error(exception, "Unable to send Pushcut notification: {0}", exception.Message); + throw new PushcutException("Unable to send Pushcut notification: {0}", exception.Message, exception); + } + } + + public ValidationFailure Test(PushcutSettings settings) + { + try + { + const string title = "Sonarr Test Title"; + const string message = "Success! You have properly configured your Pushcut notification settings."; + SendNotification(title, message, settings); + } + catch (PushcutException pushcutException) when (pushcutException.InnerException is HttpException httpException) + { + if (httpException.Response.StatusCode == HttpStatusCode.Forbidden) + { + _logger.Error(pushcutException, "API Key is invalid: {0}", pushcutException.Message); + return new ValidationFailure("API Key", $"API Key is invalid: {pushcutException.Message}"); + } + + if (httpException.Response.Content.IsNotNullOrWhiteSpace()) + { + var response = Json.Deserialize(httpException.Response.Content); + + _logger.Error(pushcutException, "Unable to send test notification. Response from Pushcut: {0}", response.Error); + return new ValidationFailure("Url", $"Unable to send test notification. Response from Pushcut: {response.Error}"); + } + + _logger.Error(pushcutException, "Unable to connect to Pushcut API. Server connection failed: ({0}) {1}", httpException.Response.StatusCode, pushcutException.Message); + return new ValidationFailure("Host", $"Unable to connect to Pushcut API. Server connection failed: ({httpException.Response.StatusCode}) {pushcutException.Message}"); + } + + return null; + } + } +} diff --git a/src/NzbDrone.Core/Notifications/Pushcut/PushcutResponse.cs b/src/NzbDrone.Core/Notifications/Pushcut/PushcutResponse.cs new file mode 100644 index 000000000..280880cd0 --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Pushcut/PushcutResponse.cs @@ -0,0 +1,7 @@ +namespace NzbDrone.Core.Notifications.Pushcut +{ + public class PushcutResponse + { + public string Error { get; set; } + } +} diff --git a/src/NzbDrone.Core/Notifications/Pushcut/PushcutSettings.cs b/src/NzbDrone.Core/Notifications/Pushcut/PushcutSettings.cs new file mode 100644 index 000000000..625bca01e --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Pushcut/PushcutSettings.cs @@ -0,0 +1,35 @@ +using FluentValidation; +using NzbDrone.Core.Annotations; +using NzbDrone.Core.ThingiProvider; +using NzbDrone.Core.Validation; + +namespace NzbDrone.Core.Notifications.Pushcut +{ + public class PushcutSettingsValidator : AbstractValidator + { + public PushcutSettingsValidator() + { + RuleFor(settings => settings.ApiKey).NotEmpty(); + RuleFor(settings => settings.NotificationName).NotEmpty(); + } + } + + public class PushcutSettings : IProviderConfig + { + private static readonly PushcutSettingsValidator Validator = new (); + + [FieldDefinition(0, Label = "Notification name", Type = FieldType.Textbox, HelpText = "Notification name from Notifications tab of the Pushcut app.")] + public string NotificationName { get; set; } + + [FieldDefinition(1, Label = "API Key", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey, HelpText = "API Keys can be managed in the Account view of the Pushcut app.")] + public string ApiKey { get; set; } + + [FieldDefinition(2, Label = "Time sensitive", Type = FieldType.Checkbox, HelpText = "Check to mark the notification as \"Time-Sensitive\"")] + public bool TimeSensitive { get; set; } + + public NzbDroneValidationResult Validate() + { + return new NzbDroneValidationResult(Validator.Validate(this)); + } + } +} From ee5ed0c91b4d35894f3af260053ffca8ced7bcf9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 11 Sep 2023 11:59:51 +0300 Subject: [PATCH 176/964] Sonarr > Prowlarr --- src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs | 2 +- src/NzbDrone.Core/Notifications/Signal/SignalProxy.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs b/src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs index ddae1319a..fd8b1a8d6 100644 --- a/src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs +++ b/src/NzbDrone.Core/Notifications/Pushcut/PushcutProxy.cs @@ -58,7 +58,7 @@ namespace NzbDrone.Core.Notifications.Pushcut { try { - const string title = "Sonarr Test Title"; + const string title = "Prowlarr Test Title"; const string message = "Success! You have properly configured your Pushcut notification settings."; SendNotification(title, message, settings); } diff --git a/src/NzbDrone.Core/Notifications/Signal/SignalProxy.cs b/src/NzbDrone.Core/Notifications/Signal/SignalProxy.cs index e41de7a32..ddae46dac 100644 --- a/src/NzbDrone.Core/Notifications/Signal/SignalProxy.cs +++ b/src/NzbDrone.Core/Notifications/Signal/SignalProxy.cs @@ -64,7 +64,7 @@ namespace NzbDrone.Core.Notifications.Signal try { const string title = "Test Notification"; - const string body = "This is a test message from Sonarr"; + const string body = "This is a test message from Prowlarr"; SendNotification(title, body, settings); } From 80e5ac4aa916a500ce9bff5e6005d5324822217d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 12 Sep 2023 15:25:48 +0300 Subject: [PATCH 177/964] New: Add custom filter by protocol for indexer stats --- .../src/Store/Actions/indexerStatsActions.js | 10 +++++++++ .../Indexers/IndexerStatsController.cs | 21 +++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/frontend/src/Store/Actions/indexerStatsActions.js b/frontend/src/Store/Actions/indexerStatsActions.js index dc928d9b5..fe13c6db4 100644 --- a/frontend/src/Store/Actions/indexerStatsActions.js +++ b/frontend/src/Store/Actions/indexerStatsActions.js @@ -61,6 +61,12 @@ export const defaultState = { type: filterBuilderTypes.CONTAINS, valueType: filterBuilderValueTypes.INDEXER }, + { + name: 'protocols', + label: () => translate('Protocols'), + type: filterBuilderTypes.EXACT, + valueType: filterBuilderValueTypes.PROTOCOL + }, { name: 'tags', label: () => translate('Tags'), @@ -112,6 +118,10 @@ export const actionHandlers = handleThunks({ requestParams.indexers = selectedFilter.value.join(','); } + if (selectedFilter.key === 'protocols') { + requestParams.protocols = selectedFilter.value.join(','); + } + if (selectedFilter.key === 'tags') { requestParams.tags = selectedFilter.value.join(','); } diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerStatsController.cs b/src/Prowlarr.Api.V1/Indexers/IndexerStatsController.cs index 1b9b1ec91..cd513c2e0 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerStatsController.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerStatsController.cs @@ -26,13 +26,30 @@ namespace Prowlarr.Api.V1.Indexers [HttpGet] [Produces("application/json")] - public IndexerStatsResource GetAll(DateTime? startDate, DateTime? endDate, string indexers, string tags) + public IndexerStatsResource GetAll(DateTime? startDate, DateTime? endDate, string indexers, string protocols, string tags) { var statsStartDate = startDate ?? DateTime.MinValue; var statsEndDate = endDate ?? DateTime.Now; var parsedIndexers = new List(); var parsedTags = new List(); - var indexerIds = _indexerFactory.All().Select(i => i.Id).ToList(); + + var allIndexers = _indexerFactory.All().Select(_indexerFactory.GetInstance).ToList(); + + if (protocols.IsNotNullOrWhiteSpace()) + { + var parsedProtocols = protocols.Split(',') + .Select(protocol => + { + Enum.TryParse(protocol, true, out DownloadProtocol downloadProtocol); + + return downloadProtocol; + }) + .ToHashSet(); + + allIndexers = allIndexers.Where(i => parsedProtocols.Contains(i.Protocol)).ToList(); + } + + var indexerIds = allIndexers.Select(i => i.Definition.Id).ToList(); if (tags.IsNotNullOrWhiteSpace()) { From 86cec51ebe1df0d461621770387f6d8a81cf8b59 Mon Sep 17 00:00:00 2001 From: Servarr Date: Tue, 12 Sep 2023 12:30:59 +0000 Subject: [PATCH 178/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index b82636bac..c5174e5e3 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -2173,6 +2173,13 @@ "type": "string" } }, + { + "name": "protocols", + "in": "query", + "schema": { + "type": "string" + } + }, { "name": "tags", "in": "query", From 0b0d6b7590f36972ad23fd1ee7a2674014f5044c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 13 Sep 2023 12:29:26 +0300 Subject: [PATCH 179/964] Fixed: (SubsPlease) Update category mappings for movie releases Co-authored-by: Lemres <45440100+Calemy@users.noreply.github.com> Fixes #1866 --- .../Indexers/Definitions/SubsPlease.cs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs b/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs index 1ad3f125b..d395e0ba1 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs @@ -43,7 +43,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IIndexerRequestGenerator GetRequestGenerator() { - return new SubsPleaseRequestGenerator() { Settings = Settings, Capabilities = Capabilities }; + return new SubsPleaseRequestGenerator { Settings = Settings, Capabilities = Capabilities }; } public override IParseIndexerResponse GetParser() @@ -56,12 +56,17 @@ namespace NzbDrone.Core.Indexers.Definitions var caps = new IndexerCapabilities { TvSearchParams = new List - { - TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep - }, + { + TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep + }, + MovieSearchParams = new List + { + MovieSearchParam.Q + } }; - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.TVAnime, "Anime"); + caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.TVAnime); + caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.MoviesOther); return caps; } @@ -205,6 +210,11 @@ namespace NzbDrone.Core.Indexers.Definitions UploadVolumeFactor = 1 }; + if (value.Episode.ToLowerInvariant() == "movie") + { + release.Categories.Add(NewznabStandardCategory.MoviesOther); + } + // Ex: [SubsPlease] Shingeki no Kyojin (The Final Season) - 64 (1080p) release.Title += $"[SubsPlease] {value.Show} - {value.Episode} ({d.Res}p)"; release.MagnetUrl = d.Magnet; From 0598211319a1ccac5402900b4ec3539ab767b644 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Sep 2023 04:06:08 +0300 Subject: [PATCH 180/964] Fixed: Ignore inaccessible mount points (cherry picked from commit 60f18249b05daa20523542beef54bc126d963d1e) --- src/NzbDrone.Mono/Disk/DiskProvider.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Mono/Disk/DiskProvider.cs b/src/NzbDrone.Mono/Disk/DiskProvider.cs index 0cbdf9cfa..a44966bc5 100644 --- a/src/NzbDrone.Mono/Disk/DiskProvider.cs +++ b/src/NzbDrone.Mono/Disk/DiskProvider.cs @@ -190,10 +190,12 @@ namespace NzbDrone.Mono.Disk } catch (Exception ex) { - throw new Exception($"Failed to fetch drive info for mount point: {d.Name}", ex); + _logger.Debug(ex, "Failed to fetch drive info for mount point: {0}", d.Name); + + return null; } }) - .Where(d => d.DriveType is DriveType.Fixed or DriveType.Network or DriveType.Removable)); + .Where(d => d is { DriveType: DriveType.Fixed or DriveType.Network or DriveType.Removable })); } catch (Exception e) { From 1a9ec4febde9efe753564d6fd3807fae1dcd5fa2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Sep 2023 17:50:54 +0300 Subject: [PATCH 181/964] Fixed: (Apps) Check if the indexers have valid settings --- src/NzbDrone.Core/Applications/ApplicationService.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/NzbDrone.Core/Applications/ApplicationService.cs b/src/NzbDrone.Core/Applications/ApplicationService.cs index 419008f7f..097b701d1 100644 --- a/src/NzbDrone.Core/Applications/ApplicationService.cs +++ b/src/NzbDrone.Core/Applications/ApplicationService.cs @@ -202,9 +202,17 @@ namespace NzbDrone.Core.Applications private bool ShouldHandleIndexer(ProviderDefinition app, ProviderDefinition indexer) { + if (!indexer.Settings.Validate().IsValid) + { + _logger.Debug("Indexer {0} [{1}] has invalid settings.", indexer.Name, indexer.Id); + + return false; + } + if (app.Tags.Empty()) { _logger.Debug("No tags set to application {0}.", app.Name); + return true; } @@ -213,10 +221,12 @@ namespace NzbDrone.Core.Applications if (intersectingTags.Any()) { _logger.Debug("Application {0} and indexer {1} [{2}] have {3} intersecting (matching) tags.", app.Name, indexer.Name, indexer.Id, intersectingTags.Length); + return true; } _logger.Debug("Application {0} does not have any intersecting (matching) tags with {1} [{2}]. Indexer will neither be synced to nor removed from the application.", app.Name, indexer.Name, indexer.Id); + return false; } From 3283d144f5a3095c6c3684bef618ce47ee59ae17 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Sep 2023 18:22:53 +0300 Subject: [PATCH 182/964] Ignore invalid cookies when adding response cookies to CookieContainer Fixes #1868 --- src/NzbDrone.Common/Http/HttpClient.cs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Common/Http/HttpClient.cs b/src/NzbDrone.Common/Http/HttpClient.cs index a1e6f0243..470f4f5c4 100644 --- a/src/NzbDrone.Common/Http/HttpClient.cs +++ b/src/NzbDrone.Common/Http/HttpClient.cs @@ -221,11 +221,18 @@ namespace NzbDrone.Common.Http }; } - sourceContainer.Add((Uri)request.Url, cookie); - - if (request.StoreRequestCookie) + try { - presistentContainer.Add((Uri)request.Url, cookie); + sourceContainer.Add((Uri)request.Url, cookie); + + if (request.StoreRequestCookie) + { + presistentContainer.Add((Uri)request.Url, cookie); + } + } + catch (CookieException ex) + { + _logger.Debug(ex, "Invalid cookie in {0}", (Uri)request.Url); } } } @@ -260,7 +267,14 @@ namespace NzbDrone.Common.Http }; } - sourceContainer.Add((Uri)request.Url, cookie); + try + { + sourceContainer.Add((Uri)request.Url, cookie); + } + catch (CookieException ex) + { + _logger.Debug(ex, "Invalid cookie in {0}", (Uri)request.Url); + } } } From 478d5a624fec0ffaba62188f72518791a6bd3d20 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Sep 2023 18:42:21 +0300 Subject: [PATCH 183/964] Fixed: (Animedia) Removed Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> --- src/NzbDrone.Core/Indexers/Definitions/Animedia.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs b/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs index e40b6e40e..5e29a2130 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs @@ -17,6 +17,7 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions { + [Obsolete("Site is unusable due to a mix of HTTP errors")] public class Animedia : TorrentIndexerBase { public override string Name => "Animedia"; From 0f3a77c336c6c7daffcad6e350ee9917044419bf Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Sep 2023 18:55:07 +0300 Subject: [PATCH 184/964] Return 1 seeder as fallback in Torrent RSS Feed --- src/NzbDrone.Core/Indexers/TorrentRssParser.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/TorrentRssParser.cs b/src/NzbDrone.Core/Indexers/TorrentRssParser.cs index 4563c7ab3..11bf0159d 100644 --- a/src/NzbDrone.Core/Indexers/TorrentRssParser.cs +++ b/src/NzbDrone.Core/Indexers/TorrentRssParser.cs @@ -145,7 +145,8 @@ namespace NzbDrone.Core.Indexers return (int)seeds; } - return null; + // Return 1 seeder as fallback + return 1; } protected virtual int? GetPeers(XElement item) @@ -174,7 +175,8 @@ namespace NzbDrone.Core.Indexers return int.Parse(itempeers.Value); } - return null; + // Ensure returning 1 seeder as fallback + return 1; } protected override long GetSize(XElement item) From c061c309bdddf28a00d9f4a35d180614aeb4fb9d Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:48:28 -0500 Subject: [PATCH 185/964] Improve tags helptext and add warnings --- frontend/src/Indexer/Edit/EditIndexerModalContent.js | 1 + .../Applications/Applications/EditApplicationModalContent.js | 3 ++- src/NzbDrone.Core/Localization/Core/en.json | 5 ++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/src/Indexer/Edit/EditIndexerModalContent.js b/frontend/src/Indexer/Edit/EditIndexerModalContent.js index 1fdc06eb0..b09b9e656 100644 --- a/frontend/src/Indexer/Edit/EditIndexerModalContent.js +++ b/frontend/src/Indexer/Edit/EditIndexerModalContent.js @@ -187,6 +187,7 @@ function EditIndexerModalContent(props) { type={inputTypes.TAG} name="tags" helpText={translate('IndexerTagsHelpText')} + helpTextWarning={translate('IndexerTagsHelpTextWarning')} {...tags} onChange={onInputChange} /> diff --git a/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js b/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js index 33cae830a..00e30cdb7 100644 --- a/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js +++ b/frontend/src/Settings/Applications/Applications/EditApplicationModalContent.js @@ -133,7 +133,8 @@ function EditApplicationModalContent(props) { diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 309613c7d..e543300ef 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -47,6 +47,8 @@ "ApplicationLongTermStatusCheckSingleClientMessage": "Applications unavailable due to failures for more than 6 hours: {0}", "ApplicationStatusCheckAllClientMessage": "All applications are unavailable due to failures", "ApplicationStatusCheckSingleClientMessage": "Applications unavailable due to failures: {0}", + "ApplicationTagsHelpText": "Sync Indexers to this application that have no tags or that have 1 or more matching tags", + "ApplicationTagsHelpTextWarning": "Tags should be used with caution, they can have unintended effects. An app with a tag will only sync to indexers with the same tag.", "ApplicationURL": "Application URL", "ApplicationUrlHelpText": "This application's external URL including http(s)://, port and URL base", "Applications": "Applications", @@ -280,7 +282,8 @@ "IndexerStatus": "Indexer Status", "IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures", "IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}", - "IndexerTagsHelpText": "Use tags to specify Indexer Proxies or which apps the indexer is synced to. Applications without 1 or more matching Indexer Tags will not be synced to.", + "IndexerTagsHelpText": "Use tags to specify Indexer Proxies or which apps the indexer is synced to.", + "IndexerTagsHelpTextWarning": "Tags should be used with caution, they can have unintended effects. An indexer with a tag will only sync to apps with the same tag.", "IndexerVipCheckExpiredClientMessage": "Indexer VIP benefits have expired: {0}", "IndexerVipCheckExpiringClientMessage": "Indexer VIP benefits expiring soon: {0}", "Indexers": "Indexers", From 4a7cc82f0d14ec50d3fd2fcc0bac54a7c4a83924 Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:56:24 -0500 Subject: [PATCH 186/964] Correction to Improve tags helptext and add warnings --- src/NzbDrone.Core/Localization/Core/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index e543300ef..23367daea 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -48,7 +48,7 @@ "ApplicationStatusCheckAllClientMessage": "All applications are unavailable due to failures", "ApplicationStatusCheckSingleClientMessage": "Applications unavailable due to failures: {0}", "ApplicationTagsHelpText": "Sync Indexers to this application that have no tags or that have 1 or more matching tags", - "ApplicationTagsHelpTextWarning": "Tags should be used with caution, they can have unintended effects. An app with a tag will only sync to indexers with the same tag.", + "ApplicationTagsHelpTextWarning": "Tags should be used with caution, they can have unintended effects. An app with a tag will only sync with indexers having the same tag.", "ApplicationURL": "Application URL", "ApplicationUrlHelpText": "This application's external URL including http(s)://, port and URL base", "Applications": "Applications", From 9adbfd23911e4840c718decf66fb4894439ddc2b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Sep 2023 21:48:24 +0300 Subject: [PATCH 187/964] Return 1 seeder as fallback only in Torrent RSS Feed --- .../Definitions/TorrentRss/TorrentRssParserFactory.cs | 3 ++- src/NzbDrone.Core/Indexers/TorrentRssParser.cs | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssParserFactory.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssParserFactory.cs index fd11862b1..5f5926a83 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssParserFactory.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssParserFactory.cs @@ -46,7 +46,8 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentRss ParseSizeInDescription = parserSettings.ParseSizeInDescription, SizeElementName = parserSettings.SizeElementName, - DefaultReleaseSize = indexerSettings.DefaultReleaseSize + DefaultReleaseSize = indexerSettings.DefaultReleaseSize, + DefaultReleaseSeeders = 1 }; } diff --git a/src/NzbDrone.Core/Indexers/TorrentRssParser.cs b/src/NzbDrone.Core/Indexers/TorrentRssParser.cs index 11bf0159d..eb78a8111 100644 --- a/src/NzbDrone.Core/Indexers/TorrentRssParser.cs +++ b/src/NzbDrone.Core/Indexers/TorrentRssParser.cs @@ -34,6 +34,9 @@ namespace NzbDrone.Core.Indexers // Default size for when release sizes aren't available public double? DefaultReleaseSize { get; set; } + // Default value for when release seeders aren't available + public int? DefaultReleaseSeeders { get; set; } + public TorrentRssParser() { PreferredEnclosureMimeTypes = TorrentEnclosureMimeTypes; @@ -145,8 +148,7 @@ namespace NzbDrone.Core.Indexers return (int)seeds; } - // Return 1 seeder as fallback - return 1; + return DefaultReleaseSeeders; } protected virtual int? GetPeers(XElement item) @@ -175,8 +177,7 @@ namespace NzbDrone.Core.Indexers return int.Parse(itempeers.Value); } - // Ensure returning 1 seeder as fallback - return 1; + return DefaultReleaseSeeders; } protected override long GetSize(XElement item) From 6c831f11a6fca40a234371488b8851d4f92207c0 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 10 Sep 2023 16:09:54 +0000 Subject: [PATCH 188/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Havok Dan Co-authored-by: Weblate Co-authored-by: leotpp Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/zh_CN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index b504c25f5..204cbfb7c 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -571,7 +571,7 @@ "NotificationStatusSingleClientHealthCheckMessage": "由于故障应用程序不可用", "AuthBasic": "基础(浏览器弹出对话框)", "AuthForm": "表单(登陆页面)", - "AuthenticationMethod": "认证方式", + "AuthenticationMethod": "", "AuthenticationMethodHelpTextWarning": "请选择有效的认证方式", "AuthenticationRequiredPasswordHelpTextWarning": "输入一个新的密码", "AuthenticationRequiredUsernameHelpTextWarning": "输入一个新的用户名", From 934b908b37177b1ae4eb5095c9c2d564aa5c3435 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 16 Sep 2023 12:43:07 +0000 Subject: [PATCH 189/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: stormaac Co-authored-by: 宿命 <331874545@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- .../Localization/Core/pt_BR.json | 7 +- src/NzbDrone.Core/Localization/Core/ro.json | 14 +++- .../Localization/Core/zh_CN.json | 68 ++++++++++++------- 3 files changed, 58 insertions(+), 31 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index ec5bac1f8..bc3480ec5 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -215,7 +215,7 @@ "IndexerSite": "Site do Indexador", "IndexerStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas", "IndexerStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas: {0}", - "IndexerTagsHelpText": "Usar etiquetas para especificar os proxies do indexador ou com quais aplicativos o indexador está sincronizado. Aplicativos sem 1 ou mais etiquetas de indexador correspondentes não serão sincronizados.", + "IndexerTagsHelpText": "Use tags para especificar Proxies do indexador ou com quais aplicativos o indexador está sincronizado.", "IndexerVipCheckExpiredClientMessage": "Benefícios VIP do Indexador expiraram: {0}", "IndexerVipCheckExpiringClientMessage": "Os benefícios VIPS do Indexador expirarão em breve: {0}", "Indexers": "Indexadores", @@ -594,5 +594,8 @@ "IndexerHistoryLoadError": "Erro ao carregar o histórico do indexador", "NoIndexerHistory": "Nenhum histórico encontrado para este indexador", "TotalGrabs": "Total de Capturas", - "TotalQueries": "Total de Consultas" + "TotalQueries": "Total de Consultas", + "ApplicationTagsHelpText": "Sincronize indexadores com este aplicativo que não possuem tags ou que possuem 1 ou mais tags correspondentes", + "ApplicationTagsHelpTextWarning": "As tags devem ser usadas com cautela, pois podem ter efeitos indesejados. Um aplicativo com uma tag só será sincronizado com indexadores que tenham a mesma tag.", + "IndexerTagsHelpTextWarning": "As tags devem ser usadas com cautela, pois podem ter efeitos indesejados. Um indexador com uma tag sincronizará apenas com aplicativos com a mesma tag." } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 347a2c8a0..309178c78 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -364,8 +364,8 @@ "IndexerObsoleteCheckMessage": "Indexatorii sunt învechiți sau nu au fost actualizați: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în Prowlarr", "IndexerProxies": "Proxiuri indexatoare", "IndexerVipCheckExpiringClientMessage": "Beneficiile VIP pentru indexator expiră în curând: {0}", - "ApplicationLongTermStatusCheckAllClientMessage": "Toți indexatorii nu sunt disponibili din cauza unor eșecuri de mai mult de 6 ore", - "ApplicationLongTermStatusCheckSingleClientMessage": "Indexatori indisponibili din cauza unor eșecuri de mai mult de 6 ore: {0}", + "ApplicationLongTermStatusCheckAllClientMessage": "Toate aplicațiile sunt indisponibile din cauza unor eșecuri pentru mai mult de 6 ore", + "ApplicationLongTermStatusCheckSingleClientMessage": "Aplicațiile indisponibile din cauza unor eșecuri pentru mai mult de 6 ore: {0}", "LastDuration": "Ultima durată", "LastExecution": "Ultima executare", "Queued": "În așteptare", @@ -443,5 +443,13 @@ "AuthForm": "Formulare (Pagina de autentificare)", "DisabledForLocalAddresses": "Dezactivat pentru adresele locale", "None": "Nici unul", - "ResetAPIKeyMessageText": "Sigur doriți să vă resetați cheia API?" + "ResetAPIKeyMessageText": "Sigur doriți să vă resetați cheia API?", + "AddApplicationImplementation": "Adăugați aplicație - {implementareName}", + "AddCategory": "Adăugați categorie", + "AddConnection": "Adăugați conexiune", + "AddConnectionImplementation": "Adăugați conexiune - {implementationName}", + "AddDownloadClientImplementation": "Adăugați client de descărcare - {implementationName}", + "AddIndexerImplementation": "Adăugați Indexator - {implementationName}", + "AddIndexerProxyImplementation": "Adăugați proxy indexator - {implementationName}", + "Album": "Album" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 204cbfb7c..6a9b23463 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -39,19 +39,19 @@ "Apply": "应用", "ApplyTags": "应用标签", "Apps": "应用程序", - "AreYouSureYouWantToDeleteCategory": "您确定要删除映射类别吗?", + "AreYouSureYouWantToDeleteCategory": "您确定要删除映射分类吗?", "Artist": "艺术家", "AudioSearch": "音频搜索", "Auth": "认证", "Authentication": "认证", - "AuthenticationMethodHelpText": "需要账号和密码以登录Prowlarr", + "AuthenticationMethodHelpText": "需要用户名和密码以访问{appName}", "AuthenticationRequired": "需要认证", "AuthenticationRequiredHelpText": "更改需要身份验证的请求。除非您了解风险,否则请勿更改。", - "AuthenticationRequiredWarning": "为了防止远程访问而无需身份验证,Prowlarr现在需要启用身份验证。请配置您的身份验证方法和凭据。您可以选择从本地地址禁用身份验证。有关其他信息,请参阅FAQ。", + "AuthenticationRequiredWarning": "为了防止未经身份验证的远程访问,{appName}现在需要启用身份验证。您可以选择禁用本地地址的身份验证。", "Author": "作者", "Automatic": "自动化", "AutomaticSearch": "自动搜索", - "AverageResponseTimesMs": "平均响应时间(毫秒)", + "AverageResponseTimesMs": "索引器平均响应时间(毫秒)", "Backup": "备份", "BackupFolderHelpText": "相对路径将在 Prowlarr 的 AppData 目录下", "BackupIntervalHelpText": "自动备份时间间隔", @@ -71,7 +71,7 @@ "Cancel": "取消", "CancelPendingTask": "您确定要取消这个挂起的任务吗?", "Categories": "分类", - "Category": "类别", + "Category": "分类", "CertificateValidation": "验证证书", "CertificateValidationHelpText": "改变HTTPS证书验证的严格程度", "ChangeHasNotBeenSavedYet": "修改暂未保存", @@ -99,14 +99,14 @@ "Delete": "删除", "DeleteAppProfile": "删除应用配置文件", "DeleteApplication": "删除应用程序", - "DeleteApplicationMessageText": "您确定要删除应用程序“{0}”吗?", + "DeleteApplicationMessageText": "您确定要删除应用程序“{name}”吗?", "DeleteBackup": "删除备份", - "DeleteBackupMessageText": "您确定要删除备份 '{0}' 吗?", - "DeleteClientCategory": "删除下载客户端类别", + "DeleteBackupMessageText": "您确定要删除备份“{name}”吗?", + "DeleteClientCategory": "删除下载客户端分类", "DeleteDownloadClient": "删除下载客户端", "DeleteDownloadClientMessageText": "你确定要删除下载客户端 “{name}” 吗?", "DeleteIndexerProxy": "删除搜刮器代理", - "DeleteIndexerProxyMessageText": "您确定要删除列表 '{0}'?", + "DeleteIndexerProxyMessageText": "您确定要删除索引器代理“{name}”吗?", "DeleteNotification": "删除消息推送", "DeleteNotificationMessageText": "您确定要删除消息推送 “{name}” 吗?", "DeleteTag": "删除标签", @@ -120,7 +120,7 @@ "Docker": "Docker", "Donations": "捐赠", "DownloadClient": "下载客户端", - "DownloadClientCategory": "下载客户端类别", + "DownloadClientCategory": "下载客户端分类", "DownloadClientSettings": "下载客户端设置", "DownloadClientStatusCheckAllClientMessage": "所有下载客户端都不可用", "DownloadClientStatusCheckSingleClientMessage": "所有下载客户端都不可用: {0}", @@ -214,7 +214,7 @@ "IndexerSite": "‎索引‎‎网站‎", "IndexerStatusCheckAllClientMessage": "所有搜刮器都因错误不可用", "IndexerStatusCheckSingleClientMessage": "搜刮器因错误不可用:{0}", - "IndexerTagsHelpText": "使用标签指定索引器代理, 索引器同步到哪些应用程序,或者只是为了组织索引器。未指定索引器的应用程序将不会同步。", + "IndexerTagsHelpText": "使用标签来指定索引器代理或索引器同步到哪些应用程序。", "IndexerVipCheckExpiredClientMessage": "索引器VIP特权已过期:{0}", "IndexerVipCheckExpiringClientMessage": "索引器VIP特权即将过期:{0}", "Indexers": "索引器", @@ -242,7 +242,7 @@ "MIA": "MIA", "MaintenanceRelease": "维护版本:修复错误及其他改进,参见Github提交 查看更多详情", "Manual": "手动", - "MappedCategories": "映射类别", + "MappedCategories": "映射分类", "MappedDrivesRunningAsService": "映射的网络驱动器在作为Windows服务运行时不可用。请参阅常见问题解答了解更多信息", "MassEditor": "批量编辑器", "Mechanism": "机制", @@ -308,7 +308,7 @@ "Proxies": "代理", "Proxy": "代理", "ProxyBypassFilterHelpText": "使用“ , ”作为分隔符,和“ *. ”作为二级域名的通配符", - "ProxyCheckBadRequestMessage": "测试代理失败,状态码: {0}", + "ProxyCheckBadRequestMessage": "测试代理失败。状态码:{0}", "ProxyCheckFailedToTestMessage": "测试代理失败: {0}", "ProxyCheckResolveIpMessage": "无法解析已设置的代理服务器主机{0}的IP地址", "ProxyPasswordHelpText": "如果需要,您只需要输入用户名和密码,否则就让它们为空。", @@ -426,9 +426,9 @@ "TestAllApps": "测试全部应用", "TestAllClients": "测试全部客户端", "TestAllIndexers": "测试全部搜刮器", - "TheLatestVersionIsAlreadyInstalled": "已安装最新版的Prowlarr", + "TheLatestVersionIsAlreadyInstalled": "已安装最新版本的{appName}", "Theme": "主题", - "ThemeHelpText": "更改应用程序UI主题,“自动”主题将使用您的操作系统主题设置明亮模式或黑暗模式。受到{0}的影响", + "ThemeHelpText": "更改应用程序UI主题,“自动”主题将使用您的操作系统主题设置亮或暗模式。灵感来源于{inspirredby}。", "Time": "时间", "Title": "标题", "Today": "今天", @@ -495,8 +495,8 @@ "ApplyTagsHelpTextAdd": "添加: 添加标签至已有的标签列表中", "CountDownloadClientsSelected": "已选择 {count} 个下载客户端", "CountIndexersSelected": "已选择 {count} 个索引器", - "DeleteSelectedDownloadClientsMessageText": "您确定要删除 {0} 个选定的下载客户端吗?", - "DeleteSelectedIndexersMessageText": "您确定要删除 {0} 个选定的索引器吗?", + "DeleteSelectedDownloadClientsMessageText": "您确定要删除{count}选定的下载客户端吗?", + "DeleteSelectedIndexersMessageText": "您确定要删除{count}选定的索引器吗?", "EditSelectedDownloadClients": "编辑选定的下载客户端", "Implementation": "执行", "ManageDownloadClients": "管理下载客户端", @@ -506,7 +506,7 @@ "ApplyTagsHelpTextHowToApplyApplications": "如何给选中的电影添加标签", "ApplyTagsHelpTextHowToApplyIndexers": "如何将标签应用到已选择的索引器", "ApplyTagsHelpTextReplace": "替换: 用输入的标签替换当前标签 (不输入将会清除所有标签)", - "DeleteSelectedApplicationsMessageText": "您确定要删除 {0} 个选定的导入列表吗?", + "DeleteSelectedApplicationsMessageText": "您确定要删除{count}选定的应用程序吗?", "DeleteSelectedDownloadClients": "删除下载客户端", "DownloadClientPriorityHelpText": "优先考虑多个下载客户端,循环查询用于具有相同优先级的客户端。", "EditSelectedIndexers": "编辑选定的索引器", @@ -519,11 +519,11 @@ "AdvancedSettingsShownClickToHide": "高级设置已展开,点击隐藏", "AppsMinimumSeedersHelpText": "使用索引器抓去所需的最低种子数,如果为空,则同步配置文件的默认值", "BasicSearch": "基础搜索", - "CountIndexersAvailable": "{0} 个索引器可用", + "CountIndexersAvailable": "{count}索引器可用", "DeleteSelectedApplications": "删除选中的应用程序", "DeleteSelectedIndexer": "删除选中的索引器", "DeleteSelectedIndexers": "删除选中的索引器", - "FoundCountReleases": "发现 {0} 个版本", + "FoundCountReleases": "找到{itemCount}版本", "IndexerCategories": "索引器分类", "IndexerDownloadClientHelpText": "请确认在Prowlarr内从此索引器中抓取时使用的下载客户端", "IndexerStatus": "索引器状态", @@ -532,14 +532,14 @@ "QueryType": "请求类型", "SeedRatioHelpText": "种子停止下载前应达到的比率,应用的默认设置为空", "SeedTime": "做种时间", - "SearchCountIndexers": "搜索了{0}个索引器", + "SearchCountIndexers": "搜索了{count}个索引器", "SeedRatio": "种子分享率", "GoToApplication": "前往应用程序", "NoHistoryFound": "未发现历史记录", - "SelectedCountOfCountReleases": "选中{1}中的{0}版本", - "AreYouSureYouWantToDeleteIndexer": "你确定从Prowlarr删除'{0}'?", + "SelectedCountOfCountReleases": "选中{itemCount} 中的 {selectedCount} 版本", + "AreYouSureYouWantToDeleteIndexer": "您确定要从Prowlarr中删除“{name}”吗?", "AuthQueries": "认证请求", - "CountApplicationsSelected": "选中 {0}个应用程序", + "CountApplicationsSelected": "{count}应用程序被选中", "ManageApplications": "管理应用程序", "RssQueries": "RSS请求", "SearchAllIndexers": "搜索所有索引器", @@ -571,7 +571,7 @@ "NotificationStatusSingleClientHealthCheckMessage": "由于故障应用程序不可用", "AuthBasic": "基础(浏览器弹出对话框)", "AuthForm": "表单(登陆页面)", - "AuthenticationMethod": "", + "AuthenticationMethod": "认证方式", "AuthenticationMethodHelpTextWarning": "请选择有效的认证方式", "AuthenticationRequiredPasswordHelpTextWarning": "输入一个新的密码", "AuthenticationRequiredUsernameHelpTextWarning": "输入一个新的用户名", @@ -581,5 +581,21 @@ "External": "外部的", "None": "无", "ResetAPIKeyMessageText": "您确定要重置您的 API 密钥吗?", - "IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{0}。" + "IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{0}。", + "ApplicationTagsHelpTextWarning": "标签应该谨慎使用,它们可能会产生意想不到的效果。带有标签的应用程序只会与具有相同标签的索引器同步。", + "EditCategory": "编辑分类", + "IndexerHistoryLoadError": "加载索引器历史记录出错", + "NoIndexerHistory": "没有找到此索引器的历史记录", + "TotalGrabs": "总抓取量", + "TotalIndexerQueries": "索引器查询总数", + "TotalIndexerSuccessfulGrabs": "总索引器成功抓取", + "TotalQueries": "总查询", + "TotalUserAgentGrabs": "总用户代理抓取", + "TotalUserAgentQueries": "用户代理查询总数", + "ApplicationTagsHelpText": "将没有标记或具有1个或多个匹配标记的索引器同步到此应用程序", + "IndexerTagsHelpTextWarning": "标签应该谨慎使用,它们可能会产生意想不到的效果。带有标签的索引器只会与带有相同标签的应用同步。", + "ActiveIndexers": "活动索引器", + "ActiveApps": "活动应用程序", + "AppsMinimumSeeders": "应用程序最少种子数", + "PackSeedTime": "做种时间" } From c2ae0cce0348b3f758dbd86856a0c6cd8c43e393 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Sep 2023 12:01:01 +0300 Subject: [PATCH 190/964] Bump version to 1.9.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ef671d5b2..05a079abc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.9.0' + majorVersion: '1.9.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 3ed6ef0336f0c431c2f4759fe456e179e4fa99e8 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 30 Aug 2023 22:11:27 +0300 Subject: [PATCH 191/964] Use await on reading the response content (cherry picked from commit 82d586e7015d7ea06356ca436024a8af5a4fb677) --- src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index 2401efaef..b3e707961 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -119,7 +119,7 @@ namespace NzbDrone.Common.Http.Dispatchers } else { - data = responseMessage.Content.ReadAsByteArrayAsync(cts.Token).GetAwaiter().GetResult(); + data = await responseMessage.Content.ReadAsByteArrayAsync(cts.Token); } } catch (Exception ex) From 840f2ae3e60b76bd0905c75e1f847b5f44307f44 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 16 Sep 2023 15:07:39 +0300 Subject: [PATCH 192/964] Sync static resource controller with upstream (cherry picked from commit ad1f185330a30a2a9d27c9d3f18d384e66727c2a) --- .../Frontend/Mappers/IMapHttpRequestsToDisk.cs | 3 ++- .../Mappers/StaticResourceMapperBase.cs | 7 ++++--- .../Frontend/StaticResourceController.cs | 17 +++++++++-------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Prowlarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs b/src/Prowlarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs index abd563606..54206b844 100644 --- a/src/Prowlarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs +++ b/src/Prowlarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; namespace Prowlarr.Http.Frontend.Mappers @@ -6,6 +7,6 @@ namespace Prowlarr.Http.Frontend.Mappers { string Map(string resourceUrl); bool CanHandle(string resourceUrl); - FileStreamResult GetResponse(string resourceUrl); + Task GetResponse(string resourceUrl); } } diff --git a/src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs b/src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs index fe47442b4..3a9b02da0 100644 --- a/src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs +++ b/src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Text; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Net.Http.Headers; @@ -30,7 +31,7 @@ namespace Prowlarr.Http.Frontend.Mappers public abstract bool CanHandle(string resourceUrl); - public FileStreamResult GetResponse(string resourceUrl) + public Task GetResponse(string resourceUrl) { var filePath = Map(resourceUrl); @@ -41,10 +42,10 @@ namespace Prowlarr.Http.Frontend.Mappers contentType = "application/octet-stream"; } - return new FileStreamResult(GetContentStream(filePath), new MediaTypeHeaderValue(contentType) + return Task.FromResult(new FileStreamResult(GetContentStream(filePath), new MediaTypeHeaderValue(contentType) { Encoding = contentType == "text/plain" ? Encoding.UTF8 : null - }); + })); } _logger.Warn("File {0} not found", filePath); diff --git a/src/Prowlarr.Http/Frontend/StaticResourceController.cs b/src/Prowlarr.Http/Frontend/StaticResourceController.cs index 11cfa2e02..55a472da9 100644 --- a/src/Prowlarr.Http/Frontend/StaticResourceController.cs +++ b/src/Prowlarr.Http/Frontend/StaticResourceController.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; @@ -25,27 +26,27 @@ namespace Prowlarr.Http.Frontend [AllowAnonymous] [HttpGet("login")] - public IActionResult LoginPage() + public async Task LoginPage() { - return MapResource("login"); + return await MapResource("login"); } [EnableCors("AllowGet")] [AllowAnonymous] [HttpGet("/content/{**path:regex(^(?!api/).*)}")] - public IActionResult IndexContent([FromRoute] string path) + public async Task IndexContent([FromRoute] string path) { - return MapResource("Content/" + path); + return await MapResource("Content/" + path); } [HttpGet("")] [HttpGet("/{**path:regex(^(?!api/).*)}")] - public IActionResult Index([FromRoute] string path) + public async Task Index([FromRoute] string path) { - return MapResource(path); + return await MapResource(path); } - private IActionResult MapResource(string path) + private async Task MapResource(string path) { path = "/" + (path ?? ""); @@ -53,7 +54,7 @@ namespace Prowlarr.Http.Frontend if (mapper != null) { - var result = mapper.GetResponse(path); + var result = await mapper.GetResponse(path); if (result != null) { From cdb3ed36f6a02638deec951349c0e42ed174204e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 18 Sep 2023 21:16:13 +0300 Subject: [PATCH 193/964] Fixed: (Nebulance) Use the group name when the release name is empty --- src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index b03fec380..44aebc36f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -226,9 +226,16 @@ namespace NzbDrone.Core.Indexers.Definitions { var details = _settings.BaseUrl + "torrents.php?id=" + row.TorrentId; + var title = row.ReleaseTitle; + + if (title.IsNullOrWhiteSpace()) + { + title = row.GroupName; + } + var release = new TorrentInfo { - Title = row.ReleaseTitle, + Title = title, Guid = details, InfoUrl = details, PosterUrl = row.Banner, @@ -299,7 +306,6 @@ namespace NzbDrone.Core.Indexers.Definitions { [JsonProperty(PropertyName = "rls_name")] public string ReleaseTitle { get; set; } - public string Title { get; set; } [JsonProperty(PropertyName = "cat")] public string Category { get; set; } public string Size { get; set; } @@ -309,6 +315,8 @@ namespace NzbDrone.Core.Indexers.Definitions public string Download { get; set; } [JsonProperty(PropertyName = "file_list")] public string[] FileList { get; set; } + [JsonProperty(PropertyName = "group_name")] + public string GroupName { get; set; } [JsonProperty(PropertyName = "series_banner")] public string Banner { get; set; } [JsonProperty(PropertyName = "group_id")] From 3cabc0589aa0433e386dd1b3c13f7f72ab7de129 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 18 Sep 2023 21:17:36 +0300 Subject: [PATCH 194/964] Simplify use the group name when the release name is empty --- src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index 44aebc36f..21289de54 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -226,12 +226,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var details = _settings.BaseUrl + "torrents.php?id=" + row.TorrentId; - var title = row.ReleaseTitle; - - if (title.IsNullOrWhiteSpace()) - { - title = row.GroupName; - } + var title = row.ReleaseTitle.IsNotNullOrWhiteSpace() ? row.ReleaseTitle : row.GroupName; var release = new TorrentInfo { From 43cb22ff2b829ff3708ecb16b46d19f6af667cae Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 11 Sep 2023 16:31:39 +0300 Subject: [PATCH 195/964] Bump migration timeout to 10 minutes --- .../Datastore/Migration/Framework/MigrationController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs index 1249dfd8b..45593cb53 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs @@ -52,7 +52,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework .Configure(opt => { opt.PreviewOnly = false; - opt.Timeout = TimeSpan.FromSeconds(60); + opt.Timeout = TimeSpan.FromMinutes(10); }) .Configure(cfg => { From 4c8b0c9eeca9967373c4ce75eaa76328f209e149 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 19 Sep 2023 00:56:10 +0300 Subject: [PATCH 196/964] Fixed: Ignore releases without title --- src/NzbDrone.Common/Extensions/PathExtensions.cs | 2 +- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common/Extensions/PathExtensions.cs b/src/NzbDrone.Common/Extensions/PathExtensions.cs index 2ec434503..0c72a07f4 100644 --- a/src/NzbDrone.Common/Extensions/PathExtensions.cs +++ b/src/NzbDrone.Common/Extensions/PathExtensions.cs @@ -160,7 +160,7 @@ namespace NzbDrone.Common.Extensions { if (text.IsNullOrWhiteSpace()) { - throw new ArgumentNullException("text"); + throw new ArgumentNullException(nameof(text)); } return text.IndexOfAny(Path.GetInvalidPathChars()) >= 0; diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index 845f08a49..6a6b965b3 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -363,7 +363,7 @@ namespace NzbDrone.Core.Indexers } } - releases.AddRange(pagedReleases); + releases.AddRange(pagedReleases.Where(IsValidRelease)); } if (releases.Any()) @@ -469,6 +469,18 @@ namespace NzbDrone.Core.Indexers return Capabilities ?? ((IndexerDefinition)Definition).Capabilities; } + protected virtual bool IsValidRelease(ReleaseInfo release) + { + if (release.Title.IsNullOrWhiteSpace()) + { + _logger.Error("Invalid Release: '{0}' from indexer: {1}. No title provided.", release.InfoUrl, Definition.Name); + + return false; + } + + return true; + } + protected virtual bool IsFullPage(IList page, int pageSize) { return pageSize != 0 && page.Count >= pageSize; From 9869c2272a4670f8d179fc20fece95a89d432c6e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 19 Sep 2023 20:17:05 +0300 Subject: [PATCH 197/964] Avoid returning null in static resource mapper Task --- src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs b/src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs index 3a9b02da0..b23eab209 100644 --- a/src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs +++ b/src/Prowlarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs @@ -50,7 +50,7 @@ namespace Prowlarr.Http.Frontend.Mappers _logger.Warn("File {0} not found", filePath); - return null; + return Task.FromResult(null); } protected virtual Stream GetContentStream(string filePath) From add29887895feeb4b11051aebb70086c55352b4a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 20 Sep 2023 02:54:25 +0300 Subject: [PATCH 198/964] Fixed: (Cardigann) Fallback variables to empty string to prevent NullRef --- .../Indexers/Definitions/Cardigann/CardigannBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs index 7123b3d86..70cec36f6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs @@ -374,7 +374,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann var newvalue = reReplaceRegexMatches.Groups[3].Value; var replaceRegex = new Regex(regexp); - var input = (string)variables[variable]; + var input = (string)variables[variable] ?? string.Empty; var expanded = replaceRegex.Replace(input, newvalue); if (modifier != null) From d4b037db78dccdf8ce763b8640a5276041f6a1c3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 21 Sep 2023 20:46:34 +0300 Subject: [PATCH 199/964] New: (AlphaRatio) Add pagination support --- .../Indexers/Definitions/AlphaRatio.cs | 17 +++++++++++++++-- .../Gazelle/GazelleRequestGenerator.cs | 17 +++++++++-------- .../Indexers/Definitions/GreatPosterWall.cs | 6 +++--- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs b/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs index aa8d6d9b4..03123bb7a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Collections.Specialized; using NLog; @@ -5,6 +6,7 @@ using NzbDrone.Common.Http; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers.Definitions.Gazelle; +using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Indexers.Definitions; @@ -15,6 +17,9 @@ public class AlphaRatio : GazelleBase public override string[] IndexerUrls => new[] { "https://alpharatio.cc/" }; public override string Description => "AlphaRatio(AR) is a Private Torrent Tracker for 0DAY / GENERAL"; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; + public override bool SupportsPagination => true; + public override int PageSize => 50; + public override TimeSpan RateLimit => TimeSpan.FromSeconds(3); public AlphaRatio(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, @@ -39,6 +44,8 @@ public class AlphaRatio : GazelleBase { var caps = new IndexerCapabilities { + LimitsDefault = PageSize, + LimitsMax = PageSize, TvSearchParams = new List { TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep @@ -98,9 +105,9 @@ public class AlphaRatioRequestGenerator : GazelleRequestGenerator _settings = settings; } - protected override NameValueCollection GetBasicSearchParameters(string term, int[] categories) + protected override NameValueCollection GetBasicSearchParameters(SearchCriteriaBase searchCriteria, string term) { - var parameters = base.GetBasicSearchParameters(term, categories); + var parameters = base.GetBasicSearchParameters(searchCriteria, term); if (_settings.FreeleechOnly) { @@ -112,6 +119,12 @@ public class AlphaRatioRequestGenerator : GazelleRequestGenerator parameters.Set("scene", "0"); } + if (searchCriteria.Limit is > 0 && searchCriteria.Offset is > 0) + { + var page = (int)(searchCriteria.Offset / searchCriteria.Limit) + 1; + parameters.Set("page", page.ToString()); + } + return parameters; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleRequestGenerator.cs index b21ae489e..bc850554f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleRequestGenerator.cs @@ -46,7 +46,7 @@ public class GazelleRequestGenerator : IIndexerRequestGenerator { var pageableRequests = new IndexerPageableRequestChain(); - var parameters = GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories); + var parameters = GetBasicSearchParameters(searchCriteria, searchCriteria.SanitizedSearchTerm); if (searchCriteria.ImdbId != null) { @@ -62,7 +62,7 @@ public class GazelleRequestGenerator : IIndexerRequestGenerator { var pageableRequests = new IndexerPageableRequestChain(); - var parameters = GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories); + var parameters = GetBasicSearchParameters(searchCriteria, searchCriteria.SanitizedSearchTerm); if (searchCriteria.Artist.IsNotNullOrWhiteSpace() && searchCriteria.Artist != "VA") { @@ -88,7 +88,7 @@ public class GazelleRequestGenerator : IIndexerRequestGenerator { var pageableRequests = new IndexerPageableRequestChain(); - var parameters = GetBasicSearchParameters(searchCriteria.SanitizedTvSearchString, searchCriteria.Categories); + var parameters = GetBasicSearchParameters(searchCriteria, searchCriteria.SanitizedTvSearchString); if (searchCriteria.ImdbId != null) { @@ -104,7 +104,7 @@ public class GazelleRequestGenerator : IIndexerRequestGenerator { var pageableRequests = new IndexerPageableRequestChain(); - var parameters = GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories); + var parameters = GetBasicSearchParameters(searchCriteria, searchCriteria.SanitizedSearchTerm); pageableRequests.Add(GetRequest(parameters)); return pageableRequests; @@ -114,7 +114,7 @@ public class GazelleRequestGenerator : IIndexerRequestGenerator { var pageableRequests = new IndexerPageableRequestChain(); - var parameters = GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories); + var parameters = GetBasicSearchParameters(searchCriteria, searchCriteria.SanitizedSearchTerm); pageableRequests.Add(GetRequest(parameters)); return pageableRequests; @@ -123,7 +123,7 @@ public class GazelleRequestGenerator : IIndexerRequestGenerator // hook to adjust the search term protected virtual string GetSearchTerm(string term) => term; - protected virtual NameValueCollection GetBasicSearchParameters(string term, int[] categories) + protected virtual NameValueCollection GetBasicSearchParameters(SearchCriteriaBase searchCriteria, string term) { var parameters = new NameValueCollection { @@ -139,9 +139,10 @@ public class GazelleRequestGenerator : IIndexerRequestGenerator parameters.Set("searchstr", searchTerm.Replace(".", " ")); } - if (categories != null) + if (searchCriteria.Categories != null && searchCriteria.Categories.Any()) { - var queryCats = Capabilities.Categories.MapTorznabCapsToTrackers(categories); + var queryCats = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories); + if (queryCats.Any()) { queryCats.ForEach(cat => parameters.Set($"filter_cat[{cat}]", "1")); diff --git a/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs b/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs index f00ca9748..931b2623e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs @@ -89,7 +89,7 @@ public class GreatPosterWallRequestGenerator : GazelleRequestGenerator public override IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { - var parameters = GetBasicSearchParameters(searchCriteria.SearchTerm, searchCriteria.Categories); + var parameters = GetBasicSearchParameters(searchCriteria, searchCriteria.SearchTerm); if (searchCriteria.ImdbId != null) { @@ -101,9 +101,9 @@ public class GreatPosterWallRequestGenerator : GazelleRequestGenerator return pageableRequests; } - protected override NameValueCollection GetBasicSearchParameters(string term, int[] categories) + protected override NameValueCollection GetBasicSearchParameters(SearchCriteriaBase searchCriteria, string term) { - var parameters = base.GetBasicSearchParameters(term, categories); + var parameters = base.GetBasicSearchParameters(searchCriteria, term); if (_settings.FreeleechOnly) { From 9625be723da78ff4fa60fc224c88dfef525a2b79 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 22 Sep 2023 19:54:11 +0300 Subject: [PATCH 200/964] Fixed: (Search) Releases deduplication --- .../IndexerSearch/ReleaseSearchService.cs | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index 6d332d424..e0b5c52c0 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -67,7 +67,9 @@ namespace NzbDrone.Core.IndexerSearch searchSpec.Year = request.year; searchSpec.Genre = request.genre; - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private async Task MusicSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) @@ -81,7 +83,9 @@ namespace NzbDrone.Core.IndexerSearch searchSpec.Track = request.track; searchSpec.Year = request.year; - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private async Task TvSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) @@ -102,7 +106,9 @@ namespace NzbDrone.Core.IndexerSearch searchSpec.Year = request.year; searchSpec.Genre = request.genre; - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private async Task BookSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) @@ -115,14 +121,18 @@ namespace NzbDrone.Core.IndexerSearch searchSpec.Year = request.year; searchSpec.Genre = request.genre; - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private async Task BasicSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) { var searchSpec = Get(request, indexerIds, interactiveSearch); - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private TSpec Get(NewznabRequest query, List indexerIds, bool interactiveSearch) @@ -265,5 +275,13 @@ namespace NzbDrone.Core.IndexerSearch return Array.Empty(); } + + private List DeDupeReleases(IList releases) + { + // De-dupe reports by guid so duplicate results aren't returned. Pick the one with the higher indexer priority. + return releases.GroupBy(r => r.Guid) + .Select(r => r.OrderBy(v => v.IndexerPriority).First()) + .ToList(); + } } } From b8df720c6cdf3e01d4cc506a7bc73e083c878ea3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 24 Sep 2023 16:22:45 +0300 Subject: [PATCH 201/964] Bump version to 1.9.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 05a079abc..f46e78587 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.9.1' + majorVersion: '1.9.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From e318a47b3a3d2bece6cd584fc0dd0ca206daa492 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 27 Sep 2023 23:23:43 +0300 Subject: [PATCH 202/964] Extend the torrent settings interface in TorrentPotato settings class --- .../Indexers/Definitions/TorrentPotato/TorrentPotatoSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoSettings.cs index 5c7d3808f..37ebaa46d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoSettings.cs @@ -17,7 +17,7 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentPotato } } - public class TorrentPotatoSettings : IIndexerSettings + public class TorrentPotatoSettings : ITorrentIndexerSettings { private static readonly TorrentPotatoSettingsValidator Validator = new (); From a0bcf5c9ae2f4a4d7ad9f24a943023fb760b1767 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 29 Sep 2023 20:26:35 +0300 Subject: [PATCH 203/964] Allow using filename for single episodes along with generated titles in AnimeBytes --- src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index 34841a925..c2f3d81d9 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -571,8 +571,6 @@ namespace NzbDrone.Core.Indexers.Definitions }; releaseInfos.Add(release); - - continue; } } From 0d98c12fa2270c431112af8420d87920e65b5b1e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 29 Sep 2023 20:45:04 +0300 Subject: [PATCH 204/964] Fix the description for `Use Filenames for Single Episodes` --- src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index c2f3d81d9..c2b2806b6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -697,7 +697,7 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(8, Label = "Enable Sonarr Compatibility", Type = FieldType.Checkbox, HelpText = "Makes Prowlarr try to add Season information into Release names, without this Sonarr can't match any Seasons, but it has a lot of false positives as well")] public bool EnableSonarrCompatibility { get; set; } - [FieldDefinition(9, Label = "Use Filenames for Single Episodes", Type = FieldType.Checkbox, HelpText = "Makes Prowlarr replace AnimeBytes release names with the actual filename, this currently only works for single episode releases")] + [FieldDefinition(9, Label = "Use Filenames for Single Episodes", Type = FieldType.Checkbox, HelpText = "Add a release using the actual filename, this currently only works for single episode releases")] public bool UseFilenameForSingleEpisodes { get; set; } [FieldDefinition(10, Label = "Add Japanese title as a synonym", Type = FieldType.Checkbox, HelpText = "Makes Prowlarr add Japanese titles as synonyms, i.e kanji/hiragana/katakana.")] From e241112915c6790e3a28578e6452c170c6a51ac7 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Mon, 25 Sep 2023 16:37:33 +0100 Subject: [PATCH 205/964] Fixed: (Shizaproject) Available again --- .../Indexers/Definitions/Shizaproject.cs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs b/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs index 4d4c6fdfb..3312bdf6d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs @@ -16,12 +16,11 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions { - [Obsolete("Site unavailable")] public class Shizaproject : TorrentIndexerBase { public override string Name => "ShizaProject"; - public override string[] IndexerUrls => new string[] { "https://shiza-project.com/" }; - public override string Description => "Shizaproject is russian anime voiceover group and eponymous anime tracker."; + public override string[] IndexerUrls => new[] { "https://shiza-project.com/" }; + public override string Description => "ShizaProject Tracker is a Public RUSSIAN tracker and release group for ANIME"; public override string Language => "ru-RU"; public override Encoding Encoding => Encoding.UTF8; public override IndexerPrivacy Privacy => IndexerPrivacy.Public; @@ -34,7 +33,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IIndexerRequestGenerator GetRequestGenerator() { - return new ShizaprojectRequestGenerator() { Settings = Settings, Capabilities = Capabilities }; + return new ShizaprojectRequestGenerator { Settings = Settings, Capabilities = Capabilities }; } public override IParseIndexerResponse GetParser() @@ -47,20 +46,22 @@ namespace NzbDrone.Core.Indexers.Definitions var caps = new IndexerCapabilities { TvSearchParams = new List - { - TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep - }, + { + TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep + }, MovieSearchParams = new List - { - MovieSearchParam.Q - } + { + MovieSearchParam.Q + } }; + caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.TVAnime, "TV"); caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TVAnime, "TV_SPECIAL"); caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.TVAnime, "ONA"); caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.TVAnime, "OVA"); caps.Categories.AddCategoryMapping(5, NewznabStandardCategory.Movies, "MOVIE"); caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.Movies, "SHORT_MOVIE"); + return caps; } } From 3e95bc405699020644b48d6dbff6941cbea1a08c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 30 Sep 2023 22:15:25 +0300 Subject: [PATCH 206/964] Fixed: (TorrentPotato) Title not being decoded --- .../Indexers/Definitions/TorrentPotato/TorrentPotatoParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoParser.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoParser.cs index 268c1e92b..4158900f4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoParser.cs @@ -40,7 +40,7 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentPotato var torrentInfo = new TorrentInfo { Guid = GetGuid(torrent), - Title = torrent.release_name, + Title = WebUtility.HtmlDecode(torrent.release_name), Categories = new List { NewznabStandardCategory.Movies }, Size = torrent.size * 1000 * 1000, DownloadUrl = torrent.download_url, From ca08c818e6592ffd662ca34c3a535513d014de9d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 30 Sep 2023 22:41:25 +0300 Subject: [PATCH 207/964] Fixed: (TorrentPotato) Use full IMDb Id --- .../Definitions/TorrentPotato/TorrentPotatoRequestGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoRequestGenerator.cs index 465437b0f..b7df35f5a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentPotato/TorrentPotatoRequestGenerator.cs @@ -19,7 +19,7 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentPotato { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(BuildRequest(searchCriteria.SearchTerm, searchCriteria.ImdbId)); + pageableRequests.Add(BuildRequest(searchCriteria.SearchTerm, searchCriteria.FullImdbId)); return pageableRequests; } From 09cef8cf9454a9c9f1ceff17c9e07b589f73e49d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 1 Oct 2023 17:01:35 +0300 Subject: [PATCH 208/964] Bump version to 1.9.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f46e78587..0990bbb07 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.9.2' + majorVersion: '1.9.3' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 7dd289b5f941e10df759daec8434eadea8e2f2c7 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 29 Sep 2023 17:26:50 +0000 Subject: [PATCH 209/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Jaspils Co-authored-by: Stevie Robinson Co-authored-by: Weblate Co-authored-by: 宿命 <331874545@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/nl.json | 7 +++++-- src/NzbDrone.Core/Localization/Core/zh_CN.json | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index aef3a9780..436f42f6d 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -450,11 +450,14 @@ "minutes": "Minuten", "DeleteAppProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {0} wilt verwijderen", "NotificationStatusSingleClientHealthCheckMessage": "Applicaties onbeschikbaar door fouten", - "AddConnection": "Bewerk collectie", + "AddConnection": "Voeg connectie toe", "NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten", "AuthBasic": "Basis (Browser Pop-up)", "AuthForm": "Formulier (Login Pagina)", "DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen", "None": "Geen", - "ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?" + "ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?", + "AddConnectionImplementation": "Voeg connectie toe - {implementationName}", + "AddDownloadClientImplementation": "Voeg Downloadclient toe - {implementationName}", + "AddIndexerImplementation": "Indexeerder toevoegen - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 6a9b23463..2469fed4f 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -118,7 +118,7 @@ "DisabledUntil": "禁用Until", "Discord": "冲突", "Docker": "Docker", - "Donations": "捐赠", + "Donations": "赞助", "DownloadClient": "下载客户端", "DownloadClientCategory": "下载客户端分类", "DownloadClientSettings": "下载客户端设置", @@ -395,7 +395,7 @@ "Shutdown": "关机", "Size": "大小", "Sort": "排序", - "Source": "源", + "Source": "来源", "StartTypingOrSelectAPathBelow": "输入路径或者从下面选择", "Started": "已开始", "StartupDirectory": "启动目录", From 93c81bb7d3b7b78f2f9858490321d6b98061c141 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 21 Sep 2023 15:46:19 +0300 Subject: [PATCH 210/964] New: (Orpheus) Add options to prevent downloads without FL tokens --- .../Indexers/Definitions/Orpheus.cs | 69 +++++++++++++++---- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index f7a519684..cb5131dea 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -10,6 +10,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; +using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers.Definitions.Gazelle; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; @@ -80,40 +81,70 @@ namespace NzbDrone.Core.Indexers.Definitions .SetHeader("Authorization", $"token {Settings.Apikey}") .Build(); - var downloadBytes = Array.Empty(); + byte[] fileData; try { var response = await _httpClient.ExecuteProxiedAsync(request, Definition); - downloadBytes = response.ResponseData; + fileData = response.ResponseData; - if (downloadBytes.Length >= 1 - && downloadBytes[0] != 'd' // simple test for torrent vs HTML content + if (Settings.UseFreeleechToken == (int)OrpheusUseFreeleechTokens.Preferred + && fileData.Length >= 1 + && fileData[0] != 'd' // simple test for torrent vs HTML content && link.Query.Contains("usetoken=1")) { - var html = Encoding.GetString(downloadBytes); + var html = Encoding.GetString(fileData); + if (html.Contains("You do not have any freeleech tokens left.") || html.Contains("You do not have enough freeleech tokens") || html.Contains("This torrent is too large.") || html.Contains("You cannot use tokens here")) { - // download again without usetoken + // Try to download again without usetoken request.Url = new HttpUri(link.ToString().Replace("&usetoken=1", "")); response = await _httpClient.ExecuteProxiedAsync(request, Definition); - downloadBytes = response.ResponseData; + fileData = response.ResponseData; } } + + _logger.Debug("Downloaded for release finished ({0} bytes from {1})", fileData.Length, link.AbsoluteUri); + } + catch (HttpException ex) + { + if (ex.Response.StatusCode == HttpStatusCode.NotFound) + { + _logger.Error(ex, "Downloading file for release failed since it no longer exists ({0})", link.AbsoluteUri); + throw new ReleaseUnavailableException("Download failed", ex); + } + + if (ex.Response.StatusCode == HttpStatusCode.TooManyRequests) + { + _logger.Error("API Grab Limit reached for {0}", link.AbsoluteUri); + } + else + { + _logger.Error(ex, "Downloading for release failed ({0})", link.AbsoluteUri); + } + + throw new ReleaseDownloadException("Download failed", ex); + } + catch (WebException ex) + { + _logger.Error(ex, "Downloading for release failed ({0})", link.AbsoluteUri); + + throw new ReleaseDownloadException("Download failed", ex); } catch (Exception) { _indexerStatusService.RecordFailure(Definition.Id); _logger.Error("Download failed"); + throw; } - ValidateDownloadData(downloadBytes); + ValidateDownloadData(fileData); - return downloadBytes; + return fileData; } } @@ -375,7 +406,7 @@ namespace NzbDrone.Core.Indexers.Definitions .AddQueryParam("id", torrentId); // Orpheus fails to download if usetoken=0 so we need to only add if we will use one - if (_settings.UseFreeleechToken) + if (_settings.UseFreeleechToken is (int)OrpheusUseFreeleechTokens.Preferred or (int)OrpheusUseFreeleechTokens.Required) { url = url.AddQueryParam("usetoken", "1"); } @@ -409,18 +440,30 @@ namespace NzbDrone.Core.Indexers.Definitions public OrpheusSettings() { Apikey = ""; - UseFreeleechToken = false; + UseFreeleechToken = (int)OrpheusUseFreeleechTokens.Never; } [FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", Privacy = PrivacyLevel.ApiKey)] public string Apikey { get; set; } - [FieldDefinition(3, Label = "Use Freeleech Tokens", HelpText = "Use freeleech tokens when available", Type = FieldType.Checkbox)] - public bool UseFreeleechToken { get; set; } + [FieldDefinition(3, Type = FieldType.Select, Label = "Use Freeleech Tokens", SelectOptions = typeof(OrpheusUseFreeleechTokens), HelpText = "When to use freeleech tokens")] + public int UseFreeleechToken { get; set; } public override NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); } } + + public enum OrpheusUseFreeleechTokens + { + [FieldOption(Label = "Never", Hint = "Do not use tokens")] + Never = 0, + + [FieldOption(Label = "Preferred", Hint = "Use token if possible")] + Preferred = 1, + + [FieldOption(Label = "Required", Hint = "Abort download if unable to use token")] + Required = 2, + } } From 181cb2e0fe2872df2d9874ca0309332861ee9c24 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 1 Oct 2023 19:47:28 +0300 Subject: [PATCH 211/964] Revert "New: (Orpheus) Add options to prevent downloads without FL tokens" This reverts commit 93c81bb7d3b7b78f2f9858490321d6b98061c141. --- .../Indexers/Definitions/Orpheus.cs | 69 ++++--------------- 1 file changed, 13 insertions(+), 56 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index cb5131dea..f7a519684 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; -using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers.Definitions.Gazelle; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; @@ -81,70 +80,40 @@ namespace NzbDrone.Core.Indexers.Definitions .SetHeader("Authorization", $"token {Settings.Apikey}") .Build(); - byte[] fileData; + var downloadBytes = Array.Empty(); try { var response = await _httpClient.ExecuteProxiedAsync(request, Definition); - fileData = response.ResponseData; + downloadBytes = response.ResponseData; - if (Settings.UseFreeleechToken == (int)OrpheusUseFreeleechTokens.Preferred - && fileData.Length >= 1 - && fileData[0] != 'd' // simple test for torrent vs HTML content + if (downloadBytes.Length >= 1 + && downloadBytes[0] != 'd' // simple test for torrent vs HTML content && link.Query.Contains("usetoken=1")) { - var html = Encoding.GetString(fileData); - + var html = Encoding.GetString(downloadBytes); if (html.Contains("You do not have any freeleech tokens left.") || html.Contains("You do not have enough freeleech tokens") || html.Contains("This torrent is too large.") || html.Contains("You cannot use tokens here")) { - // Try to download again without usetoken + // download again without usetoken request.Url = new HttpUri(link.ToString().Replace("&usetoken=1", "")); response = await _httpClient.ExecuteProxiedAsync(request, Definition); - fileData = response.ResponseData; + downloadBytes = response.ResponseData; } } - - _logger.Debug("Downloaded for release finished ({0} bytes from {1})", fileData.Length, link.AbsoluteUri); - } - catch (HttpException ex) - { - if (ex.Response.StatusCode == HttpStatusCode.NotFound) - { - _logger.Error(ex, "Downloading file for release failed since it no longer exists ({0})", link.AbsoluteUri); - throw new ReleaseUnavailableException("Download failed", ex); - } - - if (ex.Response.StatusCode == HttpStatusCode.TooManyRequests) - { - _logger.Error("API Grab Limit reached for {0}", link.AbsoluteUri); - } - else - { - _logger.Error(ex, "Downloading for release failed ({0})", link.AbsoluteUri); - } - - throw new ReleaseDownloadException("Download failed", ex); - } - catch (WebException ex) - { - _logger.Error(ex, "Downloading for release failed ({0})", link.AbsoluteUri); - - throw new ReleaseDownloadException("Download failed", ex); } catch (Exception) { _indexerStatusService.RecordFailure(Definition.Id); _logger.Error("Download failed"); - throw; } - ValidateDownloadData(fileData); + ValidateDownloadData(downloadBytes); - return fileData; + return downloadBytes; } } @@ -406,7 +375,7 @@ namespace NzbDrone.Core.Indexers.Definitions .AddQueryParam("id", torrentId); // Orpheus fails to download if usetoken=0 so we need to only add if we will use one - if (_settings.UseFreeleechToken is (int)OrpheusUseFreeleechTokens.Preferred or (int)OrpheusUseFreeleechTokens.Required) + if (_settings.UseFreeleechToken) { url = url.AddQueryParam("usetoken", "1"); } @@ -440,30 +409,18 @@ namespace NzbDrone.Core.Indexers.Definitions public OrpheusSettings() { Apikey = ""; - UseFreeleechToken = (int)OrpheusUseFreeleechTokens.Never; + UseFreeleechToken = false; } [FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", Privacy = PrivacyLevel.ApiKey)] public string Apikey { get; set; } - [FieldDefinition(3, Type = FieldType.Select, Label = "Use Freeleech Tokens", SelectOptions = typeof(OrpheusUseFreeleechTokens), HelpText = "When to use freeleech tokens")] - public int UseFreeleechToken { get; set; } + [FieldDefinition(3, Label = "Use Freeleech Tokens", HelpText = "Use freeleech tokens when available", Type = FieldType.Checkbox)] + public bool UseFreeleechToken { get; set; } public override NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); } } - - public enum OrpheusUseFreeleechTokens - { - [FieldOption(Label = "Never", Hint = "Do not use tokens")] - Never = 0, - - [FieldOption(Label = "Preferred", Hint = "Use token if possible")] - Preferred = 1, - - [FieldOption(Label = "Required", Hint = "Abort download if unable to use token")] - Required = 2, - } } From f37ccba3f97ef70d6e237abef2c2a1678f787203 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 2 Oct 2023 00:47:33 +0300 Subject: [PATCH 212/964] Fixed: (Shizaproject) Title improvements --- .../Indexers/Definitions/Shizaproject.cs | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs b/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs index 3312bdf6d..e817a41a0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Linq; using System.Text; using System.Text.RegularExpressions; using Newtonsoft.Json; @@ -94,6 +95,7 @@ namespace NzbDrone.Core.Indexers.Definitions publishedAt slug torrents { + synopsis downloaded seeders leechers @@ -113,7 +115,7 @@ namespace NzbDrone.Core.Indexers.Definitions var queryCollection = new NameValueCollection { { "query", query.Replace('\n', ' ').Trim() }, - { "variables", Newtonsoft.Json.JsonConvert.SerializeObject(variables) } + { "variables", JsonConvert.SerializeObject(variables) } }; var requestUrl = string.Format("{0}/graphql?", Settings.BaseUrl.TrimEnd('/')) + queryCollection.GetQueryString(); @@ -176,25 +178,26 @@ namespace NzbDrone.Core.Indexers.Definitions _categories = categories; } - private string composeTitle(ShizaprojectNode n, ShizaprojectTorrent tr) + private string ComposeTitle(ShizaprojectNode n, ShizaprojectTorrent tr) { - var title = string.Format("{0} / {1}", n.Name, n.OriginalName); - foreach (var tl in n.AlternativeNames) + var allNames = new HashSet(StringComparer.OrdinalIgnoreCase) { - title += " / " + tl; + n.Name, + n.OriginalName + }; + allNames.UnionWith(n.AlternativeNames.ToHashSet()); + + var title = $"{string.Join(" / ", allNames)} {tr.Synopsis}"; + + if (tr.VideoQualities.Length > 0) + { + title += $" [{string.Join(" ", tr.VideoQualities)}]"; } - title += " ["; - foreach (var q in tr.VideoQualities) - { - title += " " + q; - } - - title += " ]"; return title; } - private DateTime getActualPublishDate(ShizaprojectNode n, ShizaprojectTorrent t) + private DateTime GetActualPublishDate(ShizaprojectNode n, ShizaprojectTorrent t) { if (n.PublishedAt == null) { @@ -206,7 +209,7 @@ namespace NzbDrone.Core.Indexers.Definitions } } - private string getResolution(string[] qualities) + private string GetResolution(string[] qualities) { var resPrefix = "RESOLUTION_"; var res = Array.Find(qualities, s => s.StartsWith(resPrefix)); @@ -235,7 +238,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var torrentInfo = new TorrentInfo { - Title = composeTitle(e.Node, tr), + Title = ComposeTitle(e.Node, tr), InfoUrl = string.Format("{0}/releases/{1}/", _settings.BaseUrl.TrimEnd('/'), e.Node.Slug), DownloadVolumeFactor = 0, UploadVolumeFactor = 1, @@ -243,12 +246,12 @@ namespace NzbDrone.Core.Indexers.Definitions Peers = tr.Leechers + tr.Seeders, Grabs = tr.Downloaded, Categories = _categories.MapTrackerCatDescToNewznab(e.Node.Type), - PublishDate = getActualPublishDate(e.Node, tr), + PublishDate = GetActualPublishDate(e.Node, tr), Guid = tr.File.Url, DownloadUrl = tr.File.Url, MagnetUrl = tr.MagnetUri, Size = tr.Size, - Resolution = getResolution(tr.VideoQualities) + Resolution = GetResolution(tr.VideoQualities) }; torrentInfos.Add(torrentInfo); @@ -311,6 +314,7 @@ namespace NzbDrone.Core.Indexers.Definitions public class ShizaprojectTorrent { + public string Synopsis { get; set; } public int Downloaded { get; set; } public int Seeders { get; set; } public int Leechers { get; set; } From 3ff144421d785832083668ff379a21135215d8ac Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 2 Oct 2023 02:55:34 +0300 Subject: [PATCH 213/964] Fixed: (PassThePopcorn) Cleanup and ensure pagination is working in Radarr --- .../IndexerTests/PTPTests/PTPFixture.cs | 19 ++-- .../PassThePopcorn/PassThePopcorn.cs | 29 +++--- .../PassThePopcorn/PassThePopcornApi.cs | 52 ++++------- .../PassThePopcorn/PassThePopcornParser.cs | 58 ++++-------- .../PassThePopcornRequestGenerator.cs | 91 ++++++++----------- .../PassThePopcorn/PassThePopcornSettings.cs | 2 +- 6 files changed, 96 insertions(+), 155 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/PTPTests/PTPFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/PTPTests/PTPFixture.cs index 307585d29..1d6ad7271 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/PTPTests/PTPFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/PTPTests/PTPFixture.cs @@ -6,9 +6,8 @@ using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Common.Http; -using NzbDrone.Common.Serializer; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Indexers.PassThePopcorn; +using NzbDrone.Core.Indexers.Definitions.PassThePopcorn; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; @@ -21,26 +20,22 @@ namespace NzbDrone.Core.Test.IndexerTests.PTPTests [SetUp] public void Setup() { - Subject.Definition = new IndexerDefinition() + Subject.Definition = new IndexerDefinition { Name = "PTP", - Settings = new PassThePopcornSettings() { APIUser = "asdf", APIKey = "sad" } + Settings = new PassThePopcornSettings + { + APIUser = "asdf", + APIKey = "sad" + } }; } [TestCase("Files/Indexers/PTP/imdbsearch.json")] public async Task should_parse_feed_from_PTP(string fileName) { - var authResponse = new PassThePopcornAuthResponse { Result = "Ok" }; - - var authStream = new System.IO.StringWriter(); - Json.Serialize(authResponse, authStream); var responseJson = ReadAllText(fileName); - Mocker.GetMock() - .Setup(o => o.ExecuteProxiedAsync(It.Is(v => v.Method == HttpMethod.Post), Subject.Definition)) - .Returns((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader(), new CookieCollection(), authStream.ToString()))); - Mocker.GetMock() .Setup(o => o.ExecuteProxiedAsync(It.Is(v => v.Method == HttpMethod.Get), Subject.Definition)) .Returns((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { ContentType = HttpAccept.Json.Value }, new CookieCollection(), responseJson))); diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs index afe891a5d..c18a07a36 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs @@ -3,7 +3,7 @@ using NLog; using NzbDrone.Core.Configuration; using NzbDrone.Core.Messaging.Events; -namespace NzbDrone.Core.Indexers.PassThePopcorn +namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { public class PassThePopcorn : TorrentIndexerBase { @@ -29,22 +29,20 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn public override IIndexerRequestGenerator GetRequestGenerator() { - return new PassThePopcornRequestGenerator - { - Settings = Settings, - HttpClient = _httpClient, - Logger = _logger - }; + return new PassThePopcornRequestGenerator(Settings); + } + + public override IParseIndexerResponse GetParser() + { + return new PassThePopcornParser(Settings, _logger); } private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities { - SearchParams = new List - { - SearchParam.Q - }, + LimitsDefault = PageSize, + LimitsMax = PageSize, MovieSearchParams = new List { MovieSearchParam.Q, MovieSearchParam.ImdbId @@ -73,16 +71,11 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn return caps; } - - public override IParseIndexerResponse GetParser() - { - return new PassThePopcornParser(Settings, Capabilities, _logger); - } } public class PassThePopcornFlag : IndexerFlag { - public static IndexerFlag Golden => new IndexerFlag("golden", "Release follows Golden Popcorn quality rules"); - public static IndexerFlag Approved => new IndexerFlag("approved", "Release approved by PTP"); + public static IndexerFlag Golden => new ("golden", "Release follows Golden Popcorn quality rules"); + public static IndexerFlag Approved => new ("approved", "Release approved by PTP"); } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs index 958665e27..7d329ee18 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs @@ -1,15 +1,29 @@ using System; using System.Collections.Generic; -namespace NzbDrone.Core.Indexers.PassThePopcorn +namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { - public class Director + public class PassThePopcornResponse { - public string Name { get; set; } - public string Id { get; set; } + public string TotalResults { get; set; } + public List Movies { get; set; } + public string Page { get; set; } + public string AuthKey { get; set; } + public string PassKey { get; set; } } - public class Torrent + public class PassThePopcornMovie + { + public string GroupId { get; set; } + public string Title { get; set; } + public string Year { get; set; } + public string Cover { get; set; } + public List Tags { get; set; } + public string ImdbId { get; set; } + public List Torrents { get; set; } + } + + public class PassThePopcornTorrent { public int Id { get; set; } public string Quality { get; set; } @@ -29,32 +43,4 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn public bool GoldenPopcorn { get; set; } public string FreeleechType { get; set; } } - - public class Movie - { - public string GroupId { get; set; } - public string Title { get; set; } - public string Year { get; set; } - public string Cover { get; set; } - public List Tags { get; set; } - public List Directors { get; set; } - public string ImdbId { get; set; } - public List Torrents { get; set; } - } - - public class PassThePopcornResponse - { - public string TotalResults { get; set; } - public List Movies { get; set; } - public string Page { get; set; } - public string AuthKey { get; set; } - public string PassKey { get; set; } - } - - public class PassThePopcornAuthResponse - { - public string Result { get; set; } - public string Popcron { get; set; } - public string AntiCsrfToken { get; set; } - } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index 09ad779a3..993b59911 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -8,36 +8,28 @@ using NzbDrone.Common.Serializer; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Parser.Model; -namespace NzbDrone.Core.Indexers.PassThePopcorn +namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { public class PassThePopcornParser : IParseIndexerResponse { - private readonly IndexerCapabilities _capabilities; private readonly PassThePopcornSettings _settings; private readonly Logger _logger; - public PassThePopcornParser(PassThePopcornSettings settings, IndexerCapabilities capabilities, Logger logger) + + public PassThePopcornParser(PassThePopcornSettings settings, Logger logger) { _settings = settings; - _capabilities = capabilities; _logger = logger; } public IList ParseResponse(IndexerResponse indexerResponse) { var torrentInfos = new List(); - var indexerHttpResponse = indexerResponse.HttpResponse; - if (indexerHttpResponse.StatusCode != HttpStatusCode.OK) + var httpResponse = indexerResponse.HttpResponse; + + if (httpResponse.StatusCode != HttpStatusCode.OK) { - // Remove cookie cache - if (indexerHttpResponse.HasHttpRedirect && indexerHttpResponse.RedirectUrl - .ContainsIgnoreCase("login.php")) - { - CookiesUpdater(null, null); - throw new IndexerAuthException("We are being redirected to the PTP login page. Most likely your session expired or was killed. Recheck your cookie or credentials and try testing the indexer."); - } - - if (indexerHttpResponse.StatusCode == HttpStatusCode.Forbidden) + if (httpResponse.StatusCode == HttpStatusCode.Forbidden) { throw new RequestLimitReachedException(indexerResponse, "PTP Query Limit Reached. Please try again later."); } @@ -45,19 +37,13 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn throw new IndexerException(indexerResponse, $"Unexpected response status {indexerResponse.HttpResponse.StatusCode} code from indexer request"); } - if (indexerHttpResponse.Headers.ContentType != HttpAccept.Json.Value) + if (httpResponse.Headers.ContentType != HttpAccept.Json.Value) { - if (indexerHttpResponse.Request.Url.Path.ContainsIgnoreCase("login.php")) - { - CookiesUpdater(null, null); - throw new IndexerAuthException("We are currently on the login page. Most likely your session expired or was killed. Try testing the indexer in the settings."); - } - - // Remove cookie cache throw new IndexerException(indexerResponse, $"Unexpected response header {indexerResponse.HttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}"); } var jsonResponse = STJson.Deserialize(indexerResponse.Content); + if (jsonResponse.TotalResults == "0" || jsonResponse.TotalResults.IsNullOrWhiteSpace() || jsonResponse.Movies == null) @@ -70,7 +56,6 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn foreach (var torrent in result.Torrents) { var id = torrent.Id; - var title = torrent.ReleaseName; var flags = new HashSet(); @@ -81,37 +66,32 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn if (torrent.Checked) { - flags.Add(PassThePopcornFlag.Approved); //title = $"{title} ✔"; + flags.Add(PassThePopcornFlag.Approved); } - if (torrent.Scene) - { - flags.Add(IndexerFlag.Scene); - } - - var free = !(torrent.FreeleechType is null); - // Only add approved torrents try { torrentInfos.Add(new TorrentInfo { - Guid = string.Format("PassThePopcorn-{0}", id), - Title = title, - Size = long.Parse(torrent.Size), - DownloadUrl = GetDownloadUrl(id, jsonResponse.AuthKey, jsonResponse.PassKey), + Guid = $"PassThePopcorn-{id}", + Title = torrent.ReleaseName, InfoUrl = GetInfoUrl(result.GroupId, id), + DownloadUrl = GetDownloadUrl(id, jsonResponse.AuthKey, jsonResponse.PassKey), + Categories = new List { NewznabStandardCategory.Movies }, + Size = long.Parse(torrent.Size), Grabs = int.Parse(torrent.Snatched), Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), PublishDate = torrent.UploadTime.ToUniversalTime(), ImdbId = result.ImdbId.IsNotNullOrWhiteSpace() ? int.Parse(result.ImdbId) : 0, + Scene = torrent.Scene, IndexerFlags = flags, + DownloadVolumeFactor = torrent.FreeleechType is "Freeleech" ? 0 : 1, + UploadVolumeFactor = 1, MinimumRatio = 1, MinimumSeedTime = 345600, - DownloadVolumeFactor = free ? 0 : 1, - UploadVolumeFactor = 1, - Categories = new List { NewznabStandardCategory.Movies } + Genres = result.Tags ?? new List() }); } catch (Exception e) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs index 7faf69424..116737e44 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs @@ -1,22 +1,21 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; -using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser; -namespace NzbDrone.Core.Indexers.PassThePopcorn +namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { public class PassThePopcornRequestGenerator : IIndexerRequestGenerator { - public PassThePopcornSettings Settings { get; set; } + private readonly PassThePopcornSettings _settings; - public IDictionary Cookies { get; set; } - - public IIndexerHttpClient HttpClient { get; set; } - public Logger Logger { get; set; } + public PassThePopcornRequestGenerator(PassThePopcornSettings settings) + { + _settings = settings; + } public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { @@ -34,51 +33,6 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn return pageableRequests; } - public Func> GetCookies { get; set; } - public Action, DateTime?> CookiesUpdater { get; set; } - - private IEnumerable GetRequest(string searchParameters, SearchCriteriaBase searchCriteria) - { - var queryParams = new NameValueCollection - { - { "action", "advanced" }, - { "json", "noredirect" }, - { "grouping", "0" }, - { "searchstr", searchParameters } - }; - - if (searchCriteria.Limit is > 0 && searchCriteria.Offset is > 0) - { - var page = (int)(searchCriteria.Offset / searchCriteria.Limit) + 1; - queryParams.Set("page", page.ToString()); - } - - if (Settings.FreeleechOnly) - { - queryParams.Set("freetorrent", "1"); - } - - var request = - new IndexerRequest( - $"{Settings.BaseUrl.Trim().TrimEnd('/')}/torrents.php?{queryParams.GetQueryString()}", - HttpAccept.Json); - - request.HttpRequest.Headers["ApiUser"] = Settings.APIUser; - request.HttpRequest.Headers["ApiKey"] = Settings.APIKey; - - if (Settings.APIKey.IsNullOrWhiteSpace()) - { - foreach (var cookie in Cookies) - { - request.HttpRequest.Cookies[cookie.Key] = cookie.Value; - } - - CookiesUpdater(Cookies, DateTime.Now.AddDays(30)); - } - - yield return request; - } - public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) { return new IndexerPageableRequestChain(); @@ -102,5 +56,38 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn return pageableRequests; } + + private IEnumerable GetRequest(string searchParameters, SearchCriteriaBase searchCriteria) + { + var parameters = new NameValueCollection + { + { "action", "advanced" }, + { "json", "noredirect" }, + { "grouping", "0" }, + { "searchstr", searchParameters } + }; + + if (searchCriteria.Limit is > 0 && searchCriteria.Offset is > 0) + { + var page = (int)(searchCriteria.Offset / searchCriteria.Limit) + 1; + parameters.Set("page", page.ToString()); + } + + if (_settings.FreeleechOnly) + { + parameters.Set("freetorrent", "1"); + } + + var searchUrl = $"{_settings.BaseUrl.Trim().TrimEnd('/')}/torrents.php?{parameters.GetQueryString()}"; + + var request = new IndexerRequest(searchUrl, HttpAccept.Json); + request.HttpRequest.Headers.Add("ApiUser", _settings.APIUser); + request.HttpRequest.Headers.Add("ApiKey", _settings.APIKey); + + yield return request; + } + + public Func> GetCookies { get; set; } + public Action, DateTime?> CookiesUpdater { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornSettings.cs index e5542e008..475dfa73b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornSettings.cs @@ -3,7 +3,7 @@ using NzbDrone.Core.Annotations; using NzbDrone.Core.Indexers.Settings; using NzbDrone.Core.Validation; -namespace NzbDrone.Core.Indexers.PassThePopcorn +namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { public class PassThePopcornSettingsValidator : NoAuthSettingsValidator { From 2100e96570b737fd6d9fa86362550c6ca73efb58 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 2 Oct 2023 04:35:57 +0300 Subject: [PATCH 214/964] Fixed: (PassThePopcorn) Use UTC for publish dates --- .../Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs | 5 ++--- .../Definitions/PassThePopcorn/PassThePopcornParser.cs | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs index 7d329ee18..5b24f0c24 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornApi.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { @@ -33,7 +32,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn public string Resolution { get; set; } public bool Scene { get; set; } public string Size { get; set; } - public DateTime UploadTime { get; set; } + public string UploadTime { get; set; } public string RemasterTitle { get; set; } public string Snatched { get; set; } public string Seeders { get; set; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index 993b59911..39e32d372 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Net; using NLog; using NzbDrone.Common.Extensions; @@ -83,7 +84,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn Grabs = int.Parse(torrent.Snatched), Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), - PublishDate = torrent.UploadTime.ToUniversalTime(), + PublishDate = DateTime.Parse(torrent.UploadTime + " +0000", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), ImdbId = result.ImdbId.IsNotNullOrWhiteSpace() ? int.Parse(result.ImdbId) : 0, Scene = torrent.Scene, IndexerFlags = flags, From c1b399be39e8eeb9d795b331f1221ea35f1b4394 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 01:25:04 +0300 Subject: [PATCH 215/964] Fixed: (FileList) Parse response with STJson --- .../System.Text.Json/BooleanConverter.cs | 29 ++++++++++++++++ .../Definitions/FileList/FileListApi.cs | 34 ++++++++++++++----- .../Definitions/FileList/FileListParser.cs | 16 ++++----- 3 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 src/NzbDrone.Common/Serializer/System.Text.Json/BooleanConverter.cs diff --git a/src/NzbDrone.Common/Serializer/System.Text.Json/BooleanConverter.cs b/src/NzbDrone.Common/Serializer/System.Text.Json/BooleanConverter.cs new file mode 100644 index 000000000..dc7af179b --- /dev/null +++ b/src/NzbDrone.Common/Serializer/System.Text.Json/BooleanConverter.cs @@ -0,0 +1,29 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace NzbDrone.Common.Serializer; + +public class BooleanConverter : JsonConverter +{ + public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return reader.TokenType switch + { + JsonTokenType.True => true, + JsonTokenType.False => false, + JsonTokenType.Number => reader.GetInt64() switch + { + 1 => true, + 0 => false, + _ => throw new JsonException() + }, + _ => throw new JsonException() + }; + } + + public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) + { + writer.WriteBooleanValue(value); + } +} diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs index d3eb17ccc..0a0e18521 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs @@ -1,28 +1,44 @@ -using Newtonsoft.Json; +using System.Text.Json.Serialization; +using NzbDrone.Common.Serializer; namespace NzbDrone.Core.Indexers.Definitions.FileList; public class FileListTorrent { - public string Id { get; set; } + public uint Id { get; set; } + public string Name { get; set; } + public long Size { get; set; } + public int Leechers { get; set; } + public int Seeders { get; set; } - [JsonProperty(PropertyName = "times_completed")] + + [JsonPropertyName("times_completed")] public uint TimesCompleted { get; set; } - public uint Comments { get; set; } + public uint Files { get; set; } - [JsonProperty(PropertyName = "imdb")] + + [JsonPropertyName("imdb")] public string ImdbId { get; set; } + + [JsonConverter(typeof(BooleanConverter))] public bool Internal { get; set; } - [JsonProperty(PropertyName = "freeleech")] + + [JsonPropertyName("freeleech")] + [JsonConverter(typeof(BooleanConverter))] public bool FreeLeech { get; set; } - [JsonProperty(PropertyName = "doubleup")] + + [JsonPropertyName("doubleup")] + [JsonConverter(typeof(BooleanConverter))] public bool DoubleUp { get; set; } - [JsonProperty(PropertyName = "upload_date")] + + [JsonPropertyName("upload_date")] public string UploadDate { get; set; } + public string Category { get; set; } - [JsonProperty(PropertyName = "small_description")] + + [JsonPropertyName("small_description")] public string SmallDescription { get; set; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs index 793d61d93..558b7dffc 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs @@ -3,8 +3,8 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net; -using Newtonsoft.Json; using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Parser.Model; @@ -35,7 +35,7 @@ public class FileListParser : IParseIndexerResponse var releaseInfos = new List(); - var results = JsonConvert.DeserializeObject>(indexerResponse.Content); + var results = STJson.Deserialize>(indexerResponse.Content); foreach (var row in results) { @@ -54,7 +54,7 @@ public class FileListParser : IParseIndexerResponse } var imdbId = 0; - if (row.ImdbId != null && row.ImdbId.Length > 2) + if (row.ImdbId is { Length: > 2 }) { imdbId = int.Parse(row.ImdbId.Substring(2)); } @@ -64,7 +64,7 @@ public class FileListParser : IParseIndexerResponse releaseInfos.Add(new TorrentInfo { - Guid = string.Format("FileList-{0}", id), + Guid = $"FileList-{id}", Title = row.Name, Size = row.Size, Categories = _categories.MapTrackerCatDescToNewznab(row.Category), @@ -91,21 +91,21 @@ public class FileListParser : IParseIndexerResponse public Action, DateTime?> CookiesUpdater { get; set; } - private string GetDownloadUrl(string torrentId) + private string GetDownloadUrl(uint torrentId) { var url = new HttpUri(_settings.BaseUrl) .CombinePath("/download.php") - .AddQueryParam("id", torrentId) + .AddQueryParam("id", torrentId.ToString()) .AddQueryParam("passkey", _settings.Passkey); return url.FullUri; } - private string GetInfoUrl(string torrentId) + private string GetInfoUrl(uint torrentId) { var url = new HttpUri(_settings.BaseUrl) .CombinePath("/details.php") - .AddQueryParam("id", torrentId); + .AddQueryParam("id", torrentId.ToString()); return url.FullUri; } From 1901af5a511fd8f37e152f0398539830d0dd2859 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 01:42:41 +0300 Subject: [PATCH 216/964] Fixed: (BeyondHD) Parse response with STJson --- .../Indexers/Definitions/BeyondHD.cs | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index 412f75c4b..6da765664 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -4,8 +4,8 @@ using System.Globalization; using System.Linq; using System.Net; using System.Net.Http; +using System.Text.Json.Serialization; using FluentValidation; -using Newtonsoft.Json; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; @@ -19,6 +19,7 @@ using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; +using static Newtonsoft.Json.Formatting; namespace NzbDrone.Core.Indexers.Definitions { @@ -163,7 +164,7 @@ namespace NzbDrone.Core.Indexers.Definitions Method = HttpMethod.Post }; request.SetContent(body.ToJson()); - request.ContentSummary = body.ToJson(Formatting.None); + request.ContentSummary = body.ToJson(None); yield return new IndexerRequest(request); } @@ -245,16 +246,16 @@ namespace NzbDrone.Core.Indexers.Definitions throw new IndexerAuthException("API Key invalid or not authorized"); } - var jsonResponse = new HttpResponse(indexerHttpResponse); + var jsonResponse = STJson.Deserialize(indexerResponse.Content); - if (jsonResponse.Resource.StatusCode == 0) + if (jsonResponse.StatusCode == 0) { - throw new IndexerException(indexerResponse, $"Indexer Error: {jsonResponse.Resource.StatusMessage}"); + throw new IndexerException(indexerResponse, $"Indexer Error: {jsonResponse.StatusMessage}"); } var releaseInfos = new List(); - foreach (var row in jsonResponse.Resource.Results) + foreach (var row in jsonResponse.Results) { var details = row.InfoUrl; var link = row.DownloadLink; @@ -412,10 +413,10 @@ namespace NzbDrone.Core.Indexers.Definitions public class BeyondHDResponse { - [JsonProperty(PropertyName = "status_code")] + [JsonPropertyName("status_code")] public int StatusCode { get; set; } - [JsonProperty(PropertyName = "status_message")] + [JsonPropertyName("status_message")] public string StatusMessage { get; set; } public List Results { get; set; } } @@ -424,36 +425,48 @@ namespace NzbDrone.Core.Indexers.Definitions { public string Name { get; set; } - [JsonProperty(PropertyName = "info_hash")] + [JsonPropertyName("info_hash")] public string InfoHash { get; set; } public string Category { get; set; } public string Type { get; set; } public long Size { get; set; } - [JsonProperty(PropertyName = "times_completed")] + [JsonPropertyName("times_completed")] public int Grabs { get; set; } public int Seeders { get; set; } public int Leechers { get; set; } - [JsonProperty(PropertyName = "created_at")] + [JsonPropertyName("created_at")] public string CreatedAt { get; set; } - [JsonProperty(PropertyName = "download_url")] + [JsonPropertyName("download_url")] public string DownloadLink { get; set; } - [JsonProperty(PropertyName = "url")] + [JsonPropertyName("url")] public string InfoUrl { get; set; } - [JsonProperty(PropertyName = "imdb_id")] + [JsonPropertyName("imdb_id")] public string ImdbId { get; set; } - [JsonProperty(PropertyName = "tmdb_id")] + [JsonPropertyName("tmdb_id")] public string TmdbId { get; set; } + + [JsonConverter(typeof(BooleanConverter))] public bool Freeleech { get; set; } + + [JsonConverter(typeof(BooleanConverter))] public bool Promo25 { get; set; } + + [JsonConverter(typeof(BooleanConverter))] public bool Promo50 { get; set; } + + [JsonConverter(typeof(BooleanConverter))] public bool Promo75 { get; set; } + + [JsonConverter(typeof(BooleanConverter))] public bool Limited { get; set; } + + [JsonConverter(typeof(BooleanConverter))] public bool Internal { get; set; } } } From 993d189c61c5153911a419d831dcd155a00301fd Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 02:02:15 +0300 Subject: [PATCH 217/964] Fixed: (Nebulance) Parse response with STJson --- .../Indexers/Definitions/Nebulance.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index 21289de54..f2bb6cee6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -3,12 +3,14 @@ using System.Collections.Generic; using System.Globalization; using System.Net; using System.Text; +using System.Text.Json.Serialization; using System.Text.RegularExpressions; using System.Threading.Tasks; using Newtonsoft.Json; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers.Exceptions; @@ -208,7 +210,7 @@ namespace NzbDrone.Core.Indexers.Definitions throw new IndexerException(indexerResponse, $"Unexpected response status {indexerResponse.HttpResponse.StatusCode} code from indexer request"); } - var jsonResponse = new HttpResponse>(indexerResponse.HttpResponse).Resource; + var jsonResponse = STJson.Deserialize>(indexerResponse.HttpResponse.Content); if (jsonResponse.Error != null || jsonResponse.Result == null) { @@ -299,24 +301,24 @@ namespace NzbDrone.Core.Indexers.Definitions public class NebulanceTorrent { - [JsonProperty(PropertyName = "rls_name")] + [JsonPropertyName("rls_name")] public string ReleaseTitle { get; set; } - [JsonProperty(PropertyName = "cat")] + [JsonPropertyName("cat")] public string Category { get; set; } public string Size { get; set; } public string Seed { get; set; } public string Leech { get; set; } public string Snatch { get; set; } public string Download { get; set; } - [JsonProperty(PropertyName = "file_list")] + [JsonPropertyName("file_list")] public string[] FileList { get; set; } - [JsonProperty(PropertyName = "group_name")] + [JsonPropertyName("group_name")] public string GroupName { get; set; } - [JsonProperty(PropertyName = "series_banner")] + [JsonPropertyName("series_banner")] public string Banner { get; set; } - [JsonProperty(PropertyName = "group_id")] + [JsonPropertyName("group_id")] public string TorrentId { get; set; } - [JsonProperty(PropertyName = "rls_utc")] + [JsonPropertyName("rls_utc")] public string PublishDateUtc { get; set; } } From c81cbc801a85dc8487ca7e134963b5ef6f7f226c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 02:26:31 +0300 Subject: [PATCH 218/964] Fixed: (AvistaZBase) Parse response with STJson Also ensure GetToken is using a proxied request and rate limit --- .../Definitions/Avistaz/AvistazApi.cs | 31 ++++++------------- .../Definitions/Avistaz/AvistazBase.cs | 8 +++-- .../Definitions/Avistaz/AvistazParserBase.cs | 5 +-- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazApi.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazApi.cs index ee6bee72d..17ee34284 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazApi.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using Newtonsoft.Json; +using System.Text.Json.Serialization; namespace NzbDrone.Core.Indexers.Definitions.Avistaz { @@ -9,34 +9,34 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz public string Download { get; set; } public Dictionary Category { get; set; } - [JsonProperty(PropertyName = "movie_tv")] + [JsonPropertyName("movie_tv")] public AvistazIdInfo MovieTvinfo { get; set; } - [JsonProperty(PropertyName = "created_at")] + [JsonPropertyName("created_at")] public string CreatedAt { get; set; } - [JsonProperty(PropertyName = "file_name")] + [JsonPropertyName("file_name")] public string FileName { get; set; } - [JsonProperty(PropertyName = "info_hash")] + [JsonPropertyName("info_hash")] public string InfoHash { get; set; } public int? Leech { get; set; } public int? Completed { get; set; } public int? Seed { get; set; } - [JsonProperty(PropertyName = "file_size")] + [JsonPropertyName("file_size")] public long? FileSize { get; set; } - [JsonProperty(PropertyName = "file_count")] + [JsonPropertyName("file_count")] public int? FileCount { get; set; } - [JsonProperty(PropertyName = "download_multiply")] + [JsonPropertyName("download_multiply")] public double? DownloadMultiply { get; set; } - [JsonProperty(PropertyName = "upload_multiply")] + [JsonPropertyName("upload_multiply")] public double? UploadMultiply { get; set; } - [JsonProperty(PropertyName = "video_quality")] + [JsonPropertyName("video_quality")] public string VideoQuality { get; set; } public string Type { get; set; } public List Audio { get; set; } @@ -64,21 +64,10 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz public string Tmdb { get; set; } public string Tvdb { get; set; } public string Imdb { get; set; } - public string Title { get; set; } - - [JsonProperty(PropertyName = "tv_episode")] - public string TvEpisode { get; set; } - - [JsonProperty(PropertyName = "tv_season")] - public string TVSeason { get; set; } - - [JsonProperty(PropertyName = "tv_full_season")] - public bool TVFullSeason { get; set; } } public class AvistazAuthResponse { public string Token { get; set; } - public string Expiry { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs index dd200f5b9..14a3dbbb5 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using FluentValidation.Results; using NLog; using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; using NzbDrone.Core.Configuration; using NzbDrone.Core.Messaging.Events; @@ -120,12 +121,13 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz .AddFormParameter("password", Settings.Password) .AddFormParameter("pid", Settings.Pid.Trim()) .Accept(HttpAccept.Json) + .WithRateLimit(RateLimit.TotalSeconds) .Build(); - var response = await _httpClient.PostAsync(authLoginRequest); - var token = response.Resource.Token; + var response = await _httpClient.ExecuteProxiedAsync(authLoginRequest, Definition); + var authResponse = STJson.Deserialize(response.Content); - return token; + return authResponse.Token; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs index 68b2d745c..4dec71e11 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Net; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; @@ -42,9 +43,9 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz throw new IndexerException(indexerResponse, $"Unexpected response header {indexerResponse.HttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}"); } - var jsonResponse = new HttpResponse(indexerResponse.HttpResponse); + var jsonResponse = STJson.Deserialize(indexerResponse.HttpResponse.Content); - foreach (var row in jsonResponse.Resource.Data) + foreach (var row in jsonResponse.Data) { var details = row.Url; var link = row.Download; From 82688d8a55717e25884cdb9aa63fd3da66a69346 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 04:27:04 +0300 Subject: [PATCH 219/964] Use ExecuteAuth in AvistazBase --- src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs index 14a3dbbb5..b5d8390a3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs @@ -121,10 +121,10 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz .AddFormParameter("password", Settings.Password) .AddFormParameter("pid", Settings.Pid.Trim()) .Accept(HttpAccept.Json) - .WithRateLimit(RateLimit.TotalSeconds) .Build(); - var response = await _httpClient.ExecuteProxiedAsync(authLoginRequest, Definition); + var response = await ExecuteAuth(authLoginRequest); + var authResponse = STJson.Deserialize(response.Content); return authResponse.Token; From 52c6b56a4c95792298efc42e5d6aedb59a9f26a9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 05:19:03 +0300 Subject: [PATCH 220/964] Cleanup BooleanConverter to STJson --- src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs | 1 + src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs | 6 ------ .../Indexers/Definitions/FileList/FileListApi.cs | 4 ---- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs b/src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs index 4fba4fae1..e799b678b 100644 --- a/src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs +++ b/src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs @@ -36,6 +36,7 @@ namespace NzbDrone.Common.Serializer serializerSettings.Converters.Add(new STJTimeSpanConverter()); serializerSettings.Converters.Add(new STJUtcConverter()); serializerSettings.Converters.Add(new DictionaryStringObjectConverter()); + serializerSettings.Converters.Add(new BooleanConverter()); } public static T Deserialize(string json) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index 6da765664..2f8327715 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -451,22 +451,16 @@ namespace NzbDrone.Core.Indexers.Definitions [JsonPropertyName("tmdb_id")] public string TmdbId { get; set; } - [JsonConverter(typeof(BooleanConverter))] public bool Freeleech { get; set; } - [JsonConverter(typeof(BooleanConverter))] public bool Promo25 { get; set; } - [JsonConverter(typeof(BooleanConverter))] public bool Promo50 { get; set; } - [JsonConverter(typeof(BooleanConverter))] public bool Promo75 { get; set; } - [JsonConverter(typeof(BooleanConverter))] public bool Limited { get; set; } - [JsonConverter(typeof(BooleanConverter))] public bool Internal { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs index 0a0e18521..6f1fdc12e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs @@ -1,5 +1,4 @@ using System.Text.Json.Serialization; -using NzbDrone.Common.Serializer; namespace NzbDrone.Core.Indexers.Definitions.FileList; @@ -23,15 +22,12 @@ public class FileListTorrent [JsonPropertyName("imdb")] public string ImdbId { get; set; } - [JsonConverter(typeof(BooleanConverter))] public bool Internal { get; set; } [JsonPropertyName("freeleech")] - [JsonConverter(typeof(BooleanConverter))] public bool FreeLeech { get; set; } [JsonPropertyName("doubleup")] - [JsonConverter(typeof(BooleanConverter))] public bool DoubleUp { get; set; } [JsonPropertyName("upload_date")] From 93ec6cf89b6610b6ce2ada178aec3361a578fca7 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 3 Oct 2023 23:29:47 +0000 Subject: [PATCH 221/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Dimitri Co-authored-by: Garkus98 Co-authored-by: Oskari Lavinto Co-authored-by: RicardoVelaC Co-authored-by: Weblate Co-authored-by: 宿命 <331874545@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 15 +- src/NzbDrone.Core/Localization/Core/fi.json | 40 ++-- src/NzbDrone.Core/Localization/Core/fr.json | 207 +++++++++++------- src/NzbDrone.Core/Localization/Core/ru.json | 9 +- .../Localization/Core/zh_CN.json | 2 +- 5 files changed, 167 insertions(+), 106 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index d8df172fa..c09ca8327 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -391,7 +391,7 @@ "UpdateAvailable": "La nueva actualización está disponible", "Genre": "Géneros", "Publisher": "Editor", - "AuthenticationRequired": "Autenticación Requerida", + "AuthenticationRequired": "Autenticación requerida", "ApplyChanges": "Aplicar Cambios", "CountIndexersSelected": "{0} indexador(es) seleccionado(s)", "CountDownloadClientsSelected": "{0} cliente(s) de descarga seleccionado(s)", @@ -424,12 +424,19 @@ "None": "Ninguna", "ResetAPIKeyMessageText": "¿Está seguro de que desea restablecer su clave API?", "EditIndexerProxyImplementation": "Agregar Condición - { implementationName}", - "AppUpdated": "{appName} Actualizado", + "AppUpdated": "{appName} Actualizada", "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}", "AddApplicationImplementation": "Agregar Condición - { implementationName}", - "AddConnectionImplementation": "Agregar Condición - { implementationName}", + "AddConnectionImplementation": "Añadir Conexión - {implementationName}", "AddIndexerImplementation": "Agregar Condición - { implementationName}", "AddIndexerProxyImplementation": "Agregar Condición - { implementationName}", "EditApplicationImplementation": "Agregar Condición - { implementationName}", - "EditConnectionImplementation": "Agregar Condición - { implementationName}" + "EditConnectionImplementation": "Agregar Condición - { implementationName}", + "AddDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", + "AuthenticationMethod": "Método de autenticación", + "AuthenticationMethodHelpTextWarning": "Por favor selecciona un método válido de autenticación", + "AuthenticationRequiredHelpText": "Cambiar para que las solicitudes requieran autenticación. No lo cambie a menos que entienda los riesgos.", + "AuthenticationRequiredPasswordHelpTextWarning": "Introduzca una nueva contraseña", + "AuthenticationRequiredUsernameHelpTextWarning": "Introduzca un nuevo nombre de usuario", + "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local." } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index c286219e0..d4c69a1f0 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -12,7 +12,7 @@ "Indexers": "Tietolähteet", "MovieIndexScrollBottom": "Elokuvakirjasto: vieritä alas", "SSLCertPassword": "SSL-varmenteen salasana", - "Style": "Tyyli", + "Style": "Ulkoasu", "Tags": "Tunnisteet", "Today": "Tänään", "About": "Tietoja", @@ -22,7 +22,7 @@ "ApplicationStatusCheckSingleClientMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}", "Date": "Päiväys", "Dates": "Päiväykset", - "SettingsTimeFormat": "Ajan esitystapa", + "SettingsTimeFormat": "Kellonajan esitys", "Message": "Viesti", "Seeders": "Jakajat", "TestAll": "Testaa kaikki", @@ -48,15 +48,15 @@ "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.", "Result": "Tulos", "Settings": "Asetukset", - "SettingsLongDateFormat": "Päiväyksen pitkä esitystapa", - "SettingsShortDateFormat": "Päiväyksen lyhyt esitystapa", + "SettingsLongDateFormat": "Pitkän päiväyksen esitys", + "SettingsShortDateFormat": "Lyhyen päiväyksen esitys", "UnselectAll": "Poista kaikkien valinta", "UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.", "UpdateCheckUINotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käyttöliittymäkansioon '{0}'.", "UpdateMechanismHelpText": "Käytä Prowlarrin sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.", "Enable": "Käytä", "UI": "Käyttöliittymä", - "UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. 'http://[host]:[port]/[urlBase]'). Käytä oletusta jättämällä tyhjäksi.", + "UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.", "Usenet": "Usenet", "BackupNow": "Varmuuskopioi nyt", "NoBackupsAreAvailable": "Varmuuskopioita ei ole saatavilla", @@ -71,8 +71,8 @@ "NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.", "ApplyTags": "Tunnistetoimenpide", "Authentication": "Todennus", - "AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana.", - "BindAddressHelpText": "Toimiva IP-osoite, localhost tai '*' (tähti) kaikille yhteyksille.", + "AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana {appName}in käyttöön.", + "BindAddressHelpText": "Toimiva IP-osoite, \"localhost\" tai \"*\" (tähti) kaikille verkkoliitännöille.", "Close": "Sulje", "DeleteNotification": "Poista kytkentä", "Docker": "Docker", @@ -96,7 +96,7 @@ "Protocol": "Protokolla", "ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}", "ProxyCheckFailedToTestMessage": "Välityspalvelintesti epäonnistui: {0}", - "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen '{0}' IP-osoitteen selvitys epäonnistui.", + "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.", "ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.", "ProxyType": "Välityspalvelimen tyyppi", "ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.", @@ -145,7 +145,7 @@ "All": "Kaikki", "AllIndexersHiddenDueToFilter": "Aktiivinen suodatin on piilottanut kaikki tietolähteet.", "Analytics": "Analytiikka", - "AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja sovelluksen palvelimille. Tämä sisältää tietoja selaimestasi, verkkokäyttöliittymän sivujen käytöstä, virheraportoinnista sekä käyttöjärjestelmästäsi ja versiosta. Käytämme näitä tietoja ominaisuuksien ja virhekorjauksien painotukseen.", + "AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja palvelimillemme. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.", "ApiKey": "API-avain", "AppDataDirectory": "AppData-kansio", "DBMigration": "Tietokannan siirto", @@ -181,7 +181,7 @@ "Discord": "Discord", "Donations": "Lahjoitukset", "Edit": "Muokkaa", - "EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihaun yhteydessä, kun haku suoritetaan käyttöliittymästä tai Prowlarrin toimesta.", + "EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai Prowlarrin toimesta.", "Enabled": "Käytössä", "EventType": "Tapahtumatyyppi", "Exception": "Poikkeus", @@ -199,9 +199,9 @@ "SaveChanges": "Tallenna muutokset", "SaveSettings": "Tallenna asetukset", "Scheduled": "Ajoitettu", - "SettingsEnableColorImpairedModeHelpText": "Muokattu tyyli käyttäjille, joiden värinäkö on heikentynyt. Auttaa erottamaan värikoodatun tiedon.", - "SettingsShowRelativeDates": "Näytä suhteutetut päiväykset", - "SettingsShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) tai absoluuttiset päiväykset.", + "SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin", + "SettingsShowRelativeDates": "Suhteellisten päiväysten esitys", + "SettingsShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) absoluuttisten sijaan", "ShowSearch": "Näytä haku", "Source": "Lähde", "SSLPort": "SSL-portti", @@ -435,7 +435,7 @@ "EditSyncProfile": "Muokkaa synkronointiprofiilia", "InstanceName": "Instanssin nimi", "InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa", - "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan käyttöjärjestelmäsi teemaa vastaavaksi. Innoittanut {0}.", + "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasu. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.", "Duration": "Kesto", "ElapsedTime": "Kulunut aika", "EnabledRedirected": "Kulunut, uudelleenohjattu", @@ -485,11 +485,11 @@ "Episode": "Jakso", "Label": "Tunniste", "Theme": "Teema", - "ConnectionLostReconnect": "Radarr pyrkii muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".", + "ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai sitä voidaan yrittää manuaalisesti painamalla alta \"Lataa uudelleen\".", "DeleteAppProfileMessageText": "Haluatko varmasti poistaa laatuprofiilin '{0}'?", "RecentChanges": "Viimeaikaiset muutokset", "WhatsNew": "Mikä on uutta?", - "ConnectionLostToBackend": "Radarr on menettänyt yhteyden taustajärjestelmään ja sivu on päivitettävä toiminnallisuuden palauttamiseksi.", + "ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja käytettävyyden palauttamiseksi se on ladattava uudelleen.", "minutes": "Minuuttia", "AddConnection": "Lisää yhteys", "NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi", @@ -498,5 +498,11 @@ "AuthForm": "Lomake (kirjautumissivu)", "DisabledForLocalAddresses": "Ei käytetä paikallisille osoittelle", "None": "Ei mitään", - "ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?" + "ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?", + "TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdesieppausten kokonaismäärä", + "AppUpdated": "{appName} on päivitetty", + "AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.", + "IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu", + "AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt todennuksen käyttöönoton. Todennus voidaan poistaa käytöstä paikallisille osoitteille.", + "TotalGrabs": "Sieppausten kokonaismäärä" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index bf4386ec1..f307f9c13 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -3,16 +3,16 @@ "Indexers": "Indexeurs", "Host": "Hôte", "History": "Historique", - "HideAdvanced": "Masquer avancé", + "HideAdvanced": "Masquer param. av.", "Health": "Santé", "General": "Général", "Folder": "Dossier", - "Filter": "Filtre", + "Filter": "Filtrer", "Files": "Fichiers", "Events": "Événements", - "Edit": "Éditer", + "Edit": "Modifier", "DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", - "DownloadClients": "Clients télécharg.", + "DownloadClients": "Clients de télécharg.", "Dates": "Dates", "Date": "Date", "Delete": "Supprimer", @@ -28,19 +28,19 @@ "About": "À propos", "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", "DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}", - "SetTags": "Définir Tags", + "SetTags": "Définir les étiquettes", "ReleaseStatus": "Statut de la version", "UpdateCheckUINotWritableMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", "UpdateCheckStartupTranslocationMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' se trouve dans un dossier App Translocation.", "UpdateCheckStartupNotWritableMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", - "UnselectAll": "Tout déselectionner", + "UnselectAll": "Tout désélectionner", "UISettingsSummary": "Date, langue, et perceptions des couleurs", - "TagsSettingsSummary": "Voir tous les tags et leur utilisation. Les tags inutilisés peuvent être supprimés", + "TagsSettingsSummary": "Voir toutes les étiquettes et leur utilisation. Les étiquettes inutilisées peuvent être supprimées", "Style": "Style", - "Status": "Statut", + "Status": "État", "Sort": "Trier", "Size": "Taille", - "ShowAdvanced": "Afficher avancés", + "ShowAdvanced": "Afficher param. av.", "Settings": "Paramètres", "SelectAll": "Tout sélectionner", "Security": "Sécurité", @@ -53,15 +53,15 @@ "Queue": "File d'attente", "ProxyCheckResolveIpMessage": "Impossible de résoudre l'adresse IP de l'hôte proxy configuré {0}", "ProxyCheckFailedToTestMessage": "Échec du test du proxy : {0}", - "ProxyCheckBadRequestMessage": "Échec du test du proxy. StatusCode : {0}", + "ProxyCheckBadRequestMessage": "Échec du test du proxy. Code d'état : {0}", "Proxy": "Proxy", "Protocol": "Protocole", "Options": "Options", - "NoChanges": "Aucun changement", + "NoChanges": "Aucune modification", "NoChange": "Pas de changement", "MoreInfo": "Plus d'informations", "Grabbed": "Récupéré", - "DownloadClientsSettingsSummary": "Clients de Téléchargement configuration pour l'intégration dans la recherche de l'interface utilisateur Prowlarr", + "DownloadClientsSettingsSummary": "Configuration des clients de téléchargement pour intégration dans la recherche de l'interface utilisateur de Prowlarr", "DownloadClient": "Client de Téléchargement", "Logging": "Enregistrement", "LogFiles": "Fichiers Log", @@ -69,7 +69,7 @@ "Updates": "Mises à jour", "UI": "UI", "Tasks": "Tâches", - "Tags": "Tags", + "Tags": "Étiquettes", "System": "Système", "LastWriteTime": "Heure de la dernière écriture", "Language": "Langue", @@ -116,18 +116,18 @@ "HealthNoIssues": "Aucun problème avec votre configuration", "SystemTimeCheckMessage": "L'heure du système est décalée de plus d'un jour. Les tâches planifiées peuvent ne pas s'exécuter correctement tant que l'heure ne sera pas corrigée", "SettingsShowRelativeDates": "Afficher les dates relatives", - "UnsavedChanges": "Changement non sauvegardés", - "ShowSearchHelpText": "Afficher le bouton de recherche au survol de la souris", + "UnsavedChanges": "Modifications non sauvegardées", + "ShowSearchHelpText": "Affiche le bouton de recherche au survol du curseur", "ShowSearch": "Afficher la recherche", "SettingsTimeFormat": "Format de l'heure", - "SettingsShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/ Hier/ etc) ou absolues", + "SettingsShowRelativeDatesHelpText": "Afficher les dates relatives (aujourd'hui, hier, etc.) ou absolues", "SettingsShortDateFormat": "Format de date court", "SettingsLongDateFormat": "Format de date long", "SettingsEnableColorImpairedModeHelpText": "Style altéré pour aider les personnes daltoniennes à distinguer les informations en couleurs", "SettingsEnableColorImpairedMode": "Activer le mode daltonien", - "PendingChangesStayReview": "Rester et vérifier les changements", - "PendingChangesMessage": "Vous avez effectué des changements non sauvegardés, souhaitez vous quitter cette page ?", - "PendingChangesDiscardChanges": "Abandonner les changements et quitter", + "PendingChangesStayReview": "Rester et vérifier les modifications", + "PendingChangesMessage": "Vous avez des modifications non sauvegardées, voulez-vous vraiment quitter cette page ?", + "PendingChangesDiscardChanges": "Abandonner les modifications et quitter", "CloneProfile": "Dupliqué le profil", "ClientPriority": "Priorité du client", "ChangeHasNotBeenSavedYet": "Les changements n'ont pas encore été sauvegardés", @@ -135,15 +135,15 @@ "CertificateValidation": "Validation du certificat", "BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales", "Branch": "Branche", - "BindAddressHelpText": "Adresse IP valide, localhost ou '*' pour toutes les interfaces", + "BindAddressHelpText": "Adresse IP valide, localhost ou « * » pour toutes les interfaces", "BindAddress": "Adresse d'attache", "Backups": "Sauvegardes", "BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de conservation seront automatiquement effacées", "BackupIntervalHelpText": "Intervalle entre les sauvegardes automatiques", "Automatic": "Automatique", - "AuthenticationMethodHelpText": "Exiger un identifiant et un mot de passe pour accéder à Prowlarr", + "AuthenticationMethodHelpText": "Exiger un nom d'utilisateur et un mot de passe pour accéder à {appName}", "Authentication": "Authentification", - "ApplyTags": "Appliquer les tags", + "ApplyTags": "Appliquer les étiquettes", "AppDataDirectory": "Dossier AppData", "ApiKey": "Clé API", "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Prowlarr. Cela inclut des informations sur votre navigateur, quelle page Prowlarr WebUI vous utilisez, les rapports d'erreurs, ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.", @@ -170,8 +170,8 @@ "BranchUpdateMechanism": "Branche utilisée par le mécanisme de mise à jour extérieur", "BranchUpdate": "Branche à utiliser pour mettre Prowlarr à jour", "BeforeUpdate": "Avant la mise à jour", - "DeleteDownloadClientMessageText": "Êtes-vous sûr de vouloir supprimer le client de téléchargement '{0}' ?", - "DeleteBackupMessageText": "Êtes-vous sûr de vouloir supprimer la sauvegarde '{0}' ?", + "DeleteDownloadClientMessageText": "Voulez-vous supprimer le client de téléchargement « {name} » ?", + "DeleteBackupMessageText": "Voulez-vous supprimer la sauvegarde « {name} » ?", "ErrorLoadingContents": "Erreur lors du chargement du contenu", "EnableInteractiveSearchHelpText": "Sera utilisé lorsque la recherche interactive est utilisée", "EnableAutomaticSearchHelpText": "Sera utilisé lorsque les recherches automatiques sont effectuées via l'interface utilisateur ou par Prowlarr", @@ -180,7 +180,7 @@ "Exception": "Exception", "EditIndexer": "Modifier l'indexeur", "Disabled": "Désactivé", - "DeleteNotificationMessageText": "Êtes-vous sûr de vouloir supprimer la notification '{0}' ?", + "DeleteNotificationMessageText": "Voulez-vous supprimer la notification « {name} » ?", "AutomaticSearch": "Recherche automatique", "AddIndexer": "Ajouter un indexeur", "Interval": "Intervalle", @@ -203,14 +203,14 @@ "LogLevelTraceHelpTextWarning": "La journalisation des traces ne doit être activée que temporairement", "LogLevel": "Niveau du journal", "IncludeHealthWarningsHelpText": "Inclure avertissements santé", - "FocusSearchBox": "Zone de recherche de focus", + "FocusSearchBox": "Placer le curseur sur la barre de recherche", "ProxyBypassFilterHelpText": "Utiliser ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines", "Uptime": "Durée de fonctionnent", "UpdateScriptPathHelpText": "Chemin vers un script personnalisé qui prend un package de mise à jour extraite et gère le reste du processus de mise à jour", "UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de Prowlarr ou un script", "UpdateAutomaticallyHelpText": "Télécharger et installer automatiquement les mises à jour. Vous pourrez toujours installer à partir de System : Updates", "UnableToLoadUISettings": "Impossible de charger les paramètres de l'interface utilisateur", - "UnableToLoadTags": "Impossible de charger les balises", + "UnableToLoadTags": "Impossible de charger les étiquettes", "UnableToLoadHistory": "Impossible de charger l'historique", "UnableToLoadGeneralSettings": "Impossible de charger les paramètres généraux", "UnableToLoadDownloadClients": "Impossible de charger les clients de téléchargement", @@ -218,16 +218,16 @@ "UnableToAddANewNotificationPleaseTryAgain": "Impossible d'ajouter une nouvelle notification, veuillez réessayer.", "UnableToAddANewIndexerPleaseTryAgain": "Impossible d'ajouter un nouvel indexeur, veuillez réessayer.", "UnableToAddANewDownloadClientPleaseTryAgain": "Impossible d'ajouter un nouveau client de téléchargement, veuillez réessayer.", - "TagIsNotUsedAndCanBeDeleted": "La balise n'est pas utilisée et peut être supprimée", - "TagsHelpText": "S'applique aux films avec au moins une balise correspondante", - "StartTypingOrSelectAPathBelow": "Commencer à taper ou sélectionner un chemin ci-dessous", - "NoTagsHaveBeenAddedYet": "Aucune identification n'a été ajoutée pour l'instant", + "TagIsNotUsedAndCanBeDeleted": "L'étiquette n'est pas utilisée et peut être supprimée", + "TagsHelpText": "S'applique aux indexeurs avec au moins une étiquette correspondante", + "StartTypingOrSelectAPathBelow": "Commencer à écrire ou sélectionner un chemin ci-dessous", + "NoTagsHaveBeenAddedYet": "Aucune étiquette n'a encore été ajoutée", "IndexerFlags": "Indicateurs d'indexeur", - "DeleteTagMessageText": "Voulez-vous vraiment supprimer la balise '{0}' ?", + "DeleteTagMessageText": "Voulez-vous vraiment supprimer l'étiquette « {label} » ?", "UISettings": "Paramètres UI", "UILanguageHelpTextWarning": "Rechargement du navigateur requis", "UILanguageHelpText": "Langue que Prowlarr utilisera pour l'interface utilisateur", - "UILanguage": "UI Langue", + "UILanguage": "Langue de l'IU", "Torrents": "Torrents", "TestAllClients": "Tester tous les clients", "TagCannotBeDeletedWhileInUse": "Ne peut pas être supprimé pendant l'utilisation", @@ -254,7 +254,7 @@ "ExistingTag": "Tag existant", "RemoveFilter": "Supprimer le filtre", "RemovedFromTaskQueue": "Supprimé de la file d'attente des tâches", - "RefreshMovie": "Actualiser film", + "RefreshMovie": "Actualiser le film", "ReadTheWikiForMoreInformation": "Consultez le Wiki pour plus d'informations", "ProwlarrSupportsAnyIndexer": "Prowlarr prend en charge de nombreux indexeurs en plus de tout indexeur qui utilise la norme Newznab/Torznab en utilisant « Generic Newznab » (pour usenet) ou « Generic Torznab » (pour les torrents). Recherchez et sélectionnez votre indexeur ci-dessous.", "ProwlarrSupportsAnyDownloadClient": "Prowlarr prend en charge tout client de téléchargement qui utilise le standard Newznab, ainsi que d'autres clients de téléchargement répertoriés ci-dessous.", @@ -276,14 +276,14 @@ "New": "Nouveau", "NetCore": ".NET Core", "MovieIndexScrollTop": "Index des films : faire défiler vers le haut", - "MovieIndexScrollBottom": "Index des Films : faire défiler vers le bas", + "MovieIndexScrollBottom": "Index des films : faire défiler vers le bas", "MIA": "MIA", "LaunchBrowserHelpText": " Ouvrer un navigateur Web et accéder à la page d'accueil de Prowlarr au démarrage de l'application.", - "CloseCurrentModal": "Fermer le modal actuel", - "AddingTag": "Ajouter un tag", + "CloseCurrentModal": "Fermer cette fenêtre modale", + "AddingTag": "Ajout d'une étiquette", "OnHealthIssueHelpText": "Sur un problème de santé", "AcceptConfirmationModal": "Accepter les modalités d'utilisations", - "OpenThisModal": "Ouvrer ce modal", + "OpenThisModal": "Ouvrir cette fenêtre modale", "IndexerLongTermStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison de pannes pendant plus de 6 heures : {0}", "IndexerLongTermStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs de plus de 6 heures", "Yesterday": "Hier", @@ -311,9 +311,9 @@ "EnableRss": "Activer RSS", "EnableIndexer": "Activer l'indexeur", "DevelopmentSettings": "Paramètres de développement", - "DeleteApplicationMessageText": "Etes-vous sûr de vouloir supprimer l'application '{0}' ?", + "DeleteApplicationMessageText": "Voulez-vous supprimer l'application « {name} » ?", "DeleteApplication": "Supprimer l'application", - "ClearHistoryMessageText": "Vous êtes sûr de vouloir effacer tout l'historique de Prowlarr ?", + "ClearHistoryMessageText": "Voulez-vous vraiment effacer tout l'historique de Prowlarr ?", "ClearHistory": "Effacer l'historique", "ApplicationStatusCheckSingleClientMessage": "Applications indisponibles en raison de dysfonctionnements : {0}", "ApplicationStatusCheckAllClientMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements", @@ -347,7 +347,7 @@ "Grabs": "Complétés", "Id": "Id", "Presets": "Préconfigurations", - "Privacy": "Vie privée", + "Privacy": "Visibilité", "Query": "Requête", "Stats": "Stats", "Torrent": "Torrent", @@ -363,14 +363,14 @@ "AddDownloadClientToProwlarr": "L'ajout d'un client de téléchargement permet à Prowlarr d'envoyer des fichers directement depuis l'interface utilisateur tout en effectuant une recherche manuelle.", "NoSearchResultsFound": "Aucun résultat de recherche trouvé, essayez d'effectuer une nouvelle recherche ci-dessous.", "DeleteIndexerProxy": "Supprimer le proxy indexeur", - "DeleteIndexerProxyMessageText": "Êtes-vous sur de vouloir supprimer le proxy '{0}'  ?", + "DeleteIndexerProxyMessageText": "Voulez-vous supprimer le proxy d'indexeur « {name} » ?", "AddIndexerProxy": "Ajouter proxy indexeur", "AppSettingsSummary": "Applications et paramètres pour configurer comment Prowlarr interagit avec vos programmes PVR", - "IndexerTagsHelpText": "Utilisez des balises pour spécifier les proxys d'indexation ou les applications avec lesquelles l'indexeur est synchronisé. Les applications sans 1 ou plusieurs balises d'indexation correspondantes ne seront pas synchronisées.", + "IndexerTagsHelpText": "Utilisez des étiquettes pour spécifier les proxies d'indexation ou les applications avec lesquelles l'indexeur est synchronisé.", "Notifications": "Notifications", "IndexerVipCheckExpiredClientMessage": "Les avantages VIP de l'indexeur ont expiré : {0}", "IndexerProxy": "Proxy d'indexation", - "IndexerSettingsSummary": "Configuration de divers paramètres globaux de l'indexeur, y compris les proxys.", + "IndexerSettingsSummary": "Configuration de divers paramètres globaux de l'indexeur, y compris les proxies.", "IndexerProxies": "Proxys d'indexation", "IndexerProxyStatusCheckAllClientMessage": "Tous les proxys sont indisponibles en raison d'échecs", "IndexerProxyStatusCheckSingleClientMessage": "Proxys indisponibles en raison d'échecs : {0}", @@ -440,7 +440,7 @@ "Started": "Démarré", "EditSyncProfile": "Modifier le profil de synchronisation", "AddSyncProfile": "Ajouter un profil de synchronisation", - "ThemeHelpText": "Changez le thème de l'interface de l'application. Le thème \"Auto\" utilisera celui de votre système d'exploitation pour définir le mode clair ou foncé. Inspiré par {0}", + "ThemeHelpText": "Changez le thème de l'interface de l'application. Le thème « Auto » utilisera celui de votre système d'exploitation pour déterminer entre le mode clair ou foncé. Inspiré par {inspiredBy}.", "SyncProfile": "Profil de synchronisation", "SyncProfiles": "Profils de synchronisation", "MinimumSeeders": "Nombre minimum de seeders", @@ -449,18 +449,18 @@ "ElapsedTime": "Temps écoulé", "Parameters": "Paramètres", "AuthenticationRequired": "Authentification requise", - "AuthenticationRequiredHelpText": "Modifier les demandes pour lesquelles l'authentification est requise. Ne changez rien si vous ne comprenez pas les risques.", + "AuthenticationRequiredHelpText": "Modifier les demandes pour lesquelles l'authentification est requise. Ne rien modifier si vous n'en comprenez pas les risques.", "DeleteClientCategory": "Supprimer la catégorie du client de téléchargement", "DownloadClientCategory": "Catégorie du client de téléchargement", "MappedCategories": "Catégories mappées", "EnabledRedirected": "Activé, Redirigé", "GrabTitle": "Récupérer le titre", - "AuthenticationRequiredWarning": "Pour empêcher l'accès à distance sans authentification, Prowlarr exige désormais que l'authentification soit activée. Configurez votre méthode d'authentification et vos informations d'identification. Vous pouvez éventuellement désactiver l'authentification à partir des adresses locales. Reportez-vous à la FAQ pour plus d'informations.", + "AuthenticationRequiredWarning": "Pour empêcher l'accès à distance sans authentification, {appName} exige désormais que l'authentification soit activée. Vous pouvez éventuellement désactiver l'authentification pour les adresses locales.", "Remove": "Retirer", "Replace": "Remplacer", - "TheLatestVersionIsAlreadyInstalled": "La dernière version de Prowlarr est déjà installée", + "TheLatestVersionIsAlreadyInstalled": "La dernière version de {appName} est déjà installée", "AddCustomFilter": "Ajouter filtre personnalisé", - "AddApplication": "Ajouter application", + "AddApplication": "Ajouter une application", "IncludeManualGrabsHelpText": "Inclure les saisies manuelles effectuées dans Prowlarr", "OnGrabHelpText": "Récupéré à la sortie", "RssFeed": "Flux RSS", @@ -480,7 +480,7 @@ "Book": "Livre", "Artist": "Artiste", "Author": "Auteur", - "AverageResponseTimesMs": "Temps de réponse moyen (Ms)", + "AverageResponseTimesMs": "Temps de réponse moyen des indexeurs (ms)", "IndexerFailureRate": "Taux d'échec de l'indexeur", "Label": "Label", "More": "Plus", @@ -494,57 +494,104 @@ "Year": "Année", "ApplicationURL": "URL de l'application", "ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration", - "ApplicationUrlHelpText": "URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL", + "ApplicationUrlHelpText": "L'URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL", "ApplyChanges": "Appliquer les modifications", - "ApplyTagsHelpTextAdd": "Ajouter : Ajouter les tags à la liste de tags existantes", - "ApplyTagsHelpTextHowToApplyApplications": "Comment appliquer des tags à l'auteur sélectionné", - "CountIndexersSelected": "{0} indexeur(s) sélectionné(s)", - "DeleteSelectedApplicationsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", - "DeleteSelectedIndexersMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", + "ApplyTagsHelpTextAdd": "Ajouter : ajoute les étiquettes à la liste de étiquettes existantes", + "ApplyTagsHelpTextHowToApplyApplications": "Comment appliquer les étiquettes aux applications sélectionnées", + "CountIndexersSelected": "{count} indexeur(s) sélectionné(s)", + "DeleteSelectedApplicationsMessageText": "Voulez-vous vraiment supprimer {count} application(s) sélectionnée(s) ?", + "DeleteSelectedIndexersMessageText": "Voulez-vous vraiment supprimer les {count} indexeur(s) sélectionné(s) ?", "DownloadClientPriorityHelpText": "Donnez la priorité à plusieurs clients de téléchargement. Le Round-Robin est utilisé pour les clients ayant la même priorité.", - "SelectIndexers": "Recherche indexeurs", - "ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des tags aux indexeurs sélectionnés", - "ApplyTagsHelpTextRemove": "Suprimer : Suprime les étiquettes renseignées", - "ApplyTagsHelpTextReplace": "Remplacer : Remplace les tags par les tags renseignés (ne pas renseigner de tags pour effacer tous les tags)", + "SelectIndexers": "Sélectionner les indexeurs", + "ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des étiquettes aux indexeurs sélectionnés", + "ApplyTagsHelpTextRemove": "Supprimer : supprime les étiquettes renseignées", + "ApplyTagsHelpTextReplace": "Remplacer : remplace les étiquettes par les étiquettes renseignées (ne pas renseigner d'étiquette pour toutes les effacer)", "DeleteSelectedDownloadClients": "Supprimer le client de téléchargement", - "DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", - "StopSelecting": "Arrêtez la sélection", + "DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer {count} client(s) de téléchargement sélectionné(s) ?", + "StopSelecting": "Effacer la sélection", "UpdateAvailable": "Une nouvelle mise à jour est disponible", "AdvancedSettingsHiddenClickToShow": "Paramètres avancés masqués, cliquez pour afficher", "AdvancedSettingsShownClickToHide": "Paramètres avancés affichés, cliquez pour masquer", "AppsMinimumSeeders": "Apps avec le nombre minimum de seeders disponibles", "AppsMinimumSeedersHelpText": "Minimum de seeders requis par les applications pour que l’indexeur les récupère, laisser vide utilise la valeur par défaut du profil Sync", "BasicSearch": "Recherche de base", - "CountIndexersAvailable": "{0} indexeur(s) disponible(s)", + "CountIndexersAvailable": "{count} indexeur(s) disponible(s)", "DeleteSelectedApplications": "Supprimer les applications sélectionnées", "DeleteSelectedIndexer": "Supprimer les indexeurs sélectionnés", "DeleteSelectedIndexers": "Supprimer les indexeurs sélectionnés", "EditSelectedDownloadClients": "Modifier les clients de téléchargement sélectionnés", "EditSelectedIndexers": "Modifier les indexeurs sélectionnés", - "AreYouSureYouWantToDeleteIndexer": "Êtes-vous sûr de vouloir supprimer “{0}” de Prowlarr ?", + "AreYouSureYouWantToDeleteIndexer": "Voulez-vous supprimer « {name} » de Prowlarr ?", "AuthQueries": "Requêtes d’authentification", - "CountApplicationsSelected": "{0} application(s) sélectionnée(s)", - "CountDownloadClientsSelected": "{0} client(s) de téléchargement sélectionné(s)", - "ConnectionLostReconnect": "Radarr essaiera de se connecter automatiquement, ou vous pouvez cliquer sur \"Recharger\" en bas.", - "ConnectionLostToBackend": "Radarr a perdu sa connexion au backend et devra être rechargé pour fonctionner à nouveau.", + "CountApplicationsSelected": "{count} application(s) sélectionnée(s)", + "CountDownloadClientsSelected": "{count} client(s) de téléchargement sélectionné(s)", + "ConnectionLostReconnect": "{appName} essaiera de se connecter automatiquement, ou vous pouvez cliquer sur « Recharger » en bas.", + "ConnectionLostToBackend": "{appName} a perdu sa connexion au backend et devra être rechargé pour fonctionner à nouveau.", "RecentChanges": "Changements récents", "WhatsNew": "Quoi de neuf ?", - "minutes": "Minutes", - "DeleteAppProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?", + "minutes": "minutes", + "DeleteAppProfileMessageText": "Voulez-vous vraiment supprimer le profil d'application « {name} » ?", "AddConnection": "Ajouter une connexion", "AddConnectionImplementation": "Ajouter une connexion - {implementationName}", - "AddApplicationImplementation": "Ajouter une condition - {implementationName}", - "AddIndexerImplementation": "Ajouter une condition - {implementationName}", + "AddApplicationImplementation": "Ajouter une application - {implementationName}", + "AddIndexerImplementation": "Ajouter un indexeur - {implementationName}", "EditConnectionImplementation": "Ajouter une connexion - {implementationName}", - "NotificationStatusAllClientHealthCheckMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements", - "NotificationStatusSingleClientHealthCheckMessage": "Applications indisponibles en raison de dysfonctionnements : {0}", + "NotificationStatusAllClientHealthCheckMessage": "Toutes les notifications sont indisponibles en raison de dysfonctionnements", + "NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison de dysfonctionnements : {0}", "EditApplicationImplementation": "Ajouter une condition - {implementationName}", "EditIndexerImplementation": "Ajouter une condition - {implementationName}", - "EditIndexerProxyImplementation": "Ajouter une condition - {implementationName}", - "AuthBasic": "Authentification de base (Basic) (popup dans le navigateur)", - "AuthForm": "Authentification par un formulaire (page de connexion)", - "DisabledForLocalAddresses": "Désactivé pour les adresses IP locales", + "EditIndexerProxyImplementation": "Modifier un proxy d'indexeur - {implementationName}", + "AuthBasic": "Basique (fenêtre surgissante du navigateur)", + "AuthForm": "Formulaire (page de connexion)", + "DisabledForLocalAddresses": "Désactivée pour les adresses IP locales", "None": "Aucun", - "ResetAPIKeyMessageText": "Êtes vous sûr de vouloir réinitialiser votre Clé d'API ?", - "AddIndexerProxyImplementation": "Ajouter une condition - {implementationName}" + "ResetAPIKeyMessageText": "Voulez-vous réinitialiser votre clé d'API ?", + "AddIndexerProxyImplementation": "Ajouter un proxy d'indexeur - {implementationName}", + "IndexerStatus": "État de l'indexeur", + "ManageApplications": "Gérer les applications", + "NoIndexersFound": "Aucun indexeur n'a été trouvé", + "NoHistoryFound": "Aucun historique n'a été trouvé", + "QueryType": "Type de requête", + "SeedTimeHelpText": "Le temps qu'un torrent doit rester en seed avant de s'arrêter, la valeur vide est la valeur par défaut de l'application", + "GoToApplication": "Aller sur l'application", + "IndexerCategories": "Catégories d'indexeur", + "NoDownloadClientsFound": "Aucun client de téléchargement n'a été trouvé", + "AppUpdated": "{appName} mis à jour", + "AppUpdatedVersion": "{appName} a été mis à jour vers la version `{version}`, pour profiter des derniers changements, vous devrez relancer {appName}", + "IndexerDownloadClientHelpText": "Préciser quel client de téléchargement est utilisé pour les saisies créées au sein de Prowlarr provenant de cet indexeur", + "Implementation": "Implémentation", + "SearchCountIndexers": "Rechercher {count} indexeur(s)", + "SearchAllIndexers": "Rechercher tous les indexeurs", + "NewznabUrl": "URL Newznab", + "RssQueries": "Requêtes RSS", + "SeedTime": "Temps de seed", + "SearchQueries": "Requêtes de recherche", + "days": "jours", + "ApplicationTagsHelpTextWarning": "Les étiquettes doivent être utilisées avec prudence, elles peuvent avoir des effets indésirables. Une application avec une étiquette va uniquement synchroniser les indexeurs ayant la même étiquette.", + "DefaultNameCopiedProfile": "{name} - Copier", + "EditCategory": "Modifier la catégorie", + "EditDownloadClientImplementation": "Modifier le client de téléchargement - {implementationName}", + "External": "Externe", + "FoundCountReleases": "{itemCount} release(s) trouvée(s)", + "IndexerHistoryLoadError": "Erreur lors du chargement de l'historique de l'indexeur", + "IndexerTagsHelpTextWarning": "Les étiquettes doivent être utilisées avec prudence, elles peuvent avoir des effets indésirables. Un indexeur avec une étiquette va uniquement synchroniser les applications ayant la même étiquette.", + "NoIndexerHistory": "Aucun historique n'a été trouvé pour cet indexeur", + "PackSeedTimeHelpText": "Le temps qu'un pack (saison ou discographie) doit être seedé avant de s'arrêter, la valeur vide est la valeur par défaut de l'application", + "SeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, une valeur vide est la valeur par défaut de l'application", + "TorznabUrl": "URL Torznab", + "TotalGrabs": "Récupéré au total", + "TotalQueries": "Requêtes totales", + "SeedRatio": "Ratio de seed", + "SelectedCountOfCountReleases": "{selectedCount} sur {itemCount} releases sélectionnées", + "AddCategory": "Ajouter une catégorie", + "AddDownloadClientImplementation": "Ajouter un client de téléchargement - {implementationName}", + "ManageDownloadClients": "Gérer les clients de téléchargement", + "AuthenticationRequiredPasswordHelpTextWarning": "Saisir un nouveau mot de passe", + "IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {0].", + "AuthenticationMethod": "Méthode d'authentification", + "AuthenticationMethodHelpTextWarning": "Veuillez choisir une méthode d'authentification valide", + "ActiveIndexers": "Indexeurs actifs", + "ActiveApps": "Applications actives", + "AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur", + "Clone": "Cloner" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index f50958c3e..add28a373 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -17,7 +17,7 @@ "AddIndexer": "Добавить индексер", "Added": "Добавлено", "Actions": "Действия", - "About": "Подробности", + "About": "Об", "DeleteBackupMessageText": "Вы уверены, что хотите удалить резервную копию '{name}'?", "DeleteBackup": "Удалить резервную копию", "Delete": "Удалить", @@ -396,8 +396,8 @@ "IndexerDownloadClientHealthCheckMessage": "Индексаторы с недопустимыми клиентами загрузки: {0}.", "StopSelecting": "Прекратить выбор", "AddDownloadClientImplementation": "Добавить клиент загрузки - {implementationName}", - "AddConnection": "Добавить соединение", - "AddConnectionImplementation": "Добавить соединение - {implementationName}", + "AddConnection": "Добавить подключение", + "AddConnectionImplementation": "Добавить подключение - {implementationName}", "ManageDownloadClients": "Менеджер клиентов загрузки", "NotificationStatusAllClientHealthCheckMessage": "Все уведомления недоступны из-за сбоев", "NotificationStatusSingleClientHealthCheckMessage": "Уведомления недоступны из-за сбоев: {0}", @@ -414,5 +414,6 @@ "None": "Ничто", "ResetAPIKeyMessageText": "Вы уверены, что хотите сбросить Ваш API ключ?", "Categories": "Категории", - "Album": "альбом" + "Album": "альбом", + "AddCustomFilter": "Добавить специальный фильтр" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 2469fed4f..1d13ef15b 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -21,7 +21,7 @@ "AllIndexersHiddenDueToFilter": "由于应用了筛选器,所有索引器都被隐藏。", "Analytics": "分析", "AnalyticsEnabledHelpText": "将匿名使用情况和错误信息发送到Prowlarr的服务器。这包括有关您的浏览器的信息、您使用的Prowlarr WebUI页面、错误报告以及操作系统和运行时版本。我们将使用此信息来确定功能和错误修复的优先级。", - "ApiKey": "API 密钥", + "ApiKey": "API Key", "ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{0}个字符长。您可以通过设置或配置文件执行此操作", "AppDataDirectory": "AppData目录", "AppDataLocationHealthCheckMessage": "正在更新期间的 AppData 不会被更新删除", From 19a196e2c7eba0306fc0a38384e97d07872be260 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 05:36:39 +0300 Subject: [PATCH 222/964] Ensure the correct use of disposable parsed documents --- src/NzbDrone.Core/Indexers/Definitions/Anidex.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Anidub.cs | 6 +++--- .../Indexers/Definitions/AnimeTorrents.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Animedia.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/AroLol.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/BB.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/BakaBT.cs | 8 ++++---- src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/BitHDTV.cs | 2 +- .../Definitions/Cardigann/CardigannRequestGenerator.cs | 6 +++--- src/NzbDrone.Core/Indexers/Definitions/FunFile.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/HDTorrents.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Libble.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/NorBits.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/PixelHD.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/PreToMe.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/RevolutionTT.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs | 6 +++--- src/NzbDrone.Core/Indexers/Definitions/SceneTime.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs | 6 +++--- src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/TVVault.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/Toloka.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/TorrentBytes.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/Uniotaku.cs | 10 +++++----- src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs | 4 ++-- src/NzbDrone.Core/Indexers/Definitions/ZonaQ.cs | 4 ++-- 34 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Anidex.cs b/src/NzbDrone.Core/Indexers/Definitions/Anidex.cs index 6e3f9fe98..874f87091 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Anidex.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Anidex.cs @@ -200,7 +200,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("div#content table > tbody > tr"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Anidub.cs b/src/NzbDrone.Core/Indexers/Definitions/Anidub.cs index 5c6588c9d..010b37bc9 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Anidub.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Anidub.cs @@ -77,7 +77,7 @@ namespace NzbDrone.Core.Indexers.Definitions else { var parser = new HtmlParser(); - var document = await parser.ParseDocumentAsync(response.Content); + using var document = await parser.ParseDocumentAsync(response.Content); var errorMessage = document.QuerySelector("#content .berror .berror_c")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -433,7 +433,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var torrentInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); foreach (var t in dom.QuerySelectorAll("#tabs .torrent_c > div")) { @@ -465,7 +465,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var links = dom.QuerySelectorAll(".searchitem > h3 > a[href], #dle-content > .story > .story_h > .lcol > h2 > a[href]"); foreach (var link in links) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs index 5a3c8fc3c..7ba07ab80 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs @@ -275,7 +275,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("table tr"); foreach (var (row, index) in rows.Skip(1).Select((v, i) => (v, i))) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs b/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs index 5e29a2130..8d08c03b3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs @@ -253,7 +253,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var torrentInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); foreach (var t in dom.QuerySelectorAll("ul.media__tabs__nav > li > a")) { @@ -291,7 +291,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var links = dom.QuerySelectorAll("a.ads-list__item__title"); foreach (var link in links) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs b/src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs index 10138d441..78465e54b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs @@ -72,7 +72,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var errorMessage = dom.QuerySelector("form#loginform")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -206,7 +206,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var doc = parser.ParseDocument(indexerResponse.Content); + using var doc = parser.ParseDocument(indexerResponse.Content); var rows = doc.QuerySelectorAll("table.torrent_table > tbody > tr.torrent"); foreach (var row in rows) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/AroLol.cs b/src/NzbDrone.Core/Indexers/Definitions/AroLol.cs index 25e204bc3..5c12cdfc6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AroLol.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AroLol.cs @@ -37,7 +37,7 @@ public class AroLol : GazelleBase if (response.Content.Contains("loginform")) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var errorMessage = dom.QuerySelector("#loginform > .warning")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); diff --git a/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs b/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs index 8c72753de..ff4fb51ca 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs @@ -88,7 +88,7 @@ public class AudioBookBay : TorrentIndexerBase var response = await _httpClient.ExecuteProxiedAsync(request, Definition); var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var hash = dom.QuerySelector("td:contains(\"Info Hash:\") ~ td")?.TextContent.Trim(); if (hash == null) @@ -333,7 +333,7 @@ public class AudioBookBayParser : IParseIndexerResponse private static IHtmlDocument ParseHtmlDocument(string response) { var parser = new HtmlParser(); - var doc = parser.ParseDocument(response); + using var doc = parser.ParseDocument(response); var hidden = doc.QuerySelectorAll("div.post.re-ab"); foreach (var element in hidden) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BB.cs b/src/NzbDrone.Core/Indexers/Definitions/BB.cs index 4a8bf08bb..d5fa934f0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BB.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BB.cs @@ -72,7 +72,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var messageEl = dom.QuerySelectorAll("#loginform"); var messages = new List(); for (var i = 0; i < 13; i++) @@ -242,7 +242,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("#torrent_table > tbody > tr.torrent"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BakaBT.cs b/src/NzbDrone.Core/Indexers/Definitions/BakaBT.cs index d8b4acd72..ecfe03140 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BakaBT.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BakaBT.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Indexers.Definitions var response = await _httpClient.ExecuteProxiedAsync(request, Definition); var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var downloadLink = dom.QuerySelector(".download_link")?.GetAttribute("href"); if (downloadLink.IsNullOrWhiteSpace()) @@ -82,7 +82,7 @@ namespace NzbDrone.Core.Indexers.Definitions var loginPage = await ExecuteAuth(new HttpRequest(loginUrl)); var parser = new HtmlParser(); - var dom = await parser.ParseDocumentAsync(loginPage.Content); + using var dom = await parser.ParseDocumentAsync(loginPage.Content); var loginKey = dom.QuerySelector("input[name=\"loginKey\"]"); if (loginKey != null) { @@ -102,7 +102,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (CheckIfLoginNeeded(response)) { var htmlParser = new HtmlParser(); - var document = await htmlParser.ParseDocumentAsync(response.Content); + using var document = await htmlParser.ParseDocumentAsync(response.Content); var errorMessage = document.QuerySelector("#loginError, .error")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -247,7 +247,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll(".torrents tr.torrent, .torrents tr.torrent_alt"); var currentCategories = new List { NewznabStandardCategory.TVAnime }; diff --git a/src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs b/src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs index 93540972f..a261f2c71 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs @@ -161,7 +161,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var doc = parser.ParseDocument(indexerResponse.Content); + using var doc = parser.ParseDocument(indexerResponse.Content); var rows = doc.QuerySelectorAll("table.xMenuT > tbody > tr").Skip(1); foreach (var row in rows) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/BitHDTV.cs b/src/NzbDrone.Core/Indexers/Definitions/BitHDTV.cs index f579be009..16a8bb5fb 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BitHDTV.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BitHDTV.cs @@ -185,7 +185,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); foreach (var child in dom.QuerySelectorAll("#needseed")) { child.Remove(); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs index f543d1b0a..72cccca19 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs @@ -598,7 +598,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann } var resultParser = new HtmlParser(); - var resultDocument = resultParser.ParseDocument(loginResult.Content); + using var resultDocument = resultParser.ParseDocument(loginResult.Content); foreach (var error in errorBlocks) { var selection = resultDocument.QuerySelector(error.Selector); @@ -984,7 +984,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann var selectorText = ApplyGoTemplateText(selector.Selector, variables); var parser = new HtmlParser(); - var resultDocument = parser.ParseDocument(response.Content); + using var resultDocument = parser.ParseDocument(response.Content); var element = resultDocument.QuerySelector(selectorText); if (element == null) @@ -1045,7 +1045,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann if (_definition.Login.Test?.Selector != null && (response.Headers.ContentType?.Contains("text/html") ?? true)) { var parser = new HtmlParser(); - var document = parser.ParseDocument(response.Content); + using var document = parser.ParseDocument(response.Content); var selection = document.QuerySelectorAll(_definition.Login.Test.Selector); if (selection.Length == 0) diff --git a/src/NzbDrone.Core/Indexers/Definitions/FunFile.cs b/src/NzbDrone.Core/Indexers/Definitions/FunFile.cs index 2ae1886a4..cf6890fcd 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FunFile.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FunFile.cs @@ -70,7 +70,7 @@ public class FunFile : TorrentIndexerBase if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = await parser.ParseDocumentAsync(response.Content); var errorMessage = dom.QuerySelector("td.mf_content")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -276,7 +276,7 @@ public class FunFileParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("table.mainframe table[cellpadding=\"2\"] > tbody > tr:has(td.row3)"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs b/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs index 2cd58c40f..e2ec566e1 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs @@ -73,7 +73,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var errorMessages = dom .QuerySelectorAll("table.lista td.lista span[style*=\"#FF0000\"], table.lista td.header:contains(\"login attempts\")") .Select(r => r.TextContent.Trim()) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/HDTorrents.cs index 6819b2dcf..a16db1721 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDTorrents.cs @@ -74,7 +74,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (response.Content != null && !response.Content.ContainsIgnoreCase("If your browser doesn't have javascript enabled")) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = await parser.ParseDocumentAsync(response.Content); var errorMessage = dom.QuerySelector("div > font[color=\"#FF0000\"]")?.TextContent.Trim(); @@ -256,7 +256,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var userInfo = dom.QuerySelector("table.navus tr"); var userRank = userInfo?.Children[1].TextContent.Replace("Rank:", string.Empty).Trim(); diff --git a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs index 1c85a711f..5036239f7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs @@ -291,7 +291,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var doc = parser.ParseDocument(indexerResponse.Content); + using var doc = parser.ParseDocument(indexerResponse.Content); var rows = doc.QuerySelectorAll("table[id=\"torrents\"] > tbody > tr"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs b/src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs index b75160742..7803fff78 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs @@ -266,7 +266,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("table#sortabletable > tbody > tr:has(a[href*=\"details.php?id=\"])"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Libble.cs b/src/NzbDrone.Core/Indexers/Definitions/Libble.cs index 457320616..74a9020a4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Libble.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Libble.cs @@ -77,7 +77,7 @@ public class Libble : TorrentIndexerBase if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var errorMessage = dom.QuerySelector("#loginform > .warning")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -238,7 +238,7 @@ public class LibbleParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var doc = parser.ParseDocument(indexerResponse.Content); + using var doc = parser.ParseDocument(indexerResponse.Content); var groups = doc.QuerySelectorAll("table#torrent_table > tbody > tr.group:has(strong > a[href*=\"torrents.php?id=\"])"); foreach (var group in groups) diff --git a/src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs b/src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs index f86fe2535..9b4d10fd5 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs @@ -177,7 +177,7 @@ public class MoreThanTVParser : IParseIndexerResponse try { var parser = new HtmlParser(); - var document = parser.ParseDocument(indexerResponse.Content); + using var document = parser.ParseDocument(indexerResponse.Content); var torrents = document.QuerySelectorAll("#torrent_table > tbody > tr.torrent"); var movies = new[] { "movie" }; var tv = new[] { "season", "episode" }; diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index 49f913fa7..ddfff26cf 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -263,7 +263,7 @@ public class NorBitsParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("#torrentTable > tbody > tr").Skip(1).ToCollection(); diff --git a/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs b/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs index e1f7a4ab2..a1e9d37bb 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs @@ -234,7 +234,7 @@ public class PirateTheNetParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("table.main > tbody > tr"); foreach (var row in rows.Skip(1)) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PixelHD.cs b/src/NzbDrone.Core/Indexers/Definitions/PixelHD.cs index 29c315403..1c78174ca 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PixelHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PixelHD.cs @@ -171,7 +171,7 @@ public class PixelHDParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var groups = dom.QuerySelectorAll("div.browsePoster"); foreach (var group in groups) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PreToMe.cs b/src/NzbDrone.Core/Indexers/Definitions/PreToMe.cs index 3a533809f..9528e7b90 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PreToMe.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PreToMe.cs @@ -85,7 +85,7 @@ public class PreToMe : TorrentIndexerBase if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var errorMessage = dom.QuerySelector("table.body_table font[color~=\"red\"]")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -340,7 +340,7 @@ public class PreToMeParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("table > tbody > tr.browse"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/RevolutionTT.cs b/src/NzbDrone.Core/Indexers/Definitions/RevolutionTT.cs index acc798305..f158ef6b8 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/RevolutionTT.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/RevolutionTT.cs @@ -249,7 +249,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("#torrents-table > tbody > tr"); foreach (var row in rows.Skip(1)) diff --git a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs index b8973adf1..648062479 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs @@ -63,7 +63,7 @@ namespace NzbDrone.Core.Indexers.Definitions var response = await _httpClient.ExecuteProxiedAsync(request, Definition); var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var magnetLink = dom.QuerySelector("table.attach a.magnet-link[href^=\"magnet:?\"]")?.GetAttribute("href"); if (magnetLink == null) @@ -104,7 +104,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (!response.Content.Contains("id=\"logged-in-username\"")) { var parser = new HtmlParser(); - var document = await parser.ParseDocumentAsync(response.Content); + using var document = await parser.ParseDocumentAsync(response.Content); var errorMessage = document.QuerySelector("h4.warnColor1.tCenter.mrg_16, div.msg-main")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "RuTracker Auth Failed"); @@ -1580,7 +1580,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var doc = parser.ParseDocument(indexerResponse.Content); + using var doc = parser.ParseDocument(indexerResponse.Content); var rows = doc.QuerySelectorAll("table#tor-tbl > tbody > tr"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SceneTime.cs b/src/NzbDrone.Core/Indexers/Definitions/SceneTime.cs index d11660fc4..9a0f430a0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SceneTime.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SceneTime.cs @@ -225,7 +225,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var table = dom.QuerySelector("table.movehere"); if (table == null) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs b/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs index 158ffb6fb..61a5f0182 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs @@ -78,7 +78,7 @@ public class Shazbat : TorrentIndexerBase if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = await parser.ParseDocumentAsync(response.Content); var errorMessage = dom.QuerySelector("div#fail .modal-body")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -223,7 +223,7 @@ public class ShazbatParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var hasGlobalFreeleech = dom.QuerySelector("span:contains(\"Freeleech until:\"):has(span.datetime)") != null; @@ -303,7 +303,7 @@ public class ShazbatParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); if (!hasGlobalFreeleech) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs b/src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs index 24a01763b..5388f7831 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs @@ -96,7 +96,7 @@ public class SpeedCD : TorrentIndexerBase if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var errorMessage = dom.QuerySelector("h5")?.TextContent.Trim(); if (response.Content.Contains("Wrong Captcha!")) @@ -323,7 +323,7 @@ public class SpeedCDParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("div.boxContent > table > tbody > tr"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TVVault.cs b/src/NzbDrone.Core/Indexers/Definitions/TVVault.cs index d388cd6b7..4b75923a0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TVVault.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TVVault.cs @@ -75,7 +75,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var errorMessage = dom.QuerySelector("form#loginform")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -224,7 +224,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var doc = parser.ParseDocument(indexerResponse.Content); + using var doc = parser.ParseDocument(indexerResponse.Content); // get params to build download link (user could be banned without those params) var rssFeedUri = new Uri(_settings.BaseUrl + doc.QuerySelector("link[href^=\"/feeds.php?feed=\"]") diff --git a/src/NzbDrone.Core/Indexers/Definitions/Toloka.cs b/src/NzbDrone.Core/Indexers/Definitions/Toloka.cs index c7960dbfd..2e4955699 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Toloka.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Toloka.cs @@ -74,7 +74,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = await parser.ParseDocumentAsync(response.Content); var errorMessage = dom.QuerySelector("table.forumline table span.gen")?.FirstChild?.TextContent; throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -367,7 +367,7 @@ namespace NzbDrone.Core.Indexers.Definitions var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("table.forumline > tbody > tr[class*=prow]"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentBytes.cs index 45d920611..efda3329b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentBytes.cs @@ -71,7 +71,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var errorMessage = dom.QuerySelector("td.embedded")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -245,7 +245,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var doc = parser.ParseDocument(indexerResponse.Content); + using var doc = parser.ParseDocument(indexerResponse.Content); var rows = doc.QuerySelectorAll("table > tbody:has(tr > td.colhead) > tr:not(:has(td.colhead))"); foreach (var row in rows) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/Uniotaku.cs b/src/NzbDrone.Core/Indexers/Definitions/Uniotaku.cs index 0909f5ddb..9405e63c3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Uniotaku.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Uniotaku.cs @@ -65,7 +65,7 @@ public class Uniotaku : TorrentIndexerBase if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = await parser.ParseDocumentAsync(response.Content); var errorMessage = dom.QuerySelector(".login-content span.text-red")?.TextContent.Trim(); throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); @@ -92,7 +92,7 @@ public class Uniotaku : TorrentIndexerBase var response = await _httpClient.ExecuteProxiedAsync(request, Definition); var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = parser.ParseDocument(response.Content); var downloadLink = dom.QuerySelector("a[href^=\"download.php?id=\"]")?.GetAttribute("href")?.Trim(); if (downloadLink == null) @@ -250,9 +250,9 @@ public class UniotakuParser : IParseIndexerResponse var publishDate = DateTime.Now; foreach (var item in jsonContent.Value("data")) { - var detailsDom = parser.ParseDocument(item.SelectToken("[0]").Value()); - var categoryDom = parser.ParseDocument(item.SelectToken("[1]").Value()); - var groupDom = parser.ParseDocument(item.SelectToken("[7]").Value()); + using var detailsDom = parser.ParseDocument(item.SelectToken("[0]").Value()); + using var categoryDom = parser.ParseDocument(item.SelectToken("[1]").Value()); + using var groupDom = parser.ParseDocument(item.SelectToken("[7]").Value()); var qTitleLink = detailsDom.QuerySelector("a[href^=\"torrents-details.php?id=\"]"); var title = qTitleLink?.TextContent.Trim(); diff --git a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs index 0c6e32d61..fabfd9533 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs @@ -72,7 +72,7 @@ public class XSpeeds : TorrentIndexerBase if (CheckIfLoginNeeded(response)) { var parser = new HtmlParser(); - var dom = parser.ParseDocument(response.Content); + using var dom = await parser.ParseDocumentAsync(response.Content); var errorMessage = dom.QuerySelector(".left_side table:nth-of-type(1) tr:nth-of-type(2)")?.TextContent.Trim().Replace("\n\t", " "); if (errorMessage.IsNullOrWhiteSpace()) { @@ -289,7 +289,7 @@ public class XSpeedsParser : IParseIndexerResponse var releaseInfos = new List(); var parser = new HtmlParser(); - var dom = parser.ParseDocument(indexerResponse.Content); + using var dom = parser.ParseDocument(indexerResponse.Content); var rows = dom.QuerySelectorAll("table#sortabletable > tbody > tr:has(a[href*=\"details.php?id=\"])"); foreach (var row in rows) diff --git a/src/NzbDrone.Core/Indexers/Definitions/ZonaQ.cs b/src/NzbDrone.Core/Indexers/Definitions/ZonaQ.cs index 799fc12fe..d3e1b3101 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/ZonaQ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/ZonaQ.cs @@ -59,7 +59,7 @@ namespace NzbDrone.Core.Indexers.Definitions // The first page set the cookies and the session_id var loginPage = await ExecuteAuth(new HttpRequest(Login1Url)); var parser = new HtmlParser(); - var dom = parser.ParseDocument(loginPage.Content); + using var dom = parser.ParseDocument(loginPage.Content); var sessionId = dom.QuerySelector("input#session_id")?.GetAttribute("value"); if (string.IsNullOrWhiteSpace(sessionId)) { @@ -315,7 +315,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrentInfos = new List(); var parser = new HtmlParser(); - var doc = parser.ParseDocument(indexerResponse.Content); + using var doc = parser.ParseDocument(indexerResponse.Content); var rows = doc.QuerySelectorAll("table.torrent_list > tbody > tr"); From eb642dd2f95ac4cb0160e02f205b5a464810693f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 18:36:31 +0300 Subject: [PATCH 223/964] Fix document being disposed before returning --- src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs b/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs index ff4fb51ca..a416510bc 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs @@ -269,7 +269,7 @@ public class AudioBookBayParser : IParseIndexerResponse { var releaseInfos = new List(); - var doc = ParseHtmlDocument(indexerResponse.Content); + using var doc = ParseHtmlDocument(indexerResponse.Content); var rows = doc.QuerySelectorAll("div.post:has(div[class=\"postTitle\"])"); foreach (var row in rows) @@ -333,7 +333,7 @@ public class AudioBookBayParser : IParseIndexerResponse private static IHtmlDocument ParseHtmlDocument(string response) { var parser = new HtmlParser(); - using var doc = parser.ParseDocument(response); + var doc = parser.ParseDocument(response); var hidden = doc.QuerySelectorAll("div.post.re-ab"); foreach (var element in hidden) From 6e7bf55dbdb8098a65bba87e4ae423e7d1f0461f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 19:16:55 +0300 Subject: [PATCH 224/964] Add poster URL to PassThePopcorn --- .../PassThePopcorn/PassThePopcornParser.cs | 69 +++++++++---------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index 39e32d372..40e6915e7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -70,43 +70,28 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn flags.Add(PassThePopcornFlag.Approved); } - // Only add approved torrents - try + torrentInfos.Add(new TorrentInfo { - torrentInfos.Add(new TorrentInfo - { - Guid = $"PassThePopcorn-{id}", - Title = torrent.ReleaseName, - InfoUrl = GetInfoUrl(result.GroupId, id), - DownloadUrl = GetDownloadUrl(id, jsonResponse.AuthKey, jsonResponse.PassKey), - Categories = new List { NewznabStandardCategory.Movies }, - Size = long.Parse(torrent.Size), - Grabs = int.Parse(torrent.Snatched), - Seeders = int.Parse(torrent.Seeders), - Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), - PublishDate = DateTime.Parse(torrent.UploadTime + " +0000", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), - ImdbId = result.ImdbId.IsNotNullOrWhiteSpace() ? int.Parse(result.ImdbId) : 0, - Scene = torrent.Scene, - IndexerFlags = flags, - DownloadVolumeFactor = torrent.FreeleechType is "Freeleech" ? 0 : 1, - UploadVolumeFactor = 1, - MinimumRatio = 1, - MinimumSeedTime = 345600, - Genres = result.Tags ?? new List() - }); - } - catch (Exception e) - { - _logger.Error(e, "Encountered exception parsing PTP torrent: {" + - $"Size: {torrent.Size}" + - $"UploadTime: {torrent.UploadTime}" + - $"Seeders: {torrent.Seeders}" + - $"Leechers: {torrent.Leechers}" + - $"ReleaseName: {torrent.ReleaseName}" + - $"ID: {torrent.Id}" + - "}. Please immediately report this info on https://github.com/Prowlarr/Prowlarr/issues/1584."); - throw; - } + Guid = $"PassThePopcorn-{id}", + Title = torrent.ReleaseName, + InfoUrl = GetInfoUrl(result.GroupId, id), + DownloadUrl = GetDownloadUrl(id, jsonResponse.AuthKey, jsonResponse.PassKey), + Categories = new List { NewznabStandardCategory.Movies }, + Size = long.Parse(torrent.Size), + Grabs = int.Parse(torrent.Snatched), + Seeders = int.Parse(torrent.Seeders), + Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), + PublishDate = DateTime.Parse(torrent.UploadTime + " +0000", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), + ImdbId = result.ImdbId.IsNotNullOrWhiteSpace() ? int.Parse(result.ImdbId) : 0, + Scene = torrent.Scene, + IndexerFlags = flags, + DownloadVolumeFactor = torrent.FreeleechType is "Freeleech" ? 0 : 1, + UploadVolumeFactor = 1, + MinimumRatio = 1, + MinimumSeedTime = 345600, + Genres = result.Tags ?? new List(), + PosterUrl = GetPosterUrl(result.Cover) + }); } } @@ -136,5 +121,17 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn return url.FullUri; } + + private static string GetPosterUrl(string cover) + { + if (cover.IsNotNullOrWhiteSpace() && + Uri.TryCreate(cover, UriKind.Absolute, out var posterUri) && + (posterUri.Scheme == Uri.UriSchemeHttp || posterUri.Scheme == Uri.UriSchemeHttps)) + { + return posterUri.AbsoluteUri; + } + + return null; + } } } From 75c30dd318ddb8707aef98d174b46054cb1aaf72 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 4 Oct 2023 19:51:49 +0300 Subject: [PATCH 225/964] Add year to XML results --- src/NzbDrone.Core/IndexerSearch/NewznabResults.cs | 1 + .../Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/NzbDrone.Core/IndexerSearch/NewznabResults.cs b/src/NzbDrone.Core/IndexerSearch/NewznabResults.cs index 2845b8972..e41d758d4 100644 --- a/src/NzbDrone.Core/IndexerSearch/NewznabResults.cs +++ b/src/NzbDrone.Core/IndexerSearch/NewznabResults.cs @@ -108,6 +108,7 @@ namespace NzbDrone.Core.IndexerSearch GetNabElement("files", r.Files, protocol), GetNabElement("grabs", r.Grabs, protocol), GetNabElement("peers", t.Peers, protocol), + r.Year == 0 ? null : GetNabElement("year", r.Year, protocol), GetNabElement("author", RemoveInvalidXMLChars(r.Author), protocol), GetNabElement("booktitle", RemoveInvalidXMLChars(r.BookTitle), protocol), GetNabElement("artist", RemoveInvalidXMLChars(r.Artist), protocol), diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index 40e6915e7..c5680d6f1 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -74,6 +74,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { Guid = $"PassThePopcorn-{id}", Title = torrent.ReleaseName, + Year = int.Parse(result.Year), InfoUrl = GetInfoUrl(result.GroupId, id), DownloadUrl = GetDownloadUrl(id, jsonResponse.AuthKey, jsonResponse.PassKey), Categories = new List { NewznabStandardCategory.Movies }, From c6db30c35acfe3b4311e0431c07cbd6ababe200d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 5 Oct 2023 01:54:40 +0300 Subject: [PATCH 226/964] Parse description in RSS Parser --- src/NzbDrone.Core/Indexers/RssParser.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/RssParser.cs b/src/NzbDrone.Core/Indexers/RssParser.cs index db3231831..51f7e8ae8 100644 --- a/src/NzbDrone.Core/Indexers/RssParser.cs +++ b/src/NzbDrone.Core/Indexers/RssParser.cs @@ -161,6 +161,7 @@ namespace NzbDrone.Core.Indexers { releaseInfo.Guid = GetGuid(item); releaseInfo.Title = GetTitle(item); + releaseInfo.Description = GetDescription(item); releaseInfo.PublishDate = GetPublishDate(item); releaseInfo.DownloadUrl = GetDownloadUrl(item); releaseInfo.InfoUrl = GetInfoUrl(item); @@ -195,6 +196,11 @@ namespace NzbDrone.Core.Indexers return item.TryGetValue("title", "Unknown"); } + protected virtual string GetDescription(XElement item) + { + return item.TryGetValue("description", null); + } + protected virtual ICollection GetCategory(XElement item) { return new List { NewznabStandardCategory.Other }; From c06bf0e4ea68c50c0d8fa490ce8dab6a0ec50534 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 5 Oct 2023 22:41:59 +0300 Subject: [PATCH 227/964] Fixed: (TorrentDay) Update categories Fixes #1888 --- .../Indexers/Definitions/TorrentDay.cs | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs index 34fc9a2dd..b8510edf7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs @@ -77,14 +77,6 @@ namespace NzbDrone.Core.Indexers.Definitions } }; - caps.Categories.AddCategoryMapping(29, NewznabStandardCategory.TVAnime, "Anime"); - caps.Categories.AddCategoryMapping(28, NewznabStandardCategory.PC, "Appz/Packs"); - caps.Categories.AddCategoryMapping(42, NewznabStandardCategory.AudioAudiobook, "Audio Books"); - caps.Categories.AddCategoryMapping(20, NewznabStandardCategory.Books, "Books"); - caps.Categories.AddCategoryMapping(30, NewznabStandardCategory.TVDocumentary, "Documentary"); - caps.Categories.AddCategoryMapping(47, NewznabStandardCategory.Other, "Fonts"); - caps.Categories.AddCategoryMapping(43, NewznabStandardCategory.PCMac, "Mac"); - caps.Categories.AddCategoryMapping(96, NewznabStandardCategory.MoviesUHD, "Movie/4K"); caps.Categories.AddCategoryMapping(25, NewznabStandardCategory.MoviesSD, "Movies/480p"); caps.Categories.AddCategoryMapping(11, NewznabStandardCategory.MoviesBluRay, "Movies/Bluray"); @@ -97,31 +89,43 @@ namespace NzbDrone.Core.Indexers.Definitions caps.Categories.AddCategoryMapping(48, NewznabStandardCategory.Movies, "Movies/x265"); caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesSD, "Movies/XviD"); - caps.Categories.AddCategoryMapping(17, NewznabStandardCategory.AudioMP3, "Music/Audio"); - caps.Categories.AddCategoryMapping(23, NewznabStandardCategory.AudioForeign, "Music/Non-English"); - caps.Categories.AddCategoryMapping(41, NewznabStandardCategory.Audio, "Music/Packs"); - caps.Categories.AddCategoryMapping(16, NewznabStandardCategory.AudioVideo, "Music/Video"); - caps.Categories.AddCategoryMapping(27, NewznabStandardCategory.Audio, "Music/Flac"); - - caps.Categories.AddCategoryMapping(45, NewznabStandardCategory.AudioOther, "Podcast"); - - caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.PCGames, "PC/Games"); - caps.Categories.AddCategoryMapping(18, NewznabStandardCategory.ConsolePS3, "PS3"); - caps.Categories.AddCategoryMapping(8, NewznabStandardCategory.ConsolePSP, "PSP"); - caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.ConsoleWii, "Wii"); - caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.ConsoleXBox360, "Xbox-360"); - caps.Categories.AddCategoryMapping(24, NewznabStandardCategory.TVSD, "TV/480p"); caps.Categories.AddCategoryMapping(32, NewznabStandardCategory.TVHD, "TV/Bluray"); caps.Categories.AddCategoryMapping(31, NewznabStandardCategory.TVSD, "TV/DVD-R"); caps.Categories.AddCategoryMapping(33, NewznabStandardCategory.TVSD, "TV/DVD-Rip"); caps.Categories.AddCategoryMapping(46, NewznabStandardCategory.TVSD, "TV/Mobile"); + caps.Categories.AddCategoryMapping(82, NewznabStandardCategory.TVForeign, "TV/Non-English"); caps.Categories.AddCategoryMapping(14, NewznabStandardCategory.TV, "TV/Packs"); caps.Categories.AddCategoryMapping(26, NewznabStandardCategory.TVSD, "TV/SD/x264"); caps.Categories.AddCategoryMapping(7, NewznabStandardCategory.TVHD, "TV/x264"); caps.Categories.AddCategoryMapping(34, NewznabStandardCategory.TVUHD, "TV/x265"); caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TVSD, "TV/XviD"); + caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.PCGames, "PC/Games"); + caps.Categories.AddCategoryMapping(18, NewznabStandardCategory.ConsolePS3, "PS"); + caps.Categories.AddCategoryMapping(8, NewznabStandardCategory.ConsolePSP, "PSP"); + caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.ConsoleNDS, "Nintendo"); + caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.ConsoleXBox, "Xbox"); + + caps.Categories.AddCategoryMapping(17, NewznabStandardCategory.AudioMP3, "Music/Audio"); + caps.Categories.AddCategoryMapping(27, NewznabStandardCategory.Audio, "Music/Flac"); + caps.Categories.AddCategoryMapping(23, NewznabStandardCategory.AudioForeign, "Music/Non-English"); + caps.Categories.AddCategoryMapping(41, NewznabStandardCategory.Audio, "Music/Packs"); + caps.Categories.AddCategoryMapping(16, NewznabStandardCategory.AudioVideo, "Music/Video"); + + caps.Categories.AddCategoryMapping(29, NewznabStandardCategory.TVAnime, "Anime"); + caps.Categories.AddCategoryMapping(42, NewznabStandardCategory.AudioAudiobook, "Audio Books"); + caps.Categories.AddCategoryMapping(20, NewznabStandardCategory.Books, "Books"); + caps.Categories.AddCategoryMapping(102, NewznabStandardCategory.BooksForeign, "Books/Non-English"); + caps.Categories.AddCategoryMapping(30, NewznabStandardCategory.TVDocumentary, "Documentary"); + caps.Categories.AddCategoryMapping(95, NewznabStandardCategory.TVDocumentary, "Educational"); + caps.Categories.AddCategoryMapping(47, NewznabStandardCategory.Other, "Fonts"); + caps.Categories.AddCategoryMapping(43, NewznabStandardCategory.PCMac, "Mac"); + caps.Categories.AddCategoryMapping(45, NewznabStandardCategory.AudioOther, "Podcast"); + caps.Categories.AddCategoryMapping(28, NewznabStandardCategory.PC, "Softwa/Packs"); + caps.Categories.AddCategoryMapping(12, NewznabStandardCategory.PC, "Software"); + + caps.Categories.AddCategoryMapping(19, NewznabStandardCategory.XXX, "XXX/0Day"); caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.XXX, "XXX/Movies"); caps.Categories.AddCategoryMapping(15, NewznabStandardCategory.XXXPack, "XXX/Packs"); From b7e57f0c08f07dc86fe5424287058d5432a1acda Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 7 Oct 2023 03:09:44 +0300 Subject: [PATCH 228/964] Fixed: (Nebulance) Filter releases by season and episode for ID based searches --- .../Indexers/Definitions/Nebulance.cs | 21 +++++++++++++++++++ src/NzbDrone.Core/Indexers/IndexerBase.cs | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index f2bb6cee6..dba9ce9e4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Linq; using System.Net; using System.Text; using System.Text.Json.Serialization; @@ -67,6 +68,26 @@ namespace NzbDrone.Core.Indexers.Definitions return Task.FromResult(request); } + protected override IList CleanupReleases(IEnumerable releases, SearchCriteriaBase searchCriteria) + { + var cleanReleases = base.CleanupReleases(releases, searchCriteria); + + return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList(); + } + + protected override IEnumerable FilterReleasesByQuery(IEnumerable releases, SearchCriteriaBase searchCriteria) + { + if (!searchCriteria.IsRssSearch && + searchCriteria.IsIdSearch && + searchCriteria is TvSearchCriteria tvSearchCriteria && + tvSearchCriteria.EpisodeSearchString.IsNotNullOrWhiteSpace()) + { + releases = releases.Where(r => r.Title.IsNotNullOrWhiteSpace() && r.Title.ContainsIgnoreCase(tvSearchCriteria.EpisodeSearchString)).ToList(); + } + + return releases; + } + private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities diff --git a/src/NzbDrone.Core/Indexers/IndexerBase.cs b/src/NzbDrone.Core/Indexers/IndexerBase.cs index 489bdbb27..2e2e7cdd9 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBase.cs @@ -149,7 +149,7 @@ namespace NzbDrone.Core.Indexers return result.DistinctBy(v => v.Guid).ToList(); } - protected IEnumerable FilterReleasesByQuery(IEnumerable releases, SearchCriteriaBase searchCriteria) + protected virtual IEnumerable FilterReleasesByQuery(IEnumerable releases, SearchCriteriaBase searchCriteria) { var commonWords = new[] { "and", "the", "an", "of" }; From c664eaa9b54986da1360318a3f7944ca21158be0 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 17 Sep 2023 23:56:17 -0700 Subject: [PATCH 229/964] New: Don't treat 400 responses from Notifiarr as errors (cherry picked from commit 5eb420bbe12f59d0a5392abf3d351be28ca210e6) --- .../Notifications/Notifiarr/NotifiarrProxy.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrProxy.cs b/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrProxy.cs index b42d14b31..963e0ba2d 100644 --- a/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrProxy.cs +++ b/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrProxy.cs @@ -1,4 +1,5 @@ using System.Net.Http; +using NLog; using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; using NzbDrone.Core.Notifications.Webhook; @@ -14,10 +15,12 @@ namespace NzbDrone.Core.Notifications.Notifiarr { private const string URL = "https://notifiarr.com"; private readonly IHttpClient _httpClient; + private readonly Logger _logger; - public NotifiarrProxy(IHttpClient httpClient) + public NotifiarrProxy(IHttpClient httpClient, Logger logger) { _httpClient = httpClient; + _logger = logger; } public void SendNotification(WebhookPayload payload, NotifiarrSettings settings) @@ -47,12 +50,17 @@ namespace NzbDrone.Core.Notifications.Notifiarr switch ((int)responseCode) { case 401: + _logger.Warn("HTTP 401 - API key is invalid"); throw new NotifiarrException("API key is invalid"); case 400: - throw new NotifiarrException("Unable to send notification. Ensure Prowlarr Integration is enabled & assigned a channel on Notifiarr"); + // 400 responses shouldn't be treated as an actual error because it's a misconfiguration + // between Prowlarr and Notifiarr for a specific event, but shouldn't stop all events. + _logger.Warn("HTTP 400 - Unable to send notification. Ensure Prowlarr Integration is enabled & assigned a channel on Notifiarr"); + break; case 502: case 503: case 504: + _logger.Warn("Unable to send notification. Service Unavailable"); throw new NotifiarrException("Unable to send notification. Service Unavailable", ex); case 520: case 521: @@ -61,6 +69,7 @@ namespace NzbDrone.Core.Notifications.Notifiarr case 524: throw new NotifiarrException("Cloudflare Related HTTP Error - Unable to send notification", ex); default: + _logger.Error(ex, "Unknown HTTP Error - Unable to send notification"); throw new NotifiarrException("Unknown HTTP Error - Unable to send notification", ex); } } From bd5336e4c42685e07efdc851b27c3db5c4e553ea Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 8 Oct 2023 07:08:25 +0300 Subject: [PATCH 230/964] Bump version to 1.9.4 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0990bbb07..f2dc32fdc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.9.3' + majorVersion: '1.9.4' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From e60286210282e71c15cdda8b9d559258d520e6c5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 8 Oct 2023 21:31:38 +0300 Subject: [PATCH 231/964] Fixed: (FileList) Remove dead domain --- src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs index 34552cb98..8367a2db0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs @@ -8,12 +8,12 @@ namespace NzbDrone.Core.Indexers.Definitions.FileList; public class FileList : TorrentIndexerBase { public override string Name => "FileList.io"; - public override string[] IndexerUrls => new[] + public override string[] IndexerUrls => new[] { "https://filelist.io/" }; + public override string[] LegacyUrls => new[] { - "https://filelist.io/", + "https://filelist.io", "https://flro.org/" }; - public override string[] LegacyUrls => new[] { "https://filelist.io" }; public override string Description => "FileList (FL) is a ROMANIAN Private Torrent Tracker for 0DAY / GENERAL"; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override bool SupportsRss => true; From 32db2af0ea607f45b6c06b5e5d10670bd6e29fe4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 10 Oct 2023 02:41:05 +0300 Subject: [PATCH 232/964] Improved http timeout handling Co-authored-by: Qstick --- .../Http/HttpClientFixture.cs | 11 +++ .../Http/Dispatchers/ManagedHttpDispatcher.cs | 81 ++++++++++--------- 2 files changed, 55 insertions(+), 37 deletions(-) diff --git a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs index 4181057d6..d15319cb1 100644 --- a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs +++ b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs @@ -128,6 +128,17 @@ namespace NzbDrone.Common.Test.Http response.Content.Should().NotBeNullOrWhiteSpace(); } + [Test] + public void should_throw_timeout_request() + { + var request = new HttpRequest($"https://{_httpBinHost}/delay/10"); + + request.RequestTimeout = new TimeSpan(0, 0, 5); + + Assert.Throws(() => Subject.Execute(request)); + ExceptionVerification.ExpectedErrors(1); + } + [Test] public void should_execute_https_get() { diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index b3e707961..1c22f9d16 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -107,52 +107,59 @@ namespace NzbDrone.Common.Http.Dispatchers sw.Start(); - using var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token); + try { - byte[] data = null; - - try + using var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token); { - if (request.ResponseStream != null && responseMessage.StatusCode == HttpStatusCode.OK) + byte[] data = null; + + try { - await responseMessage.Content.CopyToAsync(request.ResponseStream, null, cts.Token); - } - else - { - data = await responseMessage.Content.ReadAsByteArrayAsync(cts.Token); - } - } - catch (Exception ex) - { - throw new WebException("Failed to read complete http response", ex, WebExceptionStatus.ReceiveFailure, null); - } - - var headers = responseMessage.Headers.ToNameValueCollection(); - - headers.Add(responseMessage.Content.Headers.ToNameValueCollection()); - - var responseCookies = new CookieContainer(); - - if (responseMessage.Headers.TryGetValues("Set-Cookie", out var cookieHeaders)) - { - foreach (var responseCookieHeader in cookieHeaders) - { - try + if (request.ResponseStream != null && responseMessage.StatusCode == HttpStatusCode.OK) { - cookies.SetCookies(responseMessage.RequestMessage.RequestUri, responseCookieHeader); + await responseMessage.Content.CopyToAsync(request.ResponseStream, null, cts.Token); } - catch + else { - // Ignore invalid cookies + data = await responseMessage.Content.ReadAsByteArrayAsync(cts.Token); } } + catch (Exception ex) + { + throw new WebException("Failed to read complete http response", ex, WebExceptionStatus.ReceiveFailure, null); + } + + var headers = responseMessage.Headers.ToNameValueCollection(); + + headers.Add(responseMessage.Content.Headers.ToNameValueCollection()); + + var responseCookies = new CookieContainer(); + + if (responseMessage.Headers.TryGetValues("Set-Cookie", out var cookieHeaders)) + { + foreach (var responseCookieHeader in cookieHeaders) + { + try + { + cookies.SetCookies(responseMessage.RequestMessage.RequestUri, responseCookieHeader); + } + catch + { + // Ignore invalid cookies + } + } + } + + var cookieCollection = cookies.GetCookies(responseMessage.RequestMessage.RequestUri); + + sw.Stop(); + + return new HttpResponse(request, new HttpHeader(headers), cookieCollection, data, sw.ElapsedMilliseconds, responseMessage.StatusCode, responseMessage.Version); } - - var cookieCollection = cookies.GetCookies(responseMessage.RequestMessage.RequestUri); - - sw.Stop(); - - return new HttpResponse(request, new HttpHeader(headers), cookieCollection, data, sw.ElapsedMilliseconds, responseMessage.StatusCode, responseMessage.Version); + } + catch (OperationCanceledException ex) when (cts.IsCancellationRequested) + { + throw new WebException("Http request timed out", ex.InnerException, WebExceptionStatus.Timeout, null); } } From 1a307b8e21a6aa5cb3739241018b61729f1ff39d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 10 Oct 2023 03:02:35 +0300 Subject: [PATCH 233/964] Fix test for http client --- src/NzbDrone.Common.Test/Http/HttpClientFixture.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs index d15319cb1..2336477a0 100644 --- a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs +++ b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs @@ -136,7 +136,8 @@ namespace NzbDrone.Common.Test.Http request.RequestTimeout = new TimeSpan(0, 0, 5); Assert.Throws(() => Subject.Execute(request)); - ExceptionVerification.ExpectedErrors(1); + + ExceptionVerification.ExpectedErrors(0); } [Test] From b088febbc4aaa843197acf7ae5045e64dfc8c4e7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 10 Oct 2023 03:05:16 +0300 Subject: [PATCH 234/964] Use async for http client test --- src/NzbDrone.Common.Test/Http/HttpClientFixture.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs index 2336477a0..43620edf4 100644 --- a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs +++ b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs @@ -135,9 +135,7 @@ namespace NzbDrone.Common.Test.Http request.RequestTimeout = new TimeSpan(0, 0, 5); - Assert.Throws(() => Subject.Execute(request)); - - ExceptionVerification.ExpectedErrors(0); + Assert.ThrowsAsync(async () => await Subject.ExecuteAsync(request)); } [Test] From bada5fe309f190faa75d01aa22dd5b8a1aa44f4a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 10 Oct 2023 13:29:26 +0300 Subject: [PATCH 235/964] New: Add TorrentNetwork --- .../Indexers/Definitions/Torznab/Torznab.cs | 12 +++++++----- src/NzbDrone.Core/Indexers/IndexerFactory.cs | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs index e4310f0d0..bf2d76cf4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs @@ -83,9 +83,10 @@ namespace NzbDrone.Core.Indexers.Torznab { get { - yield return GetDefinition("AnimeTosho", "Anime NZB/DDL mirror", GetSettings("https://feed.animetosho.org")); - yield return GetDefinition("MoreThanTV", "Private torrent tracker for TV / MOVIES", GetSettings("https://www.morethantv.me", apiPath: @"/api/torznab")); - yield return GetDefinition("Generic Torznab", "A Newznab-like api for torrents.", GetSettings("")); + yield return GetDefinition("AnimeTosho", "Anime NZB/DDL mirror", settings: GetSettings("https://feed.animetosho.org")); + yield return GetDefinition("MoreThanTV", "Private torrent tracker for TV / MOVIES", settings: GetSettings("https://www.morethantv.me", apiPath: @"/api/torznab")); + yield return GetDefinition("Torrent Network", "Torrent Network (TN) is a GERMAN Private site for TV / MOVIES / GENERAL", language: "de-DE", settings: GetSettings("https://tntracker.org", apiPath: @"/api/torznab/api")); + yield return GetDefinition("Generic Torznab", "A Newznab-like api for torrents.", settings: GetSettings("")); } } @@ -95,16 +96,17 @@ namespace NzbDrone.Core.Indexers.Torznab _capabilitiesProvider = capabilitiesProvider; } - private IndexerDefinition GetDefinition(string name, string description, TorznabSettings settings) + private IndexerDefinition GetDefinition(string name, string description, string language = null, TorznabSettings settings = null) { return new IndexerDefinition { Enable = true, Name = name, Description = description, + Language = language ?? "en-US", Implementation = GetType().Name, Settings = settings, - Protocol = DownloadProtocol.Usenet, + Protocol = DownloadProtocol.Torrent, SupportsRss = SupportsRss, SupportsSearch = SupportsSearch, SupportsRedirect = SupportsRedirect, diff --git a/src/NzbDrone.Core/Indexers/IndexerFactory.cs b/src/NzbDrone.Core/Indexers/IndexerFactory.cs index 8d711c95c..53c2c2838 100644 --- a/src/NzbDrone.Core/Indexers/IndexerFactory.cs +++ b/src/NzbDrone.Core/Indexers/IndexerFactory.cs @@ -207,7 +207,7 @@ namespace NzbDrone.Core.Indexers definition.Privacy = provider.Privacy; definition.Description ??= provider.Description; definition.Encoding = provider.Encoding; - definition.Language = provider.Language; + definition.Language ??= provider.Language; definition.Capabilities = provider.Capabilities; } } From 34464160cb6bcaec37150f576e94f79d8db7f9cc Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 9 Oct 2023 20:37:31 -0700 Subject: [PATCH 236/964] Paging params in API docs (cherry picked from commit bfaa7291e14a8d3847ef2154a52c363944560803) --- src/NzbDrone.Host/Startup.cs | 2 + .../Client/ClientBase.cs | 5 +- .../History/HistoryController.cs | 20 +++--- src/Prowlarr.Api.V1/Logs/LogController.cs | 12 ++-- .../Extensions/RequestExtensions.cs | 64 ------------------- src/Prowlarr.Http/PagingResource.cs | 24 ++++++- src/Prowlarr.Http/PagingResourceFilter.cs | 8 --- 7 files changed, 40 insertions(+), 95 deletions(-) delete mode 100644 src/Prowlarr.Http/PagingResourceFilter.cs diff --git a/src/NzbDrone.Host/Startup.cs b/src/NzbDrone.Host/Startup.cs index 4852376f4..f0d96c04f 100644 --- a/src/NzbDrone.Host/Startup.cs +++ b/src/NzbDrone.Host/Startup.cs @@ -158,6 +158,8 @@ namespace NzbDrone.Host { { apikeyQuery, Array.Empty() } }); + + c.DescribeAllParametersInCamelCase(); }); services diff --git a/src/NzbDrone.Integration.Test/Client/ClientBase.cs b/src/NzbDrone.Integration.Test/Client/ClientBase.cs index 57a5e2d88..f22498ca2 100644 --- a/src/NzbDrone.Integration.Test/Client/ClientBase.cs +++ b/src/NzbDrone.Integration.Test/Client/ClientBase.cs @@ -93,7 +93,7 @@ namespace NzbDrone.Integration.Test.Client return Get>(request); } - public PagingResource GetPaged(int pageNumber, int pageSize, string sortKey, string sortDir, string filterKey = null, string filterValue = null) + public PagingResource GetPaged(int pageNumber, int pageSize, string sortKey, string sortDir, string filterKey = null, object filterValue = null) { var request = BuildRequest(); request.AddParameter("page", pageNumber); @@ -103,8 +103,7 @@ namespace NzbDrone.Integration.Test.Client if (filterKey != null && filterValue != null) { - request.AddParameter("filterKey", filterKey); - request.AddParameter("filterValue", filterValue); + request.AddParameter(filterKey, filterValue); } return Get>(request); diff --git a/src/Prowlarr.Api.V1/History/HistoryController.cs b/src/Prowlarr.Api.V1/History/HistoryController.cs index f9c31127d..73508a47b 100644 --- a/src/Prowlarr.Api.V1/History/HistoryController.cs +++ b/src/Prowlarr.Api.V1/History/HistoryController.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Datastore; using NzbDrone.Core.History; using Prowlarr.Http; @@ -21,30 +22,25 @@ namespace Prowlarr.Api.V1.History [HttpGet] [Produces("application/json")] - public PagingResource GetHistory() + public PagingResource GetHistory([FromQuery] PagingRequestResource paging, int? eventType, bool? successful, string downloadId) { - var pagingResource = Request.ReadPagingResourceFromRequest(); + var pagingResource = new PagingResource(paging); var pagingSpec = pagingResource.MapToPagingSpec("date", SortDirection.Descending); - var eventTypeFilter = pagingResource.Filters.FirstOrDefault(f => f.Key == "eventType"); - var successfulFilter = pagingResource.Filters.FirstOrDefault(f => f.Key == "successful"); - var downloadIdFilter = pagingResource.Filters.FirstOrDefault(f => f.Key == "downloadId"); - - if (eventTypeFilter != null) + if (eventType.HasValue) { - var filterValue = (HistoryEventType)Convert.ToInt32(eventTypeFilter.Value); + var filterValue = (HistoryEventType)eventType.Value; pagingSpec.FilterExpressions.Add(v => v.EventType == filterValue); } - if (successfulFilter != null) + if (successful.HasValue) { - var filterValue = bool.Parse(successfulFilter.Value); + var filterValue = successful.Value; pagingSpec.FilterExpressions.Add(v => v.Successful == filterValue); } - if (downloadIdFilter != null) + if (downloadId.IsNotNullOrWhiteSpace()) { - var downloadId = downloadIdFilter.Value; pagingSpec.FilterExpressions.Add(h => h.DownloadId == downloadId); } diff --git a/src/Prowlarr.Api.V1/Logs/LogController.cs b/src/Prowlarr.Api.V1/Logs/LogController.cs index 3f0c6df52..f93f99ba6 100644 --- a/src/Prowlarr.Api.V1/Logs/LogController.cs +++ b/src/Prowlarr.Api.V1/Logs/LogController.cs @@ -1,5 +1,5 @@ -using System.Linq; using Microsoft.AspNetCore.Mvc; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Instrumentation; using Prowlarr.Http; using Prowlarr.Http.Extensions; @@ -18,9 +18,9 @@ namespace Prowlarr.Api.V1.Logs [HttpGet] [Produces("application/json")] - public PagingResource GetLogs() + public PagingResource GetLogs([FromQuery] PagingRequestResource paging, string level) { - var pagingResource = Request.ReadPagingResourceFromRequest(); + var pagingResource = new PagingResource(paging); var pageSpec = pagingResource.MapToPagingSpec(); if (pageSpec.SortKey == "time") @@ -28,11 +28,9 @@ namespace Prowlarr.Api.V1.Logs pageSpec.SortKey = "id"; } - var levelFilter = pagingResource.Filters.FirstOrDefault(f => f.Key == "level"); - - if (levelFilter != null) + if (level.IsNotNullOrWhiteSpace()) { - switch (levelFilter.Value) + switch (level) { case "fatal": pageSpec.FilterExpressions.Add(h => h.Level == "Fatal"); diff --git a/src/Prowlarr.Http/Extensions/RequestExtensions.cs b/src/Prowlarr.Http/Extensions/RequestExtensions.cs index 6c297f98c..f9495387e 100644 --- a/src/Prowlarr.Http/Extensions/RequestExtensions.cs +++ b/src/Prowlarr.Http/Extensions/RequestExtensions.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Net; using Microsoft.AspNetCore.Http; @@ -27,69 +26,6 @@ namespace Prowlarr.Http.Extensions return defaultValue; } - public static PagingResource ReadPagingResourceFromRequest(this HttpRequest request) - { - if (!int.TryParse(request.Query["PageSize"].ToString(), out var pageSize)) - { - pageSize = 10; - } - - if (!int.TryParse(request.Query["Page"].ToString(), out var page)) - { - page = 1; - } - - var pagingResource = new PagingResource - { - PageSize = pageSize, - Page = page, - Filters = new List() - }; - - if (request.Query["SortKey"].Any()) - { - var sortKey = request.Query["SortKey"].ToString(); - - pagingResource.SortKey = sortKey; - - if (request.Query["SortDirection"].Any()) - { - pagingResource.SortDirection = request.Query["SortDirection"].ToString() - .Equals("ascending", StringComparison.InvariantCultureIgnoreCase) - ? SortDirection.Ascending - : SortDirection.Descending; - } - } - - // For backwards compatibility with v2 - if (request.Query["FilterKey"].Any()) - { - var filter = new PagingResourceFilter - { - Key = request.Query["FilterKey"].ToString() - }; - - if (request.Query["FilterValue"].Any()) - { - filter.Value = request.Query["FilterValue"].ToString(); - } - - pagingResource.Filters.Add(filter); - } - - // v3 uses filters in key=value format - foreach (var pair in request.Query) - { - pagingResource.Filters.Add(new PagingResourceFilter - { - Key = pair.Key, - Value = pair.Value.ToString() - }); - } - - return pagingResource; - } - public static PagingResource ApplyToPage(this PagingSpec pagingSpec, Func, PagingSpec> function, Converter mapper) { pagingSpec = function(pagingSpec); diff --git a/src/Prowlarr.Http/PagingResource.cs b/src/Prowlarr.Http/PagingResource.cs index 381d3caa8..97907cd66 100644 --- a/src/Prowlarr.Http/PagingResource.cs +++ b/src/Prowlarr.Http/PagingResource.cs @@ -1,17 +1,39 @@ using System.Collections.Generic; +using System.ComponentModel; using NzbDrone.Core.Datastore; namespace Prowlarr.Http { + public class PagingRequestResource + { + [DefaultValue(1)] + public int? Page { get; set; } + [DefaultValue(10)] + public int? PageSize { get; set; } + public string SortKey { get; set; } + public SortDirection? SortDirection { get; set; } + } + public class PagingResource { public int Page { get; set; } public int PageSize { get; set; } public string SortKey { get; set; } public SortDirection SortDirection { get; set; } - public List Filters { get; set; } public int TotalRecords { get; set; } public List Records { get; set; } + + public PagingResource() + { + } + + public PagingResource(PagingRequestResource requestResource) + { + Page = requestResource.Page ?? 1; + PageSize = requestResource.PageSize ?? 10; + SortKey = requestResource.SortKey; + SortDirection = requestResource.SortDirection ?? SortDirection.Descending; + } } public static class PagingResourceMapper diff --git a/src/Prowlarr.Http/PagingResourceFilter.cs b/src/Prowlarr.Http/PagingResourceFilter.cs deleted file mode 100644 index 776dbc047..000000000 --- a/src/Prowlarr.Http/PagingResourceFilter.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Prowlarr.Http -{ - public class PagingResourceFilter - { - public string Key { get; set; } - public string Value { get; set; } - } -} From 09bf1500d6d1d1104343c16050c4caddad21c373 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Tue, 10 Oct 2023 05:40:00 +0200 Subject: [PATCH 237/964] New: Additional tooltips for icon buttons (cherry picked from commit 8c07f0d3d19a48ed96d1ded54399c66bf2977b2a) --- frontend/src/Components/Modal/ModalContent.js | 2 ++ frontend/src/Components/Page/Header/PageHeader.js | 1 + frontend/src/Components/Page/Header/PageHeaderActionsMenu.js | 1 + 3 files changed, 4 insertions(+) diff --git a/frontend/src/Components/Modal/ModalContent.js b/frontend/src/Components/Modal/ModalContent.js index 8883bf2b9..1d3862a13 100644 --- a/frontend/src/Components/Modal/ModalContent.js +++ b/frontend/src/Components/Modal/ModalContent.js @@ -3,6 +3,7 @@ import React from 'react'; import Icon from 'Components/Icon'; import Link from 'Components/Link/Link'; import { icons } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import styles from './ModalContent.css'; function ModalContent(props) { @@ -28,6 +29,7 @@ function ModalContent(props) { } diff --git a/frontend/src/Components/Page/Header/PageHeader.js b/frontend/src/Components/Page/Header/PageHeader.js index 1d8b0cc55..dac20563a 100644 --- a/frontend/src/Components/Page/Header/PageHeader.js +++ b/frontend/src/Components/Page/Header/PageHeader.js @@ -78,6 +78,7 @@ class PageHeader extends Component { aria-label="Donate" to="https://prowlarr.com/donate" size={14} + title={translate('Donate')} /> From d9d2aa84937005bb61abbd7d610e1af639654e43 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 6 Oct 2023 13:10:46 -0700 Subject: [PATCH 238/964] Sync label styling for FormLabel (cherry picked from commit 87e0a7983a437a4d166aa8b9c9eaf78ea5431969) --- frontend/src/Components/Form/FormLabel.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/Components/Form/FormLabel.css b/frontend/src/Components/Form/FormLabel.css index 074b6091d..54a4678e8 100644 --- a/frontend/src/Components/Form/FormLabel.css +++ b/frontend/src/Components/Form/FormLabel.css @@ -2,8 +2,10 @@ display: flex; justify-content: flex-end; margin-right: $formLabelRightMarginWidth; + padding-top: 8px; + min-height: 35px; + text-align: end; font-weight: bold; - line-height: 35px; } .hasError { From 5e8d3542f4664d7b50c9c48bff6403f8c940bec1 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 9 Oct 2023 21:00:05 -0700 Subject: [PATCH 239/964] Log executing health check (cherry picked from commit 78b39bd2fecda60e04a1fef17ae17f62bd2b6914) --- src/NzbDrone.Core/HealthCheck/HealthCheckService.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/HealthCheck/HealthCheckService.cs b/src/NzbDrone.Core/HealthCheck/HealthCheckService.cs index 78e60e314..550849232 100644 --- a/src/NzbDrone.Core/HealthCheck/HealthCheckService.cs +++ b/src/NzbDrone.Core/HealthCheck/HealthCheckService.cs @@ -79,8 +79,15 @@ namespace NzbDrone.Core.HealthCheck private void PerformHealthCheck(IProvideHealthCheck[] healthChecks, bool performServerChecks = false) { - var results = healthChecks.Select(c => c.Check()) - .ToList(); + var results = healthChecks.Select(c => + { + _logger.Trace("Check health -> {0}", c.GetType().Name); + var result = c.Check(); + _logger.Trace("Check health <- {0}", c.GetType().Name); + + return result; + }) + .ToList(); if (performServerChecks) { From bdae7a2cdcd6e01161a9535423ec3996cf71d18e Mon Sep 17 00:00:00 2001 From: Servarr Date: Tue, 10 Oct 2023 23:40:26 +0000 Subject: [PATCH 240/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 149 ++++++++++++++++++++++--------- 1 file changed, 109 insertions(+), 40 deletions(-) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index c5174e5e3..93e781bcd 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -503,25 +503,25 @@ "schema": { "type": "object", "properties": { - "Username": { + "username": { "type": "string" }, - "Password": { + "password": { "type": "string" }, - "RememberMe": { + "rememberMe": { "type": "string" } } }, "encoding": { - "Username": { + "username": { "style": "form" }, - "Password": { + "password": { "style": "form" }, - "RememberMe": { + "rememberMe": { "style": "form" } } @@ -1412,6 +1412,62 @@ "tags": [ "History" ], + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 10 + } + }, + { + "name": "sortKey", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "sortDirection", + "in": "query", + "schema": { + "$ref": "#/components/schemas/SortDirection" + } + }, + { + "name": "eventType", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "successful", + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "downloadId", + "in": "query", + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "description": "Success", @@ -2263,6 +2319,47 @@ "tags": [ "Log" ], + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 10 + } + }, + { + "name": "sortKey", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "sortDirection", + "in": "query", + "schema": { + "$ref": "#/components/schemas/SortDirection" + } + }, + { + "name": "level", + "in": "query", + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "description": "Success", @@ -3235,21 +3332,21 @@ ], "parameters": [ { - "name": "Query", + "name": "query", "in": "query", "schema": { "type": "string" } }, { - "name": "Type", + "name": "type", "in": "query", "schema": { "type": "string" } }, { - "name": "IndexerIds", + "name": "indexerIds", "in": "query", "schema": { "type": "array", @@ -3260,7 +3357,7 @@ } }, { - "name": "Categories", + "name": "categories", "in": "query", "schema": { "type": "array", @@ -3271,7 +3368,7 @@ } }, { - "name": "Limit", + "name": "limit", "in": "query", "schema": { "type": "integer", @@ -3279,7 +3376,7 @@ } }, { - "name": "Offset", + "name": "offset", "in": "query", "schema": { "type": "integer", @@ -4626,13 +4723,6 @@ "sortDirection": { "$ref": "#/components/schemas/SortDirection" }, - "filters": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PagingResourceFilter" - }, - "nullable": true - }, "totalRecords": { "type": "integer", "format": "int32" @@ -5423,13 +5513,6 @@ "sortDirection": { "$ref": "#/components/schemas/SortDirection" }, - "filters": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PagingResourceFilter" - }, - "nullable": true - }, "totalRecords": { "type": "integer", "format": "int32" @@ -5564,20 +5647,6 @@ }, "additionalProperties": false }, - "PagingResourceFilter": { - "type": "object", - "properties": { - "key": { - "type": "string", - "nullable": true - }, - "value": { - "type": "string", - "nullable": true - } - }, - "additionalProperties": false - }, "PingResource": { "type": "object", "properties": { From 42c533386bf3d4a7c2ad1068a1e4988ba6b63967 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 10 Oct 2023 10:30:26 +0000 Subject: [PATCH 241/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Timo Co-authored-by: Weblate Co-authored-by: blankhang Co-authored-by: 宿命 <331874545@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 7 ++++--- src/NzbDrone.Core/Localization/Core/zh_CN.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 54c7d5ebb..ec8dbb881 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -3,7 +3,7 @@ "AcceptConfirmationModal": "Bestätigung akzeptieren Modal", "Actions": "Aktionen", "Add": "Hinzufügen", - "AddDownloadClient": "Zum Downloader hinzufügen", + "AddDownloadClient": "Downloadmanager hinzufügen", "AddDownloadClientToProwlarr": "Durch das Hinzufügen eines Download-Clients kann Prowlarr während einer manuellen Suche Releases direkt über die Benutzeroberfläche senden.", "AddIndexer": "Indexer hinzufügen", "AddIndexerProxy": "Indexer Proxy hinzufügen", @@ -497,12 +497,13 @@ "WhatsNew": "Was gibt's Neues?", "minutes": "Minuten", "DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?", - "AddConnection": "Sammlung bearbeiten", + "AddConnection": "Verbindung hinzufügen", "NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar", "NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}", "AuthBasic": "Einfach (Browser Popup)", "AuthForm": "Formular (Login Seite)", "DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren", "None": "Keine", - "ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?" + "ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?", + "AddCustomFilter": "Eigenen Filter hinzufügen" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 1d13ef15b..c14ff3d58 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -56,7 +56,7 @@ "BackupFolderHelpText": "相对路径将在 Prowlarr 的 AppData 目录下", "BackupIntervalHelpText": "自动备份时间间隔", "BackupNow": "马上备份", - "BackupRetentionHelpText": "早于保留周期的自动备份将被自动清除", + "BackupRetentionHelpText": "超过保留期限的自动备份将被自动清理", "Backups": "历史备份", "BeforeUpdate": "更新前", "BindAddress": "绑定地址", From c41a7e0cccdf7435c5ea198585fdaf3a910c896f Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 10 Sep 2023 13:07:57 -0700 Subject: [PATCH 242/964] Fixed: Duplicate notifications for failed health checks (cherry picked from commit c0e54773e213f526a5046fa46aa7b57532471128) Mock debouncer for testing (cherry picked from commit bb7b2808e2f70389157408809ec47cc8860b4938) --- src/NzbDrone.Common/TPL/DebounceManager.cs | 17 +++ src/NzbDrone.Common/TPL/Debouncer.cs | 14 +- .../HealthCheck/HealthCheckServiceFixture.cs | 10 +- .../HealthCheck/HealthCheckService.cs | 128 ++++++++++++------ .../ServerSideNotificationService.cs | 46 +++---- src/NzbDrone.Test.Common/MockDebouncer.cs | 21 +++ 6 files changed, 157 insertions(+), 79 deletions(-) create mode 100644 src/NzbDrone.Common/TPL/DebounceManager.cs create mode 100644 src/NzbDrone.Test.Common/MockDebouncer.cs diff --git a/src/NzbDrone.Common/TPL/DebounceManager.cs b/src/NzbDrone.Common/TPL/DebounceManager.cs new file mode 100644 index 000000000..60803a3a9 --- /dev/null +++ b/src/NzbDrone.Common/TPL/DebounceManager.cs @@ -0,0 +1,17 @@ +using System; + +namespace NzbDrone.Common.TPL +{ + public interface IDebounceManager + { + Debouncer CreateDebouncer(Action action, TimeSpan debounceDuration); + } + + public class DebounceManager : IDebounceManager + { + public Debouncer CreateDebouncer(Action action, TimeSpan debounceDuration) + { + return new Debouncer(action, debounceDuration); + } + } +} diff --git a/src/NzbDrone.Common/TPL/Debouncer.cs b/src/NzbDrone.Common/TPL/Debouncer.cs index 0fa101525..7f8435961 100644 --- a/src/NzbDrone.Common/TPL/Debouncer.cs +++ b/src/NzbDrone.Common/TPL/Debouncer.cs @@ -4,11 +4,11 @@ namespace NzbDrone.Common.TPL { public class Debouncer { - private readonly Action _action; - private readonly System.Timers.Timer _timer; + protected readonly Action _action; + protected readonly System.Timers.Timer _timer; - private volatile int _paused; - private volatile bool _triggered; + protected volatile int _paused; + protected volatile bool _triggered; public Debouncer(Action action, TimeSpan debounceDuration) { @@ -27,7 +27,7 @@ namespace NzbDrone.Common.TPL } } - public void Execute() + public virtual void Execute() { lock (_timer) { @@ -39,7 +39,7 @@ namespace NzbDrone.Common.TPL } } - public void Pause() + public virtual void Pause() { lock (_timer) { @@ -48,7 +48,7 @@ namespace NzbDrone.Common.TPL } } - public void Resume() + public virtual void Resume() { lock (_timer) { diff --git a/src/NzbDrone.Core.Test/HealthCheck/HealthCheckServiceFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/HealthCheckServiceFixture.cs index 74802a39e..4ec0860ea 100644 --- a/src/NzbDrone.Core.Test/HealthCheck/HealthCheckServiceFixture.cs +++ b/src/NzbDrone.Core.Test/HealthCheck/HealthCheckServiceFixture.cs @@ -1,10 +1,14 @@ +using System; using System.Collections.Generic; using FluentAssertions; +using Moq; using NUnit.Framework; using NzbDrone.Common.Cache; using NzbDrone.Common.Messaging; +using NzbDrone.Common.TPL; using NzbDrone.Core.HealthCheck; using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.HealthCheck { @@ -19,10 +23,10 @@ namespace NzbDrone.Core.Test.HealthCheck Mocker.SetConstant>(new[] { _healthCheck }); Mocker.SetConstant(Mocker.Resolve()); + Mocker.SetConstant(Mocker.Resolve()); - Mocker.GetMock() - .Setup(v => v.GetServerChecks()) - .Returns(new List()); + Mocker.GetMock().Setup(s => s.CreateDebouncer(It.IsAny(), It.IsAny())) + .Returns((a, t) => new MockDebouncer(a, t)); } [Test] diff --git a/src/NzbDrone.Core/HealthCheck/HealthCheckService.cs b/src/NzbDrone.Core/HealthCheck/HealthCheckService.cs index 550849232..a9a89dc48 100644 --- a/src/NzbDrone.Core/HealthCheck/HealthCheckService.cs +++ b/src/NzbDrone.Core/HealthCheck/HealthCheckService.cs @@ -6,6 +6,7 @@ using NzbDrone.Common.Cache; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Messaging; using NzbDrone.Common.Reflection; +using NzbDrone.Common.TPL; using NzbDrone.Core.Lifecycle; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; @@ -27,35 +28,35 @@ namespace NzbDrone.Core.HealthCheck private readonly IProvideHealthCheck[] _startupHealthChecks; private readonly IProvideHealthCheck[] _scheduledHealthChecks; private readonly Dictionary _eventDrivenHealthChecks; - private readonly IServerSideNotificationService _serverSideNotificationService; private readonly IEventAggregator _eventAggregator; - private readonly ICacheManager _cacheManager; private readonly Logger _logger; private readonly ICached _healthCheckResults; + private readonly HashSet _pendingHealthChecks; + private readonly Debouncer _debounce; private bool _hasRunHealthChecksAfterGracePeriod; private bool _isRunningHealthChecksAfterGracePeriod; public HealthCheckService(IEnumerable healthChecks, - IServerSideNotificationService serverSideNotificationService, IEventAggregator eventAggregator, ICacheManager cacheManager, + IDebounceManager debounceManager, IRuntimeInfo runtimeInfo, Logger logger) { _healthChecks = healthChecks.ToArray(); - _serverSideNotificationService = serverSideNotificationService; _eventAggregator = eventAggregator; - _cacheManager = cacheManager; _logger = logger; - _healthCheckResults = _cacheManager.GetCache(GetType()); + _healthCheckResults = cacheManager.GetCache(GetType()); + _pendingHealthChecks = new HashSet(); + _debounce = debounceManager.CreateDebouncer(ProcessHealthChecks, TimeSpan.FromSeconds(5)); _startupHealthChecks = _healthChecks.Where(v => v.CheckOnStartup).ToArray(); _scheduledHealthChecks = _healthChecks.Where(v => v.CheckOnSchedule).ToArray(); _eventDrivenHealthChecks = GetEventDrivenHealthChecks(); - _startupGracePeriodEndTime = runtimeInfo.StartTime.AddMinutes(15); + _startupGracePeriodEndTime = runtimeInfo.StartTime + TimeSpan.FromMinutes(15); } public List Results() @@ -77,70 +78,93 @@ namespace NzbDrone.Core.HealthCheck .ToDictionary(g => g.Key, g => g.ToArray()); } - private void PerformHealthCheck(IProvideHealthCheck[] healthChecks, bool performServerChecks = false) + private void ProcessHealthChecks() { - var results = healthChecks.Select(c => - { - _logger.Trace("Check health -> {0}", c.GetType().Name); - var result = c.Check(); - _logger.Trace("Check health <- {0}", c.GetType().Name); + List healthChecks; - return result; - }) - .ToList(); - - if (performServerChecks) + lock (_pendingHealthChecks) { - results.AddRange(_serverSideNotificationService.GetServerChecks()); + healthChecks = _pendingHealthChecks.ToList(); + _pendingHealthChecks.Clear(); } - foreach (var result in results) + _debounce.Pause(); + + try { - if (result.Type == HealthCheckResult.Ok) - { - var previous = _healthCheckResults.Find(result.Source.Name); - - if (previous != null) + var results = healthChecks.Select(c => { - _eventAggregator.PublishEvent(new HealthCheckRestoredEvent(previous, !_hasRunHealthChecksAfterGracePeriod)); - } + _logger.Trace("Check health -> {0}", c.GetType().Name); + var result = c.Check(); + _logger.Trace("Check health <- {0}", c.GetType().Name); - _healthCheckResults.Remove(result.Source.Name); - } - else + return result; + }) + .ToList(); + + foreach (var result in results) { - if (_healthCheckResults.Find(result.Source.Name) == null) + if (result.Type == HealthCheckResult.Ok) { - _eventAggregator.PublishEvent(new HealthCheckFailedEvent(result, !_hasRunHealthChecksAfterGracePeriod)); - } + var previous = _healthCheckResults.Find(result.Source.Name); - _healthCheckResults.Set(result.Source.Name, result); + if (previous != null) + { + _eventAggregator.PublishEvent(new HealthCheckRestoredEvent(previous, !_hasRunHealthChecksAfterGracePeriod)); + } + + _healthCheckResults.Remove(result.Source.Name); + } + else + { + if (_healthCheckResults.Find(result.Source.Name) == null) + { + _eventAggregator.PublishEvent(new HealthCheckFailedEvent(result, !_hasRunHealthChecksAfterGracePeriod)); + } + + _healthCheckResults.Set(result.Source.Name, result); + } } } + finally + { + _debounce.Resume(); + } _eventAggregator.PublishEvent(new HealthCheckCompleteEvent()); } public void Execute(CheckHealthCommand message) { - if (message.Trigger == CommandTrigger.Manual) + var healthChecks = message.Trigger == CommandTrigger.Manual ? _healthChecks : _scheduledHealthChecks; + + lock (_pendingHealthChecks) { - PerformHealthCheck(_healthChecks, true); - } - else - { - PerformHealthCheck(_scheduledHealthChecks, true); + foreach (var healthCheck in healthChecks) + { + _pendingHealthChecks.Add(healthCheck); + } } + + ProcessHealthChecks(); } public void HandleAsync(ApplicationStartedEvent message) { - PerformHealthCheck(_startupHealthChecks, true); + lock (_pendingHealthChecks) + { + foreach (var healthCheck in _startupHealthChecks) + { + _pendingHealthChecks.Add(healthCheck); + } + } + + ProcessHealthChecks(); } public void HandleAsync(IEvent message) { - if (message is HealthCheckCompleteEvent) + if (message is HealthCheckCompleteEvent || message is ApplicationStartedEvent) { return; } @@ -151,7 +175,16 @@ namespace NzbDrone.Core.HealthCheck { _isRunningHealthChecksAfterGracePeriod = true; - PerformHealthCheck(_startupHealthChecks); + lock (_pendingHealthChecks) + { + foreach (var healthCheck in _startupHealthChecks) + { + _pendingHealthChecks.Add(healthCheck); + } + } + + // Call it directly so it's not debounced and any alerts can be sent. + ProcessHealthChecks(); // Update after running health checks so new failure notifications aren't sent 2x. _hasRunHealthChecksAfterGracePeriod = true; @@ -183,11 +216,16 @@ namespace NzbDrone.Core.HealthCheck if (eventDrivenHealthCheck.ShouldExecute(message, previouslyFailed)) { filteredChecks.Add(eventDrivenHealthCheck.HealthCheck); + continue; } } - // TODO: Add debounce - PerformHealthCheck(filteredChecks.ToArray()); + lock (_pendingHealthChecks) + { + filteredChecks.ForEach(h => _pendingHealthChecks.Add(h)); + } + + _debounce.Execute(); } } } diff --git a/src/NzbDrone.Core/HealthCheck/ServerSideNotificationService.cs b/src/NzbDrone.Core/HealthCheck/ServerSideNotificationService.cs index dd742bdf6..51420e63b 100644 --- a/src/NzbDrone.Core/HealthCheck/ServerSideNotificationService.cs +++ b/src/NzbDrone.Core/HealthCheck/ServerSideNotificationService.cs @@ -9,50 +9,43 @@ using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; using NzbDrone.Core.Configuration; +using NzbDrone.Core.Localization; namespace NzbDrone.Core.HealthCheck { - public interface IServerSideNotificationService - { - public List GetServerChecks(); - } - - public class ServerSideNotificationService : IServerSideNotificationService + public class ServerSideNotificationService : HealthCheckBase { private readonly IHttpClient _client; + private readonly IProwlarrCloudRequestBuilder _cloudRequestBuilder; private readonly IConfigFileProvider _configFileProvider; - private readonly IHttpRequestBuilderFactory _cloudRequestBuilder; private readonly Logger _logger; - private readonly ICached> _cache; + private readonly ICached _cache; - public ServerSideNotificationService(IHttpClient client, - IConfigFileProvider configFileProvider, - IProwlarrCloudRequestBuilder cloudRequestBuilder, - ICacheManager cacheManager, - Logger logger) + public ServerSideNotificationService(IHttpClient client, IProwlarrCloudRequestBuilder cloudRequestBuilder, IConfigFileProvider configFileProvider, ICacheManager cacheManager, ILocalizationService localizationService, Logger logger) + : base(localizationService) { _client = client; _configFileProvider = configFileProvider; - _cloudRequestBuilder = cloudRequestBuilder.Services; + _cloudRequestBuilder = cloudRequestBuilder; _logger = logger; - _cache = cacheManager.GetCache>(GetType()); + _cache = cacheManager.GetCache(GetType()); } - public List GetServerChecks() + public override HealthCheck Check() { return _cache.Get("ServerChecks", RetrieveServerChecks, TimeSpan.FromHours(2)); } - private List RetrieveServerChecks() + private HealthCheck RetrieveServerChecks() { if (BuildInfo.IsDebug) { - return new List(); + return new HealthCheck(GetType()); } - var request = _cloudRequestBuilder.Create() + var request = _cloudRequestBuilder.Services.Create() .Resource("/notification") .AddQueryParam("version", BuildInfo.Version) .AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant()) @@ -63,17 +56,22 @@ namespace NzbDrone.Core.HealthCheck try { - _logger.Trace("Getting server side health notifications"); + _logger.Trace("Getting notifications"); + var response = _client.Execute(request); var result = Json.Deserialize>(response.Content); - return result.Select(x => new HealthCheck(GetType(), x.Type, x.Message, x.WikiUrl)).ToList(); + + var checks = result.Select(x => new HealthCheck(GetType(), x.Type, x.Message, x.WikiUrl)).ToList(); + + // Only one health check is supported, services returns an ordered list, so use the first one + return checks.FirstOrDefault() ?? new HealthCheck(GetType()); } catch (Exception ex) { - _logger.Error(ex, "Failed to retrieve server notifications"); - } + _logger.Error(ex, "Failed to retrieve notifications"); - return new List(); + return new HealthCheck(GetType()); + } } } diff --git a/src/NzbDrone.Test.Common/MockDebouncer.cs b/src/NzbDrone.Test.Common/MockDebouncer.cs new file mode 100644 index 000000000..aa85135b2 --- /dev/null +++ b/src/NzbDrone.Test.Common/MockDebouncer.cs @@ -0,0 +1,21 @@ +using System; +using NzbDrone.Common.TPL; + +namespace NzbDrone.Test.Common +{ + public class MockDebouncer : Debouncer + { + public MockDebouncer(Action action, TimeSpan debounceDuration) + : base(action, debounceDuration) + { + } + + public override void Execute() + { + lock (_timer) + { + _action(); + } + } + } +} From b1f7d300212b8597d881ec2631c86ff87c1556cc Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 12 Oct 2023 04:59:47 +0300 Subject: [PATCH 243/964] Fixed: Ignore case when cleansing announce URLs --- .../InstrumentationTests/CleanseLogMessageFixture.cs | 12 ++++++++++-- .../Instrumentation/CleanseLogMessage.cs | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs index e130cea02..ea42239e8 100644 --- a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs +++ b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs @@ -89,8 +89,16 @@ namespace NzbDrone.Common.Test.InstrumentationTests // Download Station [TestCase(@"webapi/entry.cgi?api=(removed)&version=2&method=login&account=01233210&passwd=mySecret&format=sid&session=DownloadStation")] - // Tracker Responses - [TestCase(@"tracker"":""http://xxx.yyy/announce.php?passkey=9pr04sg601233210imaveql2tyu8xyui"",""info"":""http://xxx.yyy/info?a=b""")] + // Announce URLs (passkeys) Magnet & Tracker + [TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2f9pr04sg601233210IMAveQL2tyu8xyui%2fannounce""}")] + [TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2ftracker.php%2f9pr04sg601233210IMAveQL2tyu8xyui%2fannounce""}")] + [TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce%2f9pr04sg601233210IMAveQL2tyu8xyui""}")] + [TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce.php%3fpasskey%3d9pr04sg601233210IMAveQL2tyu8xyui""}")] + [TestCase(@"tracker"":""https://xxx.yyy/9pr04sg601233210IMAveQL2tyu8xyui/announce""}")] + [TestCase(@"tracker"":""https://xxx.yyy/tracker.php/9pr04sg601233210IMAveQL2tyu8xyui/announce""}")] + [TestCase(@"tracker"":""https://xxx.yyy/announce/9pr04sg601233210IMAveQL2tyu8xyui""}")] + [TestCase(@"tracker"":""https://xxx.yyy/announce.php?passkey=9pr04sg601233210IMAveQL2tyu8xyui""}")] + [TestCase(@"tracker"":""http://xxx.yyy/announce.php?passkey=9pr04sg601233210IMAveQL2tyu8xyui"",""info"":""http://xxx.yyy/info?a=b""")] // BroadcastheNet [TestCase(@"method: ""getTorrents"", ""params"": [ ""mySecret"",")] diff --git a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs index 1819f0ec7..38ff304a1 100644 --- a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs +++ b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs @@ -30,7 +30,7 @@ namespace NzbDrone.Common.Instrumentation new (@"""/(home|Users)/(?[^/""]+?)(/|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), // Trackers Announce Keys; Designed for Qbit Json; should work for all in theory - new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?[a-z0-9]{16,})|(?[a-z0-9]{16,})(/|%2f)announce"), + new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?[a-z0-9]{16,})|(?[a-z0-9]{16,})(/|%2f)announce", RegexOptions.Compiled | RegexOptions.IgnoreCase), // NzbGet new (@"""Name""\s*:\s*""[^""]*(username|password)""\s*,\s*""Value""\s*:\s*""(?[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase), From 7e32b54547a18fcf896cc12249533894c927ccd0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 12 Oct 2023 06:50:13 +0300 Subject: [PATCH 244/964] Fixed: Prevent NullRef in NewznabRequestGenerator for missing definition --- .../NewznabTests/NewznabRequestGeneratorFixture.cs | 5 +++++ src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs | 1 + .../Indexers/Definitions/Newznab/NewznabRequestGenerator.cs | 3 ++- src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabRequestGeneratorFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabRequestGeneratorFixture.cs index ead7db168..b26a1db21 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabRequestGeneratorFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabRequestGeneratorFixture.cs @@ -19,6 +19,11 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests [SetUp] public void SetUp() { + Subject.Definition = new IndexerDefinition + { + Name = "Newznab" + }; + Subject.Settings = new NewznabSettings() { BaseUrl = "http://127.0.0.1:1234/", diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs index 66c74b131..f544899b1 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs @@ -31,6 +31,7 @@ namespace NzbDrone.Core.Indexers.Newznab { return new NewznabRequestGenerator(_capabilitiesProvider) { + Definition = Definition, PageSize = PageSize, Settings = Settings }; diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs index 86c05585c..f9ab56128 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs @@ -13,10 +13,11 @@ namespace NzbDrone.Core.Indexers.Newznab public class NewznabRequestGenerator : IIndexerRequestGenerator { private readonly INewznabCapabilitiesProvider _capabilitiesProvider; + + public ProviderDefinition Definition { get; set; } public int MaxPages { get; set; } public int PageSize { get; set; } public NewznabSettings Settings { get; set; } - public ProviderDefinition Definition { get; set; } public NewznabRequestGenerator(INewznabCapabilitiesProvider capabilitiesProvider) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs index bf2d76cf4..512aaf091 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs @@ -31,6 +31,7 @@ namespace NzbDrone.Core.Indexers.Torznab { return new NewznabRequestGenerator(_capabilitiesProvider) { + Definition = Definition, PageSize = PageSize, Settings = Settings }; From d1cee950a41295d2b911b08b3379078672a852be Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Thu, 12 Oct 2023 20:21:09 -0500 Subject: [PATCH 245/964] Fixed: New Indexer URL for DICMusic --- src/NzbDrone.Core/Indexers/Definitions/DICMusic.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/DICMusic.cs b/src/NzbDrone.Core/Indexers/Definitions/DICMusic.cs index d42195890..f949740ce 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/DICMusic.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/DICMusic.cs @@ -9,7 +9,8 @@ namespace NzbDrone.Core.Indexers.Definitions; public class DICMusic : GazelleBase { public override string Name => "DICMusic"; - public override string[] IndexerUrls => new[] { "https://dicmusic.club/" }; + public override string[] IndexerUrls => new[] { "https://dicmusic.com/" }; + public override string[] LegacyUrls => new[] { "https://dicmusic.club/" }; public override string Description => "DICMusic is a CHINESE Private Torrent Tracker for MUSIC"; public override string Language => "zh-CN"; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; From 229d879f8610ea4ebfa42dc22cbc5730f94bf2d7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 13 Oct 2023 09:38:44 +0300 Subject: [PATCH 246/964] New: Show indexer categories in Add Indexer modal --- frontend/src/Indexer/Add/AddIndexerModal.js | 2 + .../src/Indexer/Add/AddIndexerModalContent.js | 10 ++- .../Add/AddIndexerModalContentConnector.js | 15 +++- frontend/src/Indexer/Add/SelectIndexerRow.js | 90 ------------------- frontend/src/Indexer/Add/SelectIndexerRow.tsx | 75 ++++++++++++++++ .../Indexer/Add/SelectIndexerRowConnector.js | 18 ---- .../Indexer/Index/Table/CapabilitiesLabel.tsx | 13 ++- frontend/src/Search/Table/CategoryLabel.js | 43 --------- frontend/src/Search/Table/CategoryLabel.tsx | 36 ++++++++ 9 files changed, 143 insertions(+), 159 deletions(-) delete mode 100644 frontend/src/Indexer/Add/SelectIndexerRow.js create mode 100644 frontend/src/Indexer/Add/SelectIndexerRow.tsx delete mode 100644 frontend/src/Indexer/Add/SelectIndexerRowConnector.js delete mode 100644 frontend/src/Search/Table/CategoryLabel.js create mode 100644 frontend/src/Search/Table/CategoryLabel.tsx diff --git a/frontend/src/Indexer/Add/AddIndexerModal.js b/frontend/src/Indexer/Add/AddIndexerModal.js index 4c4db24b9..9344c8130 100644 --- a/frontend/src/Indexer/Add/AddIndexerModal.js +++ b/frontend/src/Indexer/Add/AddIndexerModal.js @@ -1,6 +1,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import Modal from 'Components/Modal/Modal'; +import { sizes } from 'Helpers/Props'; import AddIndexerModalContentConnector from './AddIndexerModalContentConnector'; import styles from './AddIndexerModal.css'; @@ -8,6 +9,7 @@ function AddIndexerModal({ isOpen, onModalClose, onSelectIndexer, ...otherProps return ( diff --git a/frontend/src/Indexer/Add/AddIndexerModalContent.js b/frontend/src/Indexer/Add/AddIndexerModalContent.js index 81e911467..f4050560e 100644 --- a/frontend/src/Indexer/Add/AddIndexerModalContent.js +++ b/frontend/src/Indexer/Add/AddIndexerModalContent.js @@ -16,7 +16,7 @@ import TableBody from 'Components/Table/TableBody'; import { kinds, scrollDirections } from 'Helpers/Props'; import getErrorMessage from 'Utilities/Object/getErrorMessage'; import translate from 'Utilities/String/translate'; -import SelectIndexerRowConnector from './SelectIndexerRowConnector'; +import SelectIndexerRow from './SelectIndexerRow'; import styles from './AddIndexerModalContent.css'; const columns = [ @@ -49,6 +49,12 @@ const columns = [ label: () => translate('Privacy'), isSortable: true, isVisible: true + }, + { + name: 'categories', + label: () => translate('Categories'), + isSortable: false, + isVisible: true } ]; @@ -260,7 +266,7 @@ class AddIndexerModalContent extends Component { { filteredIndexers.map((indexer) => ( - { + createAllIndexersSelector(), + (indexers, allIndexers) => { const { isFetching, isPopulated, @@ -19,11 +22,19 @@ function createMapStateToProps() { sortKey } = indexers; + const indexerList = items.map((item) => { + const { definitionName } = item; + return { + ...item, + isExistingIndexer: some(allIndexers, { definitionName }) + }; + }); + return { isFetching, isPopulated, error, - indexers: items, + indexers: indexerList, sortKey, sortDirection }; diff --git a/frontend/src/Indexer/Add/SelectIndexerRow.js b/frontend/src/Indexer/Add/SelectIndexerRow.js deleted file mode 100644 index 7e1c994bf..000000000 --- a/frontend/src/Indexer/Add/SelectIndexerRow.js +++ /dev/null @@ -1,90 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import Icon from 'Components/Icon'; -import TableRowCell from 'Components/Table/Cells/TableRowCell'; -import TableRowButton from 'Components/Table/TableRowButton'; -import { icons } from 'Helpers/Props'; -import ProtocolLabel from 'Indexer/Index/Table/ProtocolLabel'; -import firstCharToUpper from 'Utilities/String/firstCharToUpper'; -import translate from 'Utilities/String/translate'; -import styles from './SelectIndexerRow.css'; - -class SelectIndexerRow extends Component { - - // - // Listeners - - onPress = () => { - const { - implementation, - implementationName, - name - } = this.props; - - this.props.onIndexerSelect({ implementation, implementationName, name }); - }; - - // - // Render - - render() { - const { - protocol, - privacy, - name, - language, - description, - isExistingIndexer - } = this.props; - - return ( - - - - - - - {name} - { - isExistingIndexer ? - : - null - } - - - - {language} - - - - {description} - - - - {translate(firstCharToUpper(privacy))} - - - ); - } -} - -SelectIndexerRow.propTypes = { - name: PropTypes.string.isRequired, - protocol: PropTypes.string.isRequired, - privacy: PropTypes.string.isRequired, - language: PropTypes.string.isRequired, - description: PropTypes.string.isRequired, - implementation: PropTypes.string.isRequired, - implementationName: PropTypes.string.isRequired, - onIndexerSelect: PropTypes.func.isRequired, - isExistingIndexer: PropTypes.bool.isRequired -}; - -export default SelectIndexerRow; diff --git a/frontend/src/Indexer/Add/SelectIndexerRow.tsx b/frontend/src/Indexer/Add/SelectIndexerRow.tsx new file mode 100644 index 000000000..ab6850573 --- /dev/null +++ b/frontend/src/Indexer/Add/SelectIndexerRow.tsx @@ -0,0 +1,75 @@ +import React, { useCallback } from 'react'; +import Icon from 'Components/Icon'; +import TableRowCell from 'Components/Table/Cells/TableRowCell'; +import TableRowButton from 'Components/Table/TableRowButton'; +import { icons } from 'Helpers/Props'; +import CapabilitiesLabel from 'Indexer/Index/Table/CapabilitiesLabel'; +import ProtocolLabel from 'Indexer/Index/Table/ProtocolLabel'; +import { IndexerCapabilities } from 'Indexer/Indexer'; +import firstCharToUpper from 'Utilities/String/firstCharToUpper'; +import translate from 'Utilities/String/translate'; +import styles from './SelectIndexerRow.css'; + +interface SelectIndexerRowProps { + name: string; + protocol: string; + privacy: string; + language: string; + description: string; + capabilities: IndexerCapabilities; + implementation: string; + implementationName: string; + isExistingIndexer: boolean; + onIndexerSelect(...args: unknown[]): void; +} + +function SelectIndexerRow(props: SelectIndexerRowProps) { + const { + name, + protocol, + privacy, + language, + description, + capabilities, + implementation, + implementationName, + isExistingIndexer, + onIndexerSelect, + } = props; + + const onPress = useCallback(() => { + onIndexerSelect({ implementation, implementationName, name }); + }, [implementation, implementationName, name, onIndexerSelect]); + + return ( + + + + + + + {name} + {isExistingIndexer ? ( + + ) : null} + + + {language} + + {description} + + {translate(firstCharToUpper(privacy))} + + + + + + ); +} + +export default SelectIndexerRow; diff --git a/frontend/src/Indexer/Add/SelectIndexerRowConnector.js b/frontend/src/Indexer/Add/SelectIndexerRowConnector.js deleted file mode 100644 index f507689c8..000000000 --- a/frontend/src/Indexer/Add/SelectIndexerRowConnector.js +++ /dev/null @@ -1,18 +0,0 @@ - -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import createExistingIndexerSelector from 'Store/Selectors/createExistingIndexerSelector'; -import SelectIndexerRow from './SelectIndexerRow'; - -function createMapStateToProps() { - return createSelector( - createExistingIndexerSelector(), - (isExistingIndexer, dimensions) => { - return { - isExistingIndexer - }; - } - ); -} - -export default connect(createMapStateToProps)(SelectIndexerRow); diff --git a/frontend/src/Indexer/Index/Table/CapabilitiesLabel.tsx b/frontend/src/Indexer/Index/Table/CapabilitiesLabel.tsx index 5f742d902..c832806ed 100644 --- a/frontend/src/Indexer/Index/Table/CapabilitiesLabel.tsx +++ b/frontend/src/Indexer/Index/Table/CapabilitiesLabel.tsx @@ -1,3 +1,4 @@ +import { uniqBy } from 'lodash'; import React from 'react'; import Label from 'Components/Label'; import { IndexerCapabilities } from 'Indexer/Indexer'; @@ -23,14 +24,18 @@ function CapabilitiesLabel(props: CapabilitiesLabelProps) { ); } - const nameList = Array.from( - new Set(filteredList.map((item) => item.name).sort()) + const indexerCategories = uniqBy(filteredList, 'id').sort( + (a, b) => a.id - b.id ); return ( - {nameList.map((category) => { - return ; + {indexerCategories.map((category) => { + return ( + + ); })} {filteredList.length === 0 ? : null} diff --git a/frontend/src/Search/Table/CategoryLabel.js b/frontend/src/Search/Table/CategoryLabel.js deleted file mode 100644 index 5c076c521..000000000 --- a/frontend/src/Search/Table/CategoryLabel.js +++ /dev/null @@ -1,43 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import Label from 'Components/Label'; -import Tooltip from 'Components/Tooltip/Tooltip'; -import { kinds, tooltipPositions } from 'Helpers/Props'; - -function CategoryLabel({ categories }) { - const sortedCategories = categories.filter((cat) => cat.name !== undefined).sort((c) => c.id); - - if (categories?.length === 0) { - return ( - Unknown} - tooltip="Please report this issue to the GitHub as this shouldn't be happening" - position={tooltipPositions.LEFT} - /> - ); - } - - return ( - - { - sortedCategories.map((category) => { - return ( - - ); - }) - } - - ); -} - -CategoryLabel.defaultProps = { - categories: [] -}; - -CategoryLabel.propTypes = { - categories: PropTypes.arrayOf(PropTypes.object).isRequired -}; - -export default CategoryLabel; diff --git a/frontend/src/Search/Table/CategoryLabel.tsx b/frontend/src/Search/Table/CategoryLabel.tsx new file mode 100644 index 000000000..4cfdeb1b2 --- /dev/null +++ b/frontend/src/Search/Table/CategoryLabel.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import Label from 'Components/Label'; +import Tooltip from 'Components/Tooltip/Tooltip'; +import { kinds, tooltipPositions } from 'Helpers/Props'; +import { IndexerCategory } from 'Indexer/Indexer'; +import translate from 'Utilities/String/translate'; + +interface CategoryLabelProps { + categories: IndexerCategory[]; +} + +function CategoryLabel({ categories = [] }: CategoryLabelProps) { + if (categories?.length === 0) { + return ( + {translate('Unknown')}} + tooltip="Please report this issue to the GitHub as this shouldn't be happening" + position={tooltipPositions.LEFT} + /> + ); + } + + const sortedCategories = categories + .filter((cat) => cat.name !== undefined) + .sort((a, b) => a.id - b.id); + + return ( + + {sortedCategories.map((category) => { + return ; + })} + + ); +} + +export default CategoryLabel; From bae79b22ad2c7210fdfb97ca5bfefda56fc8900c Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 13 Oct 2023 07:53:45 +0000 Subject: [PATCH 247/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: DavidHenryThoreau Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/fr.json | 108 ++++++++++---------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index f307f9c13..d93097c3d 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -12,7 +12,7 @@ "Events": "Événements", "Edit": "Modifier", "DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", - "DownloadClients": "Clients de télécharg.", + "DownloadClients": "Clients de téléchargements", "Dates": "Dates", "Date": "Date", "Delete": "Supprimer", @@ -28,19 +28,19 @@ "About": "À propos", "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", "DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}", - "SetTags": "Définir les étiquettes", + "SetTags": "Définir des balises", "ReleaseStatus": "Statut de la version", "UpdateCheckUINotWritableMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", "UpdateCheckStartupTranslocationMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' se trouve dans un dossier App Translocation.", "UpdateCheckStartupNotWritableMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", "UnselectAll": "Tout désélectionner", "UISettingsSummary": "Date, langue, et perceptions des couleurs", - "TagsSettingsSummary": "Voir toutes les étiquettes et leur utilisation. Les étiquettes inutilisées peuvent être supprimées", + "TagsSettingsSummary": "Voir toutes les balises et comment elles sont utilisées. Les balises inutilisées peuvent être supprimées", "Style": "Style", "Status": "État", "Sort": "Trier", "Size": "Taille", - "ShowAdvanced": "Afficher param. av.", + "ShowAdvanced": "Afficher les paramètres avancés", "Settings": "Paramètres", "SelectAll": "Tout sélectionner", "Security": "Sécurité", @@ -49,7 +49,7 @@ "SaveChanges": "Sauvegarder les modifications", "RestoreBackup": "Restaurer la sauvegarde", "ReleaseBranchCheckOfficialBranchMessage": "La branche {0} n'est pas une branche de version Prowlarr valide, vous ne recevrez pas de mises à jour", - "Refresh": "Actualiser", + "Refresh": "Rafraîchir", "Queue": "File d'attente", "ProxyCheckResolveIpMessage": "Impossible de résoudre l'adresse IP de l'hôte proxy configuré {0}", "ProxyCheckFailedToTestMessage": "Échec du test du proxy : {0}", @@ -57,19 +57,19 @@ "Proxy": "Proxy", "Protocol": "Protocole", "Options": "Options", - "NoChanges": "Aucune modification", + "NoChanges": "Aucuns changements", "NoChange": "Pas de changement", "MoreInfo": "Plus d'informations", - "Grabbed": "Récupéré", + "Grabbed": "Saisie", "DownloadClientsSettingsSummary": "Configuration des clients de téléchargement pour intégration dans la recherche de l'interface utilisateur de Prowlarr", - "DownloadClient": "Client de Téléchargement", + "DownloadClient": "Client de téléchargement", "Logging": "Enregistrement", - "LogFiles": "Fichiers Log", - "View": "Vue", + "LogFiles": "Fichiers journaux", + "View": "Vues", "Updates": "Mises à jour", "UI": "UI", "Tasks": "Tâches", - "Tags": "Étiquettes", + "Tags": "Tags", "System": "Système", "LastWriteTime": "Heure de la dernière écriture", "Language": "Langue", @@ -82,7 +82,7 @@ "ConnectSettingsSummary": "Notifications et scripts personnalisés", "Added": "Ajouté", "Actions": "Actions", - "Info": "Info", + "Info": "Information", "Error": "Erreur", "ConnectionLost": "Connexion perdue", "Component": "Composant", @@ -98,16 +98,16 @@ "TestAll": "Tout tester", "Test": "Tester", "TableOptionsColumnsMessage": "Choisissez quelles colonnes sont visibles et dans quel ordre elles apparaissent", - "TableOptions": "Paramètres de table", + "TableOptions": "Options des tableaux", "Source": "Source", "Shutdown": "Éteindre", "Seeders": "Seeders", "Save": "Sauvegarder", "Restart": "Redémarrer", "Reload": "Recharger", - "Peers": "Pairs", + "Peers": "Peers", "PageSize": "Pagination", - "Ok": "OK", + "Ok": "Ok", "OAuthPopupMessage": "Les pop-ups sont bloquées par votre navigateur", "Name": "Nom", "Message": "Message", @@ -116,8 +116,8 @@ "HealthNoIssues": "Aucun problème avec votre configuration", "SystemTimeCheckMessage": "L'heure du système est décalée de plus d'un jour. Les tâches planifiées peuvent ne pas s'exécuter correctement tant que l'heure ne sera pas corrigée", "SettingsShowRelativeDates": "Afficher les dates relatives", - "UnsavedChanges": "Modifications non sauvegardées", - "ShowSearchHelpText": "Affiche le bouton de recherche au survol du curseur", + "UnsavedChanges": "Modifications non enregistrées", + "ShowSearchHelpText": "Afficher le bouton de recherche au survol", "ShowSearch": "Afficher la recherche", "SettingsTimeFormat": "Format de l'heure", "SettingsShowRelativeDatesHelpText": "Afficher les dates relatives (aujourd'hui, hier, etc.) ou absolues", @@ -136,7 +136,7 @@ "BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales", "Branch": "Branche", "BindAddressHelpText": "Adresse IP valide, localhost ou « * » pour toutes les interfaces", - "BindAddress": "Adresse d'attache", + "BindAddress": "Adresse de liaison", "Backups": "Sauvegardes", "BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de conservation seront automatiquement effacées", "BackupIntervalHelpText": "Intervalle entre les sauvegardes automatiques", @@ -148,15 +148,15 @@ "ApiKey": "Clé API", "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Prowlarr. Cela inclut des informations sur votre navigateur, quelle page Prowlarr WebUI vous utilisez, les rapports d'erreurs, ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.", "IgnoredAddresses": "Adresses ignorées", - "Hostname": "Nom d'hôte", - "GeneralSettings": "Réglages Généraux", - "Fixed": "Corrigé", + "Hostname": "Hostname", + "GeneralSettings": "Réglages généraux", + "Fixed": "Fixé", "EnableSslHelpText": " Nécessite un redémarrage en tant qu'administrateur pour être effectif", "EnableSSL": "Activer le SSL", "EnableInteractiveSearch": "Activer la recherche interactive", "EnableAutomaticSearch": "Activer la recherche automatique", "Enable": "Activer", - "DownloadClientSettings": "Réglages Clients de téléchargement", + "DownloadClientSettings": "Télécharger les paramètres client", "Docker": "Docker", "DeleteTag": "Supprimer le tag", "DeleteNotification": "Supprimer la notification", @@ -190,7 +190,7 @@ "UnableToLoadNotifications": "Impossible de charger les notifications", "Version": "Version", "Username": "Nom d'utilisateur", - "UseProxy": "Utiliser un proxy", + "UseProxy": "Utiliser le proxy", "Usenet": "Usenet", "UrlBaseHelpText": "Pour la prise en charge du proxy inverse, la valeur par défaut est vide", "URLBase": "Base URL", @@ -198,17 +198,17 @@ "Mode": "Mode", "Mechanism": "Mécanisme", "Manual": "Manuel", - "MaintenanceRelease": "Version de maintenance : corrections de bugs et autres améliorations. Voir historique des changements Github pour plus d'informations", + "MaintenanceRelease": "Version de maintenance : corrections de bugs et autres améliorations. Voir l'historique des validations Github pour plus de détails", "Logs": "Journaux", "LogLevelTraceHelpTextWarning": "La journalisation des traces ne doit être activée que temporairement", - "LogLevel": "Niveau du journal", + "LogLevel": "Niveau de journalisation", "IncludeHealthWarningsHelpText": "Inclure avertissements santé", "FocusSearchBox": "Placer le curseur sur la barre de recherche", - "ProxyBypassFilterHelpText": "Utiliser ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines", - "Uptime": "Durée de fonctionnent", - "UpdateScriptPathHelpText": "Chemin vers un script personnalisé qui prend un package de mise à jour extraite et gère le reste du processus de mise à jour", + "ProxyBypassFilterHelpText": "Utilisez ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines", + "Uptime": "Disponibilité", + "UpdateScriptPathHelpText": "Chemin d'accès à un script personnalisé qui prend un package de mise à jour extrait et gère le reste du processus de mise à jour", "UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de Prowlarr ou un script", - "UpdateAutomaticallyHelpText": "Télécharger et installer automatiquement les mises à jour. Vous pourrez toujours installer à partir de System : Updates", + "UpdateAutomaticallyHelpText": "Téléchargez et installez automatiquement les mises à jour. Vous pourrez toujours installer à partir du système : mises à jour", "UnableToLoadUISettings": "Impossible de charger les paramètres de l'interface utilisateur", "UnableToLoadTags": "Impossible de charger les étiquettes", "UnableToLoadHistory": "Impossible de charger l'historique", @@ -221,7 +221,7 @@ "TagIsNotUsedAndCanBeDeleted": "L'étiquette n'est pas utilisée et peut être supprimée", "TagsHelpText": "S'applique aux indexeurs avec au moins une étiquette correspondante", "StartTypingOrSelectAPathBelow": "Commencer à écrire ou sélectionner un chemin ci-dessous", - "NoTagsHaveBeenAddedYet": "Aucune étiquette n'a encore été ajoutée", + "NoTagsHaveBeenAddedYet": "Aucune identification n'a été ajoutée pour l'instant", "IndexerFlags": "Indicateurs d'indexeur", "DeleteTagMessageText": "Voulez-vous vraiment supprimer l'étiquette « {label} » ?", "UISettings": "Paramètres UI", @@ -250,28 +250,28 @@ "RestartNow": "Redémarrer maintenant", "ResetAPIKey": "Réinitialiser la clé API", "Reset": "Réinitialiser", - "RemovingTag": "Suppression du tag", - "ExistingTag": "Tag existant", + "RemovingTag": "Supprimer la balise", + "ExistingTag": "Balise existante", "RemoveFilter": "Supprimer le filtre", "RemovedFromTaskQueue": "Supprimé de la file d'attente des tâches", "RefreshMovie": "Actualiser le film", - "ReadTheWikiForMoreInformation": "Consultez le Wiki pour plus d'informations", + "ReadTheWikiForMoreInformation": "Lisez le wiki pour plus d'informations", "ProwlarrSupportsAnyIndexer": "Prowlarr prend en charge de nombreux indexeurs en plus de tout indexeur qui utilise la norme Newznab/Torznab en utilisant « Generic Newznab » (pour usenet) ou « Generic Torznab » (pour les torrents). Recherchez et sélectionnez votre indexeur ci-dessous.", "ProwlarrSupportsAnyDownloadClient": "Prowlarr prend en charge tout client de téléchargement qui utilise le standard Newznab, ainsi que d'autres clients de téléchargement répertoriés ci-dessous.", - "ProxyUsernameHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si vous en avez besoin. Sinon, laissez-les vides.", - "ProxyType": "Type de proxy", - "ProxyPasswordHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si vous en avez besoin. Sinon, laissez-les vides.", + "ProxyUsernameHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si nécessaire. Sinon, laissez-les vides.", + "ProxyType": "Type de mandataire", + "ProxyPasswordHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si nécessaire. Sinon, laissez-les vides.", "Priority": "Priorité", "PortNumber": "Numéro de port", "Port": "Port", "Password": "Mot de passe", "PageSizeHelpText": "Nombre d'éléments à afficher sur chaque page", - "PackageVersion": "Version du package", + "PackageVersion": "Version du paquet", "OpenBrowserOnStart": "Ouvrir le navigateur au démarrage", "NoUpdatesAreAvailable": "Aucune mise à jour n'est disponible", - "NotificationTriggers": "Déclencheurs de notification", + "NotificationTriggers": "Déclencheurs de notifications", "NoLogFiles": "Aucun fichier journal", - "NoLeaveIt": "Non, laisse-le", + "NoLeaveIt": "Non, laisse tomber", "NoBackupsAreAvailable": "Aucune sauvegarde n'est disponible", "New": "Nouveau", "NetCore": ".NET Core", @@ -339,7 +339,7 @@ "Apps": "Applications", "Auth": "Auth", "Category": "Catégorie", - "Custom": "Personnalisé", + "Custom": "Customisé", "DeleteAppProfile": "Supprimer le profil de l'application", "Description": "Description", "Donations": "Dons", @@ -383,8 +383,8 @@ "HistoryCleanupDaysHelpText": "Définir sur 0 pour désactiver le nettoyage automatique", "HistoryCleanupDaysHelpTextWarning": "Les fichiers dans la corbeille plus anciens que le nombre de jours sélectionné seront nettoyés automatiquement", "OnGrab": "Récupéré à la sortie", - "OnHealthIssue": "Lors d'un problème de santé", - "TestAllIndexers": "Tester tous les indexeurs", + "OnHealthIssue": "Sur la question de la santé", + "TestAllIndexers": "Testez tous les indexeurs", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fourni par l'application qui a appelé l'API", "Database": "Base de données", "HistoryCleanup": "Nettoyage de l'historique", @@ -404,7 +404,7 @@ "Website": "Site internet", "AudioSearch": "Recherche de musique", "BookSearch": "Recherche de livres", - "OnApplicationUpdate": "Lors de la mise à jour de l'app", + "OnApplicationUpdate": "Sur la mise à jour de l'application", "OnApplicationUpdateHelpText": "Lors de la mise à jour de l'app", "IndexerNoDefCheckMessage": "Les indexeurs ne sont pas définis et ne fonctionneront pas :Merci de les retirer et (ou) les ajouter à nouveau à Prowlarr", "MovieSearch": "Recherche de films", @@ -430,7 +430,7 @@ "Duration": "Durée", "LastDuration": "Dernière durée", "InstanceName": "Nom de l'instance", - "InstanceNameHelpText": "Nom de l'instance dans l'onglet du navigateur et pour le nom d'application dans Syslog", + "InstanceNameHelpText": "Nom de l'instance dans l'onglet et pour le nom de l'application Syslog", "ApplicationLongTermStatusCheckSingleClientMessage": "Applications indisponibles en raison de défaillances depuis plus de 6 heures : {0}", "ApplicationLongTermStatusCheckAllClientMessage": "Toutes les applications sont indisponibles en raison de défaillances depuis plus de 6 heures", "Ended": "Terminé", @@ -506,7 +506,7 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des étiquettes aux indexeurs sélectionnés", "ApplyTagsHelpTextRemove": "Supprimer : supprime les étiquettes renseignées", "ApplyTagsHelpTextReplace": "Remplacer : remplace les étiquettes par les étiquettes renseignées (ne pas renseigner d'étiquette pour toutes les effacer)", - "DeleteSelectedDownloadClients": "Supprimer le client de téléchargement", + "DeleteSelectedDownloadClients": "Supprimer le(s) client(s) de téléchargement", "DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer {count} client(s) de téléchargement sélectionné(s) ?", "StopSelecting": "Effacer la sélection", "UpdateAvailable": "Une nouvelle mise à jour est disponible", @@ -535,17 +535,17 @@ "AddConnectionImplementation": "Ajouter une connexion - {implementationName}", "AddApplicationImplementation": "Ajouter une application - {implementationName}", "AddIndexerImplementation": "Ajouter un indexeur - {implementationName}", - "EditConnectionImplementation": "Ajouter une connexion - {implementationName}", - "NotificationStatusAllClientHealthCheckMessage": "Toutes les notifications sont indisponibles en raison de dysfonctionnements", - "NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison de dysfonctionnements : {0}", + "EditConnectionImplementation": "Modifier la connexion - {implementationName}", + "NotificationStatusAllClientHealthCheckMessage": "Toutes les notifications ne sont pas disponibles en raison d'échecs", + "NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison d'échecs : {0}", "EditApplicationImplementation": "Ajouter une condition - {implementationName}", - "EditIndexerImplementation": "Ajouter une condition - {implementationName}", + "EditIndexerImplementation": "Modifier l'indexeur - {implementationName}", "EditIndexerProxyImplementation": "Modifier un proxy d'indexeur - {implementationName}", "AuthBasic": "Basique (fenêtre surgissante du navigateur)", "AuthForm": "Formulaire (page de connexion)", "DisabledForLocalAddresses": "Désactivée pour les adresses IP locales", "None": "Aucun", - "ResetAPIKeyMessageText": "Voulez-vous réinitialiser votre clé d'API ?", + "ResetAPIKeyMessageText": "Êtes-vous sûr de vouloir réinitialiser votre clé API ?", "AddIndexerProxyImplementation": "Ajouter un proxy d'indexeur - {implementationName}", "IndexerStatus": "État de l'indexeur", "ManageApplications": "Gérer les applications", @@ -559,7 +559,7 @@ "AppUpdated": "{appName} mis à jour", "AppUpdatedVersion": "{appName} a été mis à jour vers la version `{version}`, pour profiter des derniers changements, vous devrez relancer {appName}", "IndexerDownloadClientHelpText": "Préciser quel client de téléchargement est utilisé pour les saisies créées au sein de Prowlarr provenant de cet indexeur", - "Implementation": "Implémentation", + "Implementation": "Mise en œuvre", "SearchCountIndexers": "Rechercher {count} indexeur(s)", "SearchAllIndexers": "Rechercher tous les indexeurs", "NewznabUrl": "URL Newznab", @@ -593,5 +593,9 @@ "ActiveIndexers": "Indexeurs actifs", "ActiveApps": "Applications actives", "AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur", - "Clone": "Cloner" + "Clone": "Cloner", + "PackSeedTime": "Temps de Seed", + "ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune balise ou qui ont une ou plusieurs balises correspondantes", + "OnHealthRestored": "Sur la santé restaurée", + "OnHealthRestoredHelpText": "Sur la santé restaurée" } From f1c01343bf5c4ad31d47ea73dd9676fc40fb01d3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 13 Oct 2023 14:27:32 +0300 Subject: [PATCH 248/964] New: (Nebulance) Parse TvMazeId and scene attributes --- src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index dba9ce9e4..da274e75e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -265,6 +265,8 @@ namespace NzbDrone.Core.Indexers.Definitions Grabs = ParseUtil.CoerceInt(row.Snatch), Seeders = ParseUtil.CoerceInt(row.Seed), Peers = ParseUtil.CoerceInt(row.Seed) + ParseUtil.CoerceInt(row.Leech), + TvMazeId = ParseUtil.CoerceInt(row.TvMazeId), + Scene = row.Tags?.ContainsIgnoreCase("scene"), MinimumRatio = 0, // ratioless MinimumSeedTime = row.Category.ToLower() == "season" ? 432000 : 86400, // 120 hours for seasons and 24 hours for episodes DownloadVolumeFactor = 0, // ratioless tracker @@ -339,8 +341,11 @@ namespace NzbDrone.Core.Indexers.Definitions public string Banner { get; set; } [JsonPropertyName("group_id")] public string TorrentId { get; set; } + [JsonPropertyName("series_id")] + public string TvMazeId { get; set; } [JsonPropertyName("rls_utc")] public string PublishDateUtc { get; set; } + public IEnumerable Tags { get; set; } } public class NebulanceTorrents From 29f1c36f54aa11378b7eee07159a0f0a7de10be4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 13 Oct 2023 18:55:04 +0300 Subject: [PATCH 249/964] Prevent NullRef in Nebulance with null TvMazeIds --- src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index da274e75e..45810a1c2 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -265,7 +265,6 @@ namespace NzbDrone.Core.Indexers.Definitions Grabs = ParseUtil.CoerceInt(row.Snatch), Seeders = ParseUtil.CoerceInt(row.Seed), Peers = ParseUtil.CoerceInt(row.Seed) + ParseUtil.CoerceInt(row.Leech), - TvMazeId = ParseUtil.CoerceInt(row.TvMazeId), Scene = row.Tags?.ContainsIgnoreCase("scene"), MinimumRatio = 0, // ratioless MinimumSeedTime = row.Category.ToLower() == "season" ? 432000 : 86400, // 120 hours for seasons and 24 hours for episodes @@ -273,6 +272,11 @@ namespace NzbDrone.Core.Indexers.Definitions UploadVolumeFactor = 1 }; + if (row.TvMazeId.IsNotNullOrWhiteSpace()) + { + release.TvMazeId = ParseUtil.CoerceInt(row.TvMazeId); + } + torrentInfos.Add(release); } From 30eb481c65ff0f3066492c3739db7445621c433f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 14 Oct 2023 10:17:54 +0300 Subject: [PATCH 250/964] Add year to releases for AnimeBytes --- src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index c2b2806b6..2fad1bfee 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -555,6 +555,7 @@ namespace NzbDrone.Core.Indexers.Definitions MinimumRatio = 1, MinimumSeedTime = minimumSeedTime, Title = fileName, + Year = year.GetValueOrDefault(), InfoUrl = details.AbsoluteUri, Guid = guid.AbsoluteUri, DownloadUrl = link.AbsoluteUri, @@ -587,6 +588,7 @@ namespace NzbDrone.Core.Indexers.Definitions MinimumRatio = 1, MinimumSeedTime = minimumSeedTime, Title = releaseTitle.Trim(), + Year = year.GetValueOrDefault(), InfoUrl = details.AbsoluteUri, Guid = guid.AbsoluteUri, DownloadUrl = link.AbsoluteUri, From 4b2f81bee86f5b139ca1ec37d1f0843cd86cf185 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 14 Oct 2023 15:04:30 +0300 Subject: [PATCH 251/964] Update postcss, webpack and core-js --- package.json | 6 +- yarn.lock | 910 ++++++++++++++++++++++++++------------------------- 2 files changed, 469 insertions(+), 447 deletions(-) diff --git a/package.json b/package.json index 899e3f764..7c3d85f11 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "babel-loader": "9.1.3", "babel-plugin-inline-classnames": "2.0.1", "babel-plugin-transform-react-remove-prop-types": "0.4.24", - "core-js": "3.32.1", + "core-js": "3.33.0", "css-loader": "6.7.3", "css-modules-typescript-loader": "4.0.1", "eslint": "8.45.0", @@ -122,7 +122,7 @@ "html-webpack-plugin": "5.5.1", "loader-utils": "^3.2.1", "mini-css-extract-plugin": "2.7.5", - "postcss": "8.4.23", + "postcss": "8.4.31", "postcss-color-function": "4.1.0", "postcss-loader": "7.3.0", "postcss-mixins": "9.0.4", @@ -141,7 +141,7 @@ "ts-loader": "9.4.2", "typescript-plugin-css-modules": "5.0.1", "url-loader": "4.1.1", - "webpack": "5.88.1", + "webpack": "5.89.0", "webpack-cli": "5.1.4", "webpack-livereload-plugin": "3.0.2" } diff --git a/yarn.lock b/yarn.lock index b93c2fcb4..583e985ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,7 +20,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -29,9 +29,9 @@ chalk "^2.4.2" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== "@babel/core@7.22.11": version "7.22.11" @@ -63,12 +63,12 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.22.10", "@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -81,32 +81,32 @@ "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" - integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" - integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -114,18 +114,18 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" - integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -133,18 +133,18 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -153,30 +153,30 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -190,22 +190,22 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== +"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -234,63 +234,63 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== +"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" "@babel/helpers@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" - integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" "@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.22.11", "@babel/parser@^7.22.5": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" - integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== +"@babel/parser@^7.22.11", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" - integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" - integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" "@babel/plugin-proposal-export-default-from@7.22.5": version "7.22.5" @@ -461,13 +461,13 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-async-generator-functions@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" - integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" + integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-to-generator@^7.22.5": @@ -487,9 +487,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-block-scoping@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -511,17 +511,17 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-transform-classes@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" @@ -534,9 +534,9 @@ "@babel/template" "^7.22.5" "@babel/plugin-transform-destructuring@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -580,9 +580,9 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-transform-for-of@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -626,31 +626,31 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-modules-amd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" - integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-modules-commonjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" - integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: - "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" "@babel/plugin-transform-modules-systemjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" - integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" @@ -692,15 +692,15 @@ "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-transform-object-rest-spread@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" - integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-parameters" "^7.22.15" "@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" @@ -718,19 +718,19 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.5": - version "7.22.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" - integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== +"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== +"@babel/plugin-transform-parameters@^7.22.15", "@babel/plugin-transform-parameters@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -774,15 +774,15 @@ "@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" "@babel/plugin-transform-react-pure-annotations@^7.22.5": version "7.22.5" @@ -844,12 +844,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typescript@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.11.tgz#9f27fb5e51585729374bb767ab6a6d9005a23329" - integrity sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-typescript" "^7.22.5" @@ -1008,60 +1008,60 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" - integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== +"@babel/template@^7.22.15", "@babel/template@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" - integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== +"@babel/traverse@^7.22.11", "@babel/traverse@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== +"@babel/types@^7.22.11", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@csstools/css-parser-algorithms@^2.1.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz#ec4fc764ba45d2bb7ee2774667e056aa95003f3a" - integrity sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz#1e0d581dbf4518cb3e939c3b863cb7180c8cedad" + integrity sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA== "@csstools/css-tokenizer@^2.1.1": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz#9d70e6dcbe94e44c7400a2929928db35c4de32b5" - integrity sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz#9dc431c9a5f61087af626e41ac2a79cce7bb253d" + integrity sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg== "@csstools/media-query-list-parser@^2.0.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz#0017f99945f6c16dd81a7aacf6821770933c3a5c" - integrity sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw== + version "2.1.5" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz#94bc8b3c3fd7112a40b7bf0b483e91eba0654a0f" + integrity sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ== "@csstools/selector-specificity@^2.2.0": version "2.2.0" @@ -1081,9 +1081,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" + integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== "@eslint/eslintrc@^2.1.0": version "2.1.2" @@ -1330,32 +1330,32 @@ tslib "^1.9.3" "@types/archiver@^5.3.1": - version "5.3.2" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.2.tgz#a9f0bcb0f0b991400e7766d35f6e19d163bdadcc" - integrity sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw== + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.3.tgz#9cb632a67060602b1658c669b498d51dd8ce08ab" + integrity sha512-0ABdVcXL6jOwNGY+hjWPqrxUvKelBEwNLcuv/SV2vZ4YCH8w9NttFCt+/QqI5zgMX+iX/XqVy89/r7EmLJmMpQ== dependencies: "@types/readdir-glob" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.5" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" + integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.44.4" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.4.tgz#28eaff82e1ca0a96554ec5bb0188f10ae1a74c2f" + integrity sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" + integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== "@types/history@^4.7.11": version "4.7.11" @@ -1363,9 +1363,9 @@ integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.3.tgz#8bb41d9a88164f82dd2745ff05e637e655f34d19" + integrity sha512-Wny3a2UXn5FEA1l7gc6BbpoV5mD1XijZqgkp4TRgDCDL5r3B5ieOFGUX5h3n78Tr1MEG7BfvoM8qeztdvNU0fw== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" @@ -1376,9 +1376,9 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== "@types/json5@^0.0.29": version "0.0.29" @@ -1391,14 +1391,16 @@ integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.3.tgz#dd249cef80c6fff2ba6a0d4e5beca913e04e25f8" + integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== "@types/node@*": - version "20.5.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" - integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== + version "20.8.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.6.tgz#0dbd4ebcc82ad0128df05d0e6f57e05359ee47fa" + integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== + dependencies: + undici-types "~5.25.1" "@types/node@18.15.11": version "18.15.11" @@ -1406,9 +1408,9 @@ integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" + integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1423,16 +1425,16 @@ postcss "^8.0.0" "@types/postcss-modules-scope@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.1.tgz#f0ad443c2f31f90feacb83bb357692d581388afd" - integrity sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.2.tgz#add319dfc692d741dde1cc33c68b4e02b5a3f6d3" + integrity sha512-Q+OIqRncPV2WB+HXFA9WSZmIhDMUqxE5HgU81WA4oof3NutXhh8bHzB5ypbxRKi8NaPzByoSR5o9qHYW1lMOAg== dependencies: postcss "^8.0.0" "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.8" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" + integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== "@types/react-dom@18.2.4": version "18.2.4" @@ -1442,9 +1444,9 @@ "@types/react" "*" "@types/react-redux@^7.1.16": - version "7.1.26" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.26.tgz#84149f5614e40274bb70fcbe8f7cae6267d548b1" - integrity sha512-UKPo7Cm7rswYU6PH6CmTNCRv5NYF3HrgKuHEYTK8g/3czYLrUux50gQ2pkxc9c7ZpQZi+PNhgmI8oNIRoiVIxg== + version "7.1.27" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.27.tgz#1afb31f7354bf787e162c10ff3fa19bafa9e6b57" + integrity sha512-xj7d9z32p1K/eBmO+OEy+qfaWXtcPlN8f1Xk3Ne0p/ZRQ867RI5bQ/bpBtxbqU1AHNhKJSgGvld/P2myU2uYkg== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" @@ -1483,9 +1485,9 @@ "@types/react" "*" "@types/react@*": - version "18.2.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" - integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== + version "18.2.28" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.28.tgz#86877465c0fcf751659a36c769ecedfcfacee332" + integrity sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -1501,31 +1503,31 @@ csstype "^3.0.2" "@types/readdir-glob@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.1.tgz#27ac2db283e6aa3d110b14ff9da44fcd1a5c38b1" - integrity sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.2.tgz#688a206aa258a3a5d17c7b053da3b9e04eabf431" + integrity sha512-vwAYrNN/8yhp/FJRU6HUSD0yk6xfoOS8HrZa8ZL7j+X8hJpaC1hTcAiXX2IxaAkkvrz9mLyoEhYZTE3cEYvA9Q== dependencies: "@types/node" "*" "@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + version "0.16.4" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" + integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== "@types/semver@^7.3.12": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== "@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + version "0.1.3" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.3.tgz#077e15c87fe06520e30396a533bd9848e735ce9b" + integrity sha512-I9R/7fUjzUOyDy6AFkehCK711wWoAXEaBi80AfjZt1lIkbe6AcXKd3ckQc3liMvQExWvfOeh/8CtKzrfUFN5gA== "@types/tapable@^1": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" - integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.9.tgz#1481a4236267dd2d0ca2a637adb90f0ccb3d69c4" + integrity sha512-fOHIwZua0sRltqWzODGUM6b4ffZrf/vzGUmNXdR+4DzuJP42PMbM5dLKcdzlYvv8bMJ3GALOzkk1q7cDm2zPyA== "@types/uglify-js@*": version "3.17.2" @@ -1542,18 +1544,18 @@ "@types/webpack" "^4" "@types/webpack-sources@*": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" - integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.1.tgz#98670b35fa799c44ac235910f3fda9bfdcdbc2c6" + integrity sha512-iLC3Fsx62ejm3ST3PQ8vBMC54Rb3EoCprZjeJGI5q+9QjfDLGt9jeg/k245qz1G9AQnORGk0vqPicJFPT1QODQ== dependencies: "@types/node" "*" "@types/source-list-map" "*" source-map "^0.7.3" "@types/webpack@^4": - version "4.41.33" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" - integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== + version "4.41.34" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.34.tgz#8cf616be84b39c8fb26f9459d4470a5514df2477" + integrity sha512-CN2aOGrR3zbMc2v+cKqzaClYP1ldkpPOgtdNvgX+RmlWCSWxHxpzz6WSCVQZRkF8D60ROlkRzAoEpgjWQ+bd2g== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -2047,44 +2049,45 @@ array-union@^2.1.0: integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" @@ -2142,28 +2145,28 @@ babel-plugin-inline-classnames@2.0.1: integrity sha512-Pq/jJ6hTiGiqcMmy2d4CyJcfBDeUHOdQl1t1MDWNaSKR2RxDmShSAx4Zqz6NDmFaiinaRqF8eQoTVgSRGU+McQ== babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== + version "0.4.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== + version "0.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz#a75fa1b0c3fc5bd6837f9ec465c0f48031b8cab1" + integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.31.0" + "@babel/helper-define-polyfill-provider" "^0.4.3" + core-js-compat "^3.32.2" babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" babel-plugin-transform-react-remove-prop-types@0.4.24: version "0.4.24" @@ -2254,15 +2257,15 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +browserslist@^4.14.5, browserslist@^4.21.5, browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + update-browserslist-db "^1.0.13" buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" @@ -2327,10 +2330,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: - version "1.0.30001525" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" - integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== +caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001541: + version "1.0.30001549" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz#7d1a3dce7ea78c06ed72c32c2743ea364b3615aa" + integrity sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA== chalk@^1.1.3: version "1.1.3" @@ -2550,17 +2553,17 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== +core-js-compat@^3.31.0, core-js-compat@^3.32.2: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" + integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== dependencies: - browserslist "^4.21.10" + browserslist "^4.22.1" -core-js@3.32.1: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.1.tgz#a7d8736a3ed9dd05940c3c4ff32c591bb735be77" - integrity sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ== +core-js@3.33.0: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.0.tgz#70366dbf737134761edb017990cf5ce6c6369c40" + integrity sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw== core-js@^2.4.0: version "2.6.12" @@ -2584,9 +2587,9 @@ cosmiconfig@^7.0.1: yaml "^1.10.0" cosmiconfig@^8.1.3: - version "8.3.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.3.tgz#45985f9f39f3c9330288ef642b1dcb7342bd76d7" - integrity sha512-/VY+0IvFoE47hwgKHu8feeBFIb1Z1mcJFiLrNwaJpLoLa9qwLVquMGMr2OUwQmhpJDtsSQSasg/TMv1imec9xA== + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" js-yaml "^4.1.0" @@ -2753,11 +2756,21 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-data-property@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -2886,10 +2899,10 @@ dotenv@^16.0.3: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== -electron-to-chromium@^1.4.477: - version "1.4.508" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" - integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== +electron-to-chromium@^1.4.535: + version "1.4.554" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz#04e09c2ee31dc0f1546174033809b54cc372740b" + integrity sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ== element-class@0.2.2: version "0.2.2" @@ -2959,18 +2972,18 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.20.4, es-abstract@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== dependencies: array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" + function.prototype.name "^1.1.6" get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" @@ -2986,28 +2999,28 @@ es-abstract@^1.20.4, es-abstract@^1.22.1: is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" typed-array-buffer "^1.0.0" typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" + which-typed-array "^1.1.11" es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -3414,18 +3427,18 @@ find-up@^6.3.0: path-exists "^5.0.0" flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== focus-lock@^0.11.6: version "0.11.6" @@ -3460,9 +3473,9 @@ fork-ts-checker-webpack-plugin@8.0.0: tapable "^2.2.1" fraction.js@^4.2.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs-constants@^1.0.0: version "1.0.0" @@ -3479,9 +3492,9 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: universalify "^2.0.0" fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" @@ -3494,11 +3507,11 @@ fsevents@~2.3.2: integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: +function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -3604,9 +3617,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -3720,11 +3733,9 @@ has-tostringtag@^1.0.0: has-symbols "^1.0.2" has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== he@^1.2.0: version "1.2.0" @@ -3967,7 +3978,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== @@ -4071,7 +4082,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -4135,9 +4146,9 @@ jest-worker@^27.4.5: supports-color "^8.0.0" jiti@^1.18.2: - version "1.19.3" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" - integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== jquery@3.7.0: version "3.7.0" @@ -4228,9 +4239,9 @@ just-curry-it@^3.1.0: integrity sha512-Q8206k8pTY7krW32cdmPsP+DqqLgWx/hYPSj9/+7SYqSqz7UuwPbfSe07lQtvuuaVyiSJveXk0E5RydOuWwsEg== keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -4657,9 +4668,9 @@ minipass@^4.2.4: integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" - integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== mkdirp@^0.5.6: version "0.5.6" @@ -5215,10 +5226,10 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.23: - version "8.4.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== +postcss@8.4.31, postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -5233,15 +5244,6 @@ postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23: - version "8.4.29" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" - integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - prefix-style@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06" @@ -5725,9 +5727,9 @@ redux@4.2.1, redux@^4.0.0, redux@^4.1.1: "@babel/runtime" "^7.9.2" regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -5753,14 +5755,14 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" regexpu-core@^5.3.1: version "5.3.2" @@ -5850,20 +5852,20 @@ resolve-pathname@^3.0.0: integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -5907,13 +5909,13 @@ run-sequence@2.2.1: fancy-log "^1.3.2" plugin-error "^0.1.2" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" @@ -5947,15 +5949,20 @@ safe-regex-test@^1.0.0: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass@^1.58.3: - version "1.66.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" - integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== + version "1.69.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.3.tgz#f8a0c488697e6419519834a13335e7b65a609c11" + integrity sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -6026,6 +6033,15 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -6133,9 +6149,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== stack-generator@^2.0.5: version "2.0.10" @@ -6189,9 +6205,9 @@ string-width@^4.2.3: strip-ansi "^6.0.1" string.prototype.matchall@^4.0.8: - version "4.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" - integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" @@ -6200,34 +6216,35 @@ string.prototype.matchall@^4.0.8: has-symbols "^1.0.3" internal-slot "^1.0.5" regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" side-channel "^1.0.4" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@0.10: version "0.10.31" @@ -6444,9 +6461,9 @@ terser-webpack-plugin@5.3.9, terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.10.0, terser@^5.16.8: - version "5.19.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" - integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== + version "5.21.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" + integrity sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -6695,6 +6712,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -6728,10 +6750,10 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -6865,10 +6887,10 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@5.88.1: - version "5.88.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8" - integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== +webpack@5.89.0: + version "5.89.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -6928,7 +6950,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.10, which-typed-array@^1.1.11: +which-typed-array@^1.1.11: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== From 980bd35f95164a56c12a472f1fe8935ecc05dad6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 14 Oct 2023 15:31:37 +0300 Subject: [PATCH 252/964] Revert dependencies update --- yarn.lock | 886 ++++++++++++++++++++++++++---------------------------- 1 file changed, 432 insertions(+), 454 deletions(-) diff --git a/yarn.lock b/yarn.lock index 583e985ba..3713eb241 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,7 +20,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.13": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -29,9 +29,9 @@ chalk "^2.4.2" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@7.22.11": version "7.22.11" @@ -63,12 +63,12 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.10", "@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.22.10" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -81,32 +81,32 @@ "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" + integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.22.10" -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" + integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" + "@babel/helper-validator-option" "^7.22.5" browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" - integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" + integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-member-expression-to-functions" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -114,18 +114,18 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" - integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -133,18 +133,18 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -153,30 +153,30 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.15": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.22.5" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -190,22 +190,22 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" - integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -234,63 +234,63 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== -"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== -"@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== +"@babel/helper-wrap-function@^7.22.9": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" + integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== dependencies: "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.10" "@babel/helpers@^7.22.11": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" + integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" "@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.22.11", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.22.11", "@babel/parser@^7.22.5": + version "7.22.14" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" + integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" - integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" - integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-optional-chaining" "^7.22.5" "@babel/plugin-proposal-export-default-from@7.22.5": version "7.22.5" @@ -461,13 +461,13 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-async-generator-functions@^7.22.11": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" - integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" + integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-remap-async-to-generator" "^7.22.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-to-generator@^7.22.5": @@ -487,9 +487,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-block-scoping@^7.22.10": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" - integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" + integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -511,17 +511,17 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-transform-classes@^7.22.6": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" - integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" @@ -534,9 +534,9 @@ "@babel/template" "^7.22.5" "@babel/plugin-transform-destructuring@^7.22.10": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" - integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" + integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -580,9 +580,9 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-transform-for-of@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" - integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -626,31 +626,31 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-modules-amd@^7.22.5": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" - integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-modules-commonjs@^7.22.11": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" + integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== dependencies: - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" "@babel/plugin-transform-modules-systemjs@^7.22.11": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" - integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.22.5" "@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" @@ -692,15 +692,15 @@ "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-transform-object-rest-spread@^7.22.11": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" - integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" + integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.5" "@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" @@ -718,19 +718,19 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.15": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" - integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== +"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" + integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.15", "@babel/plugin-transform-parameters@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" - integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -774,15 +774,15 @@ "@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" - integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-module-imports" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.15" + "@babel/types" "^7.22.5" "@babel/plugin-transform-react-pure-annotations@^7.22.5": version "7.22.5" @@ -844,12 +844,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typescript@^7.22.11": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" - integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.11.tgz#9f27fb5e51585729374bb767ab6a6d9005a23329" + integrity sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-create-class-features-plugin" "^7.22.11" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-typescript" "^7.22.5" @@ -1008,60 +1008,60 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" - integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" + integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/traverse@^7.22.11", "@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" + integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/parser" "^7.22.11" + "@babel/types" "^7.22.11" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.22.11", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" + integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" "@csstools/css-parser-algorithms@^2.1.1": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz#1e0d581dbf4518cb3e939c3b863cb7180c8cedad" - integrity sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz#ec4fc764ba45d2bb7ee2774667e056aa95003f3a" + integrity sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA== "@csstools/css-tokenizer@^2.1.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz#9dc431c9a5f61087af626e41ac2a79cce7bb253d" - integrity sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz#9d70e6dcbe94e44c7400a2929928db35c4de32b5" + integrity sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA== "@csstools/media-query-list-parser@^2.0.4": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz#94bc8b3c3fd7112a40b7bf0b483e91eba0654a0f" - integrity sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ== + version "2.1.4" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz#0017f99945f6c16dd81a7aacf6821770933c3a5c" + integrity sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw== "@csstools/selector-specificity@^2.2.0": version "2.2.0" @@ -1081,9 +1081,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" - integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== "@eslint/eslintrc@^2.1.0": version "2.1.2" @@ -1330,32 +1330,32 @@ tslib "^1.9.3" "@types/archiver@^5.3.1": - version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.3.tgz#9cb632a67060602b1658c669b498d51dd8ce08ab" - integrity sha512-0ABdVcXL6jOwNGY+hjWPqrxUvKelBEwNLcuv/SV2vZ4YCH8w9NttFCt+/QqI5zgMX+iX/XqVy89/r7EmLJmMpQ== + version "5.3.2" + resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.2.tgz#a9f0bcb0f0b991400e7766d35f6e19d163bdadcc" + integrity sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw== dependencies: "@types/readdir-glob" "*" "@types/eslint-scope@^3.7.3": - version "3.7.5" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" - integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.4" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.4.tgz#28eaff82e1ca0a96554ec5bb0188f10ae1a74c2f" - integrity sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA== + version "8.44.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" + integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" - integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/history@^4.7.11": version "4.7.11" @@ -1363,9 +1363,9 @@ integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/hoist-non-react-statics@^3.3.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.3.tgz#8bb41d9a88164f82dd2745ff05e637e655f34d19" - integrity sha512-Wny3a2UXn5FEA1l7gc6BbpoV5mD1XijZqgkp4TRgDCDL5r3B5ieOFGUX5h3n78Tr1MEG7BfvoM8qeztdvNU0fw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" @@ -1376,9 +1376,9 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" @@ -1391,16 +1391,14 @@ integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/minimist@^1.2.0": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.3.tgz#dd249cef80c6fff2ba6a0d4e5beca913e04e25f8" - integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "20.8.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.6.tgz#0dbd4ebcc82ad0128df05d0e6f57e05359ee47fa" - integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== - dependencies: - undici-types "~5.25.1" + version "20.5.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" + integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== "@types/node@18.15.11": version "18.15.11" @@ -1408,9 +1406,9 @@ integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== "@types/normalize-package-data@^2.4.0": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" - integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1425,16 +1423,16 @@ postcss "^8.0.0" "@types/postcss-modules-scope@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.2.tgz#add319dfc692d741dde1cc33c68b4e02b5a3f6d3" - integrity sha512-Q+OIqRncPV2WB+HXFA9WSZmIhDMUqxE5HgU81WA4oof3NutXhh8bHzB5ypbxRKi8NaPzByoSR5o9qHYW1lMOAg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.1.tgz#f0ad443c2f31f90feacb83bb357692d581388afd" + integrity sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg== dependencies: postcss "^8.0.0" "@types/prop-types@*": - version "15.7.8" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" - integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/react-dom@18.2.4": version "18.2.4" @@ -1444,9 +1442,9 @@ "@types/react" "*" "@types/react-redux@^7.1.16": - version "7.1.27" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.27.tgz#1afb31f7354bf787e162c10ff3fa19bafa9e6b57" - integrity sha512-xj7d9z32p1K/eBmO+OEy+qfaWXtcPlN8f1Xk3Ne0p/ZRQ867RI5bQ/bpBtxbqU1AHNhKJSgGvld/P2myU2uYkg== + version "7.1.26" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.26.tgz#84149f5614e40274bb70fcbe8f7cae6267d548b1" + integrity sha512-UKPo7Cm7rswYU6PH6CmTNCRv5NYF3HrgKuHEYTK8g/3czYLrUux50gQ2pkxc9c7ZpQZi+PNhgmI8oNIRoiVIxg== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" @@ -1485,9 +1483,9 @@ "@types/react" "*" "@types/react@*": - version "18.2.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.28.tgz#86877465c0fcf751659a36c769ecedfcfacee332" - integrity sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg== + version "18.2.21" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" + integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -1503,31 +1501,31 @@ csstype "^3.0.2" "@types/readdir-glob@*": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.2.tgz#688a206aa258a3a5d17c7b053da3b9e04eabf431" - integrity sha512-vwAYrNN/8yhp/FJRU6HUSD0yk6xfoOS8HrZa8ZL7j+X8hJpaC1hTcAiXX2IxaAkkvrz9mLyoEhYZTE3cEYvA9Q== + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.1.tgz#27ac2db283e6aa3d110b14ff9da44fcd1a5c38b1" + integrity sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ== dependencies: "@types/node" "*" "@types/scheduler@*": - version "0.16.4" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" - integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@types/semver@^7.3.12": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" - integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== "@types/source-list-map@*": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.3.tgz#077e15c87fe06520e30396a533bd9848e735ce9b" - integrity sha512-I9R/7fUjzUOyDy6AFkehCK711wWoAXEaBi80AfjZt1lIkbe6AcXKd3ckQc3liMvQExWvfOeh/8CtKzrfUFN5gA== + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== "@types/tapable@^1": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.9.tgz#1481a4236267dd2d0ca2a637adb90f0ccb3d69c4" - integrity sha512-fOHIwZua0sRltqWzODGUM6b4ffZrf/vzGUmNXdR+4DzuJP42PMbM5dLKcdzlYvv8bMJ3GALOzkk1q7cDm2zPyA== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/uglify-js@*": version "3.17.2" @@ -1544,18 +1542,18 @@ "@types/webpack" "^4" "@types/webpack-sources@*": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.1.tgz#98670b35fa799c44ac235910f3fda9bfdcdbc2c6" - integrity sha512-iLC3Fsx62ejm3ST3PQ8vBMC54Rb3EoCprZjeJGI5q+9QjfDLGt9jeg/k245qz1G9AQnORGk0vqPicJFPT1QODQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== dependencies: "@types/node" "*" "@types/source-list-map" "*" source-map "^0.7.3" "@types/webpack@^4": - version "4.41.34" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.34.tgz#8cf616be84b39c8fb26f9459d4470a5514df2477" - integrity sha512-CN2aOGrR3zbMc2v+cKqzaClYP1ldkpPOgtdNvgX+RmlWCSWxHxpzz6WSCVQZRkF8D60ROlkRzAoEpgjWQ+bd2g== + version "4.41.33" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -2049,45 +2047,44 @@ array-union@^2.1.0: integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" array.prototype.tosorted@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" - integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + get-intrinsic "^1.1.3" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" - es-abstract "^1.22.1" get-intrinsic "^1.2.1" is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" @@ -2145,28 +2142,28 @@ babel-plugin-inline-classnames@2.0.1: integrity sha512-Pq/jJ6hTiGiqcMmy2d4CyJcfBDeUHOdQl1t1MDWNaSKR2RxDmShSAx4Zqz6NDmFaiinaRqF8eQoTVgSRGU+McQ== babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" - integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.3" + "@babel/helper-define-polyfill-provider" "^0.4.2" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz#a75fa1b0c3fc5bd6837f9ec465c0f48031b8cab1" - integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.3" - core-js-compat "^3.32.2" + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" - integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.3" + "@babel/helper-define-polyfill-provider" "^0.4.2" babel-plugin-transform-react-remove-prop-types@0.4.24: version "0.4.24" @@ -2257,15 +2254,15 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.5, browserslist@^4.21.9, browserslist@^4.22.1: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== +browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" node-releases "^2.0.13" - update-browserslist-db "^1.0.13" + update-browserslist-db "^1.0.11" buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" @@ -2330,10 +2327,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001541: - version "1.0.30001549" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz#7d1a3dce7ea78c06ed72c32c2743ea364b3615aa" - integrity sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA== +caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: + version "1.0.30001525" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" + integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== chalk@^1.1.3: version "1.1.3" @@ -2553,12 +2550,12 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -core-js-compat@^3.31.0, core-js-compat@^3.32.2: - version "3.33.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" - integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== +core-js-compat@^3.31.0: + version "3.32.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" + integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== dependencies: - browserslist "^4.22.1" + browserslist "^4.21.10" core-js@3.33.0: version "3.33.0" @@ -2587,9 +2584,9 @@ cosmiconfig@^7.0.1: yaml "^1.10.0" cosmiconfig@^8.1.3: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + version "8.3.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.3.tgz#45985f9f39f3c9330288ef642b1dcb7342bd76d7" + integrity sha512-/VY+0IvFoE47hwgKHu8feeBFIb1Z1mcJFiLrNwaJpLoLa9qwLVquMGMr2OUwQmhpJDtsSQSasg/TMv1imec9xA== dependencies: import-fresh "^3.3.0" js-yaml "^4.1.0" @@ -2756,21 +2753,11 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-data-property@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: - define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -2899,10 +2886,10 @@ dotenv@^16.0.3: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== -electron-to-chromium@^1.4.535: - version "1.4.554" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz#04e09c2ee31dc0f1546174033809b54cc372740b" - integrity sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ== +electron-to-chromium@^1.4.477: + version "1.4.508" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" + integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== element-class@0.2.2: version "0.2.2" @@ -2972,18 +2959,18 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" - integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== +es-abstract@^1.20.4, es-abstract@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" + function.prototype.name "^1.1.5" get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" @@ -2999,28 +2986,28 @@ es-abstract@^1.22.1: is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.12" + is-typed-array "^1.1.10" is-weakref "^1.0.2" object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" typed-array-buffer "^1.0.0" typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.11" + which-typed-array "^1.1.10" es-module-lexer@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" - integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -3427,18 +3414,18 @@ find-up@^6.3.0: path-exists "^5.0.0" flat-cache@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" - integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.2.9" + flatted "^3.2.7" keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +flatted@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== focus-lock@^0.11.6: version "0.11.6" @@ -3473,9 +3460,9 @@ fork-ts-checker-webpack-plugin@8.0.0: tapable "^2.2.1" fraction.js@^4.2.0: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + version "4.3.6" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== fs-constants@^1.0.0: version "1.0.0" @@ -3492,9 +3479,9 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: universalify "^2.0.0" fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== fs.realpath@^1.0.0: version "1.0.0" @@ -3507,11 +3494,11 @@ fsevents@~2.3.2: integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.6: +function.prototype.name@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -3617,9 +3604,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.23.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" - integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -3733,9 +3720,11 @@ has-tostringtag@^1.0.0: has-symbols "^1.0.2" has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" he@^1.2.0: version "1.2.0" @@ -3978,7 +3967,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0: +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== @@ -4082,7 +4071,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -4146,9 +4135,9 @@ jest-worker@^27.4.5: supports-color "^8.0.0" jiti@^1.18.2: - version "1.20.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" - integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + version "1.19.3" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" + integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== jquery@3.7.0: version "3.7.0" @@ -4239,9 +4228,9 @@ just-curry-it@^3.1.0: integrity sha512-Q8206k8pTY7krW32cdmPsP+DqqLgWx/hYPSj9/+7SYqSqz7UuwPbfSe07lQtvuuaVyiSJveXk0E5RydOuWwsEg== keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== dependencies: json-buffer "3.0.1" @@ -4668,9 +4657,9 @@ minipass@^4.2.4: integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + version "7.0.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" + integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== mkdirp@^0.5.6: version "0.5.6" @@ -5226,7 +5215,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.31, postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23: +postcss@8.4.31: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -5244,6 +5233,15 @@ postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" +postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23: + version "8.4.29" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prefix-style@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06" @@ -5727,9 +5725,9 @@ redux@4.2.1, redux@^4.0.0, redux@^4.1.1: "@babel/runtime" "^7.9.2" regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" @@ -5755,14 +5753,14 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - set-function-name "^2.0.0" + functions-have-names "^1.2.3" regexpu-core@^5.3.1: version "5.3.2" @@ -5852,20 +5850,20 @@ resolve-pathname@^3.0.0: integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.4: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -5909,13 +5907,13 @@ run-sequence@2.2.1: fancy-log "^1.3.2" plugin-error "^0.1.2" -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.1" + get-intrinsic "^1.2.0" has-symbols "^1.0.3" isarray "^2.0.5" @@ -5949,20 +5947,15 @@ safe-regex-test@^1.0.0: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass@^1.58.3: - version "1.69.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.3.tgz#f8a0c488697e6419519834a13335e7b65a609c11" - integrity sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ== + version "1.66.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" + integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== - -sax@~1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -6033,15 +6026,6 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== - dependencies: - define-data-property "^1.0.1" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" - shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -6149,9 +6133,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== stack-generator@^2.0.5: version "2.0.10" @@ -6205,9 +6189,9 @@ string-width@^4.2.3: strip-ansi "^6.0.1" string.prototype.matchall@^4.0.8: - version "4.0.10" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" - integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + version "4.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" + integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" @@ -6216,35 +6200,34 @@ string.prototype.matchall@^4.0.8: has-symbols "^1.0.3" internal-slot "^1.0.5" regexp.prototype.flags "^1.5.0" - set-function-name "^2.0.0" side-channel "^1.0.4" -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" string_decoder@0.10: version "0.10.31" @@ -6461,9 +6444,9 @@ terser-webpack-plugin@5.3.9, terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.10.0, terser@^5.16.8: - version "5.21.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" - integrity sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw== + version "5.19.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" + integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -6712,11 +6695,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -6750,10 +6728,10 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -6950,7 +6928,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.11: +which-typed-array@^1.1.10, which-typed-array@^1.1.11: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== From dace1982d6e975bb3c88bbbe22249c2e55ee3492 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 15 Oct 2023 17:44:50 +0300 Subject: [PATCH 253/964] Fixed: (FileList) Use air date in search query --- .../FileList/FileListRequestGenerator.cs | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListRequestGenerator.cs index f422fbf16..918a80815 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListRequestGenerator.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Globalization; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; @@ -25,6 +26,25 @@ public class FileListRequestGenerator : IIndexerRequestGenerator { parameters.Set("action", "search-torrents"); + var searchQuery = searchCriteria.SanitizedSearchTerm.Trim(); + + if (DateTime.TryParseExact($"{searchCriteria.Season} {searchCriteria.Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate)) + { + searchQuery = $"{searchQuery} {showDate:yyyy.MM.dd}".Trim(); + } + else + { + if (searchCriteria.Season.HasValue) + { + parameters.Set("season", searchCriteria.Season.ToString()); + } + + if (searchCriteria.Episode.IsNotNullOrWhiteSpace()) + { + parameters.Set("episode", searchCriteria.Episode); + } + } + if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace()) { parameters.Set("type", "imdb"); @@ -33,17 +53,7 @@ public class FileListRequestGenerator : IIndexerRequestGenerator else if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace()) { parameters.Set("type", "name"); - parameters.Set("query", searchCriteria.SanitizedSearchTerm.Trim()); - } - - if (searchCriteria.Season.HasValue) - { - parameters.Set("season", searchCriteria.Season.ToString()); - } - - if (searchCriteria.Episode.IsNotNullOrWhiteSpace()) - { - parameters.Set("episode", searchCriteria.Episode); + parameters.Set("query", searchQuery); } } From be3ee00e1fa9784b1c3be36948411f83c9e6fe0e Mon Sep 17 00:00:00 2001 From: Gabe Date: Sun, 15 Oct 2023 17:55:32 +0200 Subject: [PATCH 254/964] Fixed: Remove Defunct Tracker PirateTheNet PTN closed down for good. They had an official announcement to close down on the 14th October. Aither offered to accept refugees. See /forums/topics/2535 on aither for more context. Description The definition is no longer needed as the tracker ceased all operation. --- src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs b/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs index a1e9d37bb..53adf8e30 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs @@ -19,7 +19,7 @@ using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions; - +[Obsolete("PirateTheNet has shutdown 2023-10-14")] public class PirateTheNet : TorrentIndexerBase { public override string Name => "PirateTheNet"; From c7959f735e6b385a452cc1ebafea240b670a8dc3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 15 Oct 2023 21:46:33 +0300 Subject: [PATCH 255/964] Bump version to 1.10.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f2dc32fdc..0933a411c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.9.4' + majorVersion: '1.10.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 4366530409fd7b8dc557d9f5134d923212a25289 Mon Sep 17 00:00:00 2001 From: DaftFuzz <35006874+DaftFuzz@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:21:40 +0100 Subject: [PATCH 256/964] Fixed: Calculating value for peers filter (#1900) Co-authored-by: Bogdan --- frontend/src/Store/Actions/releaseActions.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/frontend/src/Store/Actions/releaseActions.js b/frontend/src/Store/Actions/releaseActions.js index 803cb1da1..7ade2652d 100644 --- a/frontend/src/Store/Actions/releaseActions.js +++ b/frontend/src/Store/Actions/releaseActions.js @@ -3,7 +3,7 @@ import React from 'react'; import { createAction } from 'redux-actions'; import { batchActions } from 'redux-batched-actions'; import Icon from 'Components/Icon'; -import { filterBuilderTypes, filterBuilderValueTypes, icons, sortDirections } from 'Helpers/Props'; +import { filterBuilderTypes, filterBuilderValueTypes, filterTypePredicates, icons, sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; import getSectionState from 'Utilities/State/getSectionState'; @@ -169,6 +169,18 @@ export const defaultState = { } ], + filterPredicates: { + peers: function(item, filterValue, type) { + const predicate = filterTypePredicates[type]; + + const seeders = item.seeders || 0; + const leechers = item.leechers || 0; + const peers = seeders + leechers; + + return predicate(peers, filterValue); + } + }, + filterBuilderProps: [ { name: 'title', From b37d8799a0a4e79fd3249955760e4f6b0ac8f179 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 16 Oct 2023 18:45:06 +0300 Subject: [PATCH 257/964] Add acronym for PrivateHD --- src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs b/src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs index f12975ee4..21fc76ede 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs @@ -10,7 +10,7 @@ namespace NzbDrone.Core.Indexers.Definitions { public override string Name => "PrivateHD"; public override string[] IndexerUrls => new[] { "https://privatehd.to/" }; - public override string Description => "PrivateHD is a Private Torrent Tracker for HD MOVIES / TV and the sister-site of AvistaZ, CinemaZ, ExoticaZ, and AnimeTorrents"; + public override string Description => "PrivateHD (PHD) is a Private Torrent Tracker for HD MOVIES / TV and the sister-site of AvistaZ, CinemaZ, ExoticaZ, and AnimeTorrents"; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public PrivateHD(IIndexerRepository indexerRepository, From db9f06156425782c79a2cfce8d944d867a4be929 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 20 Oct 2023 00:13:55 +0300 Subject: [PATCH 258/964] Return TV category if season/episode detected in title for PTP --- .../PassThePopcorn/PassThePopcorn.cs | 2 +- .../PassThePopcorn/PassThePopcornParser.cs | 20 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs index c18a07a36..046e0e250 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs @@ -34,7 +34,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn public override IParseIndexerResponse GetParser() { - return new PassThePopcornParser(Settings, _logger); + return new PassThePopcornParser(Settings); } private IndexerCapabilities SetCapabilities() diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index c5680d6f1..bc4d11463 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Net; -using NLog; +using System.Text.RegularExpressions; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; @@ -14,12 +14,12 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn public class PassThePopcornParser : IParseIndexerResponse { private readonly PassThePopcornSettings _settings; - private readonly Logger _logger; - public PassThePopcornParser(PassThePopcornSettings settings, Logger logger) + private static Regex SeasonRegex => new (@"\bS\d{2,3}(E\d{2,3})?\b", RegexOptions.Compiled); + + public PassThePopcornParser(PassThePopcornSettings settings) { _settings = settings; - _logger = logger; } public IList ParseResponse(IndexerResponse indexerResponse) @@ -57,6 +57,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn foreach (var torrent in result.Torrents) { var id = torrent.Id; + var title = torrent.ReleaseName; var flags = new HashSet(); @@ -70,14 +71,21 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn flags.Add(PassThePopcornFlag.Approved); } + var categories = new List { NewznabStandardCategory.Movies }; + + if (title != null && SeasonRegex.Match(title).Success) + { + categories.Add(NewznabStandardCategory.TV); + } + torrentInfos.Add(new TorrentInfo { Guid = $"PassThePopcorn-{id}", - Title = torrent.ReleaseName, + Title = title, Year = int.Parse(result.Year), InfoUrl = GetInfoUrl(result.GroupId, id), DownloadUrl = GetDownloadUrl(id, jsonResponse.AuthKey, jsonResponse.PassKey), - Categories = new List { NewznabStandardCategory.Movies }, + Categories = categories, Size = long.Parse(torrent.Size), Grabs = int.Parse(torrent.Snatched), Seeders = int.Parse(torrent.Seeders), From 62548f32fe3eec41ebeddf2cda181e269cf94513 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 21 Oct 2023 12:46:50 +0300 Subject: [PATCH 259/964] Fixed: (FileList) Skip ID searches for daily episodes --- .../Definitions/FileList/FileListRequestGenerator.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListRequestGenerator.cs index 918a80815..08937d679 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListRequestGenerator.cs @@ -30,6 +30,12 @@ public class FileListRequestGenerator : IIndexerRequestGenerator if (DateTime.TryParseExact($"{searchCriteria.Season} {searchCriteria.Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate)) { + if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace()) + { + // Skip ID searches for daily episodes + return pageableRequests; + } + searchQuery = $"{searchQuery} {showDate:yyyy.MM.dd}".Trim(); } else From 7e8272ec2b01155dc4a1c06f959b79a34c8d47b0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 22 Oct 2023 09:32:32 +0300 Subject: [PATCH 260/964] Bump version to 1.10.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0933a411c..c29daf2cc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.10.0' + majorVersion: '1.10.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From d834c4292e9aa888fd53da1cf512cb0b22d07c2a Mon Sep 17 00:00:00 2001 From: Jordy <65036298+JordyEGNL@users.noreply.github.com> Date: Wed, 25 Oct 2023 10:16:13 +0200 Subject: [PATCH 261/964] Update link to Docker instructions in readme (#1905) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2afa58cb..4973be54d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://dev.azure.com/Prowlarr/Prowlarr/_apis/build/status/Prowlarr.Prowlarr?branchName=develop)](https://dev.azure.com/Prowlarr/Prowlarr/_build/latest?definitionId=1&branchName=develop) [![Translated](https://translate.servarr.com/widgets/servarr/-/prowlarr/svg-badge.svg)](https://translate.servarr.com/engage/prowlarr/?utm_source=widget) -[![Docker Pulls](https://img.shields.io/docker/pulls/hotio/prowlarr.svg)](https://wiki.servarr.com/prowlarr/installation#docker) +[![Docker Pulls](https://img.shields.io/docker/pulls/hotio/prowlarr.svg)](https://wiki.servarr.com/prowlarr/installation/docker) ![Github Downloads](https://img.shields.io/github/downloads/Prowlarr/Prowlarr/total.svg) [![Backers on Open Collective](https://opencollective.com/Prowlarr/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/Prowlarr/sponsors/badge.svg)](#sponsors) From dd25bff3d64a4032bac04cf6fb817c7881a8c59a Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 22 Oct 2023 21:57:32 +0000 Subject: [PATCH 262/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Dlgeri123 Co-authored-by: Fixer Co-authored-by: Jhonata da Rocha Co-authored-by: LandonLi Co-authored-by: Lizandra Candido da Silva Co-authored-by: Weblate Co-authored-by: hpoon Co-authored-by: jianl Co-authored-by: 宿命 <331874545@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 4 +- src/NzbDrone.Core/Localization/Core/hu.json | 14 +-- src/NzbDrone.Core/Localization/Core/pt.json | 4 +- .../Localization/Core/pt_BR.json | 96 +++++++++---------- src/NzbDrone.Core/Localization/Core/ro.json | 5 +- .../Localization/Core/zh_CN.json | 28 +++--- 6 files changed, 79 insertions(+), 72 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index ec8dbb881..0784967a7 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -505,5 +505,7 @@ "DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren", "None": "Keine", "ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?", - "AddCustomFilter": "Eigenen Filter hinzufügen" + "AddCustomFilter": "Eigenen Filter hinzufügen", + "AddApplication": "Application hinzufügen", + "AddCategory": "Kategorie hinzufügen" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 29787539a..f82dfd6ab 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -47,7 +47,7 @@ "CertificateValidationHelpText": "Módosítsa a HTTPS tanúsítás szigorúságát", "CertificateValidation": "Tanúsítvány érvényesítése", "CancelPendingTask": "Biztosan törlöd ezt a függőben lévő feladatot?", - "Cancel": "Vissza", + "Cancel": "Mégse", "BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez", "BranchUpdateMechanism": "A külső frissítési mechanizmus által használt ágazat", "BranchUpdate": "Ágazattípus a Prowlarr frissítéseihez", @@ -55,19 +55,19 @@ "BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez", "BindAddress": "Kapcsolási Cím", "BeforeUpdate": "Alkalmazásfrissítés előtt", - "Backups": "Biztonsági Mentés", + "Backups": "Biztonsági mentések", "BackupRetentionHelpText": "A megőrzési időnél régebbi automatikus biztonsági másolatok automatikusan törlésre kerülnek", "BackupNow": "Biztonsági Mentés Most", "BackupIntervalHelpText": "Időeltérés a biztonsági mentések között", "BackupFolderHelpText": "Az elérési útvonalak a Prowlarr AppData könyvtárában lesznek", "Backup": "Biztonsági Mentés", - "AutomaticSearch": "Automatikus Keresés", + "AutomaticSearch": "Automatikus keresés", "Automatic": "Automatikus", "AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a Prowlarr szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely Prowlarr WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.", "AuthenticationMethodHelpText": "Felhasználónév és Jelszó szükséges a Prowlarr-hoz való hozzáféréshez", "Authentication": "Hitelesítés", "ApplyTags": "Címkék alkalmazása", - "Age": "Kora", + "Age": "Kor", "ApiKey": "API Kulcs", "All": "Összes", "AcceptConfirmationModal": "Változás Megerősítése", @@ -459,7 +459,7 @@ "TheLatestVersionIsAlreadyInstalled": "A Prowlarr legújabb verziója már telepítva van", "Remove": "Eltávolítás", "Replace": "Kicserél", - "ApplicationURL": "Alkalmazás URL-je", + "ApplicationURL": "Alkalmazás URL", "ApplicationUrlHelpText": "Az alkalmazás külső URL-címe, beleértve a http(s)://-t, a portot és az URL-alapot", "More": "Több", "Publisher": "Kiadó", @@ -501,5 +501,7 @@ "AuthForm": "Felhasználó (Bejelentkezési oldal)", "DisabledForLocalAddresses": "Letiltva a helyi címeknél", "None": "Nincs", - "ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?" + "ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?", + "AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót", + "AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index ed99e5039..6baea2bf8 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -444,5 +444,7 @@ "AuthForm": "Formulários (página de início de sessão)", "DisabledForLocalAddresses": "Desativado para endereços locais", "None": "Nenhum", - "ResetAPIKeyMessageText": "Tem a certeza que quer repor a Chave da API?" + "ResetAPIKeyMessageText": "Tem a certeza que quer repor a Chave da API?", + "ActiveApps": "Aplicações Ativadas", + "ActiveIndexers": "Indexadores ativados" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index bc3480ec5..fad60ea04 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -4,10 +4,10 @@ "Actions": "Ações", "Add": "Adicionar", "AddApplication": "Adicionar Aplicativo", - "AddCustomFilter": "Adicionar Filtro Personalizado", - "AddDownloadClient": "Adicionar Cliente de Download", + "AddCustomFilter": "Adicionar filtro personalizado", + "AddDownloadClient": "Adicionar cliente de download", "AddDownloadClientToProwlarr": "Adicionar um cliente de download possibilita que o Prowlarr envie lançamentos diretamente da interface ao executar uma pesquisa manual.", - "AddIndexer": "Adicionar Indexador", + "AddIndexer": "Adicionar indexador", "AddIndexerProxy": "Adicionar Proxy ao Indexador", "AddNewIndexer": "Adicionar novo indexador", "AddRemoveOnly": "Adicionar e remover apenas", @@ -16,13 +16,13 @@ "Added": "Adicionado", "AddedToDownloadClient": "Lançamento adicionado ao cliente", "AddingTag": "Adicionar tag", - "Age": "Idade", + "Age": "Tempo de vida", "Album": "Álbum", "All": "Todos", "AllIndexersHiddenDueToFilter": "Todos os indexadores estão ocultos devido ao filtro aplicado.", - "Analytics": "Analítica", + "Analytics": "Análises", "AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do Prowlarr. Isso inclui informações sobre seu navegador, quais páginas da interface Web do Prowlarr você usa, relatórios de erros, e a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.", - "ApiKey": "Chave API", + "ApiKey": "Chave da API", "ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração", "AppDataDirectory": "Diretório AppData", "AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização", @@ -34,8 +34,8 @@ "ApplicationLongTermStatusCheckSingleClientMessage": "Aplicativos indisponíveis devido a falhas por mais de 6 horas: {0}", "ApplicationStatusCheckAllClientMessage": "Não há aplicativos disponíveis devido a falhas", "ApplicationStatusCheckSingleClientMessage": "Aplicativos indisponíveis devido a falhas: {0}", - "ApplicationURL": "URL do Aplicativo", - "ApplicationUrlHelpText": "A URL externa deste aplicativo, incluindo http(s)://, porta e base da URL", + "ApplicationURL": "URL do aplicativo", + "ApplicationUrlHelpText": "A URL externa deste aplicativo, incluindo http(s)://, porta e URL base", "Applications": "Aplicativos", "Apply": "Aplicar", "ApplyTags": "Aplicar Tags", @@ -45,13 +45,13 @@ "AudioSearch": "Pesquisar Áudio", "Auth": "Autenticação", "Authentication": "Autenticação", - "AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar {appName}", - "AuthenticationRequired": "Autentificação Requerida", + "AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar o {appName}", + "AuthenticationRequired": "Autenticação exigida", "AuthenticationRequiredHelpText": "Altere para quais solicitações a autenticação é necessária. Não mude a menos que você entenda os riscos.", "AuthenticationRequiredWarning": "Para evitar o acesso remoto sem autenticação, {appName} agora exige que a autenticação esteja habilitada. Opcionalmente, você pode desabilitar a autenticação de endereços locais.", "Author": "Autor", "Automatic": "Automático", - "AutomaticSearch": "Pesquisa Automática", + "AutomaticSearch": "Pesquisa automática", "AverageResponseTimesMs": "Tempos Médios de Resposta do Indexador (ms)", "Backup": "Backup", "BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do Prowlarr", @@ -60,7 +60,7 @@ "BackupRetentionHelpText": "Backups automáticos anteriores ao período de retenção serão limpos automaticamente", "Backups": "Backups", "BeforeUpdate": "Antes da atualização", - "BindAddress": "Fixar Endereço", + "BindAddress": "Fixar endereço", "BindAddressHelpText": "Endereço IP válido, localhost ou '*' para todas as interfaces", "Book": "Livro", "BookSearch": "Pesquisar Livro", @@ -73,26 +73,26 @@ "CancelPendingTask": "Tem certeza de que deseja cancelar essa tarefa pendente?", "Categories": "Categorias", "Category": "Categoria", - "CertificateValidation": "Validação de Certificado", + "CertificateValidation": "Validação de certificado", "CertificateValidationHelpText": "Alterar o quão estrita é a validação da certificação HTTPS", "ChangeHasNotBeenSavedYet": "A alteração ainda não foi salva", "Clear": "Limpar", "ClearHistory": "Limpar histórico", "ClearHistoryMessageText": "Tem certeza de que deseja limpar o histórico do Prowlarr?", - "ClientPriority": "Prioridade do Cliente", - "CloneProfile": "Clonar Perfil", + "ClientPriority": "Prioridade do cliente", + "CloneProfile": "Clonar perfil", "Close": "Fechar", "CloseCurrentModal": "Fechar modal atual", "Columns": "Colunas", "Component": "Componente", "Connect": "Notificações", - "ConnectSettings": "Configurações de Conexão", + "ConnectSettings": "Configurações de conexão", "ConnectSettingsSummary": "Notificações e scripts personalizados", - "ConnectionLost": "Conexão Perdida", + "ConnectionLost": "Conexão perdida", "Connections": "Conexões", "CouldNotConnectSignalR": "Não é possível conectar ao SignalR, a interface não atualizará", - "Custom": "Personalizar", - "CustomFilters": "Filtros Personalizados", + "Custom": "Personalizado", + "CustomFilters": "Filtros personalizados", "DBMigration": "Migração de banco de dados", "Database": "Banco de dados", "Date": "Data", @@ -104,11 +104,11 @@ "DeleteBackup": "Excluir Backup", "DeleteBackupMessageText": "Tem certeza de que deseja excluir o backup '{name}'?", "DeleteClientCategory": "Excluir Categoria de Cliente de Download", - "DeleteDownloadClient": "Excluir Cliente de Download", + "DeleteDownloadClient": "Excluir cliente de download", "DeleteDownloadClientMessageText": "Tem certeza de que deseja excluir o cliente de download '{name}'?", "DeleteIndexerProxy": "Apagar Proxy do Indexador", "DeleteIndexerProxyMessageText": "Tem certeza de que deseja excluir o proxy do indexador '{name}'?", - "DeleteNotification": "Excluir Notificação", + "DeleteNotification": "Excluir notificação", "DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?", "DeleteTag": "Excluir tag", "DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?", @@ -120,9 +120,9 @@ "Discord": "Discord", "Docker": "Docker", "Donations": "Doações", - "DownloadClient": "Cliente de Download", + "DownloadClient": "Cliente de download", "DownloadClientCategory": "Categoria de Download do Cliente", - "DownloadClientSettings": "Configurações do Cliente de Download", + "DownloadClientSettings": "Configurações do cliente de download", "DownloadClientStatusCheckAllClientMessage": "Todos os clientes de download estão indisponíveis devido a falhas", "DownloadClientStatusCheckSingleClientMessage": "Clientes de download indisponíveis devido a falhas: {0}", "DownloadClients": "Clientes de download", @@ -137,7 +137,7 @@ "EnableAutomaticSearchHelpText": "Será usado ao realizar pesquisas automáticas pela interface ou pelo Prowlarr", "EnableIndexer": "Habilitar indexador", "EnableInteractiveSearch": "Ativar pesquisa interativa", - "EnableInteractiveSearchHelpText": "Será usado quando a pesquisa interativa for usada", + "EnableInteractiveSearchHelpText": "Será usado com a pesquisa interativa", "EnableRss": "Habilitar RSS", "EnableRssHelpText": "Habilitar feed RSS para o indexador", "EnableSSL": "Habilitar SSL", @@ -149,7 +149,7 @@ "Episode": "Episódio", "Error": "Erro", "ErrorLoadingContents": "Erro ao carregar o conteúdo", - "EventType": "Tipo de Evento", + "EventType": "Tipo de evento", "Events": "Eventos", "Exception": "Exceção", "ExistingTag": "Etiqueta existente", @@ -175,7 +175,7 @@ "Grabs": "Obtenções", "Health": "Saúde", "HealthNoIssues": "Nenhum problema com sua configuração", - "HideAdvanced": "Ocultar Avançado", + "HideAdvanced": "Ocultar opções avançadas", "History": "Histórico", "HistoryCleanup": "Histórico de Limpeza", "HistoryCleanupDaysHelpText": "Defina como 0 para desabilitar a limpeza automática", @@ -183,9 +183,9 @@ "HistoryDetails": "Detalhes do histórico", "HomePage": "Página inicial", "Host": "Host", - "Hostname": "Hostname", + "Hostname": "Nome do host", "Id": "ID", - "IgnoredAddresses": "Endereços Ignorados", + "IgnoredAddresses": "Endereços ignorados", "IllRestartLater": "Reiniciarei mais tarde", "IncludeHealthWarningsHelpText": "Incluir avisos de integridade", "IncludeManualGrabsHelpText": "Incluir Capturas Manuais feitas no Prowlarr", @@ -203,7 +203,7 @@ "IndexerName": "Nome do Indexador", "IndexerNoDefCheckMessage": "Os indexadores não têm definição e não funcionarão: {0}. Por favor, remova e (ou) adicione novamente ao Prowlarr", "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao Prowlarr", - "IndexerPriority": "Prioridade do Indexador", + "IndexerPriority": "Prioridade do indexador", "IndexerPriorityHelpText": "Prioridade do Indexador de 1 (Mais Alta) a 50 (Mais Baixa). Padrão: 25.", "IndexerProxies": "Proxies do Indexador", "IndexerProxy": "Proxy do Indexador", @@ -392,7 +392,7 @@ "SettingsShowRelativeDatesHelpText": "Mostrar datas absolutas ou relativas (Hoje, Ontem, etc.)", "SettingsSqlLoggingHelpText": "Registrar todas as consultas de SQL do Prowlarr", "SettingsTimeFormat": "Formato de hora", - "ShowAdvanced": "Mostrar Avançado", + "ShowAdvanced": "Mostrar opções avançadas", "ShowSearch": "Mostrar pesquisa", "ShowSearchHelpText": "Mostrar botão de pesquisa ao passar o mouse", "Shutdown": "Desligar", @@ -456,13 +456,13 @@ "URLBase": "URL base", "UnableToAddANewAppProfilePleaseTryAgain": "Não foi possível adicionar um novo perfil de aplicativo, tente novamente.", "UnableToAddANewApplicationPleaseTryAgain": "Não foi possível adicionar um novo aplicativo, tente novamente.", - "UnableToAddANewDownloadClientPleaseTryAgain": "Não foi possível adicionar um novo cliente de download, tente novamente.", - "UnableToAddANewIndexerPleaseTryAgain": "Não foi possível adicionar um novo indexador, tente novamente.", + "UnableToAddANewDownloadClientPleaseTryAgain": "Não foi possível adicionar um novo cliente de download. Tente novamente.", + "UnableToAddANewIndexerPleaseTryAgain": "Não foi possível adicionar um novo indexador. Tente novamente.", "UnableToAddANewIndexerProxyPleaseTryAgain": "Não foi possível adicionar um novo proxy indexador, tente novamente.", - "UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação, tente novamente.", + "UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação. Tente novamente.", "UnableToLoadAppProfiles": "Não foi possível carregar os perfis de aplicativos", "UnableToLoadApplicationList": "Não é possível carregar a lista de aplicativos", - "UnableToLoadBackups": "Não é possível carregar backups", + "UnableToLoadBackups": "Não foi possível carregar os backups", "UnableToLoadDevelopmentSettings": "Não foi possível carregar as configurações de desenvolvimento", "UnableToLoadDownloadClients": "Não foi possível carregar os clientes de download", "UnableToLoadGeneralSettings": "Não foi possível carregar as configurações gerais", @@ -556,39 +556,39 @@ "days": "dias", "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.", "DeleteAppProfileMessageText": "Tem certeza de que deseja excluir o perfil do aplicativo '{name}'?", - "AppUpdated": "{appName} Atualizado", + "AppUpdated": "{appName} atualizado", "AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}", - "ConnectionLostToBackend": "{appName} perdeu sua conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", + "ConnectionLostToBackend": "{appName} perdeu a conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", "RecentChanges": "Mudanças Recentes", "WhatsNew": "O que há de novo?", "ConnectionLostReconnect": "{appName} tentará se conectar automaticamente ou você pode clicar em recarregar abaixo.", "AddApplicationImplementation": "Adicionar Aplicativo - {implementationName}", - "AddConnectionImplementation": "Adicionar Conexão - {implementationName}", + "AddConnectionImplementation": "Adicionar conexão - {implementationName}", "EditApplicationImplementation": "Editar Aplicativo - {implementationName}", "AddCategory": "Adicionar Categoria", - "AddConnection": "Adicionar Conexão", - "AddDownloadClientImplementation": "Adicionar Cliente de Download - {implementationName}", - "AddIndexerImplementation": "Adicionar Indexador - {implementationName}", + "AddConnection": "Adicionar conexão", + "AddDownloadClientImplementation": "Adicionar cliente de download - {implementationName}", + "AddIndexerImplementation": "Adicionar indexador - {implementationName}", "AddIndexerProxyImplementation": "Adicionar Proxy do Indexador - {implementationName}", "EditCategory": "Editar Categoria", - "EditConnectionImplementation": "Editar Conexão - {implementationName}", - "EditDownloadClientImplementation": "Editar Cliente de Download - {implementationName}", - "EditIndexerImplementation": "Editar Indexador - {implementationName}", + "EditConnectionImplementation": "Editar conexão - {implementationName}", + "EditDownloadClientImplementation": "Editar cliente de download - {implementationName}", + "EditIndexerImplementation": "Editar indexador - {implementationName}", "EditIndexerProxyImplementation": "Editar Proxy do Indexador - {implementationName}", "NotificationStatusAllClientHealthCheckMessage": "Todas as notificações estão indisponíveis devido a falhas", "NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {0}", - "AuthForm": "Formulário (Página de login)", - "AuthenticationMethod": "Método de Autenticação", + "AuthForm": "Formulário (página de login)", + "AuthenticationMethod": "Método de autenticação", "AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido", - "AuthenticationRequiredPasswordHelpTextWarning": "Insira uma nova senha", + "AuthenticationRequiredPasswordHelpTextWarning": "Digite uma nova senha", "AuthenticationRequiredUsernameHelpTextWarning": "Digite um novo nome de usuário", "Clone": "Clonar", "DefaultNameCopiedProfile": "{name} - Cópia", - "DisabledForLocalAddresses": "Desativado para Endereços Locais", + "DisabledForLocalAddresses": "Desabilitado para endereços locais", "External": "Externo", "None": "Vazio", "ResetAPIKeyMessageText": "Tem certeza de que deseja redefinir sua chave de API?", - "AuthBasic": "Básico (Balão do Navegador)", + "AuthBasic": "Básico (pop-up do navegador)", "ActiveIndexers": "Indexadores Ativos", "ActiveApps": "Apps Ativos", "IndexerHistoryLoadError": "Erro ao carregar o histórico do indexador", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 309178c78..c6a637576 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -121,7 +121,7 @@ "SettingsEnableColorImpairedModeHelpText": "Stil modificat pentru a permite utilizatorilor cu deficiențe de culoare să distingă mai bine informațiile codificate prin culoare", "SettingsLongDateFormat": "Format de dată lungă", "SettingsShortDateFormat": "Format scurt de dată", - "SettingsTimeFormat": "Format de timp", + "SettingsTimeFormat": "Format ora", "RSSIsNotSupportedWithThisIndexer": "RSS nu este suportat de acest indexator", "ShowSearchHelpText": "Afișați butonul de căutare pe hover", "UILanguageHelpText": "Limba pe care Prowlarr o va folosi pentru interfața de utilizare", @@ -451,5 +451,6 @@ "AddDownloadClientImplementation": "Adăugați client de descărcare - {implementationName}", "AddIndexerImplementation": "Adăugați Indexator - {implementationName}", "AddIndexerProxyImplementation": "Adăugați proxy indexator - {implementationName}", - "Album": "Album" + "Album": "Album", + "AppUpdated": "{appName} actualizat" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index c14ff3d58..9c5eac740 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -4,7 +4,7 @@ "Actions": "动作", "Add": "添加", "AddApplication": "添加应用程序", - "AddCustomFilter": "添加自定义过滤", + "AddCustomFilter": "添加自定义过滤器", "AddDownloadClient": "添加下载客户端", "AddDownloadClientToProwlarr": "添加下载客户端允许 Prowlarr 在进行手动搜索时从 UI直接发送结果.", "AddIndexer": "添加索引器", @@ -91,7 +91,7 @@ "Connections": "连接", "CouldNotConnectSignalR": "无法连接至SignalR,不会升级UI", "Custom": "自定义", - "CustomFilters": "自定义过滤", + "CustomFilters": "自定义过滤器", "DBMigration": "数据库迁移版本", "Database": "数据库", "Date": "日期", @@ -108,7 +108,7 @@ "DeleteIndexerProxy": "删除搜刮器代理", "DeleteIndexerProxyMessageText": "您确定要删除索引器代理“{name}”吗?", "DeleteNotification": "删除消息推送", - "DeleteNotificationMessageText": "您确定要删除消息推送 “{name}” 吗?", + "DeleteNotificationMessageText": "您确定要删除通知“{name}”吗?", "DeleteTag": "删除标签", "DeleteTagMessageText": "您确定要删除标签 '{label}' 吗?", "Description": "描述", @@ -116,7 +116,7 @@ "DevelopmentSettings": "开发设置", "Disabled": "禁用", "DisabledUntil": "禁用Until", - "Discord": "冲突", + "Discord": "分歧", "Docker": "Docker", "Donations": "赞助", "DownloadClient": "下载客户端", @@ -147,7 +147,7 @@ "Ended": "已完结", "Episode": "集", "Error": "错误", - "ErrorLoadingContents": "读取内容错误", + "ErrorLoadingContents": "加载内容出错", "EventType": "事件类型", "Events": "事件", "Exception": "例外", @@ -224,7 +224,7 @@ "InstanceNameHelpText": "选项卡及日志应用名称", "InteractiveSearch": "手动搜索", "Interval": "间隔", - "KeyboardShortcuts": "键盘快捷键", + "KeyboardShortcuts": "快捷键", "Label": "标签", "Language": "语言", "LastDuration": "上一次用时", @@ -250,7 +250,7 @@ "MinimumSeeders": "最少播种量", "MinimumSeedersHelpText": "用于索引器抓取的应用程序所需的最小播种量", "Mode": "模式", - "More": "更多的", + "More": "更多", "MoreInfo": "更多信息", "MovieIndexScrollBottom": "影片索引:滚动到底部", "MovieIndexScrollTop": "影片索引:滚动到顶部", @@ -334,7 +334,7 @@ "ReleaseStatus": "发布状态", "Reload": "重新加载", "Remove": "移除", - "RemoveFilter": "移除过滤条件", + "RemoveFilter": "移除过滤器", "RemovedFromTaskQueue": "从任务队列中移除", "RemovingTag": "移除标签", "RepeatSearch": "再次搜索", @@ -480,7 +480,7 @@ "UserAgentProvidedByTheAppThatCalledTheAPI": "由调用API的应用程序提供的User-Agent", "Username": "用户名", "Version": "版本", - "View": "视图", + "View": "查看", "VipExpiration": "VIP过期", "Warn": "警告", "Website": "‎网站‎", @@ -557,16 +557,16 @@ "AddConnection": "添加连接", "AddIndexerImplementation": "添加索引器 - {implementationName}", "AddCategory": "添加目录", - "AddConnectionImplementation": "添加集合 - {implementationName}", - "AddDownloadClientImplementation": "添加下载客户端 - {implementationName}", + "AddConnectionImplementation": "添加连接- {implementationName}", + "AddDownloadClientImplementation": "添加下载客户端- {implementationName}", "AddIndexerProxyImplementation": "添加搜刮器代理-{实体名称}", "AppUpdated": "{appName} 升级", - "EditDownloadClientImplementation": "添加下载客户端 - {implementationName}", - "EditIndexerImplementation": "添加索引器 - {implementationName}", + "EditDownloadClientImplementation": "编辑下载客户端- {implementationName}", + "EditIndexerImplementation": "编辑索引器- {implementationName}", "EditIndexerProxyImplementation": "添加搜刮器代理-{实体名称}", "AppUpdatedVersion": "{appName} 已经更新到 {version} 版本,重新加载 {appName} 使更新生效", "EditApplicationImplementation": "添加应用-{实体名称}", - "EditConnectionImplementation": "添加集合 - {implementationName}", + "EditConnectionImplementation": "编辑连接- {implementationName}", "NotificationStatusAllClientHealthCheckMessage": "由于故障所用应用程序都不可用", "NotificationStatusSingleClientHealthCheckMessage": "由于故障应用程序不可用", "AuthBasic": "基础(浏览器弹出对话框)", From e0f6726a3da56b5effab99d1045eaee204dd42c0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 25 Oct 2023 11:51:31 +0300 Subject: [PATCH 263/964] Fixed: Detect Raw search in Generic Torznab/Newznab feeds Fixes #1895 --- .../Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs index 1e9056f83..e182b97e7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs @@ -129,6 +129,8 @@ namespace NzbDrone.Core.Indexers.Newznab capabilities.SearchParams.AddIfNotNull(searchParam); } } + + capabilities.SupportsRawSearch = xmlBasicSearch.Attribute("searchEngine")?.Value == "raw"; } else { From 3963807c96c13386fdd84aafc06474d4f04bd06c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 25 Oct 2023 13:04:02 +0300 Subject: [PATCH 264/964] New: Add App Profile validation for indexers Fixes #1903 --- .../Profiles/AppSyncProfileService.cs | 4 +-- .../Validation/AppProfileExistsValidator.cs | 22 ++++++++++++++++ .../Indexers/IndexerController.cs | 6 ++++- .../Profiles/App/AppProfileController.cs | 16 ++++++------ .../Profiles/App/AppProfileSchemaModule.cs | 26 ------------------- 5 files changed, 37 insertions(+), 37 deletions(-) create mode 100644 src/NzbDrone.Core/Validation/AppProfileExistsValidator.cs delete mode 100644 src/Prowlarr.Api.V1/Profiles/App/AppProfileSchemaModule.cs diff --git a/src/NzbDrone.Core/Profiles/AppSyncProfileService.cs b/src/NzbDrone.Core/Profiles/AppSyncProfileService.cs index 73c07d0a8..135cd9e2a 100644 --- a/src/NzbDrone.Core/Profiles/AppSyncProfileService.cs +++ b/src/NzbDrone.Core/Profiles/AppSyncProfileService.cs @@ -7,7 +7,7 @@ using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Profiles { - public interface IProfileService + public interface IAppProfileService { AppSyncProfile Add(AppSyncProfile profile); void Update(AppSyncProfile profile); @@ -18,7 +18,7 @@ namespace NzbDrone.Core.Profiles AppSyncProfile GetDefaultProfile(string name); } - public class AppSyncProfileService : IProfileService, + public class AppSyncProfileService : IAppProfileService, IHandle { private readonly IAppProfileRepository _profileRepository; diff --git a/src/NzbDrone.Core/Validation/AppProfileExistsValidator.cs b/src/NzbDrone.Core/Validation/AppProfileExistsValidator.cs new file mode 100644 index 000000000..a3a1c4330 --- /dev/null +++ b/src/NzbDrone.Core/Validation/AppProfileExistsValidator.cs @@ -0,0 +1,22 @@ +using FluentValidation.Validators; +using NzbDrone.Core.Profiles; + +namespace NzbDrone.Core.Validation +{ + public class AppProfileExistsValidator : PropertyValidator + { + private readonly IAppProfileService _appProfileService; + + public AppProfileExistsValidator(IAppProfileService appProfileService) + { + _appProfileService = appProfileService; + } + + protected override string GetDefaultMessageTemplate() => "App Profile does not exist"; + + protected override bool IsValid(PropertyValidatorContext context) + { + return context?.PropertyValue == null || _appProfileService.Exists((int)context.PropertyValue); + } + } +} diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs index 0e38f0ccb..bb2ffc782 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs @@ -1,4 +1,5 @@ using NzbDrone.Core.Indexers; +using NzbDrone.Core.Validation; using Prowlarr.Http; namespace Prowlarr.Api.V1.Indexers @@ -6,9 +7,12 @@ namespace Prowlarr.Api.V1.Indexers [V1ApiController] public class IndexerController : ProviderControllerBase { - public IndexerController(IndexerFactory indexerFactory, IndexerResourceMapper resourceMapper, IndexerBulkResourceMapper bulkResourceMapper) + public IndexerController(IndexerFactory indexerFactory, IndexerResourceMapper resourceMapper, IndexerBulkResourceMapper bulkResourceMapper, AppProfileExistsValidator appProfileExistsValidator) : base(indexerFactory, "indexer", resourceMapper, bulkResourceMapper) { + Http.Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.AppProfileId)); + + SharedValidator.RuleFor(c => c.AppProfileId).SetValidator(appProfileExistsValidator); } } } diff --git a/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs b/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs index 0b4b7ae4f..8b3236ec4 100644 --- a/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs +++ b/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs @@ -11,11 +11,11 @@ namespace Prowlarr.Api.V1.Profiles.App [V1ApiController] public class AppProfileController : RestController { - private readonly IProfileService _profileService; + private readonly IAppProfileService _appProfileService; - public AppProfileController(IProfileService profileService) + public AppProfileController(IAppProfileService appProfileService) { - _profileService = profileService; + _appProfileService = appProfileService; SharedValidator.RuleFor(c => c.Name).NotEmpty(); } @@ -25,7 +25,7 @@ namespace Prowlarr.Api.V1.Profiles.App public ActionResult Create(AppProfileResource resource) { var model = resource.ToModel(); - model = _profileService.Add(model); + model = _appProfileService.Add(model); return Created(model.Id); } @@ -33,7 +33,7 @@ namespace Prowlarr.Api.V1.Profiles.App [Produces("application/json")] public object DeleteProfile(int id) { - _profileService.Delete(id); + _appProfileService.Delete(id); return new { }; } @@ -44,7 +44,7 @@ namespace Prowlarr.Api.V1.Profiles.App { var model = resource.ToModel(); - _profileService.Update(model); + _appProfileService.Update(model); return Accepted(model.Id); } @@ -55,14 +55,14 @@ namespace Prowlarr.Api.V1.Profiles.App [ProducesResponseType(500)] public override AppProfileResource GetResourceById(int id) { - return _profileService.Get(id).ToResource(); + return _appProfileService.Get(id).ToResource(); } [HttpGet] [Produces("application/json")] public List GetAll() { - return _profileService.All().ToResource(); + return _appProfileService.All().ToResource(); } } } diff --git a/src/Prowlarr.Api.V1/Profiles/App/AppProfileSchemaModule.cs b/src/Prowlarr.Api.V1/Profiles/App/AppProfileSchemaModule.cs deleted file mode 100644 index 7cdbda0ed..000000000 --- a/src/Prowlarr.Api.V1/Profiles/App/AppProfileSchemaModule.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using NzbDrone.Core.Profiles; -using Prowlarr.Http; - -namespace Prowlarr.Api.V1.Profiles.App -{ - [V1ApiController("appprofile/schema")] - public class QualityProfileSchemaController : Controller - { - private readonly IProfileService _profileService; - - public QualityProfileSchemaController(IProfileService profileService) - { - _profileService = profileService; - } - - [HttpGet] - [Produces("application/json")] - public AppProfileResource GetSchema() - { - var qualityProfile = _profileService.GetDefaultProfile(string.Empty); - - return qualityProfile.ToResource(); - } - } -} From 7a61761b2b7707d8ad9450fd09709d0e0ee7ebd7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 25 Oct 2023 13:25:16 +0300 Subject: [PATCH 265/964] Add schema endpoint for app profiles --- .../Profiles/App/AppProfileController.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs b/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs index 8b3236ec4..180bc5809 100644 --- a/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs +++ b/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs @@ -16,6 +16,7 @@ namespace Prowlarr.Api.V1.Profiles.App public AppProfileController(IAppProfileService appProfileService) { _appProfileService = appProfileService; + SharedValidator.RuleFor(c => c.Name).NotEmpty(); } @@ -64,5 +65,14 @@ namespace Prowlarr.Api.V1.Profiles.App { return _appProfileService.All().ToResource(); } + + [HttpGet("schema")] + [Produces("application/json")] + public AppProfileResource GetTemplates() + { + var profile = _appProfileService.GetDefaultProfile(string.Empty); + + return profile.ToResource(); + } } } From 31d32e8c30635b8b8750514ce4f3af2bb8883a2d Mon Sep 17 00:00:00 2001 From: Servarr Date: Wed, 25 Oct 2023 10:32:37 +0000 Subject: [PATCH 266/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 38 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index 93e781bcd..eb98f9846 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -483,6 +483,25 @@ } } }, + "/api/v1/appprofile/schema": { + "get": { + "tags": [ + "AppProfile" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppProfileResource" + } + } + } + } + } + } + }, "/login": { "post": { "tags": [ @@ -3280,25 +3299,6 @@ } } }, - "/api/v1/appprofile/schema": { - "get": { - "tags": [ - "QualityProfileSchema" - ], - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AppProfileResource" - } - } - } - } - } - } - }, "/api/v1/search": { "post": { "tags": [ From 768ce14afb06581fd3ffab28b43729e60e8ed72c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 25 Oct 2023 14:17:04 +0300 Subject: [PATCH 267/964] Fix integration tests for indexers --- src/NzbDrone.Integration.Test/IntegrationTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Integration.Test/IntegrationTest.cs b/src/NzbDrone.Integration.Test/IntegrationTest.cs index a8bf71c93..711c3ed37 100644 --- a/src/NzbDrone.Integration.Test/IntegrationTest.cs +++ b/src/NzbDrone.Integration.Test/IntegrationTest.cs @@ -56,6 +56,7 @@ namespace NzbDrone.Integration.Test Implementation = nameof(FileList), Name = "NewznabTest", Protocol = Core.Indexers.DownloadProtocol.Usenet, + AppProfileId = 1, Fields = SchemaBuilder.ToSchema(new FileListSettings()) }); From 6169fc2fa3c063887679857ab1b4b5d038771a9d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 25 Oct 2023 15:11:41 +0300 Subject: [PATCH 268/964] New: Add Download Client validation for indexers --- .../DownloadClientExistsValidator.cs | 22 +++++++++++++++++++ .../Indexers/IndexerController.cs | 8 ++++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/NzbDrone.Core/Validation/DownloadClientExistsValidator.cs diff --git a/src/NzbDrone.Core/Validation/DownloadClientExistsValidator.cs b/src/NzbDrone.Core/Validation/DownloadClientExistsValidator.cs new file mode 100644 index 000000000..28f571483 --- /dev/null +++ b/src/NzbDrone.Core/Validation/DownloadClientExistsValidator.cs @@ -0,0 +1,22 @@ +using FluentValidation.Validators; +using NzbDrone.Core.Download; + +namespace NzbDrone.Core.Validation +{ + public class DownloadClientExistsValidator : PropertyValidator + { + private readonly IDownloadClientFactory _downloadClientFactory; + + public DownloadClientExistsValidator(IDownloadClientFactory downloadClientFactory) + { + _downloadClientFactory = downloadClientFactory; + } + + protected override string GetDefaultMessageTemplate() => "Download Client does not exist"; + + protected override bool IsValid(PropertyValidatorContext context) + { + return context?.PropertyValue == null || _downloadClientFactory.Exists((int)context.PropertyValue); + } + } +} diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs index bb2ffc782..f64cf535f 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs @@ -7,12 +7,18 @@ namespace Prowlarr.Api.V1.Indexers [V1ApiController] public class IndexerController : ProviderControllerBase { - public IndexerController(IndexerFactory indexerFactory, IndexerResourceMapper resourceMapper, IndexerBulkResourceMapper bulkResourceMapper, AppProfileExistsValidator appProfileExistsValidator) + public IndexerController(IndexerFactory indexerFactory, + IndexerResourceMapper resourceMapper, + IndexerBulkResourceMapper bulkResourceMapper, + AppProfileExistsValidator appProfileExistsValidator, + DownloadClientExistsValidator downloadClientExistsValidator) : base(indexerFactory, "indexer", resourceMapper, bulkResourceMapper) { Http.Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.AppProfileId)); + Http.Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.DownloadClientId)); SharedValidator.RuleFor(c => c.AppProfileId).SetValidator(appProfileExistsValidator); + SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator); } } } From 203e2dbb109881508942b1905a2fc6ec59c562d3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 25 Oct 2023 16:24:30 +0300 Subject: [PATCH 269/964] Remove mandatory validation for download client in indexers --- src/Prowlarr.Api.V1/Indexers/IndexerController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs index f64cf535f..972ae4426 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs @@ -15,7 +15,6 @@ namespace Prowlarr.Api.V1.Indexers : base(indexerFactory, "indexer", resourceMapper, bulkResourceMapper) { Http.Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.AppProfileId)); - Http.Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.DownloadClientId)); SharedValidator.RuleFor(c => c.AppProfileId).SetValidator(appProfileExistsValidator); SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator); From 2c6c0fcc81e82698c968d25dcd63ec332b10c23c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 25 Oct 2023 17:11:48 +0300 Subject: [PATCH 270/964] Allow 0 as value in download client Id validation --- .../Validation/DownloadClientExistsValidator.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Validation/DownloadClientExistsValidator.cs b/src/NzbDrone.Core/Validation/DownloadClientExistsValidator.cs index 28f571483..cf021f464 100644 --- a/src/NzbDrone.Core/Validation/DownloadClientExistsValidator.cs +++ b/src/NzbDrone.Core/Validation/DownloadClientExistsValidator.cs @@ -16,7 +16,12 @@ namespace NzbDrone.Core.Validation protected override bool IsValid(PropertyValidatorContext context) { - return context?.PropertyValue == null || _downloadClientFactory.Exists((int)context.PropertyValue); + if (context?.PropertyValue == null || (int)context.PropertyValue == 0) + { + return true; + } + + return _downloadClientFactory.Exists((int)context.PropertyValue); } } } From 71a19efd9a26f3e5c8c500a3449e196463a79ef9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 27 Oct 2023 20:54:50 +0300 Subject: [PATCH 271/964] Improve appearance of info fields --- frontend/src/Components/Form/InfoInput.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/Components/Form/InfoInput.js b/frontend/src/Components/Form/InfoInput.js index eb3e9dee3..d26a519a4 100644 --- a/frontend/src/Components/Form/InfoInput.js +++ b/frontend/src/Components/Form/InfoInput.js @@ -1,5 +1,7 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import Alert from 'Components/Alert'; +import { kinds } from 'Helpers/Props'; class InfoInput extends Component { @@ -7,12 +9,12 @@ class InfoInput extends Component { // Render render() { - const { - value - } = this.props; + const { value } = this.props; return ( - + + + ); } } From c15c71386daa5a98df28de1d4b7c8479cd078116 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 29 Oct 2023 00:52:30 +0300 Subject: [PATCH 272/964] New: Set busy timeout for SQLite (cherry picked from commit 192eb7b62ae60f300a9371ce3ed2e0056b5a1f4d) --- .../Datastore/ConnectionStringFactory.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs b/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs index 961d060f8..ff97ec020 100644 --- a/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs +++ b/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs @@ -41,14 +41,16 @@ namespace NzbDrone.Core.Datastore private static string GetConnectionString(string dbPath) { - var connectionBuilder = new SQLiteConnectionStringBuilder(); - - connectionBuilder.DataSource = dbPath; - connectionBuilder.CacheSize = (int)-20000; - connectionBuilder.DateTimeKind = DateTimeKind.Utc; - connectionBuilder.JournalMode = OsInfo.IsOsx ? SQLiteJournalModeEnum.Truncate : SQLiteJournalModeEnum.Wal; - connectionBuilder.Pooling = true; - connectionBuilder.Version = 3; + var connectionBuilder = new SQLiteConnectionStringBuilder + { + DataSource = dbPath, + CacheSize = (int)-20000, + DateTimeKind = DateTimeKind.Utc, + JournalMode = OsInfo.IsOsx ? SQLiteJournalModeEnum.Truncate : SQLiteJournalModeEnum.Wal, + Pooling = true, + Version = 3, + BusyTimeout = 100 + }; if (OsInfo.IsOsx) { From edf41e2ead8fdfe4ea468d6138551a48b6e067ec Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 29 Oct 2023 10:35:43 +0200 Subject: [PATCH 273/964] Bump version to 1.10.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c29daf2cc..f66efd028 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.10.1' + majorVersion: '1.10.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 75d8a3d1d016c886b6be0cfec02c13e83b762512 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 2 Nov 2023 19:40:38 +0200 Subject: [PATCH 274/964] Fixed: (FileList) Change TZ to account DST --- .../IndexerTests/FileListTests/FileListFixture.cs | 2 +- .../Indexers/Definitions/FileList/FileListParser.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs index b6f06d180..3699a9d0c 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests torrentInfo.InfoUrl.Should().Be("https://filelist.io/details.php?id=665873"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 19:20:19")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 20:20:19")); torrentInfo.Size.Should().Be(8300512414); torrentInfo.InfoHash.Should().Be(null); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs index 558b7dffc..9c43e639f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs @@ -72,7 +72,7 @@ public class FileListParser : IParseIndexerResponse InfoUrl = GetInfoUrl(id), Seeders = row.Seeders, Peers = row.Leechers + row.Seeders, - PublishDate = DateTime.Parse(row.UploadDate + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), + PublishDate = DateTime.Parse(row.UploadDate + " +0200", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), Description = row.SmallDescription, Genres = row.SmallDescription.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList(), ImdbId = imdbId, From 051dea30c2e88694a275787d8e5d51fa2ee61705 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 4 Nov 2023 16:27:39 +0200 Subject: [PATCH 275/964] Fixed: (Beyond-HD) Category filtering --- src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index 2f8327715..3873c746c 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -130,7 +130,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (cats.Count > 0) { - body.Add("categories", string.Join(",", cats)); + body.Add("categories", cats.Select(int.Parse).ToArray()); } if (_settings.SearchTypes.Any()) From 1b1f9d16be522d4ddbd284941b655f33b2e7f05b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 4 Nov 2023 16:30:40 +0200 Subject: [PATCH 276/964] Remove default definitions for dead indexers --- src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs index f544899b1..cc9ff97a6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs @@ -103,10 +103,7 @@ namespace NzbDrone.Core.Indexers.Newznab yield return GetDefinition("NzbPlanet", GetSettings("https://api.nzbplanet.net")); yield return GetDefinition("NZBStars", GetSettings("https://nzbstars.com")); yield return GetDefinition("OZnzb", GetSettings("https://api.oznzb.com")); - yield return GetDefinition("SimplyNZBs", GetSettings("https://simplynzbs.com")); - yield return GetDefinition("SpotNZB", GetSettings("https://spotnzb.xyz")); yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api")); - yield return GetDefinition("VeryCouch LazyMuch", GetSettings("https://api.verycouch.com")); yield return GetDefinition("Generic Newznab", GetSettings("")); } } From 793de05e3d5547ed52a576817f1ba7e69c853431 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 4 Nov 2023 17:36:01 +0200 Subject: [PATCH 277/964] Fixed: (Beyond-HD) Types filtering --- src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index 3873c746c..80d2856bb 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -143,7 +143,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (searchTypes.Any()) { - body.Add("types", string.Join(",", searchTypes)); + body.Add("types", searchTypes.ToArray()); } } From bbfb92bbd8bf69b90a5b2587de114bc57b5f04e2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 Nov 2023 11:10:44 +0200 Subject: [PATCH 278/964] Bump version to 1.10.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f66efd028..ffd3ba03d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.10.2' + majorVersion: '1.10.3' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From c0b10f889b360a13bfd6a0b8e0b6c058e892f8f9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 Nov 2023 19:58:30 +0200 Subject: [PATCH 279/964] Prevent NullRef on header assert --- src/NzbDrone.Integration.Test/Client/ClientBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Integration.Test/Client/ClientBase.cs b/src/NzbDrone.Integration.Test/Client/ClientBase.cs index f22498ca2..9ff5178b6 100644 --- a/src/NzbDrone.Integration.Test/Client/ClientBase.cs +++ b/src/NzbDrone.Integration.Test/Client/ClientBase.cs @@ -72,7 +72,7 @@ namespace NzbDrone.Integration.Test.Client { // cache control header gets reordered on net core var headers = response.Headers; - ((string)headers.Single(c => c.Name == "Cache-Control").Value).Split(',').Select(x => x.Trim()) + ((string)headers.SingleOrDefault(c => c.Name == "Cache-Control")?.Value ?? string.Empty).Split(',').Select(x => x.Trim()) .Should().BeEquivalentTo("no-store, no-cache".Split(',').Select(x => x.Trim())); headers.Single(c => c.Name == "Pragma").Value.Should().Be("no-cache"); headers.Single(c => c.Name == "Expires").Value.Should().Be("-1"); From ed272aaf7473dc594674e6d5fba63142960dabd6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 Nov 2023 20:17:02 +0200 Subject: [PATCH 280/964] Increase the timeout for CheckHealth command --- src/NzbDrone.Integration.Test/IntegrationTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Integration.Test/IntegrationTest.cs b/src/NzbDrone.Integration.Test/IntegrationTest.cs index 711c3ed37..c58d35f89 100644 --- a/src/NzbDrone.Integration.Test/IntegrationTest.cs +++ b/src/NzbDrone.Integration.Test/IntegrationTest.cs @@ -47,7 +47,7 @@ namespace NzbDrone.Integration.Test protected override void InitializeTestTarget() { - WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("CheckHealth")); + WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("CheckHealth"), 20000); Indexers.Post(new Prowlarr.Api.V1.Indexers.IndexerResource { From b3f6f54e6eccdd89d53ea0dda16b26c3c64a7f36 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 Nov 2023 20:53:21 +0200 Subject: [PATCH 281/964] Fixed: (PTP) Add support for TV searches --- .../PassThePopcorn/PassThePopcorn.cs | 15 ++----- .../PassThePopcornRequestGenerator.cs | 40 ++++++++++++++----- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs index 046e0e250..63b3cd5b2 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs @@ -29,7 +29,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn public override IIndexerRequestGenerator GetRequestGenerator() { - return new PassThePopcornRequestGenerator(Settings); + return new PassThePopcornRequestGenerator(Settings, Capabilities); } public override IParseIndexerResponse GetParser() @@ -56,18 +56,11 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn }; caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.Movies, "Feature Film"); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesForeign); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesOther); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesSD); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesHD); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.Movies3D); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesBluRay); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesDVD); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesWEBDL); caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.Movies, "Short Film"); caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.TV, "Miniseries"); - caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.TV, "Stand-up Comedy"); - caps.Categories.AddCategoryMapping(5, NewznabStandardCategory.TV, "Live Performance"); + caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.Movies, "Stand-up Comedy"); + caps.Categories.AddCategoryMapping(5, NewznabStandardCategory.Movies, "Live Performance"); + caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.Movies, "Movie Collection"); return caps; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs index 116737e44..b88b793b2 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.IndexerSearch.Definitions; @@ -11,10 +12,12 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn public class PassThePopcornRequestGenerator : IIndexerRequestGenerator { private readonly PassThePopcornSettings _settings; + private readonly IndexerCapabilities _capabilities; - public PassThePopcornRequestGenerator(PassThePopcornSettings settings) + public PassThePopcornRequestGenerator(PassThePopcornSettings settings, IndexerCapabilities capabilities) { _settings = settings; + _capabilities = capabilities; } public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) @@ -27,7 +30,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn } else { - pageableRequests.Add(GetRequest($"{searchCriteria.SearchTerm}", searchCriteria)); + pageableRequests.Add(GetRequest($"{searchCriteria.SanitizedSearchTerm}", searchCriteria)); } return pageableRequests; @@ -40,7 +43,11 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) { - return new IndexerPageableRequestChain(); + var pageableRequests = new IndexerPageableRequestChain(); + + pageableRequests.Add(GetRequest($"{searchCriteria.SanitizedTvSearchString}", searchCriteria)); + + return pageableRequests; } public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) @@ -52,32 +59,43 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetRequest($"{searchCriteria.SearchTerm}", searchCriteria)); + pageableRequests.Add(GetRequest($"{searchCriteria.SanitizedSearchTerm}", searchCriteria)); return pageableRequests; } - private IEnumerable GetRequest(string searchParameters, SearchCriteriaBase searchCriteria) + private IEnumerable GetRequest(string searchTerm, SearchCriteriaBase searchCriteria) { var parameters = new NameValueCollection { { "action", "advanced" }, { "json", "noredirect" }, { "grouping", "0" }, - { "searchstr", searchParameters } + { "searchstr", searchTerm } }; + if (_settings.FreeleechOnly) + { + parameters.Set("freetorrent", "1"); + } + + var queryCats = _capabilities.Categories + .MapTorznabCapsToTrackers(searchCriteria.Categories) + .Select(int.Parse) + .Distinct() + .ToList(); + + if (searchCriteria.IsRssSearch && queryCats.Any()) + { + queryCats.ForEach(cat => parameters.Set($"filter_cat[{cat}]", "1")); + } + if (searchCriteria.Limit is > 0 && searchCriteria.Offset is > 0) { var page = (int)(searchCriteria.Offset / searchCriteria.Limit) + 1; parameters.Set("page", page.ToString()); } - if (_settings.FreeleechOnly) - { - parameters.Set("freetorrent", "1"); - } - var searchUrl = $"{_settings.BaseUrl.Trim().TrimEnd('/')}/torrents.php?{parameters.GetQueryString()}"; var request = new IndexerRequest(searchUrl, HttpAccept.Json); From c84ff60ec99588cfb34aea39657a1ea0116056d4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 Nov 2023 21:00:24 +0200 Subject: [PATCH 282/964] Fixed: (PTP) Add TV search capabilities --- .../Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs index 63b3cd5b2..ea3fc925d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs @@ -43,6 +43,10 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { LimitsDefault = PageSize, LimitsMax = PageSize, + TvSearchParams = new List + { + TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep + }, MovieSearchParams = new List { MovieSearchParam.Q, MovieSearchParam.ImdbId From a7c00a0fd76ddea7a53ef48da727660fa6371e09 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 7 Nov 2023 14:48:05 +0200 Subject: [PATCH 283/964] Fixed: (Redacted) Filter old releases on RSS --- .../Indexers/Definitions/Redacted.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index 7016d8651..d2f829732 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -29,6 +29,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override IndexerCapabilities Capabilities => SetCapabilities(); public override bool SupportsRedirect => true; + public override TimeSpan RateLimit => TimeSpan.FromSeconds(3); public Redacted(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, @@ -63,10 +64,24 @@ namespace NzbDrone.Core.Indexers.Definitions return Task.FromResult(request); } + protected override IList CleanupReleases(IEnumerable releases, SearchCriteriaBase searchCriteria) + { + var cleanReleases = base.CleanupReleases(releases, searchCriteria); + + if (searchCriteria.IsRssSearch) + { + cleanReleases = cleanReleases.Take(50).ToList(); + } + + return cleanReleases; + } + private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities { + LimitsDefault = 50, + LimitsMax = 50, MusicSearchParams = new List { MusicSearchParam.Q, MusicSearchParam.Artist, MusicSearchParam.Album, MusicSearchParam.Year @@ -172,6 +187,7 @@ namespace NzbDrone.Core.Indexers.Definitions } var queryCats = _capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories); + if (queryCats.Any()) { queryCats.ForEach(cat => parameters.Set($"filter_cat[{cat}]", "1")); From 0ba4f3e6923b96fb6cf1466e28bef120ed8b4205 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 7 Nov 2023 15:00:37 +0200 Subject: [PATCH 284/964] Fixed: (Orpheus) Filter old releases on RSS --- .../Indexers/Definitions/Orpheus.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index f7a519684..8c94d83e0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -29,6 +29,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override IndexerCapabilities Capabilities => SetCapabilities(); public override bool SupportsRedirect => true; + public override TimeSpan RateLimit => TimeSpan.FromSeconds(3); public Orpheus(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, @@ -49,10 +50,24 @@ namespace NzbDrone.Core.Indexers.Definitions return new OrpheusParser(Settings, Capabilities.Categories); } + protected override IList CleanupReleases(IEnumerable releases, SearchCriteriaBase searchCriteria) + { + var cleanReleases = base.CleanupReleases(releases, searchCriteria); + + if (searchCriteria.IsRssSearch) + { + cleanReleases = cleanReleases.Take(50).ToList(); + } + + return cleanReleases; + } + private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities { + LimitsDefault = 50, + LimitsMax = 50, MusicSearchParams = new List { MusicSearchParam.Q, MusicSearchParam.Artist, MusicSearchParam.Album, MusicSearchParam.Year @@ -200,6 +215,7 @@ namespace NzbDrone.Core.Indexers.Definitions } var queryCats = _capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories); + if (queryCats.Any()) { queryCats.ForEach(cat => parameters.Set($"filter_cat[{cat}]", "1")); From 95f899131df688997ec59264f7113ce5431ddbf7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 7 Nov 2023 15:38:49 +0200 Subject: [PATCH 285/964] Fix count in OrpheusFixture --- .../IndexerTests/OrpheusTests/OrpheusFixture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs index f52b248c9..1ba9c0af1 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs @@ -39,7 +39,7 @@ namespace NzbDrone.Core.Test.IndexerTests.OrpheusTests var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 3000 } })).Releases; - releases.Should().HaveCount(65); + releases.Should().HaveCount(50); releases.First().Should().BeOfType(); var torrentInfo = releases.First() as TorrentInfo; From 696932609256946fe85599ed2ea7f9e74fb79e3d Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 9 Nov 2023 15:33:03 -0800 Subject: [PATCH 286/964] Don't store status results for invalid providers (cherry picked from commit de23182d593e2284972103d505e66dd8d812dfdb) (cherry picked from commit 44d8dbaac81706691124ae5f8317289f0a3e5d73) --- .../IndexerTests/IndexerStatusServiceFixture.cs | 11 +++++++++++ .../Status/ProviderStatusServiceBase.cs | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/NzbDrone.Core.Test/IndexerTests/IndexerStatusServiceFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/IndexerStatusServiceFixture.cs index 55ed8abfb..f836852e1 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/IndexerStatusServiceFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/IndexerStatusServiceFixture.cs @@ -68,5 +68,16 @@ namespace NzbDrone.Core.Test.IndexerTests VerifyNoUpdate(); } + + [Test] + public void should_not_record_failure_for_unknown_provider() + { + Subject.RecordFailure(0); + + Mocker.GetMock() + .Verify(v => v.FindByProviderId(1), Times.Never); + + VerifyNoUpdate(); + } } } diff --git a/src/NzbDrone.Core/ThingiProvider/Status/ProviderStatusServiceBase.cs b/src/NzbDrone.Core/ThingiProvider/Status/ProviderStatusServiceBase.cs index 15cf84d3b..6279c6e35 100644 --- a/src/NzbDrone.Core/ThingiProvider/Status/ProviderStatusServiceBase.cs +++ b/src/NzbDrone.Core/ThingiProvider/Status/ProviderStatusServiceBase.cs @@ -59,6 +59,11 @@ namespace NzbDrone.Core.ThingiProvider.Status public virtual void RecordSuccess(int providerId) { + if (providerId <= 0) + { + return; + } + lock (_syncRoot) { var status = GetProviderStatus(providerId); @@ -79,6 +84,11 @@ namespace NzbDrone.Core.ThingiProvider.Status protected virtual void RecordFailure(int providerId, TimeSpan minimumBackOff, bool escalate) { + if (providerId <= 0) + { + return; + } + lock (_syncRoot) { var status = GetProviderStatus(providerId); From 493114f4e85fe874044ef04d4940972e5148a4ec Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 10 Nov 2023 04:55:01 +0200 Subject: [PATCH 287/964] Fixed: Record status for notifications on tests --- .../Notifications/NotificationFactory.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/NzbDrone.Core/Notifications/NotificationFactory.cs b/src/NzbDrone.Core/Notifications/NotificationFactory.cs index ffdbd482c..f9d79940e 100644 --- a/src/NzbDrone.Core/Notifications/NotificationFactory.cs +++ b/src/NzbDrone.Core/Notifications/NotificationFactory.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using FluentValidation.Results; using NLog; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.ThingiProvider; @@ -97,5 +98,26 @@ namespace NzbDrone.Core.Notifications definition.SupportsOnHealthRestored = provider.SupportsOnHealthRestored; definition.SupportsOnApplicationUpdate = provider.SupportsOnApplicationUpdate; } + + public override ValidationResult Test(NotificationDefinition definition) + { + var result = base.Test(definition); + + if (definition.Id == 0) + { + return result; + } + + if (result == null || result.IsValid) + { + _notificationStatusService.RecordSuccess(definition.Id); + } + else + { + _notificationStatusService.RecordFailure(definition.Id); + } + + return result; + } } } From da1965b18e76a9ad1e68ce87d92c8b57a36b26ba Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 12 Nov 2023 14:14:50 +0200 Subject: [PATCH 288/964] Fixed: (AvistaZ) Fix PublishDate timezone Fixes #1917 --- src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs | 2 +- .../Indexers/Definitions/Avistaz/AvistazParserBase.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs index 7d9ba3b51..4e1899651 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs @@ -84,6 +84,6 @@ namespace NzbDrone.Core.Indexers.Definitions public class AvistaZParser : AvistazParserBase { - protected override string TimezoneOffset => "+02:00"; + protected override string TimezoneOffset => "+01:00"; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs index 4dec71e11..993efb931 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs @@ -14,7 +14,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz { public class AvistazParserBase : IParseIndexerResponse { - protected virtual string TimezoneOffset => "-04:00"; // Avistaz does not specify a timezone & returns server time + protected virtual string TimezoneOffset => "-05:00"; // Avistaz does not specify a timezone & returns server time private readonly HashSet _hdResolutions = new () { "1080p", "1080i", "720p" }; public Action, DateTime?> CookiesUpdater { get; set; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs index 954d2442c..784cc56e4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs @@ -54,6 +54,8 @@ namespace NzbDrone.Core.Indexers.Definitions { private readonly IndexerCapabilitiesCategories _categories; + protected override string TimezoneOffset => "+01:00"; + public ExoticaZParser(IndexerCapabilitiesCategories categories) { _categories = categories; From d99da0481be5b0e38bcaf1f80d8d2fde4ed87991 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 12 Nov 2023 15:22:35 +0200 Subject: [PATCH 289/964] Fix AvistaZ tests --- .../IndexerTests/AvistazTests/AvistazFixture.cs | 2 +- .../IndexerTests/AvistazTests/ExoticazFixture.cs | 2 +- .../IndexerTests/AvistazTests/PrivateHDFixture.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs index dcabb4dbf..b8f7951d2 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://avistaz.to/torrent/187240-japan-sinks-people-of-hope-2021-s01e05-720p-nf-web-dl-ddp20-x264-seikel"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 21:26:21")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 22:26:21")); torrentInfo.Size.Should().Be(935127615); torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs index 50cdcbac6..4c4f9f38e 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://exoticaz.to/torrent/64040-ssis-419-my-first-experience-is-yua-mikami-from-the-day-i-lost-my-virginity-i-was-devoted-to-sex"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 15:04:50")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 10:04:50")); torrentInfo.Size.Should().Be(7085405541); torrentInfo.InfoHash.Should().Be("asdjfiasdf54asd7f4a2sdf544asdf"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs index f0531e9ec..e841659fd 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://privatehd.to/torrent/78506-godzilla-2014-2160p-uhd-bluray-remux-hdr-hevc-atmos-triton"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 04:24:49")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 05:24:49")); torrentInfo.Size.Should().Be(69914591044); torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2"); torrentInfo.MagnetUrl.Should().Be(null); From ccdad3a44cec0ebb0d58d9ed3cdd4694a1a1968f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 12 Nov 2023 16:49:35 +0200 Subject: [PATCH 290/964] Bump version to 1.10.4 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ffd3ba03d..76cc387a3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.10.3' + majorVersion: '1.10.4' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From bd0609639e1d0f28cd31f0deac021860cb68c1e0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 13 Nov 2023 02:54:28 +0200 Subject: [PATCH 291/964] New: (HDBits) Add pagination support --- .../Indexers/Definitions/HDBits/HDBits.cs | 13 +-- .../Indexers/Definitions/HDBits/HDBitsApi.cs | 19 ++-- .../Definitions/HDBits/HDBitsParser.cs | 7 +- .../HDBits/HDBitsRequestGenerator.cs | 91 ++++++++++--------- .../Definitions/HDBits/HDBitsSettings.cs | 18 +--- 5 files changed, 68 insertions(+), 80 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs index f5064a055..84ea1be25 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs @@ -12,9 +12,10 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits public override string[] LegacyUrls => new[] { "https://hdbits.org" }; public override string Description => "Best HD Tracker"; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; - public override IndexerCapabilities Capabilities => SetCapabilities(); public override bool SupportsRedirect => true; - public override int PageSize => 30; + public override bool SupportsPagination => true; + public override int PageSize => 100; + public override IndexerCapabilities Capabilities => SetCapabilities(); public HDBits(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) : base(httpClient, eventAggregator, indexerStatusService, configService, logger) @@ -45,14 +46,14 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits } }; - caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.Audio, "Audio Track"); - caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.TVDocumentary, "Documentary"); - caps.Categories.AddCategoryMapping(8, NewznabStandardCategory.Other, "Misc/Demo"); caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.Movies, "Movie"); + caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TV, "TV"); + caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.TVDocumentary, "Documentary"); caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.Audio, "Music"); caps.Categories.AddCategoryMapping(5, NewznabStandardCategory.TVSport, "Sport"); - caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TV, "TV"); + caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.Audio, "Audio Track"); caps.Categories.AddCategoryMapping(7, NewznabStandardCategory.XXX, "XXX"); + caps.Categories.AddCategoryMapping(8, NewznabStandardCategory.Other, "Misc/Demo"); return caps; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs index 9e764f5f6..4d607beb0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Newtonsoft.Json; namespace NzbDrone.Core.Indexers.Definitions.HDBits @@ -7,19 +8,15 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits { [JsonProperty(Required = Required.Always)] public string Username { get; set; } + [JsonProperty(Required = Required.Always)] public string Passkey { get; set; } public string Hash { get; set; } - public string Search { get; set; } - - public int[] Category { get; set; } - - public int[] Codec { get; set; } - - public int[] Medium { get; set; } - + public IEnumerable Category { get; set; } + public IEnumerable Codec { get; set; } + public IEnumerable Medium { get; set; } public int? Origin { get; set; } [JsonProperty(PropertyName = "imdb")] @@ -33,13 +30,9 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [JsonProperty(PropertyName = "snatched_only")] public bool? SnatchedOnly { get; set; } + public int? Limit { get; set; } public int? Page { get; set; } - - public TorrentQuery Clone() - { - return MemberwiseClone() as TorrentQuery; - } } public class HDBitsResponse diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs index f0b10ff50..6a7e7727e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs @@ -53,7 +53,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits foreach (var result in queryResults) { var id = result.Id; - var internalRelease = result.TypeOrigin == 1 ? true : false; + var internalRelease = result.TypeOrigin == 1; var flags = new HashSet(); @@ -62,9 +62,9 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits flags.Add(IndexerFlag.Internal); } - torrentInfos.Add(new HDBitsInfo() + torrentInfos.Add(new HDBitsInfo { - Guid = string.Format("HDBits-{0}", id), + Guid = $"HDBits-{id}", Title = result.Name, Size = result.Size, Categories = _categories.MapTrackerCatToNewznab(result.TypeCategory.ToString()), @@ -77,6 +77,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits Peers = result.Leechers + result.Seeders, PublishDate = result.Added.ToUniversalTime(), Internal = internalRelease, + Year = result.ImdbInfo?.Year ?? 0, ImdbId = result.ImdbInfo?.Id ?? 0, TvdbId = result.TvdbInfo?.Id ?? 0, DownloadVolumeFactor = result.FreeLeech == "yes" ? 0 : 1, diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs index 5f6b0db7a..0307c19f3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs @@ -21,12 +21,8 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits { var pageableRequests = new IndexerPageableRequestChain(); var query = new TorrentQuery(); - var imdbId = ParseUtil.GetImdbId(searchCriteria.ImdbId).GetValueOrDefault(0); - if (searchCriteria.Categories?.Length > 0) - { - query.Category = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories).Select(int.Parse).ToArray(); - } + var imdbId = ParseUtil.GetImdbId(searchCriteria.ImdbId).GetValueOrDefault(0); if (imdbId == 0 && searchCriteria.SearchTerm.IsNotNullOrWhiteSpace()) { @@ -39,37 +35,11 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits query.ImdbInfo.Id = imdbId; } - pageableRequests.Add(GetRequest(query)); + pageableRequests.Add(GetRequest(query, searchCriteria)); return pageableRequests; } - public Func> GetCookies { get; set; } - public Action, DateTime?> CookiesUpdater { get; set; } - - private IEnumerable GetRequest(TorrentQuery query) - { - var request = new HttpRequestBuilder(Settings.BaseUrl) - .Resource("/api/torrents") - .Build(); - - request.Method = HttpMethod.Post; - const string appJson = "application/json"; - request.Headers.Accept = appJson; - request.Headers.ContentType = appJson; - - query.Username = Settings.Username; - query.Passkey = Settings.ApiKey; - - query.Codec = Settings.Codecs.ToArray(); - query.Medium = Settings.Mediums.ToArray(); - - request.SetContent(query.ToJson()); - request.ContentSummary = query.ToJson(Formatting.None); - - yield return new IndexerRequest(request); - } - public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) { return new IndexerPageableRequestChain(); @@ -79,14 +49,10 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits { var pageableRequests = new IndexerPageableRequestChain(); var query = new TorrentQuery(); + var tvdbId = searchCriteria.TvdbId.GetValueOrDefault(0); var imdbId = ParseUtil.GetImdbId(searchCriteria.ImdbId).GetValueOrDefault(0); - if (searchCriteria.Categories?.Length > 0) - { - query.Category = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories).Select(int.Parse).ToArray(); - } - if (tvdbId == 0 && imdbId == 0 && searchCriteria.SearchTerm.IsNotNullOrWhiteSpace()) { query.Search = searchCriteria.SanitizedTvSearchString; @@ -114,7 +80,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits query.ImdbInfo.Id = imdbId; } - pageableRequests.Add(GetRequest(query)); + pageableRequests.Add(GetRequest(query, searchCriteria)); return pageableRequests; } @@ -129,19 +95,56 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits var pageableRequests = new IndexerPageableRequestChain(); var query = new TorrentQuery(); - if (searchCriteria.Categories?.Length > 0) - { - query.Category = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories).Select(int.Parse).ToArray(); - } - if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace()) { query.Search = searchCriteria.SanitizedSearchTerm; } - pageableRequests.Add(GetRequest(query)); + pageableRequests.Add(GetRequest(query, searchCriteria)); return pageableRequests; } + + public Func> GetCookies { get; set; } + public Action, DateTime?> CookiesUpdater { get; set; } + + private IEnumerable GetRequest(TorrentQuery query, SearchCriteriaBase searchCriteria) + { + var request = new HttpRequestBuilder(Settings.BaseUrl) + .Resource("/api/torrents") + .Build(); + + request.Method = HttpMethod.Post; + const string appJson = "application/json"; + request.Headers.Accept = appJson; + request.Headers.ContentType = appJson; + + query.Username = Settings.Username; + query.Passkey = Settings.ApiKey; + + query.Codec = Settings.Codecs.ToArray(); + query.Medium = Settings.Mediums.ToArray(); + + if (searchCriteria.Categories?.Length > 0) + { + query.Category = Capabilities.Categories + .MapTorznabCapsToTrackers(searchCriteria.Categories) + .Distinct() + .Select(int.Parse) + .ToArray(); + } + + query.Limit = 100; + + if (searchCriteria.Limit is > 0 && searchCriteria.Offset is > 0) + { + query.Page = (int)(searchCriteria.Offset / searchCriteria.Limit); + } + + request.SetContent(query.ToJson()); + request.ContentSummary = query.ToJson(Formatting.None); + + yield return new IndexerRequest(request); + } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs index cacf7049d..8aff7d2c4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using FluentValidation; using NzbDrone.Core.Annotations; @@ -10,6 +11,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits { public HDBitsSettingsValidator() { + RuleFor(c => c.Username).NotEmpty(); RuleFor(c => c.ApiKey).NotEmpty(); } } @@ -20,8 +22,8 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits public HDBitsSettings() { - Codecs = System.Array.Empty(); - Mediums = System.Array.Empty(); + Codecs = Array.Empty(); + Mediums = Array.Empty(); } [FieldDefinition(2, Label = "Username", HelpText = "Site Username", Privacy = PrivacyLevel.UserName)] @@ -42,18 +44,6 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits } } - public enum HdBitsCategory - { - Movie = 1, - Tv = 2, - Documentary = 3, - Music = 4, - Sport = 5, - Audio = 6, - Xxx = 7, - MiscDemo = 8 - } - public enum HdBitsCodec { H264 = 1, From 4b4589ed27fdb231c786916d9f77c774536f77fe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 13 Nov 2023 16:23:10 +0200 Subject: [PATCH 292/964] Improvements to download factor and show Freeleech only for HDB --- .../Definitions/HDBits/HDBitsParser.cs | 50 ++++++++++++++++--- .../Definitions/HDBits/HDBitsSettings.cs | 4 ++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs index 6a7e7727e..cc3493b2d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs @@ -14,6 +14,8 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits private readonly HDBitsSettings _settings; private readonly IndexerCapabilitiesCategories _categories; + private readonly List _halfLeechMediums = new () { (int)HdBitsMedium.Bluray, (int)HdBitsMedium.Remux, (int)HdBitsMedium.Capture }; + public HDBitsParser(HDBitsSettings settings, IndexerCapabilitiesCategories categories) { _settings = settings; @@ -22,7 +24,6 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits public IList ParseResponse(IndexerResponse indexerResponse) { - var torrentInfos = new List(); var indexerHttpResponse = indexerResponse.HttpResponse; if (indexerHttpResponse.StatusCode == HttpStatusCode.Forbidden) @@ -42,16 +43,23 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits throw new IndexerException(indexerResponse, "HDBits API request returned status code {0}: {1}", jsonResponse.Status, jsonResponse.Message ?? string.Empty); } - var responseData = jsonResponse.Data as JArray; - if (responseData == null) + if (jsonResponse.Data is not JArray responseData) { throw new IndexerException(indexerResponse, "Indexer API call response missing result data"); } + var releaseInfos = new List(); + var queryResults = responseData.ToObject(); foreach (var result in queryResults) { + // Skip non-freeleech results when freeleech only is set + if (_settings.FreeleechOnly && result.FreeLeech != "yes") + { + continue; + } + var id = result.Id; var internalRelease = result.TypeOrigin == 1; @@ -62,7 +70,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits flags.Add(IndexerFlag.Internal); } - torrentInfos.Add(new HDBitsInfo + releaseInfos.Add(new HDBitsInfo { Guid = $"HDBits-{id}", Title = result.Name, @@ -80,17 +88,45 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits Year = result.ImdbInfo?.Year ?? 0, ImdbId = result.ImdbInfo?.Id ?? 0, TvdbId = result.TvdbInfo?.Id ?? 0, - DownloadVolumeFactor = result.FreeLeech == "yes" ? 0 : 1, - UploadVolumeFactor = 1, + DownloadVolumeFactor = GetDownloadVolumeFactor(result), + UploadVolumeFactor = GetUploadVolumeFactor(result), IndexerFlags = flags }); } - return torrentInfos.ToArray(); + return releaseInfos.ToArray(); } public Action, DateTime?> CookiesUpdater { get; set; } + private double GetDownloadVolumeFactor(TorrentQueryResponse item) + { + if (item.FreeLeech == "yes") + { + return 0; + } + + // 100% Neutral Leech: all XXX content. + if (item.TypeCategory == 7) + { + return 0; + } + + // 50% Free Leech: all full discs, remuxes, captures and all internal encodes, also all TV and Documentary content. + if (_halfLeechMediums.Contains(item.TypeMedium) || item.TypeOrigin == 1 || item.TypeCategory is 2 or 3) + { + return 0.5; + } + + return 1; + } + + private static double GetUploadVolumeFactor(TorrentQueryResponse item) + { + // 100% Neutral Leech: all XXX content. + return item.TypeCategory == 7 ? 0 : 1; + } + private string GetDownloadUrl(string torrentId) { var url = new HttpUri(_settings.BaseUrl) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs index 8aff7d2c4..c812d6a9e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs @@ -24,6 +24,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits { Codecs = Array.Empty(); Mediums = Array.Empty(); + FreeleechOnly = false; } [FieldDefinition(2, Label = "Username", HelpText = "Site Username", Privacy = PrivacyLevel.UserName)] @@ -38,6 +39,9 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [FieldDefinition(5, Label = "Mediums", Type = FieldType.TagSelect, SelectOptions = typeof(HdBitsMedium), Advanced = true, HelpText = "Options: BluRay, Encode, Capture, Remux, WebDL. If unspecified, all options are used.")] public IEnumerable Mediums { get; set; } + [FieldDefinition(6, Label = "Freeleech Only", Type = FieldType.Checkbox, Advanced = true, HelpText = "Show freeleech releases only")] + public bool FreeleechOnly { get; set; } + public override NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); From 942477ecf9453ad9f349d5abbcb7f755c8fbf822 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 14 Nov 2023 17:21:07 +0200 Subject: [PATCH 293/964] Fixed: (HDBits) Add labels for codecs and mediums --- .../Indexers/Definitions/HDBits/HDBitsSettings.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs index c812d6a9e..e93f025f4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs @@ -33,10 +33,10 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [FieldDefinition(3, Label = "API Key", HelpText = "Site API Key", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } - [FieldDefinition(4, Label = "Codecs", Type = FieldType.TagSelect, SelectOptions = typeof(HdBitsCodec), Advanced = true, HelpText = "Options: h264, Mpeg2, VC1, Xvid. If unspecified, all options are used.")] + [FieldDefinition(4, Label = "Codecs", Type = FieldType.Select, SelectOptions = typeof(HdBitsCodec), Advanced = true, HelpText = "If unspecified, all options are used.")] public IEnumerable Codecs { get; set; } - [FieldDefinition(5, Label = "Mediums", Type = FieldType.TagSelect, SelectOptions = typeof(HdBitsMedium), Advanced = true, HelpText = "Options: BluRay, Encode, Capture, Remux, WebDL. If unspecified, all options are used.")] + [FieldDefinition(5, Label = "Mediums", Type = FieldType.Select, SelectOptions = typeof(HdBitsMedium), Advanced = true, HelpText = "If unspecified, all options are used.")] public IEnumerable Mediums { get; set; } [FieldDefinition(6, Label = "Freeleech Only", Type = FieldType.Checkbox, Advanced = true, HelpText = "Show freeleech releases only")] @@ -50,19 +50,29 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits public enum HdBitsCodec { + [FieldOption("H.264")] H264 = 1, + [FieldOption("MPEG-2")] Mpeg2 = 2, + [FieldOption("VC-1")] Vc1 = 3, + [FieldOption("XviD")] Xvid = 4, + [FieldOption("HEVC")] HEVC = 5 } public enum HdBitsMedium { + [FieldOption("Blu-ray/HD DVD")] Bluray = 1, + [FieldOption("Encode")] Encode = 3, + [FieldOption("Capture")] Capture = 4, + [FieldOption("Remux")] Remux = 5, + [FieldOption("WEB-DL")] WebDl = 6 } } From 118bfb8c2843af7578f4af926383a192581b8888 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 16 Nov 2023 18:00:42 +0200 Subject: [PATCH 294/964] Fixed: (AvistaZ) Increase rate limit to 5 seconds --- src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs index b5d8390a3..4d9c7e5fc 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs @@ -17,7 +17,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz public override bool SupportsSearch => true; public override bool SupportsPagination => true; public override int PageSize => 50; - public override TimeSpan RateLimit => TimeSpan.FromSeconds(4); + public override TimeSpan RateLimit => TimeSpan.FromSeconds(5); public override IndexerCapabilities Capabilities => SetCapabilities(); protected virtual string LoginUrl => Settings.BaseUrl + "api/v1/jackett/auth"; private IIndexerRepository _indexerRepository; From 2cbdb5bcba03cf36f53054263558103d3a8dedbe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 16 Nov 2023 18:49:46 +0200 Subject: [PATCH 295/964] New: (HDBits) Add Use Filenames option --- .../Indexers/Definitions/HDBits/HDBitsParser.cs | 10 +++++++++- .../Indexers/Definitions/HDBits/HDBitsSettings.cs | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs index cc3493b2d..b157aaf9b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Net; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Parser.Model; @@ -73,7 +74,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits releaseInfos.Add(new HDBitsInfo { Guid = $"HDBits-{id}", - Title = result.Name, + Title = GetTitle(result), Size = result.Size, Categories = _categories.MapTrackerCatToNewznab(result.TypeCategory.ToString()), InfoHash = result.Hash, @@ -99,6 +100,13 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits public Action, DateTime?> CookiesUpdater { get; set; } + private string GetTitle(TorrentQueryResponse item) + { + return _settings.UseFilenames && item.FileName.IsNotNullOrWhiteSpace() + ? item.FileName.Replace(".torrent", "", StringComparison.InvariantCultureIgnoreCase) + : item.Name; + } + private double GetDownloadVolumeFactor(TorrentQueryResponse item) { if (item.FreeLeech == "yes") diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs index e93f025f4..9047a26d5 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs @@ -25,6 +25,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits Codecs = Array.Empty(); Mediums = Array.Empty(); FreeleechOnly = false; + UseFilenames = false; } [FieldDefinition(2, Label = "Username", HelpText = "Site Username", Privacy = PrivacyLevel.UserName)] @@ -42,6 +43,9 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [FieldDefinition(6, Label = "Freeleech Only", Type = FieldType.Checkbox, Advanced = true, HelpText = "Show freeleech releases only")] public bool FreeleechOnly { get; set; } + [FieldDefinition(7, Label = "Use Filenames", Type = FieldType.Checkbox, HelpText = "Check this option if you want to use torrent filenames as release titles")] + public bool UseFilenames { get; set; } + public override NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); From 9d11d7e17f1eacd541f7dcae98004c8c8fbdf8e5 Mon Sep 17 00:00:00 2001 From: Erik P Date: Thu, 16 Nov 2023 18:33:53 +0100 Subject: [PATCH 296/964] Fixed: (PTP) Add IMDb ID to TV Search capabilities (#1920) Co-authored-by: Erik Persson --- .../Definitions/PassThePopcorn/PassThePopcorn.cs | 2 +- .../PassThePopcorn/PassThePopcornRequestGenerator.cs | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs index ea3fc925d..9cb147b48 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcorn.cs @@ -45,7 +45,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn LimitsMax = PageSize, TvSearchParams = new List { - TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep + TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.ImdbId }, MovieSearchParams = new List { diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs index b88b793b2..17d9b1813 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornRequestGenerator.cs @@ -45,7 +45,14 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetRequest($"{searchCriteria.SanitizedTvSearchString}", searchCriteria)); + if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace()) + { + pageableRequests.Add(GetRequest(searchCriteria.FullImdbId, searchCriteria)); + } + else + { + pageableRequests.Add(GetRequest($"{searchCriteria.SanitizedTvSearchString}", searchCriteria)); + } return pageableRequests; } From 28e90acd0d814d7941a4a83e1b47b979788bf400 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 16 Nov 2023 16:35:12 -0800 Subject: [PATCH 297/964] Rename 'ReturnUrl' to 'returnUrl' for forms auth redirection (cherry picked from commit 812712e2843a738054c065a6d5c1b7c81c5f8e7b) --- .../Authentication/AuthenticationBuilderExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Prowlarr.Http/Authentication/AuthenticationBuilderExtensions.cs b/src/Prowlarr.Http/Authentication/AuthenticationBuilderExtensions.cs index cdc024e05..9a9c54627 100644 --- a/src/Prowlarr.Http/Authentication/AuthenticationBuilderExtensions.cs +++ b/src/Prowlarr.Http/Authentication/AuthenticationBuilderExtensions.cs @@ -40,6 +40,7 @@ namespace Prowlarr.Http.Authentication options.LoginPath = "/login"; options.ExpireTimeSpan = TimeSpan.FromDays(7); options.SlidingExpiration = true; + options.ReturnUrlParameter = "returnUrl"; }) .AddApiKey("API", options => { From 9b34c89bc83a6790a4131d379ebf5e472b5f2264 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 12 Nov 2023 18:01:39 +0200 Subject: [PATCH 298/964] Fixed: Enforce validation warnings when testing providers (cherry picked from commit c3b4126d0c4f449a41e2cf7ea438b20e25370995) --- src/Prowlarr.Api.V1/ProviderControllerBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Prowlarr.Api.V1/ProviderControllerBase.cs b/src/Prowlarr.Api.V1/ProviderControllerBase.cs index 40bbe205f..809697a06 100644 --- a/src/Prowlarr.Api.V1/ProviderControllerBase.cs +++ b/src/Prowlarr.Api.V1/ProviderControllerBase.cs @@ -73,7 +73,7 @@ namespace Prowlarr.Api.V1 if (providerDefinition.Enable) { - Test(providerDefinition, false); + Test(providerDefinition, !forceSave); } providerDefinition = _providerFactory.Create(providerDefinition); @@ -91,7 +91,7 @@ namespace Prowlarr.Api.V1 // Only test existing definitions if it is enabled and forceSave isn't set. if (providerDefinition.Enable && !forceSave) { - Test(providerDefinition, false); + Test(providerDefinition, true); } _providerFactory.Update(providerDefinition); From 28004dfae1dc5e0ce4977fb7096fcbe92593080d Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 25 Oct 2023 08:16:22 +0000 Subject: [PATCH 299/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Anonymous Co-authored-by: Dlgeri123 Co-authored-by: Fixer Co-authored-by: Jhonata da Rocha Co-authored-by: Jordy Co-authored-by: LandonLi Co-authored-by: Lizandra Candido da Silva Co-authored-by: Weblate Co-authored-by: bai0012 Co-authored-by: hpoon Co-authored-by: jianl Co-authored-by: 宿命 <331874545@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/cs.json | 3 +- src/NzbDrone.Core/Localization/Core/el.json | 11 ++- src/NzbDrone.Core/Localization/Core/es.json | 3 +- src/NzbDrone.Core/Localization/Core/ko.json | 3 +- src/NzbDrone.Core/Localization/Core/nl.json | 14 +++- src/NzbDrone.Core/Localization/Core/pt.json | 78 ++++++++++++------- .../Localization/Core/pt_BR.json | 30 +++---- src/NzbDrone.Core/Localization/Core/ro.json | 11 ++- src/NzbDrone.Core/Localization/Core/ru.json | 5 +- src/NzbDrone.Core/Localization/Core/vi.json | 3 +- .../Localization/Core/zh_CN.json | 24 +++--- 11 files changed, 121 insertions(+), 64 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 4963bb9b6..7b5305ddb 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -395,5 +395,6 @@ "CountDownloadClientsSelected": "{count} vybraných klientů ke stahování", "CountIndexersSelected": "{count} vybraných indexátorů", "EditIndexerProxyImplementation": "Přidat indexátor - {implementationName}", - "AuthBasic": "Základní (vyskakovací okno prohlížeče)" + "AuthBasic": "Základní (vyskakovací okno prohlížeče)", + "AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName} povolení ověření. Ověřování z místních adres můžete volitelně zakázat." } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 02bcbf6f7..1906aed6c 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -507,5 +507,14 @@ "Clone": "Κλωνοποίηση", "DisabledForLocalAddresses": "Απενεργοποιήθηκε για τοπικές διευθύνσεις", "None": "Κανένας", - "ResetAPIKeyMessageText": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε το κλειδί API σας;" + "ResetAPIKeyMessageText": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε το κλειδί API σας;", + "AppUpdated": "{appName} Ενημερώθηκε", + "AppUpdatedVersion": "ξαναφορτωθεί", + "EditIndexerImplementation": "Προσθήκη", + "AddIndexerProxyImplementation": "Προσθήκη", + "EditConnectionImplementation": "Προσθήκη", + "EditApplicationImplementation": "Προσθήκη", + "AddApplicationImplementation": "Προσθήκη", + "AddConnectionImplementation": "Προσθήκη", + "AddIndexerImplementation": "Προσθήκη" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index c09ca8327..d3e0a7ef9 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -438,5 +438,6 @@ "AuthenticationRequiredHelpText": "Cambiar para que las solicitudes requieran autenticación. No lo cambie a menos que entienda los riesgos.", "AuthenticationRequiredPasswordHelpTextWarning": "Introduzca una nueva contraseña", "AuthenticationRequiredUsernameHelpTextWarning": "Introduzca un nuevo nombre de usuario", - "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local." + "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.", + "EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index c379f29c2..3fc0404e2 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -351,5 +351,6 @@ "AuthForm": "양식 (로그인 페이지)", "DisabledForLocalAddresses": "로컬 주소에 대해 비활성화됨", "None": "없음", - "ResetAPIKeyMessageText": "API 키를 재설정하시겠습니까?" + "ResetAPIKeyMessageText": "API 키를 재설정하시겠습니까?", + "StopSelecting": "선택 취소" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 436f42f6d..68cd252f0 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -459,5 +459,17 @@ "ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?", "AddConnectionImplementation": "Voeg connectie toe - {implementationName}", "AddDownloadClientImplementation": "Voeg Downloadclient toe - {implementationName}", - "AddIndexerImplementation": "Indexeerder toevoegen - {implementationName}" + "AddIndexerImplementation": "Indexeerder toevoegen - {implementationName}", + "AdvancedSettingsHiddenClickToShow": "Geavanceerde instellingen zijn verborgen, klik om te tonen", + "AdvancedSettingsShownClickToHide": "Geavanceerde instellingen worden getoond, klik om te verbergen", + "AppUpdated": "{appName} is geüpdatet", + "AppUpdatedVersion": "{appName} is geüpdatet naar versie '{version}', om de laatste wijzigingen door te voeren moet je mogelijk {appName} herstarten", + "AddCategory": "Categorie toevoegen", + "ActiveIndexers": "Actieve indexeerders", + "ActiveApps": "Actieve Applicaties", + "EditConnectionImplementation": "Voeg connectie toe - {implementationName}", + "EditDownloadClientImplementation": "Voeg Downloadclient toe - {implementationName}", + "EditIndexerImplementation": "Indexeerder toevoegen - {implementationName}", + "AddApplicationImplementation": "Voeg connectie toe - {implementationName}", + "AddIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 6baea2bf8..6309fdc02 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -1,6 +1,6 @@ { "Peers": "Elementos", - "AppDataLocationHealthCheckMessage": "Não foi possivél actualizar para prevenir apagar a AppData durante a actualização", + "AppDataLocationHealthCheckMessage": "Não foi possível actualizar para prevenir apagar a AppData durante a actualização", "Warn": "Avisar", "View": "Ver", "Updates": "Atualizações", @@ -89,7 +89,7 @@ "HealthNoIssues": "Não há problemas com suas definições", "Health": "Estado de funcionamento", "Grabbed": "Capturado", - "GeneralSettingsSummary": "Porta, SSL, utilizador/palavra-passe, proxy, análises e atualizações", + "GeneralSettingsSummary": "Porta, SSL, nome de utilizador/palavra-passe, proxy, análises e actualizações", "General": "Geral", "Folder": "Pasta", "Filter": "Filtrar", @@ -110,10 +110,10 @@ "Dates": "Datas", "Date": "Data", "CustomFilters": "Filtros personalizados", - "ConnectSettingsSummary": "Notificações, ligações para servidores/leitores de multimédia e scripts personalizados", + "ConnectSettingsSummary": "Notificações e scripts personalizados", "Connections": "Ligações", "ConnectionLost": "Ligação perdida", - "Connect": "Conexões", + "Connect": "Notificações", "Component": "Componente", "Columns": "Colunas", "Close": "Fechar", @@ -129,7 +129,7 @@ "Actions": "Ações", "About": "Sobre", "Automatic": "Automático", - "AuthenticationMethodHelpText": "Solicitar nome de utilizador e palavra-passe para acessar ao Prowlarr", + "AuthenticationMethodHelpText": "Solicitar nome de utilizador e palavra-passe para acessar ao {appName}", "Authentication": "Autenticação", "ApplyTags": "Aplicar etiquetas", "AppDataDirectory": "Pasta AppData", @@ -193,7 +193,7 @@ "AutomaticSearch": "Pesquisa automática", "UnableToAddANewIndexerPleaseTryAgain": "Não foi possível adicionar um novo indexador, tenta novamente.", "RSSIsNotSupportedWithThisIndexer": "RSS não é suportado por esse indexador", - "ProwlarrSupportsAnyIndexer": "O Prowlarr suporta qualquer indexador que usa o padrão Newznab, bem como os outros indexadores listados abaixo.", + "ProwlarrSupportsAnyIndexer": "O Prowlarr suporta vários indexadores, além de qualquer indexador que usa o padrão Newznab/Torznab como \"Newznab genérico\" (para Usenet) e \"Torznab genérico\" (para torrents). Pesquise e selecione os indexadores na listagem abaixo.", "IndexerPriorityHelpText": "Prioridade do indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25.", "IndexerPriority": "Prioridade do indexador", "EditIndexer": "Editar indexador", @@ -221,15 +221,15 @@ "ForMoreInformationOnTheIndividualDownloadClients": "Para obter mais informações sobre cada cliente de transferências, clique nos botões de informação.", "FilterPlaceHolder": "Indexadores de pesquisa", "ExistingTag": "Etiqueta existente", - "Exception": "Exceção", + "Exception": "Excepção", "ErrorLoadingContents": "Erro ao carregar conteúdo", "EnableInteractiveSearchHelpText": "Será utilizado ao realizar uma pesquisa interativa", "EnableAutomaticSearchHelpText": "Será utilizado ao realizar pesquisas automáticas através da IU ou pelo Prowlarr", "Disabled": "Desativado", - "DeleteTagMessageText": "Tem a certeza que quer eliminar a etiqueta \"{0}\"?", - "DeleteNotificationMessageText": "Tem a certeza que quer eliminar a notificação \"{0}\"?", - "DeleteDownloadClientMessageText": "Tem a certeza que quer eliminar o cliente de transferências \"{0}\"?", - "DeleteBackupMessageText": "Tem a certeza que quer eliminar a cópia de segurança \"{0}\"?", + "DeleteTagMessageText": "Tem a certeza que quer eliminar a etiqueta \"{label}\"?", + "DeleteNotificationMessageText": "Tem a certeza que quer eliminar a notificação \"{name}\"?", + "DeleteDownloadClientMessageText": "Tem a certeza que quer eliminar o cliente de transferências \"{name}\"?", + "DeleteBackupMessageText": "Tem a certeza que quer eliminar a cópia de segurança \"{name}\"?", "UrlBaseHelpText": "Para suporte a proxy inverso, vazio por padrão", "UpdateScriptPathHelpText": "Caminho para um script personalizado que toma um pacote de atualização extraído e lida com o restante do processo da atualização", "UpdateMechanismHelpText": "Utilizar o atualizador do Prowlarr ou um script", @@ -248,7 +248,7 @@ "ProxyUsernameHelpText": "Apenas insira o utilizador e a palavra-passe caso seja requerido. Caso contrário, deixe em branco.", "ProxyPasswordHelpText": "Apenas insira o utilizador e a palavra-passe caso seja requerido. Caso contrário, deixe em branco.", "ProxyBypassFilterHelpText": "Utilizar \",\" como separador e \"*.\" como caráter universal para subdomínios", - "MaintenanceRelease": "Versão de manutenção", + "MaintenanceRelease": "Versão de manutenção: reparações de erros e outras melhorias. Consulte o Histórico de Commits do Github para saber mais", "RemovedFromTaskQueue": "Eliminado da fila de tarefas", "LogLevelTraceHelpTextWarning": "O registo de rasteio somente deve ser ativado temporariamente", "LaunchBrowserHelpText": " Abrir o browser e a home page do Prowlarr ao iniciar a aplicação.", @@ -288,16 +288,16 @@ "SearchIndexers": "Pesquisar indexadores", "IndexerRss": "RSS do indexador", "IndexerQuery": "Consulta do indexador", - "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao Prowlarr", + "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram actualizados: {0}. Remova-os e/ou adicione-os novamente ao Prowlarr", "IndexerLongTermStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a erros por mais de 6 horas: {0}", "IndexerLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a erros por mais de 6 horas", - "IndexerHealthCheckNoIndexers": "Não há indexadores ativados, o Prowlarr não retornará resultados de pesquisa", + "IndexerHealthCheckNoIndexers": "Não há indexadores activados, o Prowlarr não retornará resultados de pesquisa", "IndexerAuth": "Autenticação do indexador", - "EnableRssHelpText": "Ativar feed RSS para o indexador", - "EnableIndexer": "Ativar indexador", - "EnableRss": "Ativar RSS", + "EnableRssHelpText": "Activar feed RSS para o indexador", + "EnableIndexer": "Activar indexador", + "EnableRss": "Activar RSS", "DevelopmentSettings": "Definições de desenvolvimento", - "DeleteApplicationMessageText": "Tem a certeza que deseja eliminar a aplicação \"{0}\"?", + "DeleteApplicationMessageText": "Tem a certeza que quer eliminar a aplicação \"{name}\"?", "DeleteApplication": "Eliminar aplicação", "ClearHistoryMessageText": "Tem a certeza que deseja limpar todo o histórico do Prowlarr?", "ClearHistory": "Limpar histórico", @@ -321,10 +321,10 @@ "SettingsLogRotate": "Rotação de logs", "SettingsIndexerLoggingHelpText": "Registar dados adicionais do indexador, incluindo resposta", "SettingsIndexerLogging": "Registo em log avançado do indexador", - "SettingsFilterSentryEvents": "Filtrar eventos de análises", + "SettingsFilterSentryEvents": "Filtrar eventos de análise", "RSS": "RSS", - "RedirectHelpText": "Redirecionar as solicitações de transferência de entrada para o indexador, em vez de por proxy usando o Prowlarr", - "Redirect": "Redirecionar", + "RedirectHelpText": "Redireccionar as solicitações de transferência de entrada para o indexador e obter diretamente, em vez de por proxy usando o Prowlarr", + "Redirect": "Redireccionar", "Reddit": "Reddit", "HomePage": "Home Page", "FeatureRequests": "Solicitações de funcionalidades", @@ -352,7 +352,7 @@ "UnableToAddANewApplicationPleaseTryAgain": "Não é possível adicionar uma nova aplicação, tenta novamente.", "Torrent": "Torrent", "SyncLevelFull": "Sincronização completa: a aplicação estará sempre sincronizada. Mudanças feitas no Prowlar serão sincronizadas posteriormente com a aplicação. Qualquer mudança feita remotamente será substituída pelo Prowlarr na sincronização seguinte.", - "SyncLevelAddRemove": "Adicionar e remover apenas: esta aplicação remota será atualizada quando da adição e remoção do Prowlarr.", + "SyncLevelAddRemove": "Somente adicionar e eliminar: esta aplicação remota será actualizada ao adicionar ou eliminar indexadores do Prowlarr.", "SyncLevel": "Nível da sincronização", "Stats": "Estatísticas", "Query": "Consulta", @@ -362,7 +362,7 @@ "AddDownloadClientToProwlarr": "Adicionar um cliente de transferências possibilita ao Prowlarr enviar versões diretamente da IU ao realizar uma pesquisa manual.", "Add": "Adicionar", "DeleteIndexerProxy": "Apagar Proxy de Indexador", - "DeleteIndexerProxyMessageText": "Tem a certeza que quer apagar o proxy '{0}'?", + "DeleteIndexerProxyMessageText": "Tem a certeza que quer eliminar o proxy \"{name}\"?", "IndexerProxy": "Proxy de Indexador", "AddIndexerProxy": "Adicionar Proxy de Indexador", "IndexerProxyStatusCheckSingleClientMessage": "Proxys indisponíveis devido a falhas: {0}", @@ -372,7 +372,7 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Não foi possível adicionar um novo indexador, tenta novamente.", "Filters": "Filtros", "HistoryCleanupDaysHelpText": "Defina como 0 para desativar a limpeza automática", - "OnGrab": "Ao capturar", + "OnGrab": "Ao capturar lançamento", "OnHealthIssue": "Ao ter problemas no estado de funcionamento", "TestAllIndexers": "Testar todos os indexadores", "UserAgentProvidedByTheAppThatCalledTheAPI": "Par Utilizador-Agente fornecido pela aplicação que chamou a API", @@ -419,9 +419,9 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar etiquetas aos indexadores selecionados", "ApplyTagsHelpTextRemove": "Remover: eliminar as etiquetas adicionadas", "DeleteSelectedDownloadClients": "Eliminar cliente de transferências", - "DeleteSelectedApplicationsMessageText": "Tem a certeza que quer eliminar o indexador \"{0}\"?", - "DeleteSelectedDownloadClientsMessageText": "Tem a certeza que quer eliminar o indexador \"{0}\"?", - "DeleteSelectedIndexersMessageText": "Tem a certeza que quer eliminar o indexador \"{0}\"?", + "DeleteSelectedApplicationsMessageText": "Tem a certeza que quer eliminar as {count} aplicações seleccionadas?", + "DeleteSelectedDownloadClientsMessageText": "Tem a certeza que quer eliminar os {count} clientes de transferência seleccionados?", + "DeleteSelectedIndexersMessageText": "Tem a certeza que quer eliminar os {count} indexadores seleccionados?", "DownloadClientPriorityHelpText": "Priorizar múltiplos clientes de transferências. Utilizaremos round robin para clientes com a mesma prioridade.", "More": "Mais", "Year": "Ano", @@ -445,6 +445,26 @@ "DisabledForLocalAddresses": "Desativado para endereços locais", "None": "Nenhum", "ResetAPIKeyMessageText": "Tem a certeza que quer repor a Chave da API?", - "ActiveApps": "Aplicações Ativadas", - "ActiveIndexers": "Indexadores ativados" + "ActiveApps": "Aplicações ativadas", + "ActiveIndexers": "Indexadores ativados", + "AuthenticationRequired": "Autenticação Necessária", + "Episode": "Episódio", + "AppUpdated": "{appName} Atualizado", + "AuthenticationRequiredHelpText": "Altere para quais solicitações a autenticação é necessária. Não mude a menos que você entenda os riscos.", + "EditIndexerProxyImplementation": "Adicionar Indexador - {implementationName}", + "AddApplicationImplementation": "Adicionar Condição - {implementationName}", + "AddConnectionImplementation": "Adicionar Conexão - {implementationName}", + "AddDownloadClientImplementation": "Adicionar Cliente de Download - {implementationName}", + "AddIndexerImplementation": "Adicionar Indexador - {implementationName}", + "AddIndexerProxyImplementation": "Adicionar Indexador - {implementationName}", + "AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}", + "AuthenticationRequiredWarning": "Para evitar o acesso remoto sem autenticação, {appName} agora exige que a autenticação esteja habilitada. Opcionalmente, você pode desabilitar a autenticação de endereços locais.", + "EditApplicationImplementation": "Adicionar Conexão - {implementationName}", + "EditConnectionImplementation": "Adicionar Conexão - {implementationName}", + "EditDownloadClientImplementation": "Adicionar Cliente de Download - {implementationName}", + "AuthenticationMethod": "Método de Autenticação", + "AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido", + "AuthenticationRequiredPasswordHelpTextWarning": "Insira uma nova senha", + "AuthenticationRequiredUsernameHelpTextWarning": "Insira um novo Nome de Usuário", + "EditIndexerImplementation": "Adicionar Indexador - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index fad60ea04..d2d4deb81 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -82,7 +82,7 @@ "ClientPriority": "Prioridade do cliente", "CloneProfile": "Clonar perfil", "Close": "Fechar", - "CloseCurrentModal": "Fechar modal atual", + "CloseCurrentModal": "Fechar pop-up atual", "Columns": "Colunas", "Component": "Componente", "Connect": "Notificações", @@ -161,7 +161,7 @@ "FilterPlaceHolder": "Pesquisar indexadores", "Filters": "Filtros", "Fixed": "Corrigido", - "FocusSearchBox": "Selecionar caixa de pesquisa", + "FocusSearchBox": "Selecionar a caixa de pesquisa", "Folder": "Pasta", "ForMoreInformationOnTheIndividualDownloadClients": "Para saber mais sobre cada cliente de download, clique nos botões de informações.", "FullSync": "Sincronização completa", @@ -219,13 +219,13 @@ "IndexerVipCheckExpiredClientMessage": "Benefícios VIP do Indexador expiraram: {0}", "IndexerVipCheckExpiringClientMessage": "Os benefícios VIPS do Indexador expirarão em breve: {0}", "Indexers": "Indexadores", - "Info": "Info", + "Info": "Informações", "InitialFailure": "Falha Inicial", - "InstanceName": "Nome da Instância", + "InstanceName": "Nome da instância", "InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog", - "InteractiveSearch": "Pesquisa Interativa", + "InteractiveSearch": "Pesquisa interativa", "Interval": "Intervalo", - "KeyboardShortcuts": "Atalhos do Teclado", + "KeyboardShortcuts": "Atalhos de teclado", "Label": "Rótulo", "Language": "Idioma", "LastDuration": "Última Duração", @@ -236,9 +236,9 @@ "Level": "Nível", "Link": "Link", "LogFiles": "Arquivos de registro", - "LogLevel": "Nível de Registro", - "LogLevelTraceHelpTextWarning": "O registro de rastreamento deve ser ativado apenas temporariamente", - "Logging": "Registrando", + "LogLevel": "Nível de registro", + "LogLevelTraceHelpTextWarning": "O registro em log deve ser habilitado apenas temporariamente", + "Logging": "Registro em log", "Logs": "Registros", "MIA": "Desaparecidos", "MaintenanceRelease": "Versão de manutenção: correções de bugs e outros aprimoramentos. Consulte o Histórico de Commit do Github para obter mais detalhes", @@ -265,9 +265,9 @@ "No": "Não", "NoBackupsAreAvailable": "Não há backups disponíveis", "NoChange": "Sem alteração", - "NoChanges": "Sem Alterações", + "NoChanges": "Sem alterações", "NoLeaveIt": "Não, deixe", - "NoLinks": "Sem Links", + "NoLinks": "Sem links", "NoLogFiles": "Nenhum arquivo de registro", "NoSearchResultsFound": "Nenhum resultado encontrado, tente fazer uma nova busca abaixo.", "NoTagsHaveBeenAddedYet": "Nenhuma tag foi adicionada ainda", @@ -288,7 +288,7 @@ "OnHealthRestored": "Com a Saúde Restaurada", "OnHealthRestoredHelpText": "Com a Saúde Restaurada", "OpenBrowserOnStart": "Abrir navegador ao iniciar", - "OpenThisModal": "Abrir este modal", + "OpenThisModal": "Abrir este pop-up", "Options": "Opções", "PackageVersion": "Versão do pacote", "PageSize": "Tamanho da página", @@ -360,7 +360,7 @@ "SSLPort": "Porta SSL", "Save": "Salvar", "SaveChanges": "Salvar Mudanças", - "SaveSettings": "Salvar Configurações", + "SaveSettings": "Salvar configurações", "Scheduled": "Programado", "ScriptPath": "Caminho do Script", "Search": "Pesquisar", @@ -386,7 +386,7 @@ "SettingsLogRotate": "Rotação de logs", "SettingsLogRotateHelpText": "Quantidade máxima de arquivos de log a manter na pasta", "SettingsLogSql": "Registrar SQL", - "SettingsLongDateFormat": "Formato longo da data", + "SettingsLongDateFormat": "Formato longo de data", "SettingsShortDateFormat": "Formato curto da data", "SettingsShowRelativeDates": "Mostrar datas relativas", "SettingsShowRelativeDatesHelpText": "Mostrar datas absolutas ou relativas (Hoje, Ontem, etc.)", @@ -586,7 +586,7 @@ "DefaultNameCopiedProfile": "{name} - Cópia", "DisabledForLocalAddresses": "Desabilitado para endereços locais", "External": "Externo", - "None": "Vazio", + "None": "Nenhum", "ResetAPIKeyMessageText": "Tem certeza de que deseja redefinir sua chave de API?", "AuthBasic": "Básico (pop-up do navegador)", "ActiveIndexers": "Indexadores Ativos", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index c6a637576..6e302ffaa 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -452,5 +452,14 @@ "AddIndexerImplementation": "Adăugați Indexator - {implementationName}", "AddIndexerProxyImplementation": "Adăugați proxy indexator - {implementationName}", "Album": "Album", - "AppUpdated": "{appName} actualizat" + "AppUpdated": "{appName} actualizat", + "NoHistoryFound": "Nu s-a găsit istoric", + "AuthenticationRequiredPasswordHelpTextWarning": "Introduceți o parolă nouă", + "AuthenticationRequiredUsernameHelpTextWarning": "Introduceți un nou nume de utilizator", + "DefaultNameCopiedProfile": "{name} - Copie", + "EditConnectionImplementation": "Adăugați conexiune - {implementationName}", + "EditDownloadClientImplementation": "Adăugați client de descărcare - {implementationName}", + "EditIndexerImplementation": "Adăugați Indexator - {implementationName}", + "EditIndexerProxyImplementation": "Adăugați proxy indexator - {implementationName}", + "EditApplicationImplementation": "Adăugați aplicație - {implementareName}" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index add28a373..628fba304 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -415,5 +415,8 @@ "ResetAPIKeyMessageText": "Вы уверены, что хотите сбросить Ваш API ключ?", "Categories": "Категории", "Album": "альбом", - "AddCustomFilter": "Добавить специальный фильтр" + "AddCustomFilter": "Добавить специальный фильтр", + "AuthenticationMethod": "Способ авторизации", + "AuthenticationRequiredPasswordHelpTextWarning": "Введите новый пароль", + "AuthenticationRequiredUsernameHelpTextWarning": "Введите новое имя пользователя" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index 98cdc821e..2c2a2e310 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -353,5 +353,6 @@ "AuthForm": "Biểu mẫu (Trang đăng nhập)", "DisabledForLocalAddresses": "Bị vô hiệu hóa đối với địa chỉ địa phương", "None": "không ai", - "ResetAPIKeyMessageText": "Bạn có chắc chắn muốn đặt lại Khóa API của mình không?" + "ResetAPIKeyMessageText": "Bạn có chắc chắn muốn đặt lại Khóa API của mình không?", + "ApiKeyValidationHealthCheckMessage": "Hãy cập nhật mã API để dài ít nhất {length} kí tự. Bạn có thể làm điều này trong cài đặt hoặc trong tập config" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 9c5eac740..c4fec281c 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -44,10 +44,10 @@ "AudioSearch": "音频搜索", "Auth": "认证", "Authentication": "认证", - "AuthenticationMethodHelpText": "需要用户名和密码以访问{appName}", - "AuthenticationRequired": "需要认证", - "AuthenticationRequiredHelpText": "更改需要身份验证的请求。除非您了解风险,否则请勿更改。", - "AuthenticationRequiredWarning": "为了防止未经身份验证的远程访问,{appName}现在需要启用身份验证。您可以选择禁用本地地址的身份验证。", + "AuthenticationMethodHelpText": "需要用户名和密码以访问 {appName}", + "AuthenticationRequired": "需要身份验证", + "AuthenticationRequiredHelpText": "更改身份验证的请求。除非您了解风险,否则请勿更改。", + "AuthenticationRequiredWarning": "为了防止未经身份验证的远程访问,{appName} 现在需要启用身份验证。您可以禁用本地地址的身份验证。", "Author": "作者", "Automatic": "自动化", "AutomaticSearch": "自动搜索", @@ -390,8 +390,8 @@ "SettingsSqlLoggingHelpText": "记录来自Prowlarr的所有SQL查询", "SettingsTimeFormat": "时间格式", "ShowAdvanced": "显示高级设置", - "ShowSearch": "显示搜索按钮", - "ShowSearchHelpText": "在选项中显示搜索框", + "ShowSearch": "显示搜索", + "ShowSearchHelpText": "悬停时显示搜索按钮", "Shutdown": "关机", "Size": "大小", "Sort": "排序", @@ -401,7 +401,7 @@ "StartupDirectory": "启动目录", "Stats": "统计数据", "Status": "状态", - "StopSelecting": "停止选中", + "StopSelecting": "停止选择", "Style": "类型", "SuggestTranslationChange": "建议翻译改变 Suggest translation change", "SyncAppIndexers": "同步应用索引", @@ -463,7 +463,7 @@ "UnableToLoadTags": "无法加载标签", "UnableToLoadUISettings": "无法加载UI设置", "UnsavedChanges": "未保存更改", - "UnselectAll": "全不选", + "UnselectAll": "取消选择全部", "UpdateAutomaticallyHelpText": "自动下载并安装更新。你还可以在“系统:更新”中安装", "UpdateAvailable": "有新的更新可用", "UpdateCheckStartupNotWritableMessage": "无法安装更新,因为用户“{1}”对于启动文件夹“{0}”没有写入权限。", @@ -572,12 +572,12 @@ "AuthBasic": "基础(浏览器弹出对话框)", "AuthForm": "表单(登陆页面)", "AuthenticationMethod": "认证方式", - "AuthenticationMethodHelpTextWarning": "请选择有效的认证方式", - "AuthenticationRequiredPasswordHelpTextWarning": "输入一个新的密码", - "AuthenticationRequiredUsernameHelpTextWarning": "输入一个新的用户名", + "AuthenticationMethodHelpTextWarning": "请选择一个有效的身份验证方式", + "AuthenticationRequiredPasswordHelpTextWarning": "请输入新密码", + "AuthenticationRequiredUsernameHelpTextWarning": "请输入新用户名", "Clone": "复制", "DefaultNameCopiedProfile": "{name} - 复制", - "DisabledForLocalAddresses": "对局域网内禁用", + "DisabledForLocalAddresses": "在本地地址上禁用", "External": "外部的", "None": "无", "ResetAPIKeyMessageText": "您确定要重置您的 API 密钥吗?", From 3130fac1062edfd31542302ce9d532979c1f319f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 18 Nov 2023 05:07:10 +0200 Subject: [PATCH 300/964] New: (AnimeBytes) Filter old releases on RSS --- src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index 2fad1bfee..830b0e6f5 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -91,6 +91,11 @@ namespace NzbDrone.Core.Indexers.Definitions { var cleanReleases = base.CleanupReleases(releases, searchCriteria); + if (searchCriteria.IsRssSearch) + { + cleanReleases = cleanReleases.Where(r => r.PublishDate > DateTime.Now.AddDays(-1)).ToList(); + } + return cleanReleases.Select(r => (ReleaseInfo)r.Clone()).ToList(); } From 709dfe453bd5b1cf60d9e4325d68f277feddc1d1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 18 Nov 2023 06:08:12 +0200 Subject: [PATCH 301/964] Fix AB tests --- .../IndexerTests/AnimeBytesTests/AnimeBytesFixture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/AnimeBytesTests/AnimeBytesFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AnimeBytesTests/AnimeBytesFixture.cs index 8532d7c8c..be01ec6e4 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AnimeBytesTests/AnimeBytesFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AnimeBytesTests/AnimeBytesFixture.cs @@ -43,7 +43,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AnimeBytesTests .Setup(o => o.ExecuteProxiedAsync(It.Is(v => v.Method == HttpMethod.Get), Subject.Definition)) .Returns((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed))); - var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000, 5000 } })).Releases; + var releases = (await Subject.Fetch(new BasicSearchCriteria { SearchTerm = "test", Categories = new[] { 2000, 5000 } })).Releases; releases.Should().HaveCount(33); releases.First().Should().BeOfType(); From 343d7088c94d791340647dc0bbf41506e76ebb98 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 19 Nov 2023 01:36:50 +0200 Subject: [PATCH 302/964] Fixed: Don't die on info indexer when the definition is missing --- .../Indexer/Info/IndexerInfoModalContent.tsx | 43 +++++++++++-------- src/NzbDrone.Core/Localization/Core/en.json | 5 ++- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx b/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx index 28c9a58ee..b54092b4a 100644 --- a/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx +++ b/frontend/src/Indexer/Info/IndexerInfoModalContent.tsx @@ -3,6 +3,7 @@ import React, { useCallback, useState } from 'react'; import { useSelector } from 'react-redux'; import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import { createSelector } from 'reselect'; +import Alert from 'Components/Alert'; import DescriptionList from 'Components/DescriptionList/DescriptionList'; import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem'; import DescriptionListItemDescription from 'Components/DescriptionList/DescriptionListItemDescription'; @@ -23,7 +24,7 @@ import TagListConnector from 'Components/TagListConnector'; import { kinds } from 'Helpers/Props'; import DeleteIndexerModal from 'Indexer/Delete/DeleteIndexerModal'; import EditIndexerModalConnector from 'Indexer/Edit/EditIndexerModalConnector'; -import Indexer from 'Indexer/Indexer'; +import Indexer, { IndexerCapabilities } from 'Indexer/Indexer'; import { createIndexerSelectorForHook } from 'Store/Selectors/createIndexerSelector'; import translate from 'Utilities/String/translate'; import IndexerHistory from './History/IndexerHistory'; @@ -63,7 +64,7 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { fields, tags, protocol, - capabilities, + capabilities = {} as IndexerCapabilities, } = indexer as Indexer; const { onModalClose } = props; @@ -207,7 +208,7 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { descriptionClassName={styles.description} title={translate('RawSearchSupported')} data={ - capabilities.supportsRawSearch + capabilities?.supportsRawSearch ? translate('Yes') : translate('No') } @@ -216,12 +217,12 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { descriptionClassName={styles.description} title={translate('SearchTypes')} data={ - capabilities.searchParams.length === 0 ? ( - translate('NotSupported') - ) : ( + capabilities?.searchParams?.length > 0 ? ( + ) : ( + translate('NotSupported') ) } /> @@ -229,60 +230,60 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { descriptionClassName={styles.description} title={translate('TVSearchTypes')} data={ - capabilities.tvSearchParams.length === 0 - ? translate('NotSupported') - : capabilities.tvSearchParams.map((p) => { + capabilities?.tvSearchParams?.length > 0 + ? capabilities.tvSearchParams.map((p) => { return ( ); }) + : translate('NotSupported') } /> { + capabilities?.movieSearchParams?.length > 0 + ? capabilities.movieSearchParams.map((p) => { return ( ); }) + : translate('NotSupported') } /> { + capabilities?.bookSearchParams?.length > 0 + ? capabilities.bookSearchParams.map((p) => { return ( ); }) + : translate('NotSupported') } /> { + capabilities?.musicSearchParams?.length > 0 + ? capabilities.musicSearchParams.map((p) => { return ( ); }) + : translate('NotSupported') } /> @@ -338,7 +339,11 @@ function IndexerInfoModalContent(props: IndexerInfoModalContentProps) { })} - ) : null} + ) : ( + + {translate('NoIndexerCategories')} + + )}
    diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 23367daea..62804cae7 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -2,8 +2,8 @@ "About": "About", "AcceptConfirmationModal": "Accept Confirmation Modal", "Actions": "Actions", - "ActiveIndexers": "Active Indexers", "ActiveApps": "Active Apps", + "ActiveIndexers": "Active Indexers", "Add": "Add", "AddApplication": "Add Application", "AddApplicationImplementation": "Add Application - {implementationName}", @@ -339,8 +339,9 @@ "NoChanges": "No Changes", "NoDownloadClientsFound": "No download clients found", "NoHistoryFound": "No history found", - "NoIndexersFound": "No indexers found", + "NoIndexerCategories": "No categories found for this indexer", "NoIndexerHistory": "No history found for this indexer", + "NoIndexersFound": "No indexers found", "NoLeaveIt": "No, Leave It", "NoLinks": "No Links", "NoLogFiles": "No log files", From 75f00436ecacf29838e49a2b2b6a062cbfa272b5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 19 Nov 2023 07:05:56 +0200 Subject: [PATCH 303/964] Bump version to 1.10.5 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 76cc387a3..4e45206c2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.10.4' + majorVersion: '1.10.5' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From e1b063eaa51533a56bb771db9d64154b9b881bc6 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Fri, 10 Nov 2023 01:00:54 +0100 Subject: [PATCH 304/964] Fixed: Replacing 'appName' translation token (cherry picked from commit 2e51b8792db0d3ec402672dc92c95f3cb886ef44) --- frontend/src/Utilities/String/translate.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/frontend/src/Utilities/String/translate.ts b/frontend/src/Utilities/String/translate.ts index 2ee319bc8..1faa70ecc 100644 --- a/frontend/src/Utilities/String/translate.ts +++ b/frontend/src/Utilities/String/translate.ts @@ -25,20 +25,18 @@ export async function fetchTranslations(): Promise { export default function translate( key: string, - tokens?: Record + tokens: Record = {} ) { const translation = translations[key] || key; - if (tokens) { - // Fallback to the old behaviour for translations not yet updated to use named tokens - Object.values(tokens).forEach((value, index) => { - tokens[index] = value; - }); + tokens.appName = 'Prowlarr'; - return translation.replace(/\{([a-z0-9]+?)\}/gi, (match, tokenMatch) => - String(tokens[tokenMatch] ?? match) - ); - } + // Fallback to the old behaviour for translations not yet updated to use named tokens + Object.values(tokens).forEach((value, index) => { + tokens[index] = value; + }); - return translation; + return translation.replace(/\{([a-z0-9]+?)\}/gi, (match, tokenMatch) => + String(tokens[tokenMatch] ?? match) + ); } From 7fa4daae9b6cc47bb69f6b60429177a6fd02095b Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 18 Nov 2023 17:47:02 -0800 Subject: [PATCH 305/964] Fixed: Disable SSL when using the removed SslCertHash configuration (cherry picked from commit d95660d3c78d1ee11a7966d58e78a82a8df01393) --- .../Configuration/ConfigFileProvider.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index c2731e084..a7b78fd92 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -325,6 +325,20 @@ namespace NzbDrone.Core.Configuration } } + public void MigrateConfigFile() + { + if (!File.Exists(_configFile)) + { + return; + } + + // If SSL is enabled and a cert hash is still in the config file disable SSL + if (EnableSsl && GetValue("SslCertHash", null).IsNotNullOrWhiteSpace()) + { + SetValue("EnableSsl", false); + } + } + private void DeleteOldValues() { var xDoc = LoadConfigFile(); @@ -396,6 +410,7 @@ namespace NzbDrone.Core.Configuration public void HandleAsync(ApplicationStartedEvent message) { + MigrateConfigFile(); EnsureDefaultConfigFile(); DeleteOldValues(); } From 26a657fa77abb0e46c515b2164d770ffe17207f5 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 18 Nov 2023 18:51:23 -0800 Subject: [PATCH 306/964] New: Require password confirmation when setting or changing password (cherry picked from commit b248163df598dc611ee919d525eb7357256d73d5) --- .../AuthenticationRequiredModalContent.js | 15 +++++++++- .../src/Settings/General/SecuritySettings.js | 16 ++++++++++ src/NzbDrone.Core/Localization/Core/en.json | 2 ++ .../Validation/Paths/FileExistsValidator.cs | 2 +- .../Config/HostConfigController.cs | 29 +++++++++++++++---- .../Config/HostConfigResource.cs | 1 + 6 files changed, 58 insertions(+), 7 deletions(-) diff --git a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js index 9e561eae2..75c527da5 100644 --- a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js +++ b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js @@ -34,7 +34,8 @@ function AuthenticationRequiredModalContent(props) { authenticationMethod, authenticationRequired, username, - password + password, + passwordConfirmation } = settings; const authenticationEnabled = authenticationMethod && authenticationMethod.value !== 'none'; @@ -120,6 +121,18 @@ function AuthenticationRequiredModalContent(props) { {...password} /> + + + {translate('PasswordConfirmation')} + + +
: null } diff --git a/frontend/src/Settings/General/SecuritySettings.js b/frontend/src/Settings/General/SecuritySettings.js index 9a930b1d5..7234f9298 100644 --- a/frontend/src/Settings/General/SecuritySettings.js +++ b/frontend/src/Settings/General/SecuritySettings.js @@ -124,6 +124,7 @@ class SecuritySettings extends Component { authenticationRequired, username, password, + passwordConfirmation, apiKey, certificateValidation } = settings; @@ -193,6 +194,21 @@ class SecuritySettings extends Component { null } + { + authenticationEnabled ? + + {translate('PasswordConfirmation')} + + + : + null + } + {translate('ApiKey')} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 62804cae7..9099791e1 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -77,6 +77,7 @@ "AuthenticationMethodHelpTextWarning": "Please select a valid authentication method", "AuthenticationRequired": "Authentication Required", "AuthenticationRequiredHelpText": "Change which requests authentication is required for. Do not change unless you understand the risks.", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirm new password", "AuthenticationRequiredPasswordHelpTextWarning": "Enter a new password", "AuthenticationRequiredUsernameHelpTextWarning": "Enter a new username", "AuthenticationRequiredWarning": "To prevent remote access without authentication, {appName} now requires authentication to be enabled. You can optionally disable authentication from local addresses.", @@ -376,6 +377,7 @@ "PageSizeHelpText": "Number of items to show on each page", "Parameters": "Parameters", "Password": "Password", + "PasswordConfirmation": "Password Confirmation", "Peers": "Peers", "PendingChangesDiscardChanges": "Discard changes and leave", "PendingChangesMessage": "You have unsaved changes, are you sure you want to leave this page?", diff --git a/src/NzbDrone.Core/Validation/Paths/FileExistsValidator.cs b/src/NzbDrone.Core/Validation/Paths/FileExistsValidator.cs index 5393ce57b..327765537 100644 --- a/src/NzbDrone.Core/Validation/Paths/FileExistsValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/FileExistsValidator.cs @@ -1,4 +1,4 @@ -using FluentValidation.Validators; +using FluentValidation.Validators; using NzbDrone.Common.Disk; namespace NzbDrone.Core.Validation.Paths diff --git a/src/Prowlarr.Api.V1/Config/HostConfigController.cs b/src/Prowlarr.Api.V1/Config/HostConfigController.cs index 9e3a82498..427fc8db3 100644 --- a/src/Prowlarr.Api.V1/Config/HostConfigController.cs +++ b/src/Prowlarr.Api.V1/Config/HostConfigController.cs @@ -47,6 +47,9 @@ namespace Prowlarr.Api.V1.Config SharedValidator.RuleFor(c => c.Password).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Basic || c.AuthenticationMethod == AuthenticationType.Forms); + SharedValidator.RuleFor(c => c.PasswordConfirmation) + .Must((resource, p) => IsMatchingPassword(resource)).WithMessage("Must match Password"); + SharedValidator.RuleFor(c => c.SslPort).ValidPort().When(c => c.EnableSsl); SharedValidator.RuleFor(c => c.SslPort).NotEqual(c => c.Port).When(c => c.EnableSsl); @@ -81,6 +84,23 @@ namespace Prowlarr.Api.V1.Config return cert != null; } + private bool IsMatchingPassword(HostConfigResource resource) + { + var user = _userService.FindUser(); + + if (user != null && user.Password == resource.Password) + { + return true; + } + + if (resource.Password == resource.PasswordConfirmation) + { + return true; + } + + return false; + } + public override HostConfigResource GetResourceById(int id) { return GetHostConfig(); @@ -94,11 +114,10 @@ namespace Prowlarr.Api.V1.Config resource.Id = 1; var user = _userService.FindUser(); - if (user != null) - { - resource.Username = user.Username; - resource.Password = user.Password; - } + + resource.Username = user?.Username ?? string.Empty; + resource.Password = user?.Password ?? string.Empty; + resource.PasswordConfirmation = string.Empty; return resource; } diff --git a/src/Prowlarr.Api.V1/Config/HostConfigResource.cs b/src/Prowlarr.Api.V1/Config/HostConfigResource.cs index 35f4eca84..425453913 100644 --- a/src/Prowlarr.Api.V1/Config/HostConfigResource.cs +++ b/src/Prowlarr.Api.V1/Config/HostConfigResource.cs @@ -19,6 +19,7 @@ namespace Prowlarr.Api.V1.Config public bool AnalyticsEnabled { get; set; } public string Username { get; set; } public string Password { get; set; } + public string PasswordConfirmation { get; set; } public string LogLevel { get; set; } public string ConsoleLogLevel { get; set; } public string Branch { get; set; } From d7927f60fe9d27b2762186617ecc9d0be161bc08 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 19 Nov 2023 22:32:43 +0200 Subject: [PATCH 307/964] Cleanup appName tokens Co-authored-by: Stevie Robinson --- frontend/src/App/AppUpdatedModalContent.js | 4 +- frontend/src/App/ConnectionLostModal.js | 4 +- .../AuthenticationRequiredModalContent.js | 4 +- .../src/Settings/General/SecuritySettings.js | 4 +- frontend/src/System/Updates/Updates.js | 2 +- src/NzbDrone.Core/Localization/Core/ar.json | 18 +++---- src/NzbDrone.Core/Localization/Core/bg.json | 18 +++---- src/NzbDrone.Core/Localization/Core/ca.json | 16 +++--- src/NzbDrone.Core/Localization/Core/cs.json | 20 ++++---- src/NzbDrone.Core/Localization/Core/da.json | 20 ++++---- src/NzbDrone.Core/Localization/Core/de.json | 44 ++++++++-------- src/NzbDrone.Core/Localization/Core/el.json | 50 +++++++++---------- src/NzbDrone.Core/Localization/Core/en.json | 50 +++++++++---------- src/NzbDrone.Core/Localization/Core/es.json | 26 +++++----- src/NzbDrone.Core/Localization/Core/fi.json | 34 ++++++------- src/NzbDrone.Core/Localization/Core/fr.json | 50 +++++++++---------- src/NzbDrone.Core/Localization/Core/he.json | 26 +++++----- src/NzbDrone.Core/Localization/Core/hi.json | 4 +- src/NzbDrone.Core/Localization/Core/hr.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 50 +++++++++---------- src/NzbDrone.Core/Localization/Core/is.json | 20 ++++---- src/NzbDrone.Core/Localization/Core/it.json | 50 +++++++++---------- src/NzbDrone.Core/Localization/Core/ja.json | 18 +++---- src/NzbDrone.Core/Localization/Core/ko.json | 16 +++--- .../Localization/Core/nb_NO.json | 12 ++--- src/NzbDrone.Core/Localization/Core/nl.json | 46 ++++++++--------- src/NzbDrone.Core/Localization/Core/pl.json | 20 ++++---- src/NzbDrone.Core/Localization/Core/pt.json | 42 ++++++++-------- .../Localization/Core/pt_BR.json | 50 +++++++++---------- src/NzbDrone.Core/Localization/Core/ro.json | 36 ++++++------- src/NzbDrone.Core/Localization/Core/ru.json | 22 ++++---- src/NzbDrone.Core/Localization/Core/sk.json | 10 ++-- src/NzbDrone.Core/Localization/Core/sv.json | 44 ++++++++-------- src/NzbDrone.Core/Localization/Core/th.json | 18 +++---- src/NzbDrone.Core/Localization/Core/tr.json | 20 ++++---- src/NzbDrone.Core/Localization/Core/uk.json | 20 ++++---- src/NzbDrone.Core/Localization/Core/vi.json | 20 ++++---- .../Localization/Core/zh_CN.json | 50 +++++++++---------- .../Localization/Core/zh_TW.json | 2 +- 39 files changed, 481 insertions(+), 481 deletions(-) diff --git a/frontend/src/App/AppUpdatedModalContent.js b/frontend/src/App/AppUpdatedModalContent.js index 71dc7702c..8cce1bc16 100644 --- a/frontend/src/App/AppUpdatedModalContent.js +++ b/frontend/src/App/AppUpdatedModalContent.js @@ -65,12 +65,12 @@ function AppUpdatedModalContent(props) { return ( - {translate('AppUpdated', { appName: 'Prowlarr' })} + {translate('AppUpdated')}
- +
{ diff --git a/frontend/src/App/ConnectionLostModal.js b/frontend/src/App/ConnectionLostModal.js index 71cfa907e..5c08f491f 100644 --- a/frontend/src/App/ConnectionLostModal.js +++ b/frontend/src/App/ConnectionLostModal.js @@ -28,11 +28,11 @@ function ConnectionLostModal(props) {
- {translate('ConnectionLostToBackend', { appName: 'Prowlarr' })} + {translate('ConnectionLostToBackend')}
- {translate('ConnectionLostReconnect', { appName: 'Prowlarr' })} + {translate('ConnectionLostReconnect')}
diff --git a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js index 75c527da5..17a04e403 100644 --- a/frontend/src/FirstRun/AuthenticationRequiredModalContent.js +++ b/frontend/src/FirstRun/AuthenticationRequiredModalContent.js @@ -64,7 +64,7 @@ function AuthenticationRequiredModalContent(props) { className={styles.authRequiredAlert} kind={kinds.WARNING} > - {translate('AuthenticationRequiredWarning', { appName: 'Prowlarr' })} + {translate('AuthenticationRequiredWarning')} { @@ -77,7 +77,7 @@ function AuthenticationRequiredModalContent(props) { type={inputTypes.SELECT} name="authenticationMethod" values={authenticationMethodOptions} - helpText={translate('AuthenticationMethodHelpText', { appName: 'Prowlarr' })} + helpText={translate('AuthenticationMethodHelpText')} helpTextWarning={authenticationMethod.value === 'none' ? translate('AuthenticationMethodHelpTextWarning') : undefined} helpLink="https://wiki.servarr.com/prowlarr/faq#forced-authentication" onChange={onInputChange} diff --git a/frontend/src/Settings/General/SecuritySettings.js b/frontend/src/Settings/General/SecuritySettings.js index 7234f9298..8e2597741 100644 --- a/frontend/src/Settings/General/SecuritySettings.js +++ b/frontend/src/Settings/General/SecuritySettings.js @@ -140,8 +140,8 @@ class SecuritySettings extends Component { type={inputTypes.SELECT} name="authenticationMethod" values={authenticationMethodOptions} - helpText={translate('AuthenticationMethodHelpText', { appName: 'Prowlarr' })} - helpTextWarning={translate('AuthenticationRequiredWarning', { appName: 'Prowlarr' })} + helpText={translate('AuthenticationMethodHelpText')} + helpTextWarning={translate('AuthenticationRequiredWarning')} onChange={onInputChange} {...authenticationMethod} /> diff --git a/frontend/src/System/Updates/Updates.js b/frontend/src/System/Updates/Updates.js index 0920df897..40ab58c75 100644 --- a/frontend/src/System/Updates/Updates.js +++ b/frontend/src/System/Updates/Updates.js @@ -114,7 +114,7 @@ class Updates extends Component { />
- {translate('TheLatestVersionIsAlreadyInstalled', { appName: 'Prowlarr' })} + {translate('TheLatestVersionIsAlreadyInstalled')}
{ diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 9f8d583ba..2cbc38939 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -77,7 +77,7 @@ "Source": "مصدر", "SSLCertPassword": "كلمة مرور شهادة SSL", "UpdateCheckStartupNotWritableMessage": "لا يمكن تثبيت التحديث لأن مجلد بدء التشغيل \"{0}\" غير قابل للكتابة بواسطة المستخدم \"{1}\".", - "UpdateMechanismHelpText": "استخدم المحدث أو البرنامج النصي المدمج في Prowlarr", + "UpdateMechanismHelpText": "استخدم المحدث أو البرنامج النصي المدمج في {appName}", "AppDataDirectory": "دليل AppData", "ConnectSettings": "ربط الإعدادات", "CouldNotConnectSignalR": "تعذر الاتصال بـ SignalR ، لن يتم تحديث واجهة المستخدم", @@ -98,7 +98,7 @@ "AppDataLocationHealthCheckMessage": "لن يكون التحديث ممكنًا لمنع حذف AppData عند التحديث", "AutomaticSearch": "البحث التلقائي", "Backup": "دعم", - "BackupFolderHelpText": "ستكون المسارات النسبية ضمن دليل AppData الخاص بـ Prowlarr", + "BackupFolderHelpText": "ستكون المسارات النسبية ضمن دليل AppData الخاص بـ {appName}", "BeforeUpdate": "قبل التحديث", "BindAddress": "عنوان ملزم", "CertificateValidationHelpText": "تغيير مدى صرامة التحقق من صحة شهادة HTTPS", @@ -144,7 +144,7 @@ "OpenBrowserOnStart": "افتح المتصفح عند البدء", "OpenThisModal": "افتح هذا النموذج", "SSLCertPathHelpText": "مسار ملف pfx", - "ReleaseBranchCheckOfficialBranchMessage": "الفرع {0} ليس فرع إصدار Prowlarr صالح ، لن تتلقى تحديثات", + "ReleaseBranchCheckOfficialBranchMessage": "الفرع {0} ليس فرع إصدار {appName} صالح ، لن تتلقى تحديثات", "RemovedFromTaskQueue": "تمت إزالته من قائمة انتظار المهام", "RemoveFilter": "قم بإزالة الفلتر", "RemovingTag": "إزالة العلامة", @@ -176,7 +176,7 @@ "Hostname": "اسم المضيف", "IgnoredAddresses": "العناوين التي تم تجاهلها", "UILanguage": "لغة واجهة المستخدم", - "UILanguageHelpText": "اللغة التي سيستخدمها Prowlarr لواجهة المستخدم", + "UILanguageHelpText": "اللغة التي سيستخدمها {appName} لواجهة المستخدم", "UILanguageHelpTextWarning": "يلزم إعادة تحميل المتصفح", "KeyboardShortcuts": "اختصارات لوحة المفاتيح", "LogFiles": "ملفات الدخول", @@ -233,10 +233,10 @@ "SSLPort": "منفذ SSL", "UpdateAutomaticallyHelpText": "تنزيل التحديثات وتثبيتها تلقائيًا. ستظل قادرًا على التثبيت من النظام: التحديثات", "All": "الكل", - "AnalyticsEnabledHelpText": "إرسال معلومات الاستخدام والخطأ المجهولة إلى خوادم Prowlarr. يتضمن ذلك معلومات حول متصفحك ، وصفحات Prowlarr WebUI التي تستخدمها ، والإبلاغ عن الأخطاء بالإضافة إلى إصدار نظام التشغيل ووقت التشغيل. سنستخدم هذه المعلومات لتحديد أولويات الميزات وإصلاحات الأخطاء.", + "AnalyticsEnabledHelpText": "إرسال معلومات الاستخدام والخطأ المجهولة إلى خوادم {appName}. يتضمن ذلك معلومات حول متصفحك ، وصفحات {appName} WebUI التي تستخدمها ، والإبلاغ عن الأخطاء بالإضافة إلى إصدار نظام التشغيل ووقت التشغيل. سنستخدم هذه المعلومات لتحديد أولويات الميزات وإصلاحات الأخطاء.", "ApplyTags": "تطبيق العلامات", "Branch": "فرع شجرة", - "BranchUpdate": "فرع لاستخدامه لتحديث Prowlarr", + "BranchUpdate": "فرع لاستخدامه لتحديث {appName}", "CancelPendingTask": "هل أنت متأكد أنك تريد إلغاء هذه المهمة المعلقة؟", "DeleteNotificationMessageText": "هل تريد بالتأكيد حذف الإشعار \"{0}\"؟", "DeleteTag": "حذف العلامة", @@ -274,17 +274,17 @@ "Indexers": "مفهرسات", "InteractiveSearch": "بحث تفاعلي", "LastWriteTime": "وقت الكتابة الأخير", - "LaunchBrowserHelpText": " افتح مستعرض ويب وانتقل إلى صفحة Prowlarr الرئيسية عند بدء التطبيق.", + "LaunchBrowserHelpText": " افتح مستعرض ويب وانتقل إلى صفحة {appName} الرئيسية عند بدء التطبيق.", "Level": "مستوى", "Logs": "السجلات", "Mechanism": "آلية", "Message": "رسالة", "MIA": "MIA", "RefreshMovie": "تحديث الفيلم", - "EnableAutomaticSearchHelpText": "سيتم استخدامه عند إجراء عمليات البحث التلقائي عبر واجهة المستخدم أو بواسطة Prowlarr", + "EnableAutomaticSearchHelpText": "سيتم استخدامه عند إجراء عمليات البحث التلقائي عبر واجهة المستخدم أو بواسطة {appName}", "Status": "الحالة", "Uptime": "مدة التشغيل", - "AuthenticationMethodHelpText": "طلب اسم المستخدم وكلمة المرور للوصول إلى Prowlarr", + "AuthenticationMethodHelpText": "طلب اسم المستخدم وكلمة المرور للوصول إلى {appName}", "Automatic": "تلقائي", "Mode": "الوضع", "Options": "خيارات", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index dec9b077d..1c9f3d83f 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -21,7 +21,7 @@ "Automatic": "Автоматично", "AutomaticSearch": "Автоматично търсене", "Backup": "Архивиране", - "BackupFolderHelpText": "Относителните пътища ще бъдат в директорията AppData на Prowlarr", + "BackupFolderHelpText": "Относителните пътища ще бъдат в директорията AppData на {appName}", "BackupIntervalHelpText": "Интервал между автоматичните архиви", "BackupNow": "Архивиране сега", "ChangeHasNotBeenSavedYet": "Промяната все още не е запазена", @@ -48,8 +48,8 @@ "AddingTag": "Добавяне на таг", "All": "всичко", "Analytics": "Анализ", - "AnalyticsEnabledHelpText": "Изпращайте анонимна информация за използването и грешките до сървърите на Prowlarr. Това включва информация за вашия браузър, кои страници на Prowlarr WebUI използвате, отчитане на грешки, както и версията на операционната система и времето за изпълнение. Ще използваме тази информация, за да дадем приоритет на функциите и корекциите на грешки.", - "AuthenticationMethodHelpText": "Изисквайте потребителско име и парола за достъп до Prowlarr", + "AnalyticsEnabledHelpText": "Изпращайте анонимна информация за използването и грешките до сървърите на {appName}. Това включва информация за вашия браузър, кои страници на {appName} WebUI използвате, отчитане на грешки, както и версията на операционната система и времето за изпълнение. Ще използваме тази информация, за да дадем приоритет на функциите и корекциите на грешки.", + "AuthenticationMethodHelpText": "Изисквайте потребителско име и парола за достъп до {appName}", "BackupRetentionHelpText": "Автоматичните архиви, по-стари от периода на съхранение, ще бъдат почистени автоматично", "BindAddressHelpText": "Валиден IP4 адрес или '*' за всички интерфейси", "BypassProxyForLocalAddresses": "Заобикаляне на прокси за локални адреси", @@ -97,7 +97,7 @@ "Tomorrow": "Утре", "Torrents": "Торенти", "Type": "Тип", - "UILanguageHelpText": "Език, който Prowlarr ще използва за потребителски интерфейс", + "UILanguageHelpText": "Език, който {appName} ще използва за потребителски интерфейс", "UnableToAddANewIndexerPleaseTryAgain": "Не може да се добави нов индексатор, моля, опитайте отново.", "UnableToAddANewIndexerProxyPleaseTryAgain": "Не може да се добави нов индексатор, моля, опитайте отново.", "UnableToAddANewNotificationPleaseTryAgain": "Не може да се добави ново известие, моля, опитайте отново.", @@ -207,7 +207,7 @@ "ProxyType": "Тип прокси", "ExistingTag": "Съществуващ маркер", "ProxyUsernameHelpText": "Трябва само да въведете потребителско име и парола, ако е необходимо. В противен случай ги оставете празни.", - "ReleaseBranchCheckOfficialBranchMessage": "Клон {0} не е валиден клон за издаване на Prowlarr, няма да получавате актуализации", + "ReleaseBranchCheckOfficialBranchMessage": "Клон {0} не е валиден клон за издаване на {appName}, няма да получавате актуализации", "IncludeHealthWarningsHelpText": "Включете здравни предупреждения", "SaveSettings": "Запазване на настройките", "Scheduled": "Планиран", @@ -257,7 +257,7 @@ "SSLCertPathHelpText": "Път към pfx файл", "UrlBaseHelpText": "За обратна поддръжка на прокси по подразбиране е празно", "View": "Изглед", - "BranchUpdate": "Клон, който да се използва за актуализиране на Prowlarr", + "BranchUpdate": "Клон, който да се използва за актуализиране на {appName}", "Indexers": "Индексатори", "IndexerStatusCheckAllClientMessage": "Всички индексатори са недостъпни поради грешки", "Mode": "Режим", @@ -268,7 +268,7 @@ "UnableToLoadUISettings": "Настройките на потребителския интерфейс не могат да се заредят", "UnsavedChanges": "Незапазени промени", "UnselectAll": "Деселектирайте всички", - "UpdateMechanismHelpText": "Използвайте вградения в Prowlarr актуализатор или скрипт", + "UpdateMechanismHelpText": "Използвайте вградения в {appName} актуализатор или скрипт", "Updates": "Актуализации", "Uptime": "Време за работа", "DownloadClientSettings": "Изтеглете настройките на клиента", @@ -276,7 +276,7 @@ "DownloadClientStatusCheckSingleClientMessage": "Клиентите за изтегляне са недостъпни поради грешки: {0}", "Edit": "редактиране", "EnableAutomaticSearch": "Активирайте автоматичното търсене", - "EnableAutomaticSearchHelpText": "Ще се използва, когато се извършват автоматични търсения чрез потребителския интерфейс или от Prowlarr", + "EnableAutomaticSearchHelpText": "Ще се използва, когато се извършват автоматични търсения чрез потребителския интерфейс или от {appName}", "EnableSSL": "Активирайте SSL", "EnableSslHelpText": " Изисква рестартиране, изпълнено като администратор, за да влезе в сила", "Error": "Грешка", @@ -291,7 +291,7 @@ "IndexerLongTermStatusCheckSingleClientMessage": "Индексатори не са налични поради неуспехи за повече от 6 часа: {0}", "IndexerPriorityHelpText": "Приоритет на индексатора от 1 (най-висок) до 50 (най-нисък). По подразбиране: 25.", "IndexerStatusCheckSingleClientMessage": "Индексатори не са налични поради грешки: {0}", - "LaunchBrowserHelpText": " Отворете уеб браузър и отворете началната страница на Prowlarr при стартиране на приложението.", + "LaunchBrowserHelpText": " Отворете уеб браузър и отворете началната страница на {appName} при стартиране на приложението.", "ResetAPIKey": "Нулиране на API ключ", "Restart": "Рестартирам", "RestartNow": "Рестартирай сега", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 187cb2fdd..39a33ca5b 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -300,14 +300,14 @@ "View": "Visualitza", "Yesterday": "Ahir", "ApplicationStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}", - "AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de Prowlarr. Això inclou informació sobre el vostre navegador, quines pàgines Prowlarr WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.", + "AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.", "HistoryCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament", "UnableToAddANewAppProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.", - "BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del Prowlarr", + "BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del {appName}", "AllIndexersHiddenDueToFilter": "Totes les pel·lícules estan ocultes a causa del filtre aplicat.", "EnableRss": "Activa RSS", "Grabs": "Captura", - "EnableAutomaticSearchHelpText": "S'utilitzarà quan es realitzin cerques automàtiques mitjançant la interfície d'usuari o per Prowlarr", + "EnableAutomaticSearchHelpText": "S'utilitzarà quan es realitzin cerques automàtiques mitjançant la interfície d'usuari o per {appName}", "UnableToAddANewApplicationPleaseTryAgain": "No es pot afegir una notificació nova, torneu-ho a provar.", "Application": "Aplicacions", "Applications": "Aplicacions", @@ -316,7 +316,7 @@ "ApplicationLongTermStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors durant més de 6 hores", "ApplicationLongTermStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors durant més de 6 hores: {0}", "BindAddressHelpText": "Adreça IP vàlida, localhost o '*' per a totes les interfícies", - "BranchUpdate": "Branca que s'utilitza per actualitzar Prowlarr", + "BranchUpdate": "Branca que s'utilitza per actualitzar {appName}", "Connect": "Notificacions", "DeleteApplicationMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?", "DeleteIndexerProxyMessageText": "Esteu segur que voleu suprimir la llista '{0}'?", @@ -327,17 +327,17 @@ "HistoryCleanupDaysHelpText": "Establiu a 0 per desactivar la neteja automàtica", "Notification": "Notificacions", "Notifications": "Notificacions", - "ReleaseBranchCheckOfficialBranchMessage": "La branca {0} no és una branca de llançament de Prowlarr vàlida, no rebreu actualitzacions", + "ReleaseBranchCheckOfficialBranchMessage": "La branca {0} no és una branca de llançament de {appName} vàlida, no rebreu actualitzacions", "TagsHelpText": "S'aplica a pel·lícules amb almenys una etiqueta coincident", "Torrent": "Torrent", "UnableToAddANewIndexerProxyPleaseTryAgain": "No es pot afegir un indexador nou, torneu-ho a provar.", - "UpdateMechanismHelpText": "Utilitzeu l'actualitzador integrat de Prowlarr o un script", + "UpdateMechanismHelpText": "Utilitzeu l'actualitzador integrat de {appName} o un script", "UserAgentProvidedByTheAppThatCalledTheAPI": "Agent d'usuari proporcionat per l'aplicació per fer peticions a l'API", "IndexerProxyStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors", "IndexerProxyStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors: {0}", - "LaunchBrowserHelpText": " Obriu un navegador web i navegueu a la pàgina d'inici de Prowlarr a l'inici de l'aplicació.", + "LaunchBrowserHelpText": " Obriu un navegador web i navegueu a la pàgina d'inici de {appName} a l'inici de l'aplicació.", "Link": "Enllaços", - "UILanguageHelpText": "Idioma que utilitzarà Prowlarr per a la interfície d'usuari", + "UILanguageHelpText": "Idioma que utilitzarà {appName} per a la interfície d'usuari", "Remove": "Elimina", "Replace": "Substitueix", "TheLatestVersionIsAlreadyInstalled": "La darrera versió de {0} ja està instal·lada", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 7b5305ddb..99e993ca8 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -69,7 +69,7 @@ "UnselectAll": "Odznačit vše", "UpdateCheckStartupNotWritableMessage": "Aktualizaci nelze nainstalovat, protože spouštěcí složku „{0}“ nelze zapisovat uživatelem „{1}“.", "Version": "Verze", - "AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery Prowlarru. To zahrnuje informace o vašem prohlížeči, které stránky Prowlarr WebUI používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k upřednostnění funkcí a oprav chyb.", + "AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery {appName}u. To zahrnuje informace o vašem prohlížeči, které stránky {appName} WebUI používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k upřednostnění funkcí a oprav chyb.", "ApiKey": "Klíč API", "AppDataDirectory": "Adresář AppData", "AppDataLocationHealthCheckMessage": "Aktualizace nebude možná, aby se zabránilo odstranění AppData při aktualizaci", @@ -77,7 +77,7 @@ "ApplicationStatusCheckSingleClientMessage": "Seznamy nejsou k dispozici z důvodu selhání: {0}", "Apply": "Použít", "Branch": "Větev", - "BranchUpdate": "Pobočka, která se má použít k aktualizaci Prowlarr", + "BranchUpdate": "Pobočka, která se má použít k aktualizaci {appName}", "EditIndexer": "Upravit indexátor", "ForMoreInformationOnTheIndividualDownloadClients": "Další informace o jednotlivých klientech pro stahování získáte kliknutím na informační tlačítka.", "General": "Všeobecné", @@ -115,7 +115,7 @@ "Actions": "Akce", "Added": "Přidáno", "AddIndexer": "Přidat indexátor", - "LaunchBrowserHelpText": " Otevřete webový prohlížeč a při spuštění aplikace přejděte na domovskou stránku Prowlarr.", + "LaunchBrowserHelpText": " Otevřete webový prohlížeč a při spuštění aplikace přejděte na domovskou stránku {appName}.", "Logging": "Protokolování", "Mechanism": "Mechanismus", "NoLinks": "Žádné odkazy", @@ -134,7 +134,7 @@ "Refresh": "Obnovit", "RefreshMovie": "Obnovit film", "MovieIndexScrollTop": "Rejstřík filmů: Posun nahoru", - "ReleaseBranchCheckOfficialBranchMessage": "Pobočka {0} není platná větev vydání Prowlarr, nebudete dostávat aktualizace", + "ReleaseBranchCheckOfficialBranchMessage": "Pobočka {0} není platná větev vydání {appName}, nebudete dostávat aktualizace", "ReleaseStatus": "Stav vydání", "Proxy": "Proxy", "Reload": "Znovu načíst", @@ -163,7 +163,7 @@ "UnableToLoadNotifications": "Nelze načíst oznámení", "UpdateCheckStartupTranslocationMessage": "Aktualizaci nelze nainstalovat, protože spouštěcí složka „{0}“ je ve složce Translocation aplikace.", "UpdateCheckUINotWritableMessage": "Aktualizaci nelze nainstalovat, protože uživatelská složka „{0}“ není zapisovatelná uživatelem „{1}“.", - "UpdateMechanismHelpText": "Použijte vestavěný aktualizátor Prowlarr nebo skript", + "UpdateMechanismHelpText": "Použijte vestavěný aktualizátor {appName} nebo skript", "UpdateScriptPathHelpText": "Cesta k vlastnímu skriptu, který přebírá extrahovaný balíček aktualizace a zpracovává zbytek procesu aktualizace", "Uptime": "Provozuschopnost", "URLBase": "URL Base", @@ -172,7 +172,7 @@ "Username": "Uživatelské jméno", "Yesterday": "Včera", "AutomaticSearch": "Vyhledat automaticky", - "BackupFolderHelpText": "Relativní cesty budou v adresáři AppData společnosti Prowlarr", + "BackupFolderHelpText": "Relativní cesty budou v adresáři AppData společnosti {appName}", "BackupIntervalHelpText": "Interval mezi automatickými zálohami", "BackupNow": "Ihned zálohovat", "BackupRetentionHelpText": "Automatické zálohy starší než doba uchovávání budou automaticky vyčištěny", @@ -230,7 +230,7 @@ "EnableRss": "Povolit RSS", "NoChange": "Žádná změna", "Authentication": "Ověřování", - "AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k Prowlarr", + "AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k {appName}", "Automatic": "Automatický", "Backup": "Záloha", "Cancel": "Zrušit", @@ -256,7 +256,7 @@ "DownloadClients": "Stáhnout klienty", "Edit": "Upravit", "Enable": "Umožnit", - "EnableAutomaticSearchHelpText": "Použije se, když se automatické vyhledávání provádí pomocí uživatelského rozhraní nebo Prowlarr", + "EnableAutomaticSearchHelpText": "Použije se, když se automatické vyhledávání provádí pomocí uživatelského rozhraní nebo {appName}", "EnableInteractiveSearch": "Povolit interaktivní vyhledávání", "EnableSSL": "Povolit SSL", "EnableSslHelpText": " Vyžaduje restartování spuštěné jako správce, aby se projevilo", @@ -301,7 +301,7 @@ "Type": "Typ", "UI": "UI", "UILanguage": "Jazyk uživatelského rozhraní", - "UILanguageHelpText": "Jazyk, který Prowlarr použije pro uživatelské rozhraní", + "UILanguageHelpText": "Jazyk, který {appName} použije pro uživatelské rozhraní", "UISettings": "Nastavení uživatelského rozhraní", "UnableToLoadUISettings": "Nelze načíst nastavení uživatelského rozhraní", "UnsavedChanges": "Neuložené změny", @@ -329,7 +329,7 @@ "Queued": "Ve frontě", "Remove": "Odstranit", "Replace": "Nahradit", - "TheLatestVersionIsAlreadyInstalled": "Nejnovější verze aplikace Prowlarr je již nainstalována", + "TheLatestVersionIsAlreadyInstalled": "Nejnovější verze aplikace {appName} je již nainstalována", "More": "Více", "ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu", "ApplyTagsHelpTextHowToApplyApplications": "Jak použít značky na vybrané filmy", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index f09fe409e..69cd9b3aa 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -23,7 +23,7 @@ "Edit": "Rediger", "DownloadClientStatusCheckSingleClientMessage": "Download klienter er ikke tilgængelige på grund af fejl: {0}", "DownloadClientStatusCheckAllClientMessage": "Alle download klienter er utilgængelige på grund af fejl", - "DownloadClientsSettingsSummary": "Indstilling af downloadklienter til brug for Prowlarrs søgefunktion", + "DownloadClientsSettingsSummary": "Indstilling af downloadklienter til brug for {appName}s søgefunktion", "DownloadClients": "Download Klienter", "DownloadClient": "Download Klient", "Details": "Detaljer", @@ -93,7 +93,7 @@ "YesCancel": "Ja, Annuller", "AcceptConfirmationModal": "Accepter bekræftelsesmodal", "AddIndexer": "Tilføj indeksør", - "AnalyticsEnabledHelpText": "Send anonym brugs- og fejlinformation til Prowlarrs servere. Dette inkluderer information om din browser, hvilke af Prowlarrs WebUI-sider du bruger, fejlrapportering, samt OS- og runtime-version. Vi bruger disse oplysninger til at prioritere funktioner og fejlrettelser.", + "AnalyticsEnabledHelpText": "Send anonym brugs- og fejlinformation til {appName}s servere. Dette inkluderer information om din browser, hvilke af {appName}s WebUI-sider du bruger, fejlrapportering, samt OS- og runtime-version. Vi bruger disse oplysninger til at prioritere funktioner og fejlrettelser.", "Backups": "Sikkerhedskopier", "BypassProxyForLocalAddresses": "Bypass-proxy til lokale adresser", "CancelPendingTask": "Er du sikker på, at du vil annullere denne afventende opgave?", @@ -114,7 +114,7 @@ "EditIndexer": "Rediger indekser", "Enable": "Aktiver", "EnableAutomaticSearch": "Aktivér automatisk søgning", - "EnableAutomaticSearchHelpText": "Bruges, når der foretages automatiske søgninger via brugergrænsefladen eller af Prowlarr", + "EnableAutomaticSearchHelpText": "Bruges, når der foretages automatiske søgninger via brugergrænsefladen eller af {appName}", "Enabled": "Aktiveret", "EnableInteractiveSearch": "Aktivér interaktiv søgning", "EnableRss": "Aktivér RSS", @@ -141,7 +141,7 @@ "IndexerPriorityHelpText": "Indekseringsprioritet fra 1 (højest) til 50 (lavest). Standard: 25.", "IndexerProxyStatusCheckAllClientMessage": "Alle indexere er utilgængelige på grund af fejl", "IndexerProxyStatusCheckSingleClientMessage": "Indexere utilgængelige på grund af fejl: {0}", - "LaunchBrowserHelpText": " Åbn en webbrowser, og naviger til Prowlarr-hjemmesiden ved start af appen.", + "LaunchBrowserHelpText": " Åbn en webbrowser, og naviger til {appName}-hjemmesiden ved start af appen.", "Logging": "Logning", "LogLevel": "Logniveau", "LogLevelTraceHelpTextWarning": "Sporlogning bør kun aktiveres midlertidigt", @@ -182,7 +182,7 @@ "Reddit": "Reddit", "Refresh": "Opdater", "RefreshMovie": "Opdater film", - "ReleaseBranchCheckOfficialBranchMessage": "Filial {0} er ikke en gyldig Prowlarr-frigivelsesfilial, du modtager ikke opdateringer", + "ReleaseBranchCheckOfficialBranchMessage": "Filial {0} er ikke en gyldig {appName}-frigivelsesfilial, du modtager ikke opdateringer", "Reload": "Genindlæs", "RemovedFromTaskQueue": "Fjernet fra opgavekøen", "RemoveFilter": "Fjern filteret", @@ -227,7 +227,7 @@ "Torrent": "Torrenter", "Torrents": "Torrenter", "UI": "UI", - "UILanguageHelpText": "Sprog, som Prowlarr vil bruge til UI", + "UILanguageHelpText": "Sprog, som {appName} vil bruge til UI", "UnableToAddANewApplicationPleaseTryAgain": "Kan ikke tilføje en ny underretning, prøv igen.", "UnableToAddANewAppProfilePleaseTryAgain": "Kan ikke tilføje en ny kvalitetsprofil, prøv igen.", "UnableToAddANewDownloadClientPleaseTryAgain": "Kunne ikke tilføje en ny downloadklient. Prøv igen.", @@ -274,17 +274,17 @@ "ApplicationStatusCheckSingleClientMessage": "Lister utilgængelige på grund af fejl: {0}", "ApplyTags": "Anvend tags", "Authentication": "Godkendelse", - "AuthenticationMethodHelpText": "Kræv brugernavn og adgangskode for at få adgang til Prowlarr", + "AuthenticationMethodHelpText": "Kræv brugernavn og adgangskode for at få adgang til {appName}", "Automatic": "Automatisk", "AutomaticSearch": "Automatisk søgning", - "BackupFolderHelpText": "Relative stier vil være under Prowlarrs AppData-bibliotek", + "BackupFolderHelpText": "Relative stier vil være under {appName}s AppData-bibliotek", "BackupIntervalHelpText": "Interval mellem automatiske sikkerhedskopier", "BackupRetentionHelpText": "Automatiske sikkerhedskopier, der er ældre end opbevaringsperioden, renses automatisk", "BeforeUpdate": "Før opdatering", "BindAddress": "Bind adresse", "BindAddressHelpText": "Gyldig IP4-adresse, 'localhost' eller '*' for alle grænseflader", "Branch": "Afdeling", - "BranchUpdate": "Filial, der skal bruges til at opdatere Prowlarr", + "BranchUpdate": "Filial, der skal bruges til at opdatere {appName}", "BranchUpdateMechanism": "Gren brugt af ekstern opdateringsmekanisme", "ClientPriority": "Kundens prioritet", "CloneProfile": "Klonprofil", @@ -340,7 +340,7 @@ "Notification": "Notifikationer", "Remove": "Fjerne", "Replace": "erstat", - "TheLatestVersionIsAlreadyInstalled": "Den seneste version af Prowlarr er allerede installeret", + "TheLatestVersionIsAlreadyInstalled": "Den seneste version af {appName} er allerede installeret", "Year": "År", "ApplyTagsHelpTextAdd": "Tilføj: Føj tags til den eksisterende liste over tags", "ApplyTagsHelpTextHowToApplyApplications": "Sådan anvendes tags på de valgte film", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 0784967a7..a1d22f674 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -4,7 +4,7 @@ "Actions": "Aktionen", "Add": "Hinzufügen", "AddDownloadClient": "Downloadmanager hinzufügen", - "AddDownloadClientToProwlarr": "Durch das Hinzufügen eines Download-Clients kann Prowlarr während einer manuellen Suche Releases direkt über die Benutzeroberfläche senden.", + "AddDownloadClientToProwlarr": "Durch das Hinzufügen eines Download-Clients kann {appName} während einer manuellen Suche Releases direkt über die Benutzeroberfläche senden.", "AddIndexer": "Indexer hinzufügen", "AddIndexerProxy": "Indexer Proxy hinzufügen", "AddNewIndexer": "Neuen Indexer hinzufügen", @@ -18,14 +18,14 @@ "All": "Alle", "AllIndexersHiddenDueToFilter": "Alle Indexer sind durch den ausgewählten Filter ausgeblendet.", "Analytics": "Analytik", - "AnalyticsEnabledHelpText": "Sende anonyme Nutzungs- und Fehlerinformationen an die Server von Prowlarr. Dazu gehören Informationen über Browser, welche Seiten der Prowlarr-Weboberfläche aufgerufen wurden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.", + "AnalyticsEnabledHelpText": "Sende anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen über Browser, welche Seiten der {appName}-Weboberfläche aufgerufen wurden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.", "ApiKey": "API-Schlüssel", "ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {0} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen", "AppDataDirectory": "AppData Ordner", "AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern", "AppProfileInUse": "App-Profil im Einsatz", "AppProfileSelectHelpText": "App-Profile werden verwendet, um die Einstellungen für RSS, automatische Suche und interaktive Suche bei der Anwendungssynchronisierung zu steuern", - "AppSettingsSummary": "Anwendungen und Einstellungen um zu konfigurieren, wie Prowlarr mit deinen PVR Programmen interagiert", + "AppSettingsSummary": "Anwendungen und Einstellungen um zu konfigurieren, wie {appName} mit deinen PVR Programmen interagiert", "Application": "Anwendungen", "ApplicationLongTermStatusCheckAllClientMessage": "Alle Anwendungen sind nicht verfügbar, da es zu Störungen für mehr als 6 Stunden kam", "ApplicationLongTermStatusCheckSingleClientMessage": "Anwendungen nicht verfügbar, da es zu Störungen für mehr als 6 Stunden kam: {0}", @@ -38,11 +38,11 @@ "AudioSearch": "Audio Suche", "Auth": "Authentifizierung", "Authentication": "Authentifizierung", - "AuthenticationMethodHelpText": "Für den Zugriff auf Prowlarr sind Benutzername und Passwort erforderlich", + "AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich", "Automatic": "Automatisch", "AutomaticSearch": "Automatische Suche", "Backup": "Backups", - "BackupFolderHelpText": "Relative Pfade befinden sich unter Prowlarrs AppData Ordner", + "BackupFolderHelpText": "Relative Pfade befinden sich unter {appName}s AppData Ordner", "BackupIntervalHelpText": "Intervall zum sichern der Datenbank und Einstellungen", "BackupNow": "Jetzt sichern", "BackupRetentionHelpText": "Automatische Backups, die älter als die Aufbewahrungsfrist sind, werden automatisch gelöscht", @@ -53,7 +53,7 @@ "BookSearch": "Buch Suche", "BookSearchTypes": "Buch-Suchtypen", "Branch": "Git-Branch", - "BranchUpdate": "Verwendeter Branch zur Aktualisierung von Prowlarr", + "BranchUpdate": "Verwendeter Branch zur Aktualisierung von {appName}", "BranchUpdateMechanism": "Git-Branch für den externen Updateablauf", "BypassProxyForLocalAddresses": "Proxy für lokale Adressen umgehen", "Cancel": "Abbrechen", @@ -65,7 +65,7 @@ "ChangeHasNotBeenSavedYet": "Änderung wurde noch nicht gespeichert", "Clear": "Leeren", "ClearHistory": "Verlauf leeren", - "ClearHistoryMessageText": "Wirklich den ganzen Prowlarr Verlauf löschen?", + "ClearHistoryMessageText": "Wirklich den ganzen {appName} Verlauf löschen?", "ClientPriority": "Priorität", "CloneProfile": "Profil kopieren", "Close": "Schließen", @@ -110,7 +110,7 @@ "DownloadClientStatusCheckAllClientMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar", "DownloadClientStatusCheckSingleClientMessage": "Download Clients aufgrund von Fehlern nicht verfügbar: {0}", "DownloadClients": "Downloader", - "DownloadClientsSettingsSummary": "Download der Client-Konfigurationen für die Integration in die Prowlarr UI-Suche", + "DownloadClientsSettingsSummary": "Download der Client-Konfigurationen für die Integration in die {appName} UI-Suche", "Duration": "Dauer", "Edit": "Bearbeiten", "EditIndexer": "Indexer bearbeiten", @@ -118,7 +118,7 @@ "ElapsedTime": "Vergangene Zeit", "Enable": "Aktivieren", "EnableAutomaticSearch": "Automatische Suche einschalten", - "EnableAutomaticSearchHelpText": "Wird für automatische Suchen genutzt die vom Benutzer oder von Prowlarr gestartet werden", + "EnableAutomaticSearchHelpText": "Wird für automatische Suchen genutzt die vom Benutzer oder von {appName} gestartet werden", "EnableIndexer": "Indexer aktivieren", "EnableInteractiveSearch": "Interaktive Suche einschalten", "EnableInteractiveSearchHelpText": "Wird bei der manuellen Suche benutzt", @@ -174,13 +174,13 @@ "IndexerAuth": "Indexer Authentifizierung", "IndexerDetails": "Indexer-Details", "IndexerFlags": "Indexer-Flags", - "IndexerHealthCheckNoIndexers": "Keine Indexer aktiviert, Prowlarr wird keine Suchergebnisse zurückgeben", + "IndexerHealthCheckNoIndexers": "Keine Indexer aktiviert, {appName} wird keine Suchergebnisse zurückgeben", "IndexerInfo": "Indexer-Info", "IndexerLongTermStatusCheckAllClientMessage": "Alle Indexer sind wegen über 6 Stunden langen bestehender Fehler nicht verfügbar", "IndexerLongTermStatusCheckSingleClientMessage": "Indexer wegen über 6 Stunden langen bestehenden Fehlern nicht verfügbar: {0}", "IndexerName": "Indexer-Name", - "IndexerNoDefCheckMessage": "Indexer haben keine Definition und werden nicht funktionieren: {0}. Bitte entferne und (oder) füge diese neu zu Prowlarr hinzu", - "IndexerObsoleteCheckMessage": "Indexer sind nicht mehr verfügbar oder wurden aktualiiert: {0}. Bitte enfernen und (oder) neu zu Prowlarr hinzufügen", + "IndexerNoDefCheckMessage": "Indexer haben keine Definition und werden nicht funktionieren: {0}. Bitte entferne und (oder) füge diese neu zu {appName} hinzu", + "IndexerObsoleteCheckMessage": "Indexer sind nicht mehr verfügbar oder wurden aktualiiert: {0}. Bitte enfernen und (oder) neu zu {appName} hinzufügen", "IndexerPriority": "Priorität", "IndexerPriorityHelpText": "Indexer Priorität von 1 (höchste) bis 50 (niedrigste). Standard: 25.", "IndexerProxies": "Indexer-Proxies", @@ -207,7 +207,7 @@ "LastDuration": "Letzte Dauer", "LastExecution": "Letzte Ausführung", "LastWriteTime": "Zuletzt beschrieben", - "LaunchBrowserHelpText": " Öffne die Startseite von Prowlarr im Webbrowser nach dem Start.", + "LaunchBrowserHelpText": " Öffne die Startseite von {appName} im Webbrowser nach dem Start.", "Level": "Stufe", "Link": "Links", "LogFiles": "Protokolle", @@ -218,7 +218,7 @@ "MIA": "MIA", "MaintenanceRelease": "Wartung: Fehlerbehebung und andere Verbesserungen. Siehe Github Commit History für weitere Details", "Manual": "Manuell", - "MappedDrivesRunningAsService": "Zugeordnete Netzlaufwerke sind nicht verfügbar, wenn Prowlarr als Windows-Dienst ausgeführt wird. Bitte lesen Sie die FAQ für weitere Informationen", + "MappedDrivesRunningAsService": "Zugeordnete Netzlaufwerke sind nicht verfügbar, wenn {appName} als Windows-Dienst ausgeführt wird. Bitte lesen Sie die FAQ für weitere Informationen", "MassEditor": "Masseneditor", "Mechanism": "Verfahren", "Message": "Nachricht", @@ -277,7 +277,7 @@ "Private": "Privat", "Protocol": "Protokoll", "ProwlarrSupportsAnyDownloadClient": "Jeder Downloader der den Newznab-Standard verwendet oder unten aufgelistet ist wird untertützt.", - "ProwlarrSupportsAnyIndexer": "Prowlarr unterstützt alle Indexer, welcher den Newznab/Torznab Standard implementiert (verwende 'Generic Newznab' (für Usenet) oder 'Generic Torznab' (für Torrents)) und darüber hinaus viele weitere Indexer. Wählen Sie im Folgenden Ihren Indexer aus der Liste.", + "ProwlarrSupportsAnyIndexer": "{appName} unterstützt alle Indexer, welcher den Newznab/Torznab Standard implementiert (verwende 'Generic Newznab' (für Usenet) oder 'Generic Torznab' (für Torrents)) und darüber hinaus viele weitere Indexer. Wählen Sie im Folgenden Ihren Indexer aus der Liste.", "Proxies": "Proxies", "Proxy": "Proxy", "ProxyBypassFilterHelpText": "Verwende ',' als Trennzeichen und '*.' als Platzhalter für Subdomains", @@ -299,10 +299,10 @@ "ReadTheWikiForMoreInformation": "Lese das Wiki für mehr Informationen", "Reddit": "Reddit", "Redirect": "Umleiten", - "RedirectHelpText": "Eingehende Download-Anfragen für den Indexer umleiten, anstatt Proxying mit Prowlarr", + "RedirectHelpText": "Eingehende Download-Anfragen für den Indexer umleiten, anstatt Proxying mit {appName}", "Refresh": "Aktualisieren", "RefreshMovie": "Film aktualisieren", - "ReleaseBranchCheckOfficialBranchMessage": "Zweig {0} ist kein gültiger Prowlarr-Release-Zweig. Sie erhalten keine Updates", + "ReleaseBranchCheckOfficialBranchMessage": "Zweig {0} ist kein gültiger {appName}-Release-Zweig. Sie erhalten keine Updates", "ReleaseStatus": "Releasestatus", "Reload": "Neuladen", "Remove": "Entfernen", @@ -314,7 +314,7 @@ "ResetAPIKey": "API-Schlüssel zurücksetzen", "Restart": "Neustarten", "RestartNow": "Jetzt neustarten", - "RestartProwlarr": "Prowlarr Neustarten", + "RestartProwlarr": "{appName} Neustarten", "RestartRequiredHelpTextWarning": "Erfordert einen Neustart", "Restore": "Wiederherstellen", "RestoreBackup": "Backup einspielen", @@ -356,7 +356,7 @@ "SettingsShortDateFormat": "Kurzes Datumsformat", "SettingsShowRelativeDates": "Relatives Datum anzeigen", "SettingsShowRelativeDatesHelpText": "Relatives (z.B.: Heute, gestern, etc) oder absolutes Datum anzeigen", - "SettingsSqlLoggingHelpText": "Log alle SQL Abfragen von Prowlarr", + "SettingsSqlLoggingHelpText": "Log alle SQL Abfragen von {appName}", "SettingsTimeFormat": "Zeitformat", "ShowAdvanced": "Einfache Ansicht", "ShowSearch": "Suche anzeigen", @@ -374,8 +374,8 @@ "SuggestTranslationChange": "Schlage eine Übersetzung vor", "SyncAppIndexers": "App Indexer syncen", "SyncLevel": "Sync-Level", - "SyncLevelAddRemove": "Nur hinzufügen und entfernen: Wenn Indexer zu Prowlarr hinzugefügt oder entfernt werden, wird diese Remote-App aktualisiert.", - "SyncLevelFull": "Vollständige Synchronisierung: Hält die Indexer dieser App vollständig synchronisiert. Änderungen an Indexern in Prowlarr werden mit dieser App synchronisiert. Jede Änderung die and Indexern dieser App gemacht werden, wird von Prowlarr bei der nächsten Synchronisierung überschrieben.", + "SyncLevelAddRemove": "Nur hinzufügen und entfernen: Wenn Indexer zu {appName} hinzugefügt oder entfernt werden, wird diese Remote-App aktualisiert.", + "SyncLevelFull": "Vollständige Synchronisierung: Hält die Indexer dieser App vollständig synchronisiert. Änderungen an Indexern in {appName} werden mit dieser App synchronisiert. Jede Änderung die and Indexern dieser App gemacht werden, wird von {appName} bei der nächsten Synchronisierung überschrieben.", "SyncProfile": "Sync-Profile", "SyncProfiles": "Sync-Profile", "System": "System", @@ -435,7 +435,7 @@ "UpdateCheckStartupNotWritableMessage": "Update kann nicht installiert werden, da der Startordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.", "UpdateCheckStartupTranslocationMessage": "Update kann nicht installiert werden, da sich der Startordner '{0}' in einem App Translocation-Ordner befindet.", "UpdateCheckUINotWritableMessage": "Update kann nicht installiert werden, da der Benutzeroberflächenordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.", - "UpdateMechanismHelpText": "Benutze Prowlarr's Built-In Updater oder ein Script", + "UpdateMechanismHelpText": "Benutze {appName}'s Built-In Updater oder ein Script", "UpdateScriptPathHelpText": "Pfad zu einem benutzerdefinierten Skript, das ein extrahiertes Update-Paket übernimmt und den Rest des Update-Prozesses abwickelt", "Updates": "Updates", "Uptime": "Laufzeit", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 1906aed6c..6182c6ad8 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -30,7 +30,7 @@ "Edit": "Επεξεργασία", "DownloadClientStatusCheckSingleClientMessage": "Προγράμματα λήψης που είναι μη διαθέσιμα λόγων αποτυχιών: {0}", "DownloadClientStatusCheckAllClientMessage": "Όλα τα προγράμματα λήψης είναι μη διαθέσιμα λόγων αποτυχιών", - "DownloadClientsSettingsSummary": "Κάντε λήψη της διαμόρφωσης πελατών για ενσωμάτωση στην αναζήτηση διεπαφής χρήστη Prowlarr", + "DownloadClientsSettingsSummary": "Κάντε λήψη της διαμόρφωσης πελατών για ενσωμάτωση στην αναζήτηση διεπαφής χρήστη {appName}", "CustomFilters": "Custom Φιλτρα", "ConnectSettingsSummary": "Ειδοποιήσεις και προσαρμοσμένα σενάρια", "AppDataLocationHealthCheckMessage": "Η ενημέρωση δεν θα είναι δυνατή για να αποτραπεί η διαγραφή των δεδομένων εφαρμογής κατά την ενημέρωση", @@ -97,7 +97,7 @@ "Tags": "Ετικέτες", "UI": "Διεπαφή χρήστη", "UILanguage": "Γλώσσα διεπαφής χρήστη", - "UILanguageHelpText": "Γλώσσα που θα χρησιμοποιήσει ο Prowlarr για τη διεπαφή χρήστη", + "UILanguageHelpText": "Γλώσσα που θα χρησιμοποιήσει ο {appName} για τη διεπαφή χρήστη", "UISettings": "Ρυθμίσεις διεπαφής χρήστη", "Yesterday": "Εχθές", "FeatureRequests": "Αιτήματα χαρακτηριστικών", @@ -114,7 +114,7 @@ "UnableToAddANewAppProfilePleaseTryAgain": "Δεν είναι δυνατή η προσθήκη ενός νέου προφίλ ποιότητας. Δοκιμάστε ξανά.", "UnableToLoadHistory": "Δεν είναι δυνατή η φόρτωση του ιστορικού", "UpdateCheckUINotWritableMessage": "Δεν είναι δυνατή η εγκατάσταση της ενημέρωσης επειδή ο φάκελος διεπαφής χρήστη \"{0}\" δεν είναι εγγράψιμος από τον χρήστη \"{1}\".", - "AuthenticationMethodHelpText": "Απαιτήστε όνομα χρήστη και κωδικό πρόσβασης για πρόσβαση στο Prowlarr", + "AuthenticationMethodHelpText": "Απαιτήστε όνομα χρήστη και κωδικό πρόσβασης για πρόσβαση στο {appName}", "Automatic": "Αυτόματο", "BeforeUpdate": "Πριν από την ενημέρωση", "BindAddressHelpText": "Έγκυρη διεύθυνση IP, localhost ή '*' για όλες τις διεπαφές", @@ -129,7 +129,7 @@ "DeleteNotificationMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε την ειδοποίηση \"{0}\";", "DeleteTagMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε την ετικέτα \"{0}\";", "EnableAutomaticSearch": "Ενεργοποίηση αυτόματης αναζήτησης", - "EnableAutomaticSearchHelpText": "Θα χρησιμοποιηθεί όταν πραγματοποιούνται αυτόματες αναζητήσεις μέσω του περιβάλλοντος χρήστη ή του Prowlarr", + "EnableAutomaticSearchHelpText": "Θα χρησιμοποιηθεί όταν πραγματοποιούνται αυτόματες αναζητήσεις μέσω του περιβάλλοντος χρήστη ή του {appName}", "EnableSslHelpText": " Απαιτείται επανεκκίνηση ως διαχειριστής για να τεθεί σε ισχύ", "Error": "Λάθος", "ErrorLoadingContents": "Σφάλμα κατά τη φόρτωση περιεχομένων", @@ -143,7 +143,7 @@ "IndexerPriorityHelpText": "Προτεραιότητα ευρετηρίου από 1 (Υψηλότερη) έως 50 (Χαμηλότερη). Προεπιλογή: 25.", "IndexerProxyStatusCheckAllClientMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", "IndexerProxyStatusCheckSingleClientMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών: {0}", - "LaunchBrowserHelpText": " Ανοίξτε ένα πρόγραμμα περιήγησης ιστού και μεταβείτε στην αρχική σελίδα του Prowlarr κατά την έναρξη της εφαρμογής.", + "LaunchBrowserHelpText": " Ανοίξτε ένα πρόγραμμα περιήγησης ιστού και μεταβείτε στην αρχική σελίδα του {appName} κατά την έναρξη της εφαρμογής.", "LogFiles": "Αρχεία καταγραφής", "Logging": "Ξύλευση", "LogLevelTraceHelpTextWarning": "Η καταγραφή ιχνών πρέπει να ενεργοποιηθεί προσωρινά", @@ -172,7 +172,7 @@ "ReadTheWikiForMoreInformation": "Διαβάστε το Wiki για περισσότερες πληροφορίες", "Refresh": "Φρεσκάρω", "RefreshMovie": "Ανανέωση ταινίας", - "ReleaseBranchCheckOfficialBranchMessage": "Το υποκατάστημα {0} δεν είναι έγκυρο υποκατάστημα κυκλοφορίας Prowlarr, δεν θα λαμβάνετε ενημερώσεις", + "ReleaseBranchCheckOfficialBranchMessage": "Το υποκατάστημα {0} δεν είναι έγκυρο υποκατάστημα κυκλοφορίας {appName}, δεν θα λαμβάνετε ενημερώσεις", "Reload": "Φορτώνω πάλι", "RemovedFromTaskQueue": "Καταργήθηκε από την ουρά εργασιών", "RemoveFilter": "Αφαιρέστε το φίλτρο", @@ -236,8 +236,8 @@ "Tasks": "Καθήκοντα", "UnableToLoadBackups": "Δεν είναι δυνατή η φόρτωση αντιγράφων ασφαλείας", "UnableToLoadDownloadClients": "Δεν είναι δυνατή η φόρτωση πελατών λήψης", - "UpdateMechanismHelpText": "Χρησιμοποιήστε το ενσωματωμένο πρόγραμμα ενημέρωσης του Prowlarr ή ένα script", - "AnalyticsEnabledHelpText": "Στείλτε ανώνυμες πληροφορίες χρήσης και σφάλματος στους διακομιστές του Prowlarr. Αυτό περιλαμβάνει πληροφορίες στο πρόγραμμα περιήγησής σας, ποιες σελίδες Prowlarr WebUI χρησιμοποιείτε, αναφορά σφαλμάτων καθώς και έκδοση λειτουργικού συστήματος και χρόνου εκτέλεσης. Θα χρησιμοποιήσουμε αυτές τις πληροφορίες για να δώσουμε προτεραιότητα σε λειτουργίες και διορθώσεις σφαλμάτων.", + "UpdateMechanismHelpText": "Χρησιμοποιήστε το ενσωματωμένο πρόγραμμα ενημέρωσης του {appName} ή ένα script", + "AnalyticsEnabledHelpText": "Στείλτε ανώνυμες πληροφορίες χρήσης και σφάλματος στους διακομιστές του {appName}. Αυτό περιλαμβάνει πληροφορίες στο πρόγραμμα περιήγησής σας, ποιες σελίδες {appName} WebUI χρησιμοποιείτε, αναφορά σφαλμάτων καθώς και έκδοση λειτουργικού συστήματος και χρόνου εκτέλεσης. Θα χρησιμοποιήσουμε αυτές τις πληροφορίες για να δώσουμε προτεραιότητα σε λειτουργίες και διορθώσεις σφαλμάτων.", "AppDataDirectory": "Κατάλογος AppData", "BindAddress": "Δεσμευμένη διεύθυνση", "EnableRss": "Ενεργοποίηση RSS", @@ -259,12 +259,12 @@ "ApplicationStatusCheckAllClientMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", "ApplicationStatusCheckSingleClientMessage": "Μη διαθέσιμες λίστες λόγω αποτυχιών: {0}", "ApplyTags": "Εφαρμογή ετικετών", - "BackupFolderHelpText": "Οι σχετικές διαδρομές θα βρίσκονται στον κατάλογο AppData του Prowlarr", + "BackupFolderHelpText": "Οι σχετικές διαδρομές θα βρίσκονται στον κατάλογο AppData του {appName}", "AutomaticSearch": "Αυτόματη αναζήτηση", "BackupIntervalHelpText": "Διάστημα μεταξύ των αυτόματων αντιγράφων ασφαλείας", "BackupRetentionHelpText": "Τα αυτόματα αντίγραφα ασφαλείας που είναι παλαιότερα από την περίοδο διατήρησης θα καθαρίζονται αυτόματα", "Backups": "Δημιουργία αντιγράφων ασφαλείας", - "BranchUpdate": "Υποκατάστημα για χρήση για την ενημέρωση του Prowlarr", + "BranchUpdate": "Υποκατάστημα για χρήση για την ενημέρωση του {appName}", "CancelPendingTask": "Είστε βέβαιοι ότι θέλετε να ακυρώσετε αυτήν την εργασία σε εκκρεμότητα;", "CertificateValidation": "Επικύρωση πιστοποιητικού", "CertificateValidationHelpText": "Αλλάξτε πόσο αυστηρή είναι η επικύρωση πιστοποίησης HTTPS", @@ -343,7 +343,7 @@ "SettingsFilterSentryEventsHelpText": "Φιλτράρετε τα γνωστά συμβάντα σφαλμάτων χρήστη από την αποστολή τους ως Analytics", "ThemeHelpText": "Αλλαγή του θέματος διεπαφής χρήστη εφαρμογής, το θέμα «Αυτόματο» θα χρησιμοποιήσει το Θέμα του λειτουργικού σας συστήματος για να ρυθμίσει τη λειτουργία Light ή Dark. Εμπνευσμένο από το Theme.Park", "SettingsFilterSentryEvents": "Φιλτράρισμα συμβάντων Analytics", - "SettingsSqlLoggingHelpText": "Καταγράψτε όλα τα ερωτήματα SQL από το Prowlarr", + "SettingsSqlLoggingHelpText": "Καταγράψτε όλα τα ερωτήματα SQL από το {appName}", "SettingsConsoleLogLevel": "Επίπεδο καταγραφής κονσόλας", "SettingsLogRotate": "Περιστροφή καταγραφής", "SettingsLogRotateHelpText": "Μέγιστος αριθμός αρχείων καταγραφής που θα διατηρηθούν αποθηκευμένα στο φάκελο καταγραφής", @@ -365,10 +365,10 @@ "SearchType": "Τύπος αναζήτησης", "UnableToLoadApplicationList": "Δεν είναι δυνατή η φόρτωση της λίστας εφαρμογών", "AddRemoveOnly": "Μόνο προσθήκη και αφαίρεση", - "ProwlarrSupportsAnyDownloadClient": "Το Prowlarr υποστηρίζει οποιοδήποτε από τα προγράμματα-πελάτες λήψης που αναφέρονται παρακάτω.", + "ProwlarrSupportsAnyDownloadClient": "Το {appName} υποστηρίζει οποιοδήποτε από τα προγράμματα-πελάτες λήψης που αναφέρονται παρακάτω.", "Query": "Ερώτηση", "Redirect": "Διευθύνω πάλιν", - "SyncLevelAddRemove": "Μόνο προσθήκη και αφαίρεση: Όταν προστίθενται ή αφαιρούνται ευρετήρια από το Prowlarr, θα ενημερώσει αυτήν την απομακρυσμένη εφαρμογή.", + "SyncLevelAddRemove": "Μόνο προσθήκη και αφαίρεση: Όταν προστίθενται ή αφαιρούνται ευρετήρια από το {appName}, θα ενημερώσει αυτήν την απομακρυσμένη εφαρμογή.", "UISettingsSummary": "Επιλογές με προβλήματα ημερομηνίας, γλώσσας και χρώματος", "AddedToDownloadClient": "Η έκδοση προστέθηκε στον πελάτη", "AddToDownloadClient": "Προσθήκη έκδοσης στον πελάτη λήψης", @@ -379,13 +379,13 @@ "DeleteAppProfile": "Διαγραφή προφίλ εφαρμογής", "DeleteApplication": "Διαγραφή Εφαρμογής", "IndexerProxy": "Ευρετήριο μεσολάβησης", - "IndexerObsoleteCheckMessage": "Τα ευρετήρια είναι παρωχημένα ή έχουν ενημερωθεί: {0}. Αφαιρέστε και (ή) προσθέστε ξανά στο Prowlarr", + "IndexerObsoleteCheckMessage": "Τα ευρετήρια είναι παρωχημένα ή έχουν ενημερωθεί: {0}. Αφαιρέστε και (ή) προσθέστε ξανά στο {appName}", "Private": "Ιδιωτικός", "SyncProfiles": "Συγχρονισμός προφίλ", "AuthenticationRequired": "Απαιτείται πιστοποίηση", "BookSearchTypes": "Τύποι αναζήτησης βιβλίων", "ClearHistory": "Καθαρισμός ιστορικού", - "ClearHistoryMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλο το ιστορικό Prowlarr;", + "ClearHistoryMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλο το ιστορικό {appName};", "DeleteClientCategory": "Διαγραφή Κατηγορίας Πελάτη Λήψης", "DownloadClientCategory": "Κατεβάστε την κατηγορία πελάτη", "EditSyncProfile": "Επεξεργασία προφίλ συγχρονισμού", @@ -405,19 +405,19 @@ "Proxies": "Proxies", "QueryResults": "Αποτελέσματα ερωτήματος", "RawSearchSupported": "Υποστηρίζεται η ακατέργαστη αναζήτηση", - "RedirectHelpText": "Ανακατευθύνετε το εισερχόμενο αίτημα λήψης για το ευρετήριο και περάστε το άρπαγμα απευθείας αντί να μεταφέρετε το αίτημα μέσω Prowlarr", - "RestartProwlarr": "Επανεκκινήστε το Prowlarr", + "RedirectHelpText": "Ανακατευθύνετε το εισερχόμενο αίτημα λήψης για το ευρετήριο και περάστε το άρπαγμα απευθείας αντί να μεταφέρετε το αίτημα μέσω {appName}", + "RestartProwlarr": "Επανεκκινήστε το {appName}", "SearchCapabilities": "Δυνατότητες αναζήτησης", "TestAllApps": "Δοκιμάστε όλες τις εφαρμογές", "UnableToLoadIndexerProxies": "Δεν είναι δυνατή η φόρτωση των Proxer Indexer", - "AddDownloadClientToProwlarr": "Η προσθήκη ενός προγράμματος-πελάτη λήψης επιτρέπει στο Prowlarr να στέλνει εκδόσεις απευθείας από τη διεπαφή χρήστη ενώ κάνει μια μη αυτόματη αναζήτηση.", + "AddDownloadClientToProwlarr": "Η προσθήκη ενός προγράμματος-πελάτη λήψης επιτρέπει στο {appName} να στέλνει εκδόσεις απευθείας από τη διεπαφή χρήστη ενώ κάνει μια μη αυτόματη αναζήτηση.", "Application": "Εφαρμογή", "IndexerAuth": "Indexer Auth", "AddIndexerProxy": "Προσθήκη Indexer Proxy", "Apps": "Εφαρμογές", "Description": "Περιγραφή", "AppProfileInUse": "Προφίλ εφαρμογής σε χρήση", - "AppSettingsSummary": "Εφαρμογές και ρυθμίσεις για τη διαμόρφωση του τρόπου με τον οποίο το Prowlarr αλληλεπιδρά με τα προγράμματα PVR", + "AppSettingsSummary": "Εφαρμογές και ρυθμίσεις για τη διαμόρφωση του τρόπου με τον οποίο το {appName} αλληλεπιδρά με τα προγράμματα PVR", "Category": "Κατηγορία", "DevelopmentSettings": "Ρυθμίσεις ανάπτυξης", "EnabledRedirected": "Ενεργοποιήθηκε, ανακατευθύνθηκε", @@ -431,7 +431,7 @@ "IndexerInfo": "Πληροφορίες ευρετηρίου", "IndexerName": "Όνομα ευρετηρίου", "IndexerProxies": "Proxer Indexer", - "IndexerNoDefCheckMessage": "Τα ευρετήρια δεν έχουν ορισμό και δεν θα λειτουργήσουν: {0}. Αφαιρέστε και (ή) προσθέστε ξανά στο Prowlarr", + "IndexerNoDefCheckMessage": "Τα ευρετήρια δεν έχουν ορισμό και δεν θα λειτουργήσουν: {0}. Αφαιρέστε και (ή) προσθέστε ξανά στο {appName}", "SemiPrivate": "Ημι-ιδιωτικό", "SettingsIndexerLoggingHelpText": "Καταγραφή πρόσθετων δεδομένων ευρετηρίου συμπεριλαμβανομένης της απόκρισης", "SearchTypes": "Τύποι αναζήτησης", @@ -449,16 +449,16 @@ "TVSearchTypes": "Τύποι αναζήτησης τηλεόρασης", "AppProfileSelectHelpText": "Τα προφίλ εφαρμογών χρησιμοποιούνται για τον έλεγχο των ρυθμίσεων RSS, αυτόματης αναζήτησης και διαδραστικής αναζήτησης στο συγχρονισμό εφαρμογών", "AuthenticationRequiredHelpText": "Αλλαγή για τα οποία απαιτείται έλεγχος ταυτότητας. Μην αλλάζετε αν δεν κατανοήσετε τους κινδύνους.", - "AuthenticationRequiredWarning": "Για να αποτρέψει την απομακρυσμένη πρόσβαση χωρίς έλεγχο ταυτότητας, το Prowlarr απαιτεί τώρα να ενεργοποιηθεί ο έλεγχος ταυτότητας. Διαμορφώστε τη μέθοδο ελέγχου ταυτότητας και τα διαπιστευτήριά σας. Μπορείτε προαιρετικά να απενεργοποιήσετε τον έλεγχο ταυτότητας από τοπικές διευθύνσεις. Ανατρέξτε στις Συχνές Ερωτήσεις για πρόσθετες πληροφορίες.", - "IndexerHealthCheckNoIndexers": "Δεν υπάρχουν ενεργοποιημένα ευρετήρια, το Prowlarr δεν θα επιστρέψει αποτελέσματα αναζήτησης", + "AuthenticationRequiredWarning": "Για να αποτρέψει την απομακρυσμένη πρόσβαση χωρίς έλεγχο ταυτότητας, το {appName} απαιτεί τώρα να ενεργοποιηθεί ο έλεγχος ταυτότητας. Διαμορφώστε τη μέθοδο ελέγχου ταυτότητας και τα διαπιστευτήριά σας. Μπορείτε προαιρετικά να απενεργοποιήσετε τον έλεγχο ταυτότητας από τοπικές διευθύνσεις. Ανατρέξτε στις Συχνές Ερωτήσεις για πρόσθετες πληροφορίες.", + "IndexerHealthCheckNoIndexers": "Δεν υπάρχουν ενεργοποιημένα ευρετήρια, το {appName} δεν θα επιστρέψει αποτελέσματα αναζήτησης", "IndexerTagsHelpText": "Χρησιμοποιήστε ετικέτες για να καθορίσετε Διακομιστές μεσολάβησης ευρετηρίου, με ποιες εφαρμογές συγχρονίζεται το ευρετήριο ή απλώς για να οργανώσετε τα ευρετήρια σας.", "MinimumSeedersHelpText": "Ελάχιστοι σπόροι που απαιτούνται από την Εφαρμογή για να αρπάξει ο δείκτης", - "ProwlarrSupportsAnyIndexer": "Το Prowlarr υποστηρίζει πολλούς ευρετήρια εκτός από οποιονδήποτε δείκτη που χρησιμοποιεί το πρότυπο Newznab/Torznab χρησιμοποιώντας το 'Generic Newznab' (για usenet) ή το 'Generic Torznab' (για torrents). Αναζήτηση & Επιλέξτε τον ευρετηριαστή σας από παρακάτω.", + "ProwlarrSupportsAnyIndexer": "Το {appName} υποστηρίζει πολλούς ευρετήρια εκτός από οποιονδήποτε δείκτη που χρησιμοποιεί το πρότυπο Newznab/Torznab χρησιμοποιώντας το 'Generic Newznab' (για usenet) ή το 'Generic Torznab' (για torrents). Αναζήτηση & Επιλέξτε τον ευρετηριαστή σας από παρακάτω.", "SyncAppIndexers": "Συγχρονισμός ευρετηρίων εφαρμογών", - "SyncLevelFull": "Πλήρης συγχρονισμός: Θα διατηρήσει πλήρως συγχρονισμένα τα ευρετήρια αυτής της εφαρμογής. Στη συνέχεια, οι αλλαγές που γίνονται στους indexers στο Prowlarr συγχρονίζονται με αυτήν την εφαρμογή. Οποιαδήποτε αλλαγή γίνει σε ευρετήρια απομακρυσμένα σε αυτήν την εφαρμογή θα παρακαμφθεί από τον Prowlarr στον επόμενο συγχρονισμό.", + "SyncLevelFull": "Πλήρης συγχρονισμός: Θα διατηρήσει πλήρως συγχρονισμένα τα ευρετήρια αυτής της εφαρμογής. Στη συνέχεια, οι αλλαγές που γίνονται στους indexers στο {appName} συγχρονίζονται με αυτήν την εφαρμογή. Οποιαδήποτε αλλαγή γίνει σε ευρετήρια απομακρυσμένα σε αυτήν την εφαρμογή θα παρακαμφθεί από τον {appName} στον επόμενο συγχρονισμό.", "Remove": "Αφαιρώ", "Replace": "Αντικαθιστώ", - "TheLatestVersionIsAlreadyInstalled": "Η τελευταία έκδοση του Prowlarr είναι ήδη εγκατεστημένη", + "TheLatestVersionIsAlreadyInstalled": "Η τελευταία έκδοση του {appName} είναι ήδη εγκατεστημένη", "ApiKeyValidationHealthCheckMessage": "Παρακαλούμε ενημερώστε το κλείδι API ώστε να έχει τουλάχιστον {0} χαρακτήρες. Μπορείτε να το κάνετε αυτό μέσα από τις ρυθμίσεις ή το αρχείο ρυθμίσεων", "StopSelecting": "Διακοπή Επιλογής", "OnHealthRestored": "Στην Αποκατάσταση Υγείας", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 9099791e1..2c2bcd6fa 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -13,7 +13,7 @@ "AddCustomFilter": "Add Custom Filter", "AddDownloadClient": "Add Download Client", "AddDownloadClientImplementation": "Add Download Client - {implementationName}", - "AddDownloadClientToProwlarr": "Adding a download client allows Prowlarr to send releases direct from the UI while doing a manual search.", + "AddDownloadClientToProwlarr": "Adding a download client allows {appName} to send releases direct from the UI while doing a manual search.", "AddIndexer": "Add Indexer", "AddIndexerImplementation": "Add Indexer - {implementationName}", "AddIndexerProxy": "Add Indexer Proxy", @@ -32,14 +32,14 @@ "All": "All", "AllIndexersHiddenDueToFilter": "All indexers are hidden due to applied filter.", "Analytics": "Analytics", - "AnalyticsEnabledHelpText": "Send anonymous usage and error information to Prowlarr's servers. This includes information on your browser, which Prowlarr WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes.", + "AnalyticsEnabledHelpText": "Send anonymous usage and error information to {appName}'s servers. This includes information on your browser, which {appName} WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes.", "ApiKey": "API Key", "ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file", "AppDataDirectory": "AppData directory", "AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update", "AppProfileInUse": "App Profile in Use", "AppProfileSelectHelpText": "App profiles are used to control RSS, Automatic Search and Interactive Search settings on application sync", - "AppSettingsSummary": "Applications and settings to configure how Prowlarr interacts with your PVR programs", + "AppSettingsSummary": "Applications and settings to configure how {appName} interacts with your PVR programs", "AppUpdated": "{appName} Updated", "AppUpdatedVersion": "{appName} has been updated to version `{version}`, in order to get the latest changes you'll need to reload {appName}", "Application": "Application", @@ -64,7 +64,7 @@ "AppsMinimumSeeders": "Apps Minimum Seeders", "AppsMinimumSeedersHelpText": "Minimum seeders required by the Applications for the indexer to grab, empty is Sync profile's default", "AreYouSureYouWantToDeleteCategory": "Are you sure you want to delete mapped category?", - "AreYouSureYouWantToDeleteIndexer": "Are you sure you want to delete '{name}' from Prowlarr?", + "AreYouSureYouWantToDeleteIndexer": "Are you sure you want to delete '{name}' from {appName}?", "Artist": "Artist", "AudioSearch": "Audio Search", "Auth": "Auth", @@ -86,7 +86,7 @@ "AutomaticSearch": "Automatic Search", "AverageResponseTimesMs": "Average Indexer Response Times (ms)", "Backup": "Backup", - "BackupFolderHelpText": "Relative paths will be under Prowlarr's AppData directory", + "BackupFolderHelpText": "Relative paths will be under {appName}'s AppData directory", "BackupIntervalHelpText": "Interval between automatic backups", "BackupNow": "Backup Now", "BackupRetentionHelpText": "Automatic backups older than the retention period will be cleaned up automatically", @@ -99,7 +99,7 @@ "BookSearch": "Book Search", "BookSearchTypes": "Book Search Types", "Branch": "Branch", - "BranchUpdate": "Branch to use to update Prowlarr", + "BranchUpdate": "Branch to use to update {appName}", "BranchUpdateMechanism": "Branch used by external update mechanism", "BypassProxyForLocalAddresses": "Bypass Proxy for Local Addresses", "Cancel": "Cancel", @@ -111,7 +111,7 @@ "ChangeHasNotBeenSavedYet": "Change has not been saved yet", "Clear": "Clear", "ClearHistory": "Clear History", - "ClearHistoryMessageText": "Are you sure you want to clear all Prowlarr history?", + "ClearHistoryMessageText": "Are you sure you want to clear all {appName} history?", "ClientPriority": "Client Priority", "Clone": "Clone", "CloneProfile": "Clone Profile", @@ -177,7 +177,7 @@ "DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures", "DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}", "DownloadClients": "Download Clients", - "DownloadClientsSettingsSummary": "Download clients configuration for integration into Prowlarr UI search", + "DownloadClientsSettingsSummary": "Download clients configuration for integration into {appName} UI search", "Duration": "Duration", "Edit": "Edit", "EditApplicationImplementation": "Edit Application - {implementationName}", @@ -193,7 +193,7 @@ "ElapsedTime": "Elapsed Time", "Enable": "Enable", "EnableAutomaticSearch": "Enable Automatic Search", - "EnableAutomaticSearchHelpText": "Will be used when automatic searches are performed via the UI or by Prowlarr", + "EnableAutomaticSearchHelpText": "Will be used when automatic searches are performed via the UI or by {appName}", "EnableIndexer": "Enable Indexer", "EnableInteractiveSearch": "Enable Interactive Search", "EnableInteractiveSearchHelpText": "Will be used when interactive search is used", @@ -251,7 +251,7 @@ "IllRestartLater": "I'll restart later", "Implementation": "Implementation", "IncludeHealthWarningsHelpText": "Include Health Warnings", - "IncludeManualGrabsHelpText": "Include Manual Grabs made within Prowlarr", + "IncludeManualGrabsHelpText": "Include Manual Grabs made within {appName}", "Indexer": "Indexer", "IndexerAlreadySetup": "At least one instance of indexer is already setup", "IndexerAuth": "Indexer Auth", @@ -259,17 +259,17 @@ "IndexerDetails": "Indexer Details", "IndexerDisabled": "Indexer Disabled", "IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {0}.", - "IndexerDownloadClientHelpText": "Specify which download client is used for grabs made within Prowlarr from this indexer", + "IndexerDownloadClientHelpText": "Specify which download client is used for grabs made within {appName} from this indexer", "IndexerFailureRate": "Indexer Failure Rate", "IndexerFlags": "Indexer Flags", - "IndexerHealthCheckNoIndexers": "No indexers enabled, Prowlarr will not return search results", + "IndexerHealthCheckNoIndexers": "No indexers enabled, {appName} will not return search results", "IndexerHistoryLoadError": "Error loading indexer history", "IndexerInfo": "Indexer Info", "IndexerLongTermStatusCheckAllClientMessage": "All indexers are unavailable due to failures for more than 6 hours", "IndexerLongTermStatusCheckSingleClientMessage": "Indexers unavailable due to failures for more than 6 hours: {0}", "IndexerName": "Indexer Name", - "IndexerNoDefCheckMessage": "Indexers have no definition and will not work: {0}. Please remove and (or) re-add to Prowlarr", - "IndexerObsoleteCheckMessage": "Indexers are obsolete or have been updated: {0}. Please remove and (or) re-add to Prowlarr", + "IndexerNoDefCheckMessage": "Indexers have no definition and will not work: {0}. Please remove and (or) re-add to {appName}", + "IndexerObsoleteCheckMessage": "Indexers are obsolete or have been updated: {0}. Please remove and (or) re-add to {appName}", "IndexerPriority": "Indexer Priority", "IndexerPriorityHelpText": "Indexer Priority from 1 (Highest) to 50 (Lowest). Default: 25.", "IndexerProxies": "Indexer Proxies", @@ -301,7 +301,7 @@ "LastExecution": "Last Execution", "LastFailure": "Last Failure", "LastWriteTime": "Last Write Time", - "LaunchBrowserHelpText": " Open a web browser and navigate to the Prowlarr homepage on app start.", + "LaunchBrowserHelpText": " Open a web browser and navigate to the {appName} homepage on app start.", "Level": "Level", "Link": "Link", "LogFiles": "Log Files", @@ -389,8 +389,8 @@ "Privacy": "Privacy", "Private": "Private", "Protocol": "Protocol", - "ProwlarrSupportsAnyDownloadClient": "Prowlarr supports any of the download clients listed below.", - "ProwlarrSupportsAnyIndexer": "Prowlarr supports many indexers in addition to any indexer that uses the Newznab/Torznab standard using 'Generic Newznab' (for usenet) or 'Generic Torznab' (for torrents). Search & Select your indexer from below.", + "ProwlarrSupportsAnyDownloadClient": "{appName} supports any of the download clients listed below.", + "ProwlarrSupportsAnyIndexer": "{appName} supports many indexers in addition to any indexer that uses the Newznab/Torznab standard using 'Generic Newznab' (for usenet) or 'Generic Torznab' (for torrents). Search & Select your indexer from below.", "Proxies": "Proxies", "Proxy": "Proxy", "ProxyBypassFilterHelpText": "Use ',' as a separator, and '*.' as a wildcard for subdomains", @@ -415,10 +415,10 @@ "RecentChanges": "Recent Changes", "Reddit": "Reddit", "Redirect": "Redirect", - "RedirectHelpText": "Redirect incoming download request for indexer and pass the grab directly instead of proxying the request via Prowlarr", + "RedirectHelpText": "Redirect incoming download request for indexer and pass the grab directly instead of proxying the request via {appName}", "Refresh": "Refresh", "RefreshMovie": "Refresh movie", - "ReleaseBranchCheckOfficialBranchMessage": "Branch {0} is not a valid Prowlarr release branch, you will not receive updates", + "ReleaseBranchCheckOfficialBranchMessage": "Branch {0} is not a valid {appName} release branch, you will not receive updates", "ReleaseStatus": "Release Status", "Reload": "Reload", "Remove": "Remove", @@ -432,7 +432,7 @@ "ResetAPIKeyMessageText": "Are you sure you want to reset your API Key?", "Restart": "Restart", "RestartNow": "Restart Now", - "RestartProwlarr": "Restart Prowlarr", + "RestartProwlarr": "Restart {appName}", "RestartRequiredHelpTextWarning": "Requires restart to take effect", "Restore": "Restore", "RestoreBackup": "Restore Backup", @@ -486,7 +486,7 @@ "SettingsShortDateFormat": "Short Date Format", "SettingsShowRelativeDates": "Show Relative Dates", "SettingsShowRelativeDatesHelpText": "Show relative (Today/Yesterday/etc) or absolute dates", - "SettingsSqlLoggingHelpText": "Log all SQL queries from Prowlarr", + "SettingsSqlLoggingHelpText": "Log all SQL queries from {appName}", "SettingsTimeFormat": "Time Format", "ShowAdvanced": "Show Advanced", "ShowSearch": "Show Search", @@ -505,8 +505,8 @@ "SuggestTranslationChange": "Suggest translation change", "SyncAppIndexers": "Sync App Indexers", "SyncLevel": "Sync Level", - "SyncLevelAddRemove": "Add and Remove Only: When indexers are added or removed from Prowlarr, it will update this remote app.", - "SyncLevelFull": "Full Sync: Will keep this app's indexers fully in sync. Changes made to indexers in Prowlarr are then synced to this app. Any change made to indexers remotely within this app will be overridden by Prowlarr on the next sync.", + "SyncLevelAddRemove": "Add and Remove Only: When indexers are added or removed from {appName}, it will update this remote app.", + "SyncLevelFull": "Full Sync: Will keep this app's indexers fully in sync. Changes made to indexers in {appName} are then synced to this app. Any change made to indexers remotely within this app will be overridden by {appName} on the next sync.", "SyncProfile": "Sync Profile", "SyncProfiles": "Sync Profiles", "System": "System", @@ -548,7 +548,7 @@ "Type": "Type", "UI": "UI", "UILanguage": "UI Language", - "UILanguageHelpText": "Language that Prowlarr will use for UI", + "UILanguageHelpText": "Language that {appName} will use for UI", "UILanguageHelpTextWarning": "Browser Reload Required", "UISettings": "UI Settings", "UISettingsSummary": "Date, language, and color impaired options", @@ -578,7 +578,7 @@ "UpdateCheckStartupNotWritableMessage": "Cannot install update because startup folder '{0}' is not writable by the user '{1}'.", "UpdateCheckStartupTranslocationMessage": "Cannot install update because startup folder '{0}' is in an App Translocation folder.", "UpdateCheckUINotWritableMessage": "Cannot install update because UI folder '{0}' is not writable by the user '{1}'.", - "UpdateMechanismHelpText": "Use Prowlarr's built-in updater or a script", + "UpdateMechanismHelpText": "Use {appName}'s built-in updater or a script", "UpdateScriptPathHelpText": "Path to a custom script that takes an extracted update package and handle the remainder of the update process", "Updates": "Updates", "Uptime": "Uptime", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index d3e0a7ef9..0adc79675 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -48,7 +48,7 @@ "Scheduled": "Programado", "SaveChanges": "Guardar Cambios", "RestoreBackup": "Recuperar Backup", - "ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de Prowlarr, no recibirás actualizaciones", + "ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de {appName}, no recibirás actualizaciones", "Refresh": "Actualizar", "Queue": "Cola", "ProxyCheckResolveIpMessage": "No se pudo resolver la dirección IP del Host Proxy configurado {0}", @@ -150,14 +150,14 @@ "Backups": "Copias de seguridad", "BackupRetentionHelpText": "Las copias de seguridad automáticas anteriores al período de retención serán borradas automáticamente", "BackupIntervalHelpText": "Intervalo entre copias de seguridad automáticas", - "BackupFolderHelpText": "Las rutas relativas estarán en el directorio AppData de Prowlarr", + "BackupFolderHelpText": "Las rutas relativas estarán en el directorio AppData de {appName}", "Automatic": "Automático", - "AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder Prowlarr", + "AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder {appName}", "Authentication": "Autenticación", "ApiKey": "Clave de API", "ApplyTags": "Aplicar Etiquetas", "AppDataDirectory": "Directorio AppData", - "AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de Prowlarr. Esto incluye información sobre su navegador, qué páginas de Prowlarr WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.", + "AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de {appName}. Esto incluye información sobre su navegador, qué páginas de {appName} WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.", "YesCancel": "Sí, Cancelar", "Version": "Versión", "Username": "Nombre de usuario", @@ -167,7 +167,7 @@ "URLBase": "URL Base", "Uptime": "Tiempo de actividad", "UpdateScriptPathHelpText": "Ruta del script propio que toma el paquete de actualización y se encarga del proceso de actualización restante", - "UpdateMechanismHelpText": "Usar el actualizador de Prowlarr o un script", + "UpdateMechanismHelpText": "Usar el actualizador de {appName} o un script", "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Se podrán instalar desde Sistema: Actualizaciones también", "UnableToLoadTags": "No se pueden cargar las Etiquetas", "UnableToLoadNotifications": "No se pueden cargar las Notificaciones", @@ -186,7 +186,7 @@ "Retention": "Retención", "Result": "Resultado", "RestartRequiredHelpTextWarning": "Requiere reiniciar para que surta efecto", - "RestartProwlarr": "Reiniciar Prowlarr", + "RestartProwlarr": "Reiniciar {appName}", "RestartNow": "Reiniciar Ahora", "ResetAPIKey": "Reajustar API", "Reset": "Reiniciar", @@ -212,7 +212,7 @@ "Mechanism": "Mecanismo", "Logs": "Registros", "LogLevel": "Nivel de Registro", - "LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de Prowlarr al arrancar la app.", + "LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de {appName} al arrancar la app.", "Interval": "Intervalo", "IndexerFlags": "Marcas de Indexer", "IncludeHealthWarningsHelpText": "Incluir Alertas de Salud", @@ -235,14 +235,14 @@ "LogLevelTraceHelpTextWarning": "El registro de seguimiento se ha de habilitar solo temporalmente", "ExistingTag": "Etiqueta existente", "EnableInteractiveSearchHelpText": "Se usará cuando se utilice la búsqueda interactiva", - "EnableAutomaticSearchHelpText": "Se usará cuando las búsquedas automáticas se realicen desde el UI o por Prowlarr", + "EnableAutomaticSearchHelpText": "Se usará cuando las búsquedas automáticas se realicen desde el UI o por {appName}", "DeleteTagMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?", "DeleteNotificationMessageText": "Seguro que quieres elminiar la notificación '{0}'?", "DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{0}'?", "DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{0}'?", "CancelPendingTask": "Seguro que quieres cancelar esta tarea pendiente?", "BranchUpdateMechanism": "Rama usada por el mecanismo de actualización externo", - "BranchUpdate": "Qué rama usar para actualizar Prowlarr", + "BranchUpdate": "Qué rama usar para actualizar {appName}", "BeforeUpdate": "Antes de actualizar", "AddingTag": "Añadir etiqueta", "UnableToLoadUISettings": "No se han podido cargar los ajustes de UI", @@ -255,7 +255,7 @@ "TagIsNotUsedAndCanBeDeleted": "La etiqueta no se usa y puede ser borrada", "StartTypingOrSelectAPathBelow": "Comienza a escribir o selecciona una ruta debajo", "Restore": "Restaurar", - "ProwlarrSupportsAnyIndexer": "Prowlarr soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.", + "ProwlarrSupportsAnyIndexer": "{appName} soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.", "ProwlarrSupportsAnyDownloadClient": "Raddar soporta cualquier gestor de descargas que utilice el estandar Newznab, como también los clientes indicados debajo.", "NoUpdatesAreAvailable": "No hay actualizaciones disponibles", "NoTagsHaveBeenAddedYet": "No se han añadido etiquetas todavía", @@ -267,7 +267,7 @@ "Exception": "Excepción", "ErrorLoadingContents": "Error al cargar los contenidos", "UILanguageHelpTextWarning": "Recargar el Navegador", - "UILanguageHelpText": "Lenguaje que Prowlarr usara para el UI", + "UILanguageHelpText": "Lenguaje que {appName} usara para el UI", "UILanguage": "Lenguaje de UI", "Priority": "Prioridad", "InteractiveSearch": "Búsqueda Interactiva", @@ -332,7 +332,7 @@ "AddToDownloadClient": "Añadir descarga al cliente de descargas", "Applications": "Aplicaciones", "AppProfileInUse": "Perfil de aplicación en uso", - "AddDownloadClientToProwlarr": "Añadir un cliente de descargas permite a Prowlarr enviar descargas directamente desde la interfaz en una búsqueda manual.", + "AddDownloadClientToProwlarr": "Añadir un cliente de descargas permite a {appName} enviar descargas directamente desde la interfaz en una búsqueda manual.", "Category": "Categoría", "Application": "Aplicación", "BookSearch": "Búsqueda de libros", @@ -363,7 +363,7 @@ "Started": "Iniciado", "Remove": "Eliminar", "Replace": "Reemplazar", - "TheLatestVersionIsAlreadyInstalled": "La última versión de Prowlarr ya está instalada", + "TheLatestVersionIsAlreadyInstalled": "La última versión de {appName} ya está instalada", "Apps": "Aplicaciones", "AddApplication": "Añadir aplicación", "AddCustomFilter": "Añadir filtro personalizado", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index d4c69a1f0..19b60958a 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -44,7 +44,7 @@ "Reddit": "Reddit", "Refresh": "Päivitä", "RefreshMovie": "Päivitä elokuva", - "ReleaseBranchCheckOfficialBranchMessage": "'{0}' ei ole kelvollinen Prowlarr-julkaisuhaara, etkä saa päivityksiä sen kautta", + "ReleaseBranchCheckOfficialBranchMessage": "'{0}' ei ole kelvollinen {appName}-julkaisuhaara, etkä saa päivityksiä sen kautta", "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.", "Result": "Tulos", "Settings": "Asetukset", @@ -53,7 +53,7 @@ "UnselectAll": "Poista kaikkien valinta", "UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.", "UpdateCheckUINotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käyttöliittymäkansioon '{0}'.", - "UpdateMechanismHelpText": "Käytä Prowlarrin sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.", + "UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.", "Enable": "Käytä", "UI": "Käyttöliittymä", "UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.", @@ -181,7 +181,7 @@ "Discord": "Discord", "Donations": "Lahjoitukset", "Edit": "Muokkaa", - "EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai Prowlarrin toimesta.", + "EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai {appName}in toimesta.", "Enabled": "Käytössä", "EventType": "Tapahtumatyyppi", "Exception": "Poikkeus", @@ -190,7 +190,7 @@ "IgnoredAddresses": "Ohitetut osoitteet", "IllRestartLater": "Käynnistän uudelleen myöhemmin", "Info": "Tiedot", - "LaunchBrowserHelpText": " Avaa Prowlarrin verkkokäyttöliittymä verkkoselaimeen sovelluksen käynnistyksen yhteydessä.", + "LaunchBrowserHelpText": " Avaa {appName}in verkkokäyttöliittymä verkkoselaimeen sovelluksen käynnistyksen yhteydessä.", "NoChanges": "Ei muutoksia", "NoLeaveIt": "Ei, anna olla", "PendingChangesMessage": "On tallentamattomia muutoksia. Haluatko varmasti poistua sivulta?", @@ -306,20 +306,20 @@ "UILanguageHelpText": "Käyttöliittymä näytetään tällä kielellä.", "UILanguageHelpTextWarning": "Käyttöönotto vaatii selaimen sivupäivityksen.", "UISettings": "Käyttöliittymän asetukset", - "DownloadClientsSettingsSummary": "Prowlarrin käyttöliittymästä suoritettavien hakujen yhteydessä käytettävien lataustyökalujen määritykset.", - "ProwlarrSupportsAnyDownloadClient": "Prowlarr tukee alla listatuja lataustyökaluja.", - "AddDownloadClientToProwlarr": "Lisäämällä lataustyökalun Prowlarr voi käynnistää lataukset suoraan käyttöliittymästä manuaalisen haun yhteydessä.", + "DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävien lataustyökalujen määritykset.", + "ProwlarrSupportsAnyDownloadClient": "{appName} tukee alla listatuja lataustyökaluja.", + "AddDownloadClientToProwlarr": "Lisäämällä lataustyökalun {appName} voi käynnistää lataukset suoraan käyttöliittymästä manuaalisen haun yhteydessä.", "RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja ohjaa sieppaus suoraan sen sijaan, että se välitettäisiin Prowlarin kautta.", "FullSync": "Täysi synkronointi", - "SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen tietolähteet täysin synkronoituna. Tietolähteisiin Prowlarrissa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.", + "SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen tietolähteet täysin synkronoituna. Tietolähteisiin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.", "EnableIndexer": "Tietolähteen tila", "FilterPlaceHolder": "Suodata tietolähteitä", - "IndexerHealthCheckNoIndexers": "Yhtään tietolähdettä ei ole käytössä, eikä Prowlarr tämän vuoksi löydä tuloksia.", + "IndexerHealthCheckNoIndexers": "Yhtään tietolähdettä ei ole käytössä, eikä {appName} tämän vuoksi löydä tuloksia.", "IndexerObsoleteCheckMessage": "Tietolähteet ovat vanhentuneita tai niitä on päivitetty: {0}. Poista ja/tai lisää ne Prowlariin uudelleen.", "IndexerProxy": "Tietolähteen välityspalvelin", "IndexerSettingsSummary": "Määritä useita globaaleita tietolähdeasetuksia, kuten välityspalvelimia.", "IndexerVipCheckExpiringClientMessage": "Tietolähteen VIP-edut erääntyvät pian: {0}", - "ProwlarrSupportsAnyIndexer": "Prowlarr tukee Newznab- ja Torznab-yhteensopivien tietolähteiden ohella myös useita muita lähteitä vaihtoehdoilla \"Yleinen Newznab\" (Usenetille) ja 'Yleinen Torznab' (torrenteille).", + "ProwlarrSupportsAnyIndexer": "{appName} tukee Newznab- ja Torznab-yhteensopivien tietolähteiden ohella myös useita muita lähteitä vaihtoehdoilla \"Yleinen Newznab\" (Usenetille) ja 'Yleinen Torznab' (torrenteille).", "SettingsIndexerLogging": "Tehostettu tietolähteiden valvonta", "AddIndexerProxy": "Lisää tiedonhaun välityspalvelin", "UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.", @@ -335,9 +335,9 @@ "MaintenanceRelease": "Huoltojulkaisu: Korjauksia ja muita parannuksia. Lue lisää Githubin historiasta muutoshistoriasta.", "Query": "Kysely", "Redirect": "Uudelleenohjaus", - "RestartProwlarr": "Käynnistä Prowlarr uudelleen", + "RestartProwlarr": "Käynnistä {appName} uudelleen", "SyncLevel": "Synkronoinnin laajuus", - "SyncLevelAddRemove": "Vain lisäys/poisto: Kun Prowlarrin tietolähteitä lisätään tai poistetaan, päivittyy myös etäsovellus.", + "SyncLevelAddRemove": "Vain lisäys/poisto: Kun {appName}in tietolähteitä lisätään tai poistetaan, päivittyy myös etäsovellus.", "SyncAppIndexers": "Synkronoi tietolähteet", "TestAllApps": "Testaa kaikki sovellukset", "UnableToLoadIndexerProxies": "Tietolähdevälityspalvelimien lataus epäonnistui", @@ -351,7 +351,7 @@ "SettingsLogRotateHelpText": "Lokien tallennuskansiossa säilytettävien lokitiedostojen enimmäismäärä", "SettingsLogRotate": "Lokitiedostojen kierrätys", "SettingsLogSql": "Kirjaa SQL", - "SettingsSqlLoggingHelpText": "Kirjaa kaikki Prowlarrin SQL-kyselyt", + "SettingsSqlLoggingHelpText": "Kirjaa kaikki {appName}in SQL-kyselyt", "ConnectSettingsSummary": "Ilmoitukset ja omat komentosarjat.", "DevelopmentSettings": "Kehittäjäasetukset", "Description": "Kuvaus", @@ -365,7 +365,7 @@ "Auth": "Todennus", "Category": "Luokitus", "ClearHistory": "Tyhjennä historia", - "ClearHistoryMessageText": "Haluatko varmasti tyhjentää kaiken Prowlarr-historian?", + "ClearHistoryMessageText": "Haluatko varmasti tyhjentää kaiken {appName}-historian?", "Connect": "Kytkennät", "EnableRssHelpText": "Tietolähde sisällytetään RSS-syötteeseen.", "DeleteApplication": "Poista sovellus", @@ -376,7 +376,7 @@ "NotificationTriggersHelpText": "Valitse tapahtumat, jotka aiheuttavat ilmoituksen.", "Stats": "Tilastot", "UnableToLoadDevelopmentSettings": "Kehittäjäasetusten lataus epäonnistui", - "AppSettingsSummary": "Sovellukset ja asetukset, joilla määritetään miten Prowlarr viestii PVR-sovellustesi kanssa.", + "AppSettingsSummary": "Sovellukset ja asetukset, joilla määritetään miten {appName} viestii PVR-sovellustesi kanssa.", "Privacy": "Yksityisyys", "NetCore": ".NET", "BookSearch": "Etsi kirjoja", @@ -406,7 +406,7 @@ "UnableToLoadApplicationList": "Sovelluslistausta ei voitu ladata", "Url": "URL", "Website": "Verkkosivusto", - "IndexerNoDefCheckMessage": "Tietolähteillä ei ole määritystä, eivätkä ne toimi: {0}. Poista ja/tai lisää Prowlarriin uudelleen", + "IndexerNoDefCheckMessage": "Tietolähteillä ei ole määritystä, eivätkä ne toimi: {0}. Poista ja/tai lisää {appName}iin uudelleen", "Private": "Yksityinen", "QueryResults": "Kyselyn tulokset", "Application": "Sovellus", @@ -456,7 +456,7 @@ "AuthenticationRequired": "Todennus vaaditaan", "Remove": "Poista", "Replace": "Korvaa", - "TheLatestVersionIsAlreadyInstalled": "Prowlarrin uusin versio on jo asennettu", + "TheLatestVersionIsAlreadyInstalled": "{appName}in uusin versio on jo asennettu", "ApplicationURL": "Sovelluksen URL-osoite", "ApplicationUrlHelpText": "Sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.", "Track": "Jäljitys", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index d93097c3d..6b5a9adc9 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -48,7 +48,7 @@ "Scheduled": "Programmé", "SaveChanges": "Sauvegarder les modifications", "RestoreBackup": "Restaurer la sauvegarde", - "ReleaseBranchCheckOfficialBranchMessage": "La branche {0} n'est pas une branche de version Prowlarr valide, vous ne recevrez pas de mises à jour", + "ReleaseBranchCheckOfficialBranchMessage": "La branche {0} n'est pas une branche de version {appName} valide, vous ne recevrez pas de mises à jour", "Refresh": "Rafraîchir", "Queue": "File d'attente", "ProxyCheckResolveIpMessage": "Impossible de résoudre l'adresse IP de l'hôte proxy configuré {0}", @@ -61,7 +61,7 @@ "NoChange": "Pas de changement", "MoreInfo": "Plus d'informations", "Grabbed": "Saisie", - "DownloadClientsSettingsSummary": "Configuration des clients de téléchargement pour intégration dans la recherche de l'interface utilisateur de Prowlarr", + "DownloadClientsSettingsSummary": "Configuration des clients de téléchargement pour intégration dans la recherche de l'interface utilisateur de {appName}", "DownloadClient": "Client de téléchargement", "Logging": "Enregistrement", "LogFiles": "Fichiers journaux", @@ -146,7 +146,7 @@ "ApplyTags": "Appliquer les étiquettes", "AppDataDirectory": "Dossier AppData", "ApiKey": "Clé API", - "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Prowlarr. Cela inclut des informations sur votre navigateur, quelle page Prowlarr WebUI vous utilisez, les rapports d'erreurs, ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.", + "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de {appName}. Cela inclut des informations sur votre navigateur, quelle page {appName} WebUI vous utilisez, les rapports d'erreurs, ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.", "IgnoredAddresses": "Adresses ignorées", "Hostname": "Hostname", "GeneralSettings": "Réglages généraux", @@ -164,17 +164,17 @@ "DeleteBackup": "Supprimer la sauvegarde", "DBMigration": "Migration de la base de données", "ConnectSettings": "Paramètres de connexion", - "BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de Prowlarr", + "BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de {appName}", "IllRestartLater": "Je redémarrerai plus tard", "CancelPendingTask": "Êtes-vous sur de vouloir annuler cette tâche en attente ?", "BranchUpdateMechanism": "Branche utilisée par le mécanisme de mise à jour extérieur", - "BranchUpdate": "Branche à utiliser pour mettre Prowlarr à jour", + "BranchUpdate": "Branche à utiliser pour mettre {appName} à jour", "BeforeUpdate": "Avant la mise à jour", "DeleteDownloadClientMessageText": "Voulez-vous supprimer le client de téléchargement « {name} » ?", "DeleteBackupMessageText": "Voulez-vous supprimer la sauvegarde « {name} » ?", "ErrorLoadingContents": "Erreur lors du chargement du contenu", "EnableInteractiveSearchHelpText": "Sera utilisé lorsque la recherche interactive est utilisée", - "EnableAutomaticSearchHelpText": "Sera utilisé lorsque les recherches automatiques sont effectuées via l'interface utilisateur ou par Prowlarr", + "EnableAutomaticSearchHelpText": "Sera utilisé lorsque les recherches automatiques sont effectuées via l'interface utilisateur ou par {appName}", "ForMoreInformationOnTheIndividualDownloadClients": "Pour plus d'informations sur les clients de téléchargement individuels, cliquez sur les boutons d'information.", "FilterPlaceHolder": "Rechercher des indexeurs", "Exception": "Exception", @@ -207,7 +207,7 @@ "ProxyBypassFilterHelpText": "Utilisez ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines", "Uptime": "Disponibilité", "UpdateScriptPathHelpText": "Chemin d'accès à un script personnalisé qui prend un package de mise à jour extrait et gère le reste du processus de mise à jour", - "UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de Prowlarr ou un script", + "UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de {appName} ou un script", "UpdateAutomaticallyHelpText": "Téléchargez et installez automatiquement les mises à jour. Vous pourrez toujours installer à partir du système : mises à jour", "UnableToLoadUISettings": "Impossible de charger les paramètres de l'interface utilisateur", "UnableToLoadTags": "Impossible de charger les étiquettes", @@ -226,7 +226,7 @@ "DeleteTagMessageText": "Voulez-vous vraiment supprimer l'étiquette « {label} » ?", "UISettings": "Paramètres UI", "UILanguageHelpTextWarning": "Rechargement du navigateur requis", - "UILanguageHelpText": "Langue que Prowlarr utilisera pour l'interface utilisateur", + "UILanguageHelpText": "Langue que {appName} utilisera pour l'interface utilisateur", "UILanguage": "Langue de l'IU", "Torrents": "Torrents", "TestAllClients": "Tester tous les clients", @@ -246,7 +246,7 @@ "Result": "Résultat", "Restore": "Restaurer", "RestartRequiredHelpTextWarning": "Nécessite un redémarrage pour prendre effet", - "RestartProwlarr": "Redémarrer Prowlarr", + "RestartProwlarr": "Redémarrer {appName}", "RestartNow": "Redémarrer maintenant", "ResetAPIKey": "Réinitialiser la clé API", "Reset": "Réinitialiser", @@ -256,8 +256,8 @@ "RemovedFromTaskQueue": "Supprimé de la file d'attente des tâches", "RefreshMovie": "Actualiser le film", "ReadTheWikiForMoreInformation": "Lisez le wiki pour plus d'informations", - "ProwlarrSupportsAnyIndexer": "Prowlarr prend en charge de nombreux indexeurs en plus de tout indexeur qui utilise la norme Newznab/Torznab en utilisant « Generic Newznab » (pour usenet) ou « Generic Torznab » (pour les torrents). Recherchez et sélectionnez votre indexeur ci-dessous.", - "ProwlarrSupportsAnyDownloadClient": "Prowlarr prend en charge tout client de téléchargement qui utilise le standard Newznab, ainsi que d'autres clients de téléchargement répertoriés ci-dessous.", + "ProwlarrSupportsAnyIndexer": "{appName} prend en charge de nombreux indexeurs en plus de tout indexeur qui utilise la norme Newznab/Torznab en utilisant « Generic Newznab » (pour usenet) ou « Generic Torznab » (pour les torrents). Recherchez et sélectionnez votre indexeur ci-dessous.", + "ProwlarrSupportsAnyDownloadClient": "{appName} prend en charge tout client de téléchargement qui utilise le standard Newznab, ainsi que d'autres clients de téléchargement répertoriés ci-dessous.", "ProxyUsernameHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si nécessaire. Sinon, laissez-les vides.", "ProxyType": "Type de mandataire", "ProxyPasswordHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si nécessaire. Sinon, laissez-les vides.", @@ -278,7 +278,7 @@ "MovieIndexScrollTop": "Index des films : faire défiler vers le haut", "MovieIndexScrollBottom": "Index des films : faire défiler vers le bas", "MIA": "MIA", - "LaunchBrowserHelpText": " Ouvrer un navigateur Web et accéder à la page d'accueil de Prowlarr au démarrage de l'application.", + "LaunchBrowserHelpText": " Ouvrer un navigateur Web et accéder à la page d'accueil de {appName} au démarrage de l'application.", "CloseCurrentModal": "Fermer cette fenêtre modale", "AddingTag": "Ajout d'une étiquette", "OnHealthIssueHelpText": "Sur un problème de santé", @@ -293,7 +293,7 @@ "UnableToLoadDevelopmentSettings": "Impossible de charger les paramètres de développement", "TestAllApps": "Tester toutes les applications", "SyncAppIndexers": "Synchroniser les indexeurs d'applications", - "SettingsSqlLoggingHelpText": "Enregistrez toutes les requêtes SQL de Prowlarr", + "SettingsSqlLoggingHelpText": "Enregistrez toutes les requêtes SQL de {appName}", "SettingsLogRotateHelpText": "Nombre maximum de fichiers journaux à conserver dans le dossier des journaux", "SettingsLogRotate": "Rotation du journal", "SettingsIndexerLoggingHelpText": "Enregistrer des données supplémentaires de l'indexeur, y compris la réponse", @@ -304,8 +304,8 @@ "SearchIndexers": "Recherche indexeurs", "IndexerRss": "Indexeur Rss", "IndexerQuery": "Requête indexeur", - "IndexerObsoleteCheckMessage": "Les indexeurs sont obsolètes ou ont été mis à jour : {0}. Veuillez supprimer et (ou) rajouter à Prowlarr", - "IndexerHealthCheckNoIndexers": "Aucun indexeur activé, Prowlarr ne renverra pas de résultats de recherche", + "IndexerObsoleteCheckMessage": "Les indexeurs sont obsolètes ou ont été mis à jour : {0}. Veuillez supprimer et (ou) rajouter à {appName}", + "IndexerHealthCheckNoIndexers": "Aucun indexeur activé, {appName} ne renverra pas de résultats de recherche", "IndexerAuth": "Authentification d’Indexeur", "EnableRssHelpText": "Activer le flux RSS pour l'indexeur", "EnableRss": "Activer RSS", @@ -313,7 +313,7 @@ "DevelopmentSettings": "Paramètres de développement", "DeleteApplicationMessageText": "Voulez-vous supprimer l'application « {name} » ?", "DeleteApplication": "Supprimer l'application", - "ClearHistoryMessageText": "Voulez-vous vraiment effacer tout l'historique de Prowlarr ?", + "ClearHistoryMessageText": "Voulez-vous vraiment effacer tout l'historique de {appName} ?", "ClearHistory": "Effacer l'historique", "ApplicationStatusCheckSingleClientMessage": "Applications indisponibles en raison de dysfonctionnements : {0}", "ApplicationStatusCheckAllClientMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements", @@ -323,7 +323,7 @@ "AddNewIndexer": "Ajouter un nouvel indexeur", "Wiki": "Wiki", "RSS": "RSS", - "RedirectHelpText": "Rediriger la demande de téléchargement entrante pour l'indexeur et transmettre la capture directement au lieu de transmettre la demande par proxy via Prowlarr", + "RedirectHelpText": "Rediriger la demande de téléchargement entrante pour l'indexeur et transmettre la capture directement au lieu de transmettre la demande par proxy via {appName}", "Redirect": "Rediriger", "Reddit": "Reddit", "HomePage": "Page d'accueil", @@ -355,17 +355,17 @@ "UnableToAddANewAppProfilePleaseTryAgain": "Impossible d'ajouter un nouveau profil d'application, veuillez réessayer.", "UnableToLoadAppProfiles": "Impossible de charger les profils d'application", "Add": "Ajouter", - "SyncLevelFull": "Synchronisation complète : Maintiendra les indexeurs de cette application entièrement synchronisés. Les modifications apportées aux indexeurs dans Prowlarr sont ensuite synchronisées avec cette application. Toute modification effectuée sur les indexeurs dans l'application sera annulée par Prowlarr lors de la prochaine synchronisation.", - "SyncLevelAddRemove": "Ajouter et supprimer uniquement : lorsque les indexeurs sont ajoutés ou supprimés de Prowlarr, ils mettront à jour cette application à distance.", + "SyncLevelFull": "Synchronisation complète : Maintiendra les indexeurs de cette application entièrement synchronisés. Les modifications apportées aux indexeurs dans {appName} sont ensuite synchronisées avec cette application. Toute modification effectuée sur les indexeurs dans l'application sera annulée par {appName} lors de la prochaine synchronisation.", + "SyncLevelAddRemove": "Ajouter et supprimer uniquement : lorsque les indexeurs sont ajoutés ou supprimés de {appName}, ils mettront à jour cette application à distance.", "SyncLevel": "Niveau de synchronisation", "FullSync": "Synchronisation complète", "AddRemoveOnly": "Ajouter et supprimer uniquement", - "AddDownloadClientToProwlarr": "L'ajout d'un client de téléchargement permet à Prowlarr d'envoyer des fichers directement depuis l'interface utilisateur tout en effectuant une recherche manuelle.", + "AddDownloadClientToProwlarr": "L'ajout d'un client de téléchargement permet à {appName} d'envoyer des fichers directement depuis l'interface utilisateur tout en effectuant une recherche manuelle.", "NoSearchResultsFound": "Aucun résultat de recherche trouvé, essayez d'effectuer une nouvelle recherche ci-dessous.", "DeleteIndexerProxy": "Supprimer le proxy indexeur", "DeleteIndexerProxyMessageText": "Voulez-vous supprimer le proxy d'indexeur « {name} » ?", "AddIndexerProxy": "Ajouter proxy indexeur", - "AppSettingsSummary": "Applications et paramètres pour configurer comment Prowlarr interagit avec vos programmes PVR", + "AppSettingsSummary": "Applications et paramètres pour configurer comment {appName} interagit avec vos programmes PVR", "IndexerTagsHelpText": "Utilisez des étiquettes pour spécifier les proxies d'indexation ou les applications avec lesquelles l'indexeur est synchronisé.", "Notifications": "Notifications", "IndexerVipCheckExpiredClientMessage": "Les avantages VIP de l'indexeur ont expiré : {0}", @@ -406,7 +406,7 @@ "BookSearch": "Recherche de livres", "OnApplicationUpdate": "Sur la mise à jour de l'application", "OnApplicationUpdateHelpText": "Lors de la mise à jour de l'app", - "IndexerNoDefCheckMessage": "Les indexeurs ne sont pas définis et ne fonctionneront pas :Merci de les retirer et (ou) les ajouter à nouveau à Prowlarr", + "IndexerNoDefCheckMessage": "Les indexeurs ne sont pas définis et ne fonctionneront pas :Merci de les retirer et (ou) les ajouter à nouveau à {appName}", "MovieSearch": "Recherche de films", "TvSearch": "Recherche de séries TV", "Application": "Applications", @@ -461,7 +461,7 @@ "TheLatestVersionIsAlreadyInstalled": "La dernière version de {appName} est déjà installée", "AddCustomFilter": "Ajouter filtre personnalisé", "AddApplication": "Ajouter une application", - "IncludeManualGrabsHelpText": "Inclure les saisies manuelles effectuées dans Prowlarr", + "IncludeManualGrabsHelpText": "Inclure les saisies manuelles effectuées dans {appName}", "OnGrabHelpText": "Récupéré à la sortie", "RssFeed": "Flux RSS", "VipExpiration": "Expiration VIP", @@ -521,7 +521,7 @@ "DeleteSelectedIndexers": "Supprimer les indexeurs sélectionnés", "EditSelectedDownloadClients": "Modifier les clients de téléchargement sélectionnés", "EditSelectedIndexers": "Modifier les indexeurs sélectionnés", - "AreYouSureYouWantToDeleteIndexer": "Voulez-vous supprimer « {name} » de Prowlarr ?", + "AreYouSureYouWantToDeleteIndexer": "Voulez-vous supprimer « {name} » de {appName} ?", "AuthQueries": "Requêtes d’authentification", "CountApplicationsSelected": "{count} application(s) sélectionnée(s)", "CountDownloadClientsSelected": "{count} client(s) de téléchargement sélectionné(s)", @@ -558,7 +558,7 @@ "NoDownloadClientsFound": "Aucun client de téléchargement n'a été trouvé", "AppUpdated": "{appName} mis à jour", "AppUpdatedVersion": "{appName} a été mis à jour vers la version `{version}`, pour profiter des derniers changements, vous devrez relancer {appName}", - "IndexerDownloadClientHelpText": "Préciser quel client de téléchargement est utilisé pour les saisies créées au sein de Prowlarr provenant de cet indexeur", + "IndexerDownloadClientHelpText": "Préciser quel client de téléchargement est utilisé pour les saisies créées au sein de {appName} provenant de cet indexeur", "Implementation": "Mise en œuvre", "SearchCountIndexers": "Rechercher {count} indexeur(s)", "SearchAllIndexers": "Rechercher tous les indexeurs", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index b9fbf3965..42359c955 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -5,7 +5,7 @@ "ConnectionLost": "החיבור אבד", "CouldNotConnectSignalR": "לא ניתן להתחבר ל- SignalR, ממשק המשתמש לא יתעדכן", "Dates": "תאריכים", - "EnableAutomaticSearchHelpText": "ישמש כאשר חיפושים אוטומטיים מבוצעים דרך ממשק המשתמש או על ידי Prowlarr", + "EnableAutomaticSearchHelpText": "ישמש כאשר חיפושים אוטומטיים מבוצעים דרך ממשק המשתמש או על ידי {appName}", "EnableRss": "אפשר RSS", "EnableSSL": "אפשר SSL", "Age": "גיל", @@ -64,7 +64,7 @@ "Type": "סוּג", "UI": "ממשק משתמש", "UILanguage": "שפת ממשק משתמש", - "UILanguageHelpText": "שפה בה Prowlarr ישתמש עבור ממשק המשתמש", + "UILanguageHelpText": "שפה בה {appName} ישתמש עבור ממשק המשתמש", "UILanguageHelpTextWarning": "חובה לטעון דפדפן", "UISettings": "הגדרות ממשק המשתמש", "UnableToAddANewAppProfilePleaseTryAgain": "לא ניתן להוסיף פרופיל איכות חדש, נסה שוב.", @@ -73,7 +73,7 @@ "UnableToLoadUISettings": "לא ניתן לטעון הגדרות ממשק משתמש", "UnsavedChanges": "שינויים שלא נשמרו", "UnselectAll": "בטל את הבחירה בכול", - "BranchUpdate": "ענף לשימוש עדכון Prowlarr", + "BranchUpdate": "ענף לשימוש עדכון {appName}", "BranchUpdateMechanism": "ענף המשמש את מנגנון העדכון החיצוני", "BypassProxyForLocalAddresses": "עקיפת פרוקסי לכתובות מקומיות", "Cancel": "לְבַטֵל", @@ -96,7 +96,7 @@ "Enabled": "מופעל", "Language": "שפה", "LastWriteTime": "זמן כתיבה אחרון", - "LaunchBrowserHelpText": " פתח דפדפן אינטרנט ונווט אל דף הבית של Prowlarr בהתחלת האפליקציה.", + "LaunchBrowserHelpText": " פתח דפדפן אינטרנט ונווט אל דף הבית של {appName} בהתחלת האפליקציה.", "Level": "רָמָה", "LogFiles": "קבצי יומן", "Logging": "רישום", @@ -105,7 +105,7 @@ "Logs": "יומנים", "NoChange": "ללא שינוי", "Analytics": "ניתוח", - "AnalyticsEnabledHelpText": "שלח פרטי שימוש ושגיאה אנונימיים לשרתי Prowlarr. זה כולל מידע בדפדפן שלך, אילו דפי Prowlarr WebUI אתה משתמש, דיווח על שגיאות וכן מערכת הפעלה וגרסת זמן ריצה. אנו נשתמש במידע זה כדי לתעדף תכונות ותיקוני באגים.", + "AnalyticsEnabledHelpText": "שלח פרטי שימוש ושגיאה אנונימיים לשרתי {appName}. זה כולל מידע בדפדפן שלך, אילו דפי {appName} WebUI אתה משתמש, דיווח על שגיאות וכן מערכת הפעלה וגרסת זמן ריצה. אנו נשתמש במידע זה כדי לתעדף תכונות ותיקוני באגים.", "Security": "בִּטָחוֹן", "Ok": "בסדר", "Usenet": "Usenet", @@ -172,10 +172,10 @@ "ProxyPasswordHelpText": "עליך להזין שם משתמש וסיסמה רק אם נדרשים שם. השאר אותם ריקים אחרת.", "ProxyUsernameHelpText": "עליך להזין שם משתמש וסיסמה רק אם נדרשים שם. השאר אותם ריקים אחרת.", "Reddit": "רדיט", - "ReleaseBranchCheckOfficialBranchMessage": "סניף {0} אינו סניף חוקי לשחרור Prowlarr, לא תקבל עדכונים", + "ReleaseBranchCheckOfficialBranchMessage": "סניף {0} אינו סניף חוקי לשחרור {appName}, לא תקבל עדכונים", "ScriptPath": "נתיב סקריפט", "Search": "לחפש", - "UpdateMechanismHelpText": "השתמש במעדכן המובנה של Prowlarr או בסקריפט", + "UpdateMechanismHelpText": "השתמש במעדכן המובנה של {appName} או בסקריפט", "UnableToLoadNotifications": "לא ניתן לטעון התראות", "Add": "הוסף", "Branch": "ענף", @@ -228,7 +228,7 @@ "Size": "גודל", "Sort": "סוג", "Source": "מָקוֹר", - "BackupFolderHelpText": "נתיבים יחסית יהיו תחת ספריית AppData של Prowlarr", + "BackupFolderHelpText": "נתיבים יחסית יהיו תחת ספריית AppData של {appName}", "BackupIntervalHelpText": "מרווח בין גיבויים אוטומטיים", "BackupRetentionHelpText": "גיבויים אוטומטיים ישנים יותר מתקופת השמירה ינוקו אוטומטית", "EnableInteractiveSearch": "אפשר חיפוש אינטראקטיבי", @@ -259,7 +259,7 @@ "Apply": "להגיש מועמדות", "ApplyTags": "החל תגים", "Authentication": "אימות", - "AuthenticationMethodHelpText": "דרוש שם משתמש וסיסמה כדי לגשת ל Prowlarr", + "AuthenticationMethodHelpText": "דרוש שם משתמש וסיסמה כדי לגשת ל {appName}", "Automatic": "אוֹטוֹמָטִי", "AutomaticSearch": "חיפוש אוטומטי", "Backup": "גיבוי", @@ -360,18 +360,18 @@ "BookSearch": "חיפוש ספר", "BookSearchTypes": "סוגי חיפוש ספר", "ClearHistory": "ניקוי היסטוריה", - "ClearHistoryMessageText": "האם לנקות את כל ההיסטוריה של Prowlarr?", + "ClearHistoryMessageText": "האם לנקות את כל ההיסטוריה של {appName}?", "ConnectSettingsSummary": "התראות וסקריפטים", - "AddDownloadClientToProwlarr": "הוספת קליינט להורדות מאפשר ל-Prowlarr לשלוח הפצות מהממשק משתמש בזמן חיפוש ידני.", + "AddDownloadClientToProwlarr": "הוספת קליינט להורדות מאפשר ל-{appName} לשלוח הפצות מהממשק משתמש בזמן חיפוש ידני.", "AppProfileSelectHelpText": "פרופיל אפליקציות נועדו לשליטה ב- RSS, חיפוש אוטומטי והגדרות חיפוש מושהה בעת סינכרון אפליקציה", "AppSettingsSummary": "אפליקציות והגדרות אינטרקציה עם תוכניות PVR", - "AuthenticationRequiredWarning": "בכדי למנוע גישה מרחוק ללא אימות, Prowlarr דורש הגדרת אימות.\nהגדר את הפרטים ושיטת האימות. ישנה אפשרות לדלג על אימות מהרשת הביתית שלך. \nבמידת הצורך יש לפנות אל שו״ת למידע נוסף.", + "AuthenticationRequiredWarning": "בכדי למנוע גישה מרחוק ללא אימות, {appName} דורש הגדרת אימות.\nהגדר את הפרטים ושיטת האימות. ישנה אפשרות לדלג על אימות מהרשת הביתית שלך. \nבמידת הצורך יש לפנות אל שו״ת למידע נוסף.", "AddNewIndexer": "הוספת אינדקסר חדש", "AddSyncProfile": "הוספת פרופיל סינכרון", "EditSyncProfile": "הוספת פרופיל סינכרון", "Notifications": "התראות", "Notification": "התראות", - "TheLatestVersionIsAlreadyInstalled": "הגרסה האחרונה של Prowlarr כבר מותקנת", + "TheLatestVersionIsAlreadyInstalled": "הגרסה האחרונה של {appName} כבר מותקנת", "Remove": "לְהַסִיר", "Replace": "החלף", "AddApplication": "הוספת אפליקציה", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 9e61008df..d667bc4c3 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -6,7 +6,7 @@ "Date": "दिनांक", "Tomorrow": "आने वाला कल", "Apply": "लागू", - "AuthenticationMethodHelpText": "Prowlarr का उपयोग करने के लिए उपयोगकर्ता नाम और पासवर्ड की आवश्यकता है", + "AuthenticationMethodHelpText": "{appName} का उपयोग करने के लिए उपयोगकर्ता नाम और पासवर्ड की आवश्यकता है", "Automatic": "स्वचालित", "Backup": "बैकअप", "Indexers": "indexers", @@ -176,7 +176,7 @@ "YesCancel": "हाँ, रद्द करें", "AllIndexersHiddenDueToFilter": "सभी फिल्में लागू फिल्टर के कारण छिपी हुई हैं।", "Analytics": "एनालिटिक्स", - "AnalyticsEnabledHelpText": "बेनामी उपयोग और त्रुटि जानकारी को Prowlarr के सर्वर पर भेजें। इसमें आपके ब्राउज़र की जानकारी शामिल है, जो आपके द्वारा उपयोग किए जाने वाले रेडर वेबयूआई पृष्ठों, त्रुटि रिपोर्टिंग के साथ-साथ ओएस और रनटाइम संस्करण भी है। हम इस जानकारी का उपयोग सुविधाओं और बग फिक्स को प्राथमिकता देने के लिए करेंगे।", + "AnalyticsEnabledHelpText": "बेनामी उपयोग और त्रुटि जानकारी को {appName} के सर्वर पर भेजें। इसमें आपके ब्राउज़र की जानकारी शामिल है, जो आपके द्वारा उपयोग किए जाने वाले रेडर वेबयूआई पृष्ठों, त्रुटि रिपोर्टिंग के साथ-साथ ओएस और रनटाइम संस्करण भी है। हम इस जानकारी का उपयोग सुविधाओं और बग फिक्स को प्राथमिकता देने के लिए करेंगे।", "TagsHelpText": "कम से कम एक मिलान टैग के साथ फिल्मों पर लागू होता है", "DeleteTagMessageText": "क्या आप वाकई '{0}' टैग हटाना चाहते हैं?", "Disabled": "विकलांग", diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index ad49c12b4..9346fed4f 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -134,7 +134,7 @@ "RemoveFilter": "Ukloni filter", "Restart": "Resetiraj", "RestartNow": "Resetiraj sad", - "RestartProwlarr": "Resetiraj Prowlarr", + "RestartProwlarr": "Resetiraj {appName}", "Save": "Spremi", "SelectAll": "Odaberi sve", "Security": "Sigurnost", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index f82dfd6ab..f74489ced 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -5,14 +5,14 @@ "AddingTag": "Címke hozzáadása", "Error": "Hiba", "DeleteTag": "Címke Törlése", - "EnableAutomaticSearchHelpText": "Akkor kerül felhasználásra, ha az automatikus kereséseket a kezelőfelületen vagy a Prowlarr-on keresztül hajtják végre", + "EnableAutomaticSearchHelpText": "Akkor kerül felhasználásra, ha az automatikus kereséseket a kezelőfelületen vagy a {appName}-on keresztül hajtják végre", "EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést", "Enable": "Aktiválás", "EditIndexer": "Indexer Szerkesztése", "Edit": "Szerkesztés", "DownloadClientStatusCheckSingleClientMessage": "Letöltőkliens hiba miatt nem elérhető: {0}", "DownloadClientStatusCheckAllClientMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt", - "DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a Prowlarr felhasználói felület keresésbe történő integráláshoz", + "DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a {appName} felhasználói felület keresésbe történő integráláshoz", "DownloadClientSettings": "Letöltőkliens Beállítások", "DownloadClients": "Letöltőkliensek", "DownloadClient": "Letöltési Kliens", @@ -50,7 +50,7 @@ "Cancel": "Mégse", "BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez", "BranchUpdateMechanism": "A külső frissítési mechanizmus által használt ágazat", - "BranchUpdate": "Ágazattípus a Prowlarr frissítéseihez", + "BranchUpdate": "Ágazattípus a {appName} frissítéseihez", "Branch": "Ágazat", "BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez", "BindAddress": "Kapcsolási Cím", @@ -59,12 +59,12 @@ "BackupRetentionHelpText": "A megőrzési időnél régebbi automatikus biztonsági másolatok automatikusan törlésre kerülnek", "BackupNow": "Biztonsági Mentés Most", "BackupIntervalHelpText": "Időeltérés a biztonsági mentések között", - "BackupFolderHelpText": "Az elérési útvonalak a Prowlarr AppData könyvtárában lesznek", + "BackupFolderHelpText": "Az elérési útvonalak a {appName} AppData könyvtárában lesznek", "Backup": "Biztonsági Mentés", "AutomaticSearch": "Automatikus keresés", "Automatic": "Automatikus", - "AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a Prowlarr szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely Prowlarr WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.", - "AuthenticationMethodHelpText": "Felhasználónév és Jelszó szükséges a Prowlarr-hoz való hozzáféréshez", + "AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a {appName} szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely {appName} WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.", + "AuthenticationMethodHelpText": "Felhasználónév és Jelszó szükséges a {appName}-hoz való hozzáféréshez", "Authentication": "Hitelesítés", "ApplyTags": "Címkék alkalmazása", "Age": "Kor", @@ -140,7 +140,7 @@ "RestoreBackup": "Biztonsági mentés visszaállítása", "Restore": "Visszaállítás", "RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez", - "RestartProwlarr": "Prowlarr Újraindítása", + "RestartProwlarr": "{appName} Újraindítása", "RestartNow": "Újraindítás Most", "Restart": "Újraindítás", "ResetAPIKey": "API Kulcs visszaállítása", @@ -150,12 +150,12 @@ "RemovedFromTaskQueue": "Eltávolítva a feladatsorról", "Reload": "Újratöltés", "ReleaseStatus": "Kiadás státusza", - "ReleaseBranchCheckOfficialBranchMessage": "A(z) {0} nem érvényes Prowlarr frissítési ágazat, ezért nem kap frissítéseket", + "ReleaseBranchCheckOfficialBranchMessage": "A(z) {0} nem érvényes {appName} frissítési ágazat, ezért nem kap frissítéseket", "RefreshMovie": "Film frissítése", "Refresh": "Frissítés", "ReadTheWikiForMoreInformation": "Olvasd el a Wiki-t további információkért", - "ProwlarrSupportsAnyIndexer": "A Prowlarr számos indexert támogat, minden olyan indexelő mellett, amely a Newznab / Torznab szabványt használja, valamint a 'Generic Newznab' (usenethez) vagy a 'Generic Torznab' (torrentekhez) használatával. Keresés és az alább felsorolt indexelők kiválasztása.", - "ProwlarrSupportsAnyDownloadClient": "A Prowlarr minden olyan letöltési klienst támogat, amely a Newznab szabványt használja, valamint az alább felsorolt letöltési klienseket.", + "ProwlarrSupportsAnyIndexer": "A {appName} számos indexert támogat, minden olyan indexelő mellett, amely a Newznab / Torznab szabványt használja, valamint a 'Generic Newznab' (usenethez) vagy a 'Generic Torznab' (torrentekhez) használatával. Keresés és az alább felsorolt indexelők kiválasztása.", + "ProwlarrSupportsAnyDownloadClient": "A {appName} minden olyan letöltési klienst támogat, amely a Newznab szabványt használja, valamint az alább felsorolt letöltési klienseket.", "Queue": "Várakozási sor", "ProxyUsernameHelpText": "Csak akkor kell megadnod felhasználónevet és jelszót, ha szükséges. Egyébként hagyd üresen.", "ProxyType": "Proxy Típusa", @@ -208,7 +208,7 @@ "Logging": "Loggolás", "LogFiles": "Log Fájlok", "Level": "Szint", - "LaunchBrowserHelpText": " Nyisson meg egy böngészőt, és az alkalmazás indításakor lépjen a Prowlarr kezdőlapjára.", + "LaunchBrowserHelpText": " Nyisson meg egy böngészőt, és az alkalmazás indításakor lépjen a {appName} kezdőlapjára.", "LastWriteTime": "Utolsó írási idő", "Language": "Nyelv", "KeyboardShortcuts": "Gyorsbillentyűk", @@ -231,7 +231,7 @@ "UISettingsSummary": "Dátum-, nyelv- és színtévesztő lehetőségek", "UISettings": "A felhasználói felület beállításai", "UILanguageHelpTextWarning": "Böngésző újratöltése szükséges", - "UILanguageHelpText": "A Prowlarr által a felhasználói felülethez használt nyelv", + "UILanguageHelpText": "A {appName} által a felhasználói felülethez használt nyelv", "UILanguage": "Felület nyelve", "UI": "Felület", "Type": "Típus", @@ -270,7 +270,7 @@ "Uptime": "Üzemidő", "UpdateScriptPathHelpText": "Keresse meg az egyéni parancsfájl elérési útját, amely kibontott frissítési csomagot vesz fel, és kezeli a frissítési folyamat fennmaradó részét", "Updates": "Frissítések", - "UpdateMechanismHelpText": "Használja a Prowlarr beépített frissítőjét vagy egy szkriptet", + "UpdateMechanismHelpText": "Használja a {appName} beépített frissítőjét vagy egy szkriptet", "UpdateCheckUINotWritableMessage": "Nem lehet telepíteni a frissítést, mert a(z) „{0}” felhasználói felület mappát nem írhatja a „{1}” felhasználó.", "UpdateCheckStartupTranslocationMessage": "Nem lehet telepíteni a frissítést, mert a (z) „{0}” indítási mappa az Alkalmazások Transzlokációs mappájában található.", "UpdateCheckStartupNotWritableMessage": "A frissítés nem telepíthető, mert a (z) „{0}” indítási mappát a „{1}” felhasználó nem írhatja.", @@ -295,7 +295,7 @@ "Today": "Ma", "TestAllApps": "Összes alkalmazás tesztelése", "SyncAppIndexers": "Szinkronizálja az alkalmazás indexelőket", - "SettingsSqlLoggingHelpText": "Naplózza az összes SQL-lekérdezést a Prowlarr-ból", + "SettingsSqlLoggingHelpText": "Naplózza az összes SQL-lekérdezést a {appName}-ból", "SettingsLogRotateHelpText": "A naplók mappába mentett naplófájlok maximális száma", "SettingsLogRotate": "Napló forgatása", "SettingsIndexerLoggingHelpText": "További Indexelő adatok naplózása a válaszokkal együtt", @@ -305,13 +305,13 @@ "SettingsConsoleLogLevel": "Konzol naplószint", "SearchIndexers": "Indexelők keresése", "IndexerQuery": "Indexelő lekérdezés", - "IndexerHealthCheckNoIndexers": "Nincs engedélyezve indexelő, a Prowlarr nem ad vissza keresési eredményeket", + "IndexerHealthCheckNoIndexers": "Nincs engedélyezve indexelő, a {appName} nem ad vissza keresési eredményeket", "EnableIndexer": "Indexelő engedélyezése", - "IndexerObsoleteCheckMessage": "Az indexelők elavultak vagy frissültek: {0}. Kérjük, távolítsa el és (vagy) add újra a hozzá a Prowlarr-ba", + "IndexerObsoleteCheckMessage": "Az indexelők elavultak vagy frissültek: {0}. Kérjük, távolítsa el és (vagy) add újra a hozzá a {appName}-ba", "DevelopmentSettings": "Fejlesztési beállítások", "DeleteApplicationMessageText": "Biztosan törli a(z) „{0}” alkalmazást?", "DeleteApplication": "Alkalmazás törlése", - "ClearHistoryMessageText": "Biztosan törlöd a Prowlarr összes előzményét?", + "ClearHistoryMessageText": "Biztosan törlöd a {appName} összes előzményét?", "ClearHistory": "Előzmények törlése", "ApplicationStatusCheckSingleClientMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}", "ApplicationStatusCheckAllClientMessage": "Összes alkalmazás elérhetetlen hiba miatt", @@ -323,7 +323,7 @@ "EnableRss": "RSS Engedélyezése", "Wiki": "Wiki", "RSS": "RSS", - "RedirectHelpText": "Átirányítja a bejövő letöltési kérelmet az indexelő számára, és közvetlenül adja át a fájlt ahelyett, hogy a kérést a Prowlarr-en keresztül proxyba tenné", + "RedirectHelpText": "Átirányítja a bejövő letöltési kérelmet az indexelő számára, és közvetlenül adja át a fájlt ahelyett, hogy a kérést a {appName}-en keresztül proxyba tenné", "Redirect": "Átirányítás", "Reddit": "Reddit", "HomePage": "Kezdőlap", @@ -354,15 +354,15 @@ "Stats": "Statisztikák", "Torrent": "Torrent", "UnableToLoadAppProfiles": "Nem sikerült betölteni az alkalmazásprofilokat", - "SyncLevelFull": "Teljes szinkronizálás: Az alkalmazás indexereit teljesen szinkronban tartja. A Prowlarr indexerein végrehajtott módosítások ezután szinkronizálódnak ezzel az alkalmazással. A Prowlarr a következő szinkronizáláskor felülírja az indexerekben távolról végrehajtott módosításokat.", - "SyncLevelAddRemove": "Hozzáadás és eltávolítás: Ha indexereket ad hozzá vagy távolít el a Prowlarr-ból, az frissíti ezt a távoli alkalmazást.", + "SyncLevelFull": "Teljes szinkronizálás: Az alkalmazás indexereit teljesen szinkronban tartja. A {appName} indexerein végrehajtott módosítások ezután szinkronizálódnak ezzel az alkalmazással. A {appName} a következő szinkronizáláskor felülírja az indexerekben távolról végrehajtott módosításokat.", + "SyncLevelAddRemove": "Hozzáadás és eltávolítás: Ha indexereket ad hozzá vagy távolít el a {appName}-ból, az frissíti ezt a távoli alkalmazást.", "SyncLevel": "Szinkronizálás Szintje", "FullSync": "Teljes Szinkron", "AddRemoveOnly": "Csak hozzáadás és eltávolítás", - "AddDownloadClientToProwlarr": "Letöltőkliens hozzáadásával a Prowlarr kézi keresés közben közvetlenül a felhasználói felületről küldhet kiadásokat.", + "AddDownloadClientToProwlarr": "Letöltőkliens hozzáadásával a {appName} kézi keresés közben közvetlenül a felhasználói felületről küldhet kiadásokat.", "Add": "Hozzáadás", "NoSearchResultsFound": "Nincs találat. Próbálkozzon új kereséssel.", - "AppSettingsSummary": "Alkalmazások és beállítások a Prowlarr interakciójának beállításához a PVR programjaiddal", + "AppSettingsSummary": "Alkalmazások és beállítások a {appName} interakciójának beállításához a PVR programjaiddal", "DeleteIndexerProxy": "Indexer Proxy törlése", "DeleteIndexerProxyMessageText": "Biztosan törlöd a(z) „{0}” proxyt?", "IndexerProxies": "Indexer Proxy(k)", @@ -393,7 +393,7 @@ "HistoryCleanupDaysHelpTextWarning": "A kiválasztott napszámnál régebbi előzmények automatikusan törlődnek", "IndexerAlreadySetup": "Az indexelő legalább egy példánya már be van állítva", "IndexerInfo": "Indexer információ", - "IndexerNoDefCheckMessage": "Az indexereknek nincs definíciójuk, és nem működnek: {0}. Kérjük, távolítsa el és (vagy) adja hozzá újra a Prowlarrhoz", + "IndexerNoDefCheckMessage": "Az indexereknek nincs definíciójuk, és nem működnek: {0}. Kérjük, távolítsa el és (vagy) adja hozzá újra a {appName}hoz", "MassEditor": "Tömeges szerkesztő", "OnApplicationUpdate": "Alkalmazásfrissítésről", "OnApplicationUpdateHelpText": "Alkalmazásfrissítésről", @@ -455,8 +455,8 @@ "DownloadClientCategory": "Letöltési kliens kategória", "AuthenticationRequired": "Azonosítás szükséges", "AuthenticationRequiredHelpText": "Módosítsd, hogy mely kérésekhez van szükség hitelesítésre. Ne változtasson, hacsak nem érti a kockázatokat.", - "AuthenticationRequiredWarning": "A hitelesítés nélküli távoli hozzáférés megakadályozása érdekében a Prowlarrnak mostantól engedélyezni kell a hitelesítést. Konfigurálja a hitelesítési módszert és a hitelesítési adatokat. Opcionálisan letilthatja a helyi címekről történő hitelesítést. További információkért tekintsd meg a GYIK-et.", - "TheLatestVersionIsAlreadyInstalled": "A Prowlarr legújabb verziója már telepítva van", + "AuthenticationRequiredWarning": "A hitelesítés nélküli távoli hozzáférés megakadályozása érdekében a {appName}nak mostantól engedélyezni kell a hitelesítést. Konfigurálja a hitelesítési módszert és a hitelesítési adatokat. Opcionálisan letilthatja a helyi címekről történő hitelesítést. További információkért tekintsd meg a GYIK-et.", + "TheLatestVersionIsAlreadyInstalled": "A {appName} legújabb verziója már telepítva van", "Remove": "Eltávolítás", "Replace": "Kicserél", "ApplicationURL": "Alkalmazás URL", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index a653bdb88..466f05f75 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -1,7 +1,7 @@ { "Add": "Bæta við", "BindAddress": "Bind heimilisfang", - "BranchUpdate": "Útibú til að nota til að uppfæra Prowlarr", + "BranchUpdate": "Útibú til að nota til að uppfæra {appName}", "Logs": "Logs", "Usenet": "Usenet", "Logging": "Skógarhögg", @@ -73,7 +73,7 @@ "UseProxy": "Notaðu Proxy", "Username": "Notendanafn", "Version": "Útgáfa", - "LaunchBrowserHelpText": " Opnaðu vafra og farðu á Prowlarr heimasíðuna þegar forritið byrjar.", + "LaunchBrowserHelpText": " Opnaðu vafra og farðu á {appName} heimasíðuna þegar forritið byrjar.", "Level": "Stig", "Mechanism": "Mekanismi", "Message": "Skilaboð", @@ -111,7 +111,7 @@ "ReadTheWikiForMoreInformation": "Lestu Wiki fyrir frekari upplýsingar", "Refresh": "Hressa", "RefreshMovie": "Hressa kvikmynd", - "ReleaseBranchCheckOfficialBranchMessage": "Útibú {0} er ekki gild útibú frá Prowlarr, þú færð ekki uppfærslur", + "ReleaseBranchCheckOfficialBranchMessage": "Útibú {0} er ekki gild útibú frá {appName}, þú færð ekki uppfærslur", "Reload": "Endurhlaða", "ResetAPIKey": "Endurstilla API lykil", "Restart": "Endurræsa", @@ -120,7 +120,7 @@ "SetTags": "Settu merki", "Settings": "Stillingar", "SettingsEnableColorImpairedMode": "Virkja litaskerta ham", - "UILanguageHelpText": "Tungumál sem Prowlarr mun nota fyrir HÍ", + "UILanguageHelpText": "Tungumál sem {appName} mun nota fyrir HÍ", "UILanguageHelpTextWarning": "Endurhlaða vafra krafist", "UISettings": "Stillingar HÍ", "UnableToLoadTags": "Ekki er hægt að hlaða merkin", @@ -130,7 +130,7 @@ "UpdateCheckStartupNotWritableMessage": "Ekki er hægt að setja uppfærslu þar sem ræsimappan '{0}' er ekki skrifanleg af notandanum '{1}'.", "UpdateCheckStartupTranslocationMessage": "Ekki er hægt að setja uppfærslu vegna þess að ræsimappan '{0}' er í forritunarmöppu forrits.", "UpdateCheckUINotWritableMessage": "Ekki er hægt að setja uppfærslu vegna þess að notendamöppan '{0}' er ekki skrifuð af notandanum '{1}'.", - "UpdateMechanismHelpText": "Notaðu innbyggða uppfærslu Prowlarr eða handrit", + "UpdateMechanismHelpText": "Notaðu innbyggða uppfærslu {appName} eða handrit", "Updates": "Uppfærslur", "UpdateScriptPathHelpText": "Leið að sérsniðnu handriti sem tekur útdreginn uppfærslupakka og annast afganginn af uppfærsluferlinu", "URLBase": "Vefslóðagrunnur", @@ -174,7 +174,7 @@ "All": "Allt", "AllIndexersHiddenDueToFilter": "Allar kvikmyndir eru faldar vegna beittrar síu.", "Analytics": "Greiningar", - "AnalyticsEnabledHelpText": "Sendu nafnlausar upplýsingar um notkun og villur á netþjóna Prowlarr. Þetta felur í sér upplýsingar í vafranum þínum, hvaða Prowlarr WebUI síður þú notar, villuskýrslur sem og stýrikerfi og keyrsluútgáfu. Við munum nota þessar upplýsingar til að forgangsraða eiginleikum og villuleiðréttingum.", + "AnalyticsEnabledHelpText": "Sendu nafnlausar upplýsingar um notkun og villur á netþjóna {appName}. Þetta felur í sér upplýsingar í vafranum þínum, hvaða {appName} WebUI síður þú notar, villuskýrslur sem og stýrikerfi og keyrsluútgáfu. Við munum nota þessar upplýsingar til að forgangsraða eiginleikum og villuleiðréttingum.", "ApiKey": "API lykill", "AppDataDirectory": "AppData skrá", "AppDataLocationHealthCheckMessage": "Uppfærsla verður ekki möguleg til að koma í veg fyrir að AppData sé eytt við uppfærslu", @@ -183,7 +183,7 @@ "Apply": "Sækja um", "ApplyTags": "Notaðu merki", "Authentication": "Auðkenning", - "AuthenticationMethodHelpText": "Krefjast notandanafns og lykilorðs til að fá aðgang að Prowlarr", + "AuthenticationMethodHelpText": "Krefjast notandanafns og lykilorðs til að fá aðgang að {appName}", "Automatic": "Sjálfskiptur", "AutomaticSearch": "Sjálfvirk leit", "BackupIntervalHelpText": "Bil milli sjálfvirkra afrita", @@ -216,7 +216,7 @@ "EditIndexer": "Breyttu Indexer", "Enable": "Virkja", "EnableAutomaticSearch": "Virkja sjálfvirka leit", - "EnableAutomaticSearchHelpText": "Verður notað þegar sjálfvirkar leitir eru framkvæmdar í HÍ eða af Prowlarr", + "EnableAutomaticSearchHelpText": "Verður notað þegar sjálfvirkar leitir eru framkvæmdar í HÍ eða af {appName}", "Filter": "Sía", "Fixed": "Fastur", "HealthNoIssues": "Engin vandamál með stillingar þínar", @@ -249,7 +249,7 @@ "UnableToAddANewIndexerPleaseTryAgain": "Ekki er hægt að bæta við nýjum flokkara, reyndu aftur.", "UnableToAddANewIndexerProxyPleaseTryAgain": "Ekki er hægt að bæta við nýjum flokkara, reyndu aftur.", "UnableToAddANewNotificationPleaseTryAgain": "Ekki er hægt að bæta við nýrri tilkynningu. Reyndu aftur.", - "BackupFolderHelpText": "Hlutfallslegir slóðir verða undir AppData skránni hjá Prowlarr", + "BackupFolderHelpText": "Hlutfallslegir slóðir verða undir AppData skránni hjá {appName}", "BranchUpdateMechanism": "Útibú notað af ytri uppfærslu", "BypassProxyForLocalAddresses": "Hliðarbraut umboðsmanns fyrir heimilisfang", "Cancel": "Hætta við", @@ -329,7 +329,7 @@ "NextExecution": "Næsta framkvæmd", "Remove": "Fjarlægðu", "Replace": "Skipta um", - "TheLatestVersionIsAlreadyInstalled": "Nýjasta útgáfan af Prowlarr er þegar uppsett", + "TheLatestVersionIsAlreadyInstalled": "Nýjasta útgáfan af {appName} er þegar uppsett", "ApplyTagsHelpTextAdd": "Bæta við: Bættu merkjum við núverandi lista yfir merki", "ApplyTagsHelpTextHowToApplyApplications": "Hvernig á að setja merki á völdu kvikmyndirnar", "ApplyTagsHelpTextHowToApplyIndexers": "Hvernig á að setja merki á völdu kvikmyndirnar", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index baea94757..91902561c 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -6,7 +6,7 @@ "SetTags": "Imposta Etichette", "SelectAll": "Seleziona Tutto", "Scheduled": "Programmato", - "ReleaseBranchCheckOfficialBranchMessage": "La versione {0} non è una versione valida per le release di Prowlarr, non riceverai aggiornamenti", + "ReleaseBranchCheckOfficialBranchMessage": "La versione {0} non è una versione valida per le release di {appName}, non riceverai aggiornamenti", "ProxyCheckResolveIpMessage": "Impossibile risolvere l'indirizzo IP per l'Host Configurato del Proxy {0}", "NoChanges": "Nessuna Modifica", "NoChange": "Nessuna Modifica", @@ -67,7 +67,7 @@ "Edit": "Modifica", "DownloadClientStatusCheckSingleClientMessage": "Client per il download non disponibili per errori: {0}", "DownloadClientStatusCheckAllClientMessage": "Nessun client di download è disponibile a causa di errori", - "DownloadClientsSettingsSummary": "Configurazione dei client di download per l'integrazione nella ricerca di Prowlarr", + "DownloadClientsSettingsSummary": "Configurazione dei client di download per l'integrazione nella ricerca di {appName}", "DownloadClients": "Clients di Download", "DownloadClient": "Client di Download", "Details": "Dettagli", @@ -97,15 +97,15 @@ "Backups": "Backups", "BackupRetentionHelpText": "I backup automatici più vecchi del periodo di conservazione verranno eliminati automaticamente", "BackupIntervalHelpText": "Intervallo tra i backup automatici", - "BackupFolderHelpText": "I percorsi relativi saranno nella cartella AppData di Prowlarr", + "BackupFolderHelpText": "I percorsi relativi saranno nella cartella AppData di {appName}", "Automatic": "Automatico", - "AuthenticationMethodHelpText": "Richiedi Nome Utente e Password per accedere a Prowlarr", + "AuthenticationMethodHelpText": "Richiedi Nome Utente e Password per accedere a {appName}", "Authentication": "Autenticazione", "ApplyTags": "Applica Etichette", "Apply": "Applica", "AppDataDirectory": "Cartella AppData", "ApiKey": "Chiave API", - "AnalyticsEnabledHelpText": "Invia informazioni anonime sull'uso e sugli errori ai server di Prowlarr. Questo include informazioni sul tuo browser, quali pagine della WebUI di Prowlarr utilizzi, la segnalazione di errori così come il sistema operativo e la versione di runtime. Useremo queste informazioni per dare priorità alle funzionalità e alle correzioni dei bug.", + "AnalyticsEnabledHelpText": "Invia informazioni anonime sull'uso e sugli errori ai server di {appName}. Questo include informazioni sul tuo browser, quali pagine della WebUI di {appName} utilizzi, la segnalazione di errori così come il sistema operativo e la versione di runtime. Useremo queste informazioni per dare priorità alle funzionalità e alle correzioni dei bug.", "Warn": "Attenzione", "Type": "Tipo", "Title": "Titolo", @@ -147,7 +147,7 @@ "DeleteBackupMessageText": "Sei sicuro di voler cancellare il backup '{0}'?", "CancelPendingTask": "Sei sicuro di voler cancellare questa operazione in sospeso?", "BranchUpdateMechanism": "Ramo utilizzato dal sistema di aggiornamento esterno", - "BranchUpdate": "Ramo da usare per aggiornare Prowlarr", + "BranchUpdate": "Ramo da usare per aggiornare {appName}", "AddingTag": "Aggiungendo etichetta", "Password": "Password", "OnHealthIssueHelpText": "Quando c'è un problema", @@ -167,7 +167,7 @@ "Result": "Risultato", "Restore": "Ripristina", "RestartRequiredHelpTextWarning": "Richiede il riavvio per avere effetto", - "RestartProwlarr": "Riavvia Prowlarr", + "RestartProwlarr": "Riavvia {appName}", "RestartNow": "Riavvia adesso", "ResetAPIKey": "Resetta la Chiave API", "Reset": "Resetta", @@ -176,8 +176,8 @@ "RemovedFromTaskQueue": "Rimosso dalla coda lavori", "RefreshMovie": "Aggiorna il Film", "ReadTheWikiForMoreInformation": "Leggi la Wiki per maggiori informazioni", - "ProwlarrSupportsAnyIndexer": "Prowlarr supporta molti indicizzatori oltre a qualsiasi indicizzatore che utilizza lo standard Newznab/Torznab utilizzando \"Generic Newznab\" (per usenet) o \"Generic Torznab\" (per torrent). Cerca e seleziona il tuo indicizzatore da qua sotto.", - "ProwlarrSupportsAnyDownloadClient": "Prowlarr supporta qualunque client di download elencato sotto.", + "ProwlarrSupportsAnyIndexer": "{appName} supporta molti indicizzatori oltre a qualsiasi indicizzatore che utilizza lo standard Newznab/Torznab utilizzando \"Generic Newznab\" (per usenet) o \"Generic Torznab\" (per torrent). Cerca e seleziona il tuo indicizzatore da qua sotto.", + "ProwlarrSupportsAnyDownloadClient": "{appName} supporta qualunque client di download elencato sotto.", "ProxyUsernameHelpText": "Devi inserire nome utente e password solo se richiesto. Altrimenti lascia vuoto.", "ProxyType": "Tipo di Proxy", "ProxyPasswordHelpText": "Devi inserire nome utente e password solo se richiesto. Altrimenti lascia vuoto.", @@ -202,7 +202,7 @@ "MaintenanceRelease": "Release di Manutenzione: correzione di bug e altri miglioramenti. Vedi la storia dei Commit su Github per maggiori dettagli", "LogLevelTraceHelpTextWarning": "Il Trace Log dovrebbe essere abilitato solo temporaneamente", "LogLevel": "Livello di Log", - "LaunchBrowserHelpText": " Apri un browser e vai all'homepage di Prowlarr all'avvio dell'app.", + "LaunchBrowserHelpText": " Apri un browser e vai all'homepage di {appName} all'avvio dell'app.", "Interval": "Intervallo", "IncludeHealthWarningsHelpText": "Includi gli avvisi di salute", "IllRestartLater": "Riavvierò più tardi", @@ -217,7 +217,7 @@ "EnableSslHelpText": " Richiede il riavvio come amministratore per avere effetto", "EnableInteractiveSearchHelpText": "Verrà usato durante la ricerca interattiva", "EnableInteractiveSearch": "Abilita la Ricerca Interattiva", - "EnableAutomaticSearchHelpText": "Sarà usata quando la ricerca automatica è eseguita dalla l'intrfaccia o da Prowlarr", + "EnableAutomaticSearchHelpText": "Sarà usata quando la ricerca automatica è eseguita dalla l'intrfaccia o da {appName}", "EnableAutomaticSearch": "Attiva la Ricerca Automatica", "DeleteTagMessageText": "Sei sicuro di voler eliminare l'etichetta '{0}'?", "DeleteNotificationMessageText": "Sei sicuro di voler eliminare la notifica '{0}'?", @@ -232,7 +232,7 @@ "UrlBaseHelpText": "Per il supporto al reverse proxy, di default è vuoto", "URLBase": "Base Url", "UpdateScriptPathHelpText": "Percorso verso uno script personalizzato che prende un pacchetto di aggiornamento estratto e gestisce il resto del processo di aggiornamento", - "UpdateMechanismHelpText": "Usa l'aggiornamento integrato in Prowlarr o uno script", + "UpdateMechanismHelpText": "Usa l'aggiornamento integrato in {appName} o uno script", "UpdateAutomaticallyHelpText": "Scarica e installa automaticamente gli aggiornamenti. Sarai comunque in grado in installarli da Sistema: Aggiornamenti", "UnsavedChanges": "Modifiche non salvate", "UnableToLoadUISettings": "Impossibile caricare le impostazioni interfaccia", @@ -247,7 +247,7 @@ "UnableToAddANewDownloadClientPleaseTryAgain": "Impossibile aggiungere un nuovo client di download, riprova.", "UISettings": "Impostazioni Interfaccia", "UILanguageHelpTextWarning": "Ricaricamento del browser richiesto", - "UILanguageHelpText": "Lingua che Prowlarr userà per l'interfaccia", + "UILanguageHelpText": "Lingua che {appName} userà per l'interfaccia", "UILanguage": "Lingua dell'Interfaccia", "Torrents": "Torrents", "TestAllClients": "Testa tutti i client", @@ -296,13 +296,13 @@ "AddDownloadClient": "Aggiungi Downloader", "Category": "Categoria", "ClearHistory": "Cancella cronologia", - "ClearHistoryMessageText": "Sei sicuro di voler cancellare tutta la cronologia di Prowlarr?", + "ClearHistoryMessageText": "Sei sicuro di voler cancellare tutta la cronologia di {appName}?", "Discord": "Discord", "Donations": "Donazioni", "EnableRssHelpText": "Abilita feed RSS per l'Indicizzatore", "HomePage": "Pagina Iniziale", "Id": "Id", - "IndexerHealthCheckNoIndexers": "Nessun Indicizzatore abilitato, Prowlarr non restituirà risultati di ricerca", + "IndexerHealthCheckNoIndexers": "Nessun Indicizzatore abilitato, {appName} non restituirà risultati di ricerca", "EnableRss": "Abilita RSS", "NoLinks": "Nessun Collegamento", "RSS": "RSS", @@ -357,15 +357,15 @@ "Database": "Database", "DeleteIndexerProxy": "Cancella il Proxy dell'Indicizzatore", "Auth": "Auth", - "AddDownloadClientToProwlarr": "L'aggiunta di un client di download permette a Prowlarr di inviare le release direttamente dall'interfaccia mentre si fa una ricerca manuale.", + "AddDownloadClientToProwlarr": "L'aggiunta di un client di download permette a {appName} di inviare le release direttamente dall'interfaccia mentre si fa una ricerca manuale.", "Applications": "Applicazioni", "AppProfileInUse": "Profilo App in Uso", "Application": "Applicazione", "BookSearchTypes": "Tipi di Ricerca Libri", - "AppSettingsSummary": "Applicazioni e impostazioni per configurare come Prowlarr interagisce con i tuoi programmi PVR", + "AppSettingsSummary": "Applicazioni e impostazioni per configurare come {appName} interagisce con i tuoi programmi PVR", "Apps": "Le App", "DevelopmentSettings": "Impostazioni di Sviluppo", - "RedirectHelpText": "Reindirizza le richieste di download per l'Indicizzatore e passa il prelievo direttamente invece di inoltrare la richiesta tramite Prowlarr", + "RedirectHelpText": "Reindirizza le richieste di download per l'Indicizzatore e passa il prelievo direttamente invece di inoltrare la richiesta tramite {appName}", "IndexerVipCheckExpiredClientMessage": "I benefici VIP dell'Indicizzatore sono scaduti: {0}", "IndexerVipCheckExpiringClientMessage": "I benefici VIP dell'Indicizzatore scadranno a breve: {0}", "IndexerProxies": "Proxy degli Indicizzatori", @@ -386,7 +386,7 @@ "IndexerDetails": "Dettagli dell'Indicizzatore", "IndexerInfo": "Info sull'Indicizzatore", "IndexerName": "Nome dell'Indicizzatore", - "IndexerNoDefCheckMessage": "Gli indicizzatori non hanno una definizione e non funzioneranno: {0}. Si prega di rimuoverli e/o di riaggiungerli a Prowlarr", + "IndexerNoDefCheckMessage": "Gli indicizzatori non hanno una definizione e non funzioneranno: {0}. Si prega di rimuoverli e/o di riaggiungerli a {appName}", "HistoryCleanup": "Pulizia della Cronologia", "IndexerRss": "RSS dell'Indicizzatore", "IndexerSite": "Sito dell'Indicizzatore", @@ -418,15 +418,15 @@ "Url": "Url", "NoSearchResultsFound": "Nessun risultato di ricerca trovato, prova a eseguire una nuova ricerca qui sotto.", "SettingsConsoleLogLevel": "Livello di Log della Console", - "IndexerObsoleteCheckMessage": "Gli indicizzatori sono obsoleti e sono stati aggiornati: {0}. Si prega di rimuoverli e/o di riaggiungerli a Prowlarr", + "IndexerObsoleteCheckMessage": "Gli indicizzatori sono obsoleti e sono stati aggiornati: {0}. Si prega di rimuoverli e/o di riaggiungerli a {appName}", "IndexerQuery": "Query dell'Indicizzatore", "IndexerSettingsSummary": "Configura varie impostazioni globali degli Indicizzatori, anche i Proxy.", "Query": "Query", "SearchCapabilities": "Capacità di Ricerca", "SettingsIndexerLoggingHelpText": "Logga i dati aggiuntivi dell'indicizzatore includendo la risposta", - "SettingsSqlLoggingHelpText": "Scrivi a log tutte le query SQL di Prowlarr", - "SyncLevelAddRemove": "Solo aggiunte e rimozioni: Quando gli indicizzatori vengono aggiunti o rimossi da Prowlarr, verrà aggiornata questa applicazione remota.", - "SyncLevelFull": "Sincronizzazione completa: Mantiene gli indicizzatori dell'app completamente sincronizzati. Le modifiche apportate agli indicizzatori in Prowlarr sono sincronizzate in questa app. Qualsiasi cambiamento fatto agli indicizzatori da remoto all'interno di questa applicazione verrà sovrascritto da Prowlarr alla prossima sincronizzazione.", + "SettingsSqlLoggingHelpText": "Scrivi a log tutte le query SQL di {appName}", + "SyncLevelAddRemove": "Solo aggiunte e rimozioni: Quando gli indicizzatori vengono aggiunti o rimossi da {appName}, verrà aggiornata questa applicazione remota.", + "SyncLevelFull": "Sincronizzazione completa: Mantiene gli indicizzatori dell'app completamente sincronizzati. Le modifiche apportate agli indicizzatori in {appName} sono sincronizzate in questa app. Qualsiasi cambiamento fatto agli indicizzatori da remoto all'interno di questa applicazione verrà sovrascritto da {appName} alla prossima sincronizzazione.", "MinimumSeedersHelpText": "Seeder minimi richiesti dall'Applicazione per far sì che l'indicizzatore li prenda", "SyncProfile": "Profilo Sincronizzazione", "SyncProfiles": "Profili di sincronizzazione", @@ -452,13 +452,13 @@ "AreYouSureYouWantToDeleteCategory": "Vuoi davvero cancellare la categoria mappata?", "AuthenticationRequired": "Autenticazione richiesta", "AuthenticationRequiredHelpText": "Cambia a quali richieste l'autenticazione verrà richiesta. Non cambiare se non comprendi i rischi.", - "AuthenticationRequiredWarning": "Per impedire accessi remoti senza autenticazione, Prowlarr ora richiede che l'autenticazione venga attivata. Puoi disattivare l'autenticazione per indirizzi privati.", + "AuthenticationRequiredWarning": "Per impedire accessi remoti senza autenticazione, {appName} ora richiede che l'autenticazione venga attivata. Puoi disattivare l'autenticazione per indirizzi privati.", "DeleteClientCategory": "Cancella categoria del client di download", "DownloadClientCategory": "Categoria client di download", "MappedCategories": "Categorie mappate", "Remove": "Rimuovi", "Replace": "Sostituire", - "TheLatestVersionIsAlreadyInstalled": "L'ultima versione di Prowlarr è già installata", + "TheLatestVersionIsAlreadyInstalled": "L'ultima versione di {appName} è già installata", "ApplicationURL": "URL Applicazione", "ApplicationUrlHelpText": "L'URL esterno di questa applicazione, incluso http(s)://, porta e URL base", "Episode": "Episodio", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index ba69d6b15..448d15e90 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -42,7 +42,7 @@ "UnableToAddANewApplicationPleaseTryAgain": "新しい通知を追加できません。もう一度やり直してください。", "UnableToLoadNotifications": "通知を読み込めません", "UpdateCheckStartupNotWritableMessage": "スタートアップフォルダ「{0}」はユーザー「{1}」によって書き込み可能ではないため、更新をインストールできません。", - "UpdateMechanismHelpText": "Prowlarrの組み込みアップデーターまたはスクリプトを使用する", + "UpdateMechanismHelpText": "{appName}の組み込みアップデーターまたはスクリプトを使用する", "Wiki": "ウィキ", "Yesterday": "昨日", "Type": "タイプ", @@ -107,7 +107,7 @@ "Uptime": "稼働時間", "Username": "ユーザー名", "AddDownloadClient": "ダウンロードクライアントの追加", - "BackupFolderHelpText": "相対パスはProwlarrのAppDataディレクトリの下にあります", + "BackupFolderHelpText": "相対パスは{appName}のAppDataディレクトリの下にあります", "DownloadClient": "クライアントのダウンロード", "DownloadClientStatusCheckSingleClientMessage": "失敗のためにダウンロードできないクライアント:{0}", "Restore": "戻す", @@ -118,7 +118,7 @@ "MoreInfo": "より詳しい情報", "Usenet": "Usenet", "Authentication": "認証", - "AuthenticationMethodHelpText": "Prowlarrにアクセスするにはユーザー名とパスワードが必要です", + "AuthenticationMethodHelpText": "{appName}にアクセスするにはユーザー名とパスワードが必要です", "Automatic": "自動", "BackupIntervalHelpText": "自動バックアップの間隔", "BackupNow": "今すぐバックアップ", @@ -177,7 +177,7 @@ "ProxyPasswordHelpText": "ユーザー名とパスワードが必要な場合にのみ入力する必要があります。それ以外の場合は空白のままにします。", "ProxyType": "プロキシタイプ", "RefreshMovie": "映画を更新する", - "ReleaseBranchCheckOfficialBranchMessage": "ブランチ{0}は有効なProwlarrリリースブランチではありません。更新を受け取りません。", + "ReleaseBranchCheckOfficialBranchMessage": "ブランチ{0}は有効な{appName}リリースブランチではありません。更新を受け取りません。", "ResetAPIKey": "APIキーをリセット", "RestartNow": "今すぐ再起動", "Result": "結果", @@ -200,7 +200,7 @@ "TestAllClients": "すべてのクライアントをテストする", "Torrents": "トレント", "UILanguage": "UI言語", - "UILanguageHelpText": "ProwlarrがUIに使用する言語", + "UILanguageHelpText": "{appName}がUIに使用する言語", "UILanguageHelpTextWarning": "ブラウザのリロードが必要", "UnableToAddANewAppProfilePleaseTryAgain": "新しい品質プロファイルを追加できません。再試行してください。", "UnableToAddANewDownloadClientPleaseTryAgain": "新しいダウンロードクライアントを追加できません。もう一度やり直してください。", @@ -237,7 +237,7 @@ "All": "すべて", "AllIndexersHiddenDueToFilter": "フィルタが適用されているため、すべてのムービーが非表示になっています。", "Analytics": "分析", - "AnalyticsEnabledHelpText": "匿名の使用状況とエラー情報をProwlarrのサーバーに送信します。これには、使用するProwlarr WebUIページ、エラーレポート、OSおよびランタイムバージョンなどのブラウザに関する情報が含まれます。この情報を使用して、機能とバグ修正に優先順位を付けます。", + "AnalyticsEnabledHelpText": "匿名の使用状況とエラー情報を{appName}のサーバーに送信します。これには、使用する{appName} WebUIページ、エラーレポート、OSおよびランタイムバージョンなどのブラウザに関する情報が含まれます。この情報を使用して、機能とバグ修正に優先順位を付けます。", "ApiKey": "APIキー", "AppDataDirectory": "AppDataディレクトリ", "AppDataLocationHealthCheckMessage": "更新時にAppDataが削除されないように更新することはできません", @@ -257,7 +257,7 @@ "EventType": "イベントタイプ", "Exception": "例外", "Fixed": "修繕", - "LaunchBrowserHelpText": " Webブラウザーを開き、アプリの起動時にProwlarrホームページに移動します。", + "LaunchBrowserHelpText": " Webブラウザーを開き、アプリの起動時に{appName}ホームページに移動します。", "PageSizeHelpText": "各ページに表示するアイテムの数", "Peers": "ピア", "PendingChangesDiscardChanges": "変更を破棄してそのままにします", @@ -273,7 +273,7 @@ "BindAddress": "バインドアドレス", "BindAddressHelpText": "すべてのインターフェースに有効なIP4アドレスまたは「*」", "Branch": "ブランチ", - "BranchUpdate": "Prowlarrの更新に使用するブランチ", + "BranchUpdate": "{appName}の更新に使用するブランチ", "BranchUpdateMechanism": "外部更新メカニズムで使用されるブランチ", "BypassProxyForLocalAddresses": "ローカルアドレスのプロキシをバイパスする", "Cancel": "キャンセル", @@ -329,7 +329,7 @@ "Queued": "キューに入れられました", "Remove": "削除する", "Replace": "交換", - "TheLatestVersionIsAlreadyInstalled": "Prowlarrの最新バージョンはすでにインストールされています", + "TheLatestVersionIsAlreadyInstalled": "{appName}の最新バージョンはすでにインストールされています", "Track": "痕跡", "DeleteSelectedDownloadClients": "ダウンロードクライアントを削除する", "Genre": "ジャンル", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 3fc0404e2..4d5589aa5 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -111,17 +111,17 @@ "YesCancel": "예, 취소합니다", "Folder": "폴더", "EnableAutomaticSearch": "자동 검색 활성화", - "EnableAutomaticSearchHelpText": "UI 또는 Prowlarr를 통해 자동 검색을 수행 할 때 사용됩니다.", + "EnableAutomaticSearchHelpText": "UI 또는 {appName}를 통해 자동 검색을 수행 할 때 사용됩니다.", "ErrorLoadingContents": "콘텐츠로드 오류", "Grabs": "붙잡다", "Torrent": "급류", "Torrents": "급류", "Type": "유형", "DeleteApplicationMessageText": "알림 '{0}'을(를) 삭제하시겠습니까?", - "AuthenticationMethodHelpText": "Prowlarr에 액세스하려면 사용자 이름 및 암호 필요", - "BackupFolderHelpText": "상대 경로는 Prowlarr의 AppData 디렉토리에 있습니다.", + "AuthenticationMethodHelpText": "{appName}에 액세스하려면 사용자 이름 및 암호 필요", + "BackupFolderHelpText": "상대 경로는 {appName}의 AppData 디렉토리에 있습니다.", "Branch": "분기", - "BranchUpdate": "Prowlarr 업데이트에 사용할 분기", + "BranchUpdate": "{appName} 업데이트에 사용할 분기", "DeleteIndexerProxyMessageText": "'{0}' 태그를 삭제하시겠습니까?", "EnableInteractiveSearch": "대화 형 검색 활성화", "EnableSSL": "SSL 활성화", @@ -167,7 +167,7 @@ "RemovingTag": "태그 제거", "IndexerPriority": "인덱서 우선 순위", "Language": "언어", - "LaunchBrowserHelpText": " 웹 브라우저를 열고 앱 시작시 Prowlarr 홈페이지로 이동합니다.", + "LaunchBrowserHelpText": " 웹 브라우저를 열고 앱 시작시 {appName} 홈페이지로 이동합니다.", "SSLPort": "SSL 포트", "StartupDirectory": "시작 디렉토리", "LogFiles": "로그 파일", @@ -186,7 +186,7 @@ "UnableToAddANewNotificationPleaseTryAgain": "새 알림을 추가 할 수 없습니다. 다시 시도하십시오.", "UnableToLoadGeneralSettings": "일반 설정을로드 할 수 없습니다.", "UnableToLoadNotifications": "알림을로드 할 수 없습니다.", - "UpdateMechanismHelpText": "Prowlarr의 내장 업데이트 프로그램 또는 스크립트 사용", + "UpdateMechanismHelpText": "{appName}의 내장 업데이트 프로그램 또는 스크립트 사용", "UpdateScriptPathHelpText": "추출 된 업데이트 패키지를 사용하고 나머지 업데이트 프로세스를 처리하는 사용자 지정 스크립트에 대한 경로", "URLBase": "URL베이스", "Usenet": "유즈넷", @@ -208,7 +208,7 @@ "TestAll": "모두 테스트", "Options": "옵션", "SettingsTimeFormat": "시간 형식", - "AnalyticsEnabledHelpText": "익명의 사용 및 오류 정보를 Prowlarr의 서버에 보냅니다. 여기에는 브라우저에 대한 정보, 사용하는 Prowlarr WebUI 페이지, 오류보고, OS 및 런타임 버전이 포함됩니다. 이 정보를 사용하여 기능 및 버그 수정의 우선 순위를 지정합니다.", + "AnalyticsEnabledHelpText": "익명의 사용 및 오류 정보를 {appName}의 서버에 보냅니다. 여기에는 브라우저에 대한 정보, 사용하는 {appName} WebUI 페이지, 오류보고, OS 및 런타임 버전이 포함됩니다. 이 정보를 사용하여 기능 및 버그 수정의 우선 순위를 지정합니다.", "Filename": "파일 이름", "ForMoreInformationOnTheIndividualDownloadClients": "개별 다운로드 클라이언트에 대한 자세한 내용을 보려면 정보 버튼을 클릭하십시오.", "GeneralSettings": "일반 설정", @@ -226,7 +226,7 @@ "SettingsShowRelativeDatesHelpText": "상대 (오늘 / 어제 / 기타) 또는 절대 날짜 표시", "ShowSearch": "검색 표시", "UILanguage": "UI 언어", - "UILanguageHelpText": "Prowlarr가 UI에 사용할 언어", + "UILanguageHelpText": "{appName}가 UI에 사용할 언어", "HistoryCleanupDaysHelpText": "자동 정리를 사용하지 않으려면 0으로 설정하십시오.", "HistoryCleanupDaysHelpTextWarning": "선택한 일 수보다 오래된 휴지통에있는 파일은 자동으로 정리됩니다.", "OnGrab": "잡기", diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index eafe00097..a51be2d64 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -23,7 +23,7 @@ "About": "Om", "AcceptConfirmationModal": "Godta bekreftelsesmodal", "Actions": "Handlinger", - "AddDownloadClientToProwlarr": "Ved å legge til en nedlastingsklient kan Prowlarr sende utgivelser direkte fra brukergrensesnittet mens du gjør et manuelt søk.", + "AddDownloadClientToProwlarr": "Ved å legge til en nedlastingsklient kan {appName} sende utgivelser direkte fra brukergrensesnittet mens du gjør et manuelt søk.", "AddIndexer": "Legg til indekser", "Age": "Alder", "ApiKey": "API Nøkkel", @@ -38,10 +38,10 @@ "CertificateValidationHelpText": "Endre hvor streng HTTPS -sertifisering validering er", "DeleteBackupMessageText": "Er du sikker på at du vil slette formattaggen {0}?", "AllIndexersHiddenDueToFilter": "Alle filmer er skjult på grunn av påført filter.", - "AnalyticsEnabledHelpText": "Send anonym bruk og feilinformasjon til Prowlarrs servere. Dette inkluderer informasjon om nettleseren din, hvilke Prowlarr WebUI -sider du bruker, feilrapportering samt OS og kjøretidsversjon. Vi vil bruke denne informasjonen til å prioritere funksjoner og feilrettinger.", - "AuthenticationMethodHelpText": "Krev brukernavn og passord for å få tilgang til Prowlarr", - "BackupFolderHelpText": "Relative stier vil være under Prowlarr's AppData -katalog", - "BranchUpdate": "Gren som skal brukes til å oppdatere Prowlarr", + "AnalyticsEnabledHelpText": "Send anonym bruk og feilinformasjon til {appName}s servere. Dette inkluderer informasjon om nettleseren din, hvilke {appName} WebUI -sider du bruker, feilrapportering samt OS og kjøretidsversjon. Vi vil bruke denne informasjonen til å prioritere funksjoner og feilrettinger.", + "AuthenticationMethodHelpText": "Krev brukernavn og passord for å få tilgang til {appName}", + "BackupFolderHelpText": "Relative stier vil være under {appName}'s AppData -katalog", + "BranchUpdate": "Gren som skal brukes til å oppdatere {appName}", "DeleteApplicationMessageText": "Er du sikker på at du vil slette formattaggen {0}?", "DeleteDownloadClientMessageText": "Er du sikker på at du vil slette formattaggen {0}?", "DeleteIndexerProxyMessageText": "Er du sikker på at du vil slette formattaggen {0}?", @@ -98,7 +98,7 @@ "Grabs": "Hent", "Application": "Applikasjoner", "Reload": "Likemenn", - "UpdateMechanismHelpText": "Bruk Prowlarrs innebygde oppdaterer eller et skript", + "UpdateMechanismHelpText": "Bruk {appName}s innebygde oppdaterer eller et skript", "Updates": "Oppdater", "URLBase": "URL Base", "Details": "detaljer", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 68cd252f0..d7c6a6722 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -6,7 +6,7 @@ "AddApplication": "Applicatie Toevoegen", "AddCustomFilter": "Aangepaste Filter Toevoegen", "AddDownloadClient": "Download Client Toevoegen", - "AddDownloadClientToProwlarr": "Door een downloadclient toe te voegen, kan Prowlarr releases rechtstreeks vanuit de gebruikersinterface verzenden tijdens een handmatige zoekopdracht.", + "AddDownloadClientToProwlarr": "Door een downloadclient toe te voegen, kan {appName} releases rechtstreeks vanuit de gebruikersinterface verzenden tijdens een handmatige zoekopdracht.", "AddIndexer": "Voeg Indexeerder Toe", "AddIndexerProxy": "Indexeerproxy toevoegen", "AddNewIndexer": "Voeg nieuwe Indexeerder Toe", @@ -21,14 +21,14 @@ "All": "Alle", "AllIndexersHiddenDueToFilter": "Alle indexeerders zijn verborgen door actieve filter.", "Analytics": "Statistieken", - "AnalyticsEnabledHelpText": "Stuur anonieme gebruiks- en foutinformatie naar de servers van Prowlarr. Dit omvat informatie over uw browser, welke Prowlarr WebUI pagina's u gebruikt, foutrapportage en OS en runtime versie. We zullen deze informatie gebruiken om prioriteiten te stellen voor functies en het verhelpen van fouten.", + "AnalyticsEnabledHelpText": "Stuur anonieme gebruiks- en foutinformatie naar de servers van {appName}. Dit omvat informatie over uw browser, welke {appName} WebUI pagina's u gebruikt, foutrapportage en OS en runtime versie. We zullen deze informatie gebruiken om prioriteiten te stellen voor functies en het verhelpen van fouten.", "ApiKey": "API-sleutel", "ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {0} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand", "AppDataDirectory": "AppData folder", "AppDataLocationHealthCheckMessage": "Updaten zal niet mogelijk zijn om het verwijderen van AppData te voorkomen", "AppProfileInUse": "App-profiel in gebruik", "AppProfileSelectHelpText": "App-profielen worden gebruikt om de instellingen voor RSS, Automatisch zoeken en Interactief zoeken bij applicatiesynchronisatie te beheren", - "AppSettingsSummary": "Applicaties en instellingen om te configureren hoe Prowlarr met uw PVR-programma's omgaat", + "AppSettingsSummary": "Applicaties en instellingen om te configureren hoe {appName} met uw PVR-programma's omgaat", "Application": "Applicaties", "ApplicationLongTermStatusCheckAllClientMessage": "Alle indexeerders zijn niet beschikbaar vanwege storingen gedurende meer dan 6 uur", "ApplicationLongTermStatusCheckSingleClientMessage": "Indexeerders zijn niet beschikbaar vanwege storingen gedurende meer dan 6 uur: {0}", @@ -41,11 +41,11 @@ "AudioSearch": "auditief zoeken", "Auth": "Authenticatie", "Authentication": "Authenticatie", - "AuthenticationMethodHelpText": "Gebruikersnaam en wachtwoord nodig voor toegang tot Prowlarr", + "AuthenticationMethodHelpText": "Gebruikersnaam en wachtwoord nodig voor toegang tot {appName}", "Automatic": "Automatisch", "AutomaticSearch": "Automatisch Zoeken", "Backup": "Veiligheidskopie", - "BackupFolderHelpText": "Relatieve paden zullen t.o.v. de Prowlarr AppData map bekeken worden", + "BackupFolderHelpText": "Relatieve paden zullen t.o.v. de {appName} AppData map bekeken worden", "BackupIntervalHelpText": "Tussentijd voor automatische back-up", "BackupNow": "Nu backup nemen", "BackupRetentionHelpText": "Automatische veiligheidskopieën ouder dan de retentie periode zullen worden opgeruimd", @@ -54,7 +54,7 @@ "BindAddress": "Aanhaak Adres", "BindAddressHelpText": "Geldig IP-adres, localhost of '*' voor alle interfaces", "Branch": "Branch", - "BranchUpdate": "Te gebruiken branch om Prowlarr bij te werken", + "BranchUpdate": "Te gebruiken branch om {appName} bij te werken", "BranchUpdateMechanism": "Gebruikte branch door extern update mechanisme", "BypassProxyForLocalAddresses": "Omzeil Proxy voor Lokale Adressen", "Cancel": "Annuleer", @@ -66,7 +66,7 @@ "ChangeHasNotBeenSavedYet": "Wijziging is nog niet opgeslagen", "Clear": "Wis", "ClearHistory": "Geschiedenis verwijderen", - "ClearHistoryMessageText": "Weet je zeker dat je alle geschiedenis van Prowlarr wilt verwijderen?", + "ClearHistoryMessageText": "Weet je zeker dat je alle geschiedenis van {appName} wilt verwijderen?", "ClientPriority": "Client Prioriteit", "CloneProfile": "Dupliceer Profiel", "Close": "Sluit", @@ -111,14 +111,14 @@ "DownloadClientStatusCheckAllClientMessage": "Alle downloaders zijn onbeschikbaar wegens fouten", "DownloadClientStatusCheckSingleClientMessage": "Downloaders onbeschikbaar wegens fouten: {0}", "DownloadClients": "Downloaders", - "DownloadClientsSettingsSummary": "Clientconfiguratie downloaden voor integratie in Prowlarr UI-zoekopdracht", + "DownloadClientsSettingsSummary": "Clientconfiguratie downloaden voor integratie in {appName} UI-zoekopdracht", "Duration": "Duur", "Edit": "Bewerk", "EditIndexer": "Bewerk Indexeerder", "EditSyncProfile": "Synchronisatieprofiel toevoegen", "Enable": "Activeer", "EnableAutomaticSearch": "Activeer Automatisch Zoeken", - "EnableAutomaticSearchHelpText": "Zal worden gebruikt wanneer automatische zoekopdrachten worden uitgevoerd via de gebruikersinterface of door Prowlarr", + "EnableAutomaticSearchHelpText": "Zal worden gebruikt wanneer automatische zoekopdrachten worden uitgevoerd via de gebruikersinterface of door {appName}", "EnableIndexer": "Indexer inschakelen", "EnableInteractiveSearch": "Activeer Interactief Zoeken", "EnableInteractiveSearchHelpText": "Zal worden gebruikt wanneer interactief zoeken wordt gebruikt", @@ -169,10 +169,10 @@ "Indexer": "Indexeerder", "IndexerAuth": "Indexer-authenticatie", "IndexerFlags": "Indexeerder Flags", - "IndexerHealthCheckNoIndexers": "Geen indexers ingeschakeld, Prowlarr geeft geen zoekresultaten terug", + "IndexerHealthCheckNoIndexers": "Geen indexers ingeschakeld, {appName} geeft geen zoekresultaten terug", "IndexerLongTermStatusCheckAllClientMessage": "Alle indexeerders zijn niet beschikbaar vanwege storingen gedurende meer dan 6 uur", "IndexerLongTermStatusCheckSingleClientMessage": "Indexeerders zijn niet beschikbaar vanwege storingen gedurende meer dan 6 uur: {0}", - "IndexerObsoleteCheckMessage": "Indexeerders zijn verouderd of zijn bijgewerkt: {0}. Gelieve te verwijderen en (of) opnieuw toe te voegen aan Prowlarr", + "IndexerObsoleteCheckMessage": "Indexeerders zijn verouderd of zijn bijgewerkt: {0}. Gelieve te verwijderen en (of) opnieuw toe te voegen aan {appName}", "IndexerPriority": "Indexeerder Prioriteit", "IndexerPriorityHelpText": "Indexeerder Prioriteit van 1 (Hoogste) tot 50 (Laagste). Standaard: 25.", "IndexerProxies": "Indexer-proxy's", @@ -197,7 +197,7 @@ "LastDuration": "Laatste Looptijd", "LastExecution": "Laatste Uitvoering", "LastWriteTime": "Laatste Modificatietijd", - "LaunchBrowserHelpText": " Open een web browser en navigeer naar de Prowlarr startpagina bij het starten van de app.", + "LaunchBrowserHelpText": " Open een web browser en navigeer naar de {appName} startpagina bij het starten van de app.", "Level": "Niveau", "Link": "Koppelingen", "LogFiles": "Logbestanden", @@ -208,7 +208,7 @@ "MIA": "MIA", "MaintenanceRelease": "Onderhoudsuitgave", "Manual": "Manueel", - "MappedDrivesRunningAsService": "Toegewezen netwerkstation is niet beschikbaar wanneer Prowlarr wordt uitgevoerd als een Windows Service. Bekijk de Veelgestelde Vragen voor meer informatie", + "MappedDrivesRunningAsService": "Toegewezen netwerkstation is niet beschikbaar wanneer {appName} wordt uitgevoerd als een Windows Service. Bekijk de Veelgestelde Vragen voor meer informatie", "Mechanism": "Mechanisme", "Message": "Bericht", "Mode": "Modus", @@ -259,8 +259,8 @@ "Priority": "Prioriteit", "Privacy": "Privacy", "Protocol": "Protocol", - "ProwlarrSupportsAnyDownloadClient": "Prowlarr ondersteund elke downloader die gebruik maakt van de Newznab standaard, tevens ook de ander hieronder weergegeven downloaders.", - "ProwlarrSupportsAnyIndexer": "Prowlarr ondersteunt veel indexeerders naast elke indexeerder die de Newznab/Torznab-standaard gebruikt met 'Generic Newznab' (voor usenet) of 'Generic Torznab' (voor torrents). Zoek en selecteer uw indexeerder hieronder.", + "ProwlarrSupportsAnyDownloadClient": "{appName} ondersteund elke downloader die gebruik maakt van de Newznab standaard, tevens ook de ander hieronder weergegeven downloaders.", + "ProwlarrSupportsAnyIndexer": "{appName} ondersteunt veel indexeerders naast elke indexeerder die de Newznab/Torznab-standaard gebruikt met 'Generic Newznab' (voor usenet) of 'Generic Torznab' (voor torrents). Zoek en selecteer uw indexeerder hieronder.", "Proxy": "Proxy", "ProxyBypassFilterHelpText": "Gebruik ',' als scheidingsteken en '*' als wildcard voor subdomeinen", "ProxyCheckBadRequestMessage": "Testen van proxy is mislukt. Statuscode: {0}", @@ -277,10 +277,10 @@ "ReadTheWikiForMoreInformation": "Lees de Wiki voor meer informatie", "Reddit": "Reddit", "Redirect": "Omleiden", - "RedirectHelpText": "Leid inkomend downloadverzoek voor indexeerder om en geef de grijper direct door in plaats van het verzoek via Prowlarr te proxyen", + "RedirectHelpText": "Leid inkomend downloadverzoek voor indexeerder om en geef de grijper direct door in plaats van het verzoek via {appName} te proxyen", "Refresh": "Vernieuw", "RefreshMovie": "Film vernieuwen", - "ReleaseBranchCheckOfficialBranchMessage": "Branch {0} is geen geldige Prowlarr release branch, u zult geen updates ontvangen", + "ReleaseBranchCheckOfficialBranchMessage": "Branch {0} is geen geldige {appName} release branch, u zult geen updates ontvangen", "ReleaseStatus": "Uitgave Status", "Reload": "Herlaad", "Remove": "Verwijder", @@ -292,7 +292,7 @@ "ResetAPIKey": "Reset API-sleutel", "Restart": "Herstart", "RestartNow": "Herstart Nu", - "RestartProwlarr": "Herstart Prowlarr", + "RestartProwlarr": "Herstart {appName}", "RestartRequiredHelpTextWarning": "Herstarten vereist om in werking te treden", "Restore": "Herstellen", "RestoreBackup": "Veiligheidskopie Herstellen", @@ -330,7 +330,7 @@ "SettingsShortDateFormat": "Korte Datumnotatie", "SettingsShowRelativeDates": "Toon Relatieve Datums", "SettingsShowRelativeDatesHelpText": "Toon relatieve (Vandaag/Gisteren/enz.) of absolute datums", - "SettingsSqlLoggingHelpText": "Log alle SQL-query's van Prowlarr", + "SettingsSqlLoggingHelpText": "Log alle SQL-query's van {appName}", "SettingsTimeFormat": "Tijdsformaat", "ShowAdvanced": "Toon Geavanceerd", "ShowSearch": "Toon Zoeken", @@ -347,8 +347,8 @@ "SuggestTranslationChange": "Stel vertaling voor", "SyncAppIndexers": "App-indexeerders synchroniseren", "SyncLevel": "Synchronisatieniveau", - "SyncLevelAddRemove": "Alleen toevoegen en verwijderen: wanneer het wordt toegevoegd of verwijderd uit Prowlarr, wordt deze externe app bijgewerkt.", - "SyncLevelFull": "Volledige synchronisatie: houdt deze app volledig gesynchroniseerd. Wijzigingen in Prowlarr worden vervolgens gesynchroniseerd met deze app. Elke wijziging die op afstand wordt aangebracht, wordt bij de volgende synchronisatie overschreven door Prowlarr.", + "SyncLevelAddRemove": "Alleen toevoegen en verwijderen: wanneer het wordt toegevoegd of verwijderd uit {appName}, wordt deze externe app bijgewerkt.", + "SyncLevelFull": "Volledige synchronisatie: houdt deze app volledig gesynchroniseerd. Wijzigingen in {appName} worden vervolgens gesynchroniseerd met deze app. Elke wijziging die op afstand wordt aangebracht, wordt bij de volgende synchronisatie overschreven door {appName}.", "System": "Systeem", "SystemTimeCheckMessage": "De systeemtijd loopt verkeerd met meer dan 1 dag. Geplande taken worden mogelijk niet goed uitgevoerd tot dit is opgelost", "TableOptions": "Tabel Opties", @@ -364,7 +364,7 @@ "TestAllApps": "Alle apps testen", "TestAllClients": "Test Alle Downloaders", "TestAllIndexers": "Test Alle Indexeerders", - "TheLatestVersionIsAlreadyInstalled": "De nieuwste versie van Prowlarr is al geïnstalleerd", + "TheLatestVersionIsAlreadyInstalled": "De nieuwste versie van {appName} is al geïnstalleerd", "Time": "Tijd", "Title": "Titel", "Today": "Vandaag", @@ -374,7 +374,7 @@ "Type": "Type", "UI": "Gebruikersinterface", "UILanguage": "Gebruikersinterface Taal", - "UILanguageHelpText": "Taal die Prowlarr zal gebruiken voor de gebruikersinterface", + "UILanguageHelpText": "Taal die {appName} zal gebruiken voor de gebruikersinterface", "UILanguageHelpTextWarning": "Browser Herladen Vereist", "UISettings": "Gebruikersinterface Instellingen", "UISettingsSummary": "Datum, kleurenblindheid en taal instellingen", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 7e0d8b58f..740773e96 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -17,7 +17,7 @@ "TableOptionsColumnsMessage": "Wybierz, które kolumny są widoczne i w jakiej kolejności się pojawiają", "BeforeUpdate": "Przed aktualizacją", "BindAddress": "Adres powiązania", - "BranchUpdate": "Oddział do użycia do aktualizacji Prowlarr", + "BranchUpdate": "Oddział do użycia do aktualizacji {appName}", "Cancel": "Anuluj", "Automatic": "Automatyczny", "ApplyTags": "Zastosuj tagi", @@ -27,13 +27,13 @@ "Delete": "Usunąć", "Discord": "Niezgoda", "Edit": "Edytować", - "EnableAutomaticSearchHelpText": "Będzie używany, gdy automatyczne wyszukiwania są wykonywane przez interfejs użytkownika lub przez Prowlarr", + "EnableAutomaticSearchHelpText": "Będzie używany, gdy automatyczne wyszukiwania są wykonywane przez interfejs użytkownika lub przez {appName}", "KeyboardShortcuts": "Skróty klawiszowe", "UnableToAddANewAppProfilePleaseTryAgain": "Nie można dodać nowego profilu jakości, spróbuj ponownie.", "URLBase": "Baza adresów URL", "CustomFilters": "Filtry niestandardowe", "EnableRss": "Włącz RSS", - "LaunchBrowserHelpText": " Otwórz przeglądarkę internetową i przejdź do strony głównej Prowlarr po uruchomieniu aplikacji.", + "LaunchBrowserHelpText": " Otwórz przeglądarkę internetową i przejdź do strony głównej {appName} po uruchomieniu aplikacji.", "Password": "Hasło", "Peers": "Rówieśnicy", "Protocol": "Protokół", @@ -101,13 +101,13 @@ "ErrorLoadingContents": "Błąd podczas ładowania treści", "Events": "Wydarzenia", "SettingsLongDateFormat": "Format długiej daty", - "AnalyticsEnabledHelpText": "Wysyłaj anonimowe informacje o użytkowaniu i błędach do serwerów Prowlarr. Obejmuje to informacje o Twojej przeglądarce, z których stron Prowlarr WebUI używasz, raportowanie błędów, a także wersję systemu operacyjnego i środowiska wykonawczego. Wykorzystamy te informacje, aby nadać priorytet funkcjom i poprawkom błędów.", + "AnalyticsEnabledHelpText": "Wysyłaj anonimowe informacje o użytkowaniu i błędach do serwerów {appName}. Obejmuje to informacje o Twojej przeglądarce, z których stron {appName} WebUI używasz, raportowanie błędów, a także wersję systemu operacyjnego i środowiska wykonawczego. Wykorzystamy te informacje, aby nadać priorytet funkcjom i poprawkom błędów.", "ApplicationStatusCheckAllClientMessage": "Wszystkie listy są niedostępne z powodu błędów", "ApplicationStatusCheckSingleClientMessage": "Listy niedostępne z powodu błędów: {0}", "Apply": "Zastosuj", "Authentication": "Autoryzacja", - "AuthenticationMethodHelpText": "Wymagaj nazwy użytkownika i hasła, aby uzyskać dostęp do Prowlarr", - "BackupFolderHelpText": "Względne ścieżki będą znajdować się w katalogu AppData Prowlarr", + "AuthenticationMethodHelpText": "Wymagaj nazwy użytkownika i hasła, aby uzyskać dostęp do {appName}", + "BackupFolderHelpText": "Względne ścieżki będą znajdować się w katalogu AppData {appName}", "BackupRetentionHelpText": "Automatyczne kopie zapasowe starsze niż okres przechowywania zostaną automatycznie wyczyszczone", "BindAddressHelpText": "Prawidłowy adres IP4 lub „*” dla wszystkich interfejsów", "BranchUpdateMechanism": "Gałąź używana przez zewnętrzny mechanizm aktualizacji", @@ -202,7 +202,7 @@ "Queue": "Kolejka", "Reddit": "Reddit", "RefreshMovie": "Odśwież film", - "ReleaseBranchCheckOfficialBranchMessage": "Gałąź {0} nie jest poprawną gałęzią wydania Prowlarr, nie będziesz otrzymywać aktualizacji", + "ReleaseBranchCheckOfficialBranchMessage": "Gałąź {0} nie jest poprawną gałęzią wydania {appName}, nie będziesz otrzymywać aktualizacji", "RemovedFromTaskQueue": "Usunięto z kolejki zadań", "RemoveFilter": "Usuń filtr", "Reset": "Resetowanie", @@ -253,7 +253,7 @@ "Torrent": "Torrenty", "Torrents": "Torrenty", "Type": "Rodzaj", - "UILanguageHelpText": "Język, którego Prowlarr będzie używać w interfejsie użytkownika", + "UILanguageHelpText": "Język, którego {appName} będzie używać w interfejsie użytkownika", "UILanguageHelpTextWarning": "Wymagane przeładowanie przeglądarki", "UISettings": "Ustawienia interfejsu użytkownika", "UnableToAddANewApplicationPleaseTryAgain": "Nie można dodać nowego powiadomienia, spróbuj ponownie.", @@ -270,7 +270,7 @@ "UpdateAutomaticallyHelpText": "Automatycznie pobieraj i instaluj aktualizacje. Nadal będziesz mógł zainstalować z System: Updates", "UpdateCheckStartupNotWritableMessage": "Nie można zainstalować aktualizacji, ponieważ użytkownik „{1}” nie ma prawa zapisu do folderu startowego „{0}”.", "UpdateCheckStartupTranslocationMessage": "Nie można zainstalować aktualizacji, ponieważ folder startowy „{0}” znajduje się w folderze translokacji aplikacji.", - "UpdateMechanismHelpText": "Użyj wbudowanego aktualizatora Prowlarr lub skryptu", + "UpdateMechanismHelpText": "Użyj wbudowanego aktualizatora {appName} lub skryptu", "Updates": "Aktualizacje", "UpdateScriptPathHelpText": "Ścieżka do niestandardowego skryptu, który pobiera wyodrębniony pakiet aktualizacji i obsługuje pozostałą część procesu aktualizacji", "UrlBaseHelpText": "W przypadku obsługi zwrotnego proxy wartość domyślna jest pusta", @@ -341,7 +341,7 @@ "ApplicationLongTermStatusCheckAllClientMessage": "Wszystkie indeksatory są niedostępne z powodu awarii przez ponad 6 godzin", "Remove": "Usunąć", "Replace": "Zastąpić", - "TheLatestVersionIsAlreadyInstalled": "Najnowsza wersja Prowlarr jest już zainstalowana", + "TheLatestVersionIsAlreadyInstalled": "Najnowsza wersja {appName} jest już zainstalowana", "ApplicationURL": "Link do aplikacji", "ApplicationUrlHelpText": "Zewnętrzny URL tej aplikacji zawierający http(s)://, port i adres URL", "ApplyTagsHelpTextAdd": "Dodaj: dodaj tagi do istniejącej listy tagów", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 6309fdc02..f94fdd3a6 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -52,7 +52,7 @@ "Restart": "Reiniciar", "Reload": "Recarregar", "ReleaseStatus": "Estado da versão", - "ReleaseBranchCheckOfficialBranchMessage": "A ramificação {0} não é uma ramificação de versões válida do Prowlarr, você não receberá atualizações", + "ReleaseBranchCheckOfficialBranchMessage": "A ramificação {0} não é uma ramificação de versões válida do {appName}, você não receberá atualizações", "Refresh": "Atualizar", "Queue": "Fila", "ProxyCheckResolveIpMessage": "Não é possível resolver o Endereço IP para o Anfitrião de proxy {0} definido", @@ -102,7 +102,7 @@ "Edit": "Editar", "DownloadClientStatusCheckSingleClientMessage": "Clientes de transferências indisponíveis devido a falhas: {0}", "DownloadClientStatusCheckAllClientMessage": "Todos os clientes de transferências estão indisponíveis devido a falhas", - "DownloadClientsSettingsSummary": "Definições do cliente de transferências para integração à pesquisa da IU do Prowlarr", + "DownloadClientsSettingsSummary": "Definições do cliente de transferências para integração à pesquisa da IU do {appName}", "DownloadClients": "Clientes de transferências", "DownloadClient": "Cliente de transferências", "Details": "Detalhes", @@ -134,7 +134,7 @@ "ApplyTags": "Aplicar etiquetas", "AppDataDirectory": "Pasta AppData", "ApiKey": "Chave da API", - "AnalyticsEnabledHelpText": "Envia informações anônimas de uso e de erros aos servidores do Prowlarr. Isso inclui informações sobre seu browser, páginas utilizadas na WebUI do Prowlarr, relatórios de erros, bem como as versões do sistema operativo e da aplicação. Utilizaremos essas informações para priorizar funcionalidades e correções de bugs.", + "AnalyticsEnabledHelpText": "Envia informações anônimas de uso e de erros aos servidores do {appName}. Isso inclui informações sobre seu browser, páginas utilizadas na WebUI do {appName}, relatórios de erros, bem como as versões do sistema operativo e da aplicação. Utilizaremos essas informações para priorizar funcionalidades e correções de bugs.", "ProxyType": "Tipo de proxy", "PortNumber": "Número da porta", "Port": "Porta", @@ -181,19 +181,19 @@ "BindAddressHelpText": "Endereço de IP válido, localhost ou \"*\" para todas as interfaces", "BindAddress": "Endereço de vínculo", "Backups": "Cópias de segurança", - "BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do Prowlarr", + "BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do {appName}", "BackupIntervalHelpText": "Intervalo entre cópias de segurança automáticas", "BackupRetentionHelpText": "Cópias de segurança automáticas anteriores ao período de retenção serão eliminadas automaticamente", "ClientPriority": "Prioridade do cliente", "CancelPendingTask": "Tem a certeza que quer cancelar esta tarefa pendente?", "BranchUpdateMechanism": "Ramificação utilizada pelo mecanismo externo de atualização", - "BranchUpdate": "Ramificação utilizada para atualizar o Prowlarr", + "BranchUpdate": "Ramificação utilizada para atualizar o {appName}", "BeforeUpdate": "Antes de atualizar", "AddingTag": "A adicionar etiqueta", "AutomaticSearch": "Pesquisa automática", "UnableToAddANewIndexerPleaseTryAgain": "Não foi possível adicionar um novo indexador, tenta novamente.", "RSSIsNotSupportedWithThisIndexer": "RSS não é suportado por esse indexador", - "ProwlarrSupportsAnyIndexer": "O Prowlarr suporta vários indexadores, além de qualquer indexador que usa o padrão Newznab/Torznab como \"Newznab genérico\" (para Usenet) e \"Torznab genérico\" (para torrents). Pesquise e selecione os indexadores na listagem abaixo.", + "ProwlarrSupportsAnyIndexer": "O {appName} suporta vários indexadores, além de qualquer indexador que usa o padrão Newznab/Torznab como \"Newznab genérico\" (para Usenet) e \"Torznab genérico\" (para torrents). Pesquise e selecione os indexadores na listagem abaixo.", "IndexerPriorityHelpText": "Prioridade do indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25.", "IndexerPriority": "Prioridade do indexador", "EditIndexer": "Editar indexador", @@ -202,7 +202,7 @@ "Retention": "Retenção", "Result": "Resultado", "Restore": "Restaurar", - "RestartProwlarr": "Reiniciar o Prowlarr", + "RestartProwlarr": "Reiniciar o {appName}", "RestartNow": "Reiniciar agora", "ResetAPIKey": "Repor chave da API", "Reset": "Repor", @@ -224,7 +224,7 @@ "Exception": "Excepção", "ErrorLoadingContents": "Erro ao carregar conteúdo", "EnableInteractiveSearchHelpText": "Será utilizado ao realizar uma pesquisa interativa", - "EnableAutomaticSearchHelpText": "Será utilizado ao realizar pesquisas automáticas através da IU ou pelo Prowlarr", + "EnableAutomaticSearchHelpText": "Será utilizado ao realizar pesquisas automáticas através da IU ou pelo {appName}", "Disabled": "Desativado", "DeleteTagMessageText": "Tem a certeza que quer eliminar a etiqueta \"{label}\"?", "DeleteNotificationMessageText": "Tem a certeza que quer eliminar a notificação \"{name}\"?", @@ -232,7 +232,7 @@ "DeleteBackupMessageText": "Tem a certeza que quer eliminar a cópia de segurança \"{name}\"?", "UrlBaseHelpText": "Para suporte a proxy inverso, vazio por padrão", "UpdateScriptPathHelpText": "Caminho para um script personalizado que toma um pacote de atualização extraído e lida com o restante do processo da atualização", - "UpdateMechanismHelpText": "Utilizar o atualizador do Prowlarr ou um script", + "UpdateMechanismHelpText": "Utilizar o atualizador do {appName} ou um script", "UpdateAutomaticallyHelpText": "Transferir e instalar automaticamente as atualizações. Ainda é possível instalar a partir de Sistema: Atualizações", "TestAllClients": "Testar todos os clientes", "TagsHelpText": "Aplica-se a indexadores com pelo menos uma etiqueta correspondente", @@ -244,14 +244,14 @@ "SSLCertPassword": "Palavra-passe do certificado SSL", "SendAnonymousUsageData": "Enviar dados anônimos de uso", "RestartRequiredHelpTextWarning": "Requer reinício para aplicar alterações", - "ProwlarrSupportsAnyDownloadClient": "O Prowlarr suporta qualquer dos clientes de transferências listados abaixo.", + "ProwlarrSupportsAnyDownloadClient": "O {appName} suporta qualquer dos clientes de transferências listados abaixo.", "ProxyUsernameHelpText": "Apenas insira o utilizador e a palavra-passe caso seja requerido. Caso contrário, deixe em branco.", "ProxyPasswordHelpText": "Apenas insira o utilizador e a palavra-passe caso seja requerido. Caso contrário, deixe em branco.", "ProxyBypassFilterHelpText": "Utilizar \",\" como separador e \"*.\" como caráter universal para subdomínios", "MaintenanceRelease": "Versão de manutenção: reparações de erros e outras melhorias. Consulte o Histórico de Commits do Github para saber mais", "RemovedFromTaskQueue": "Eliminado da fila de tarefas", "LogLevelTraceHelpTextWarning": "O registo de rasteio somente deve ser ativado temporariamente", - "LaunchBrowserHelpText": " Abrir o browser e a home page do Prowlarr ao iniciar a aplicação.", + "LaunchBrowserHelpText": " Abrir o browser e a home page do {appName} ao iniciar a aplicação.", "TagCannotBeDeletedWhileInUse": "Não é possível eliminar enquanto estiver em uso", "SuggestTranslationChange": "Sugerir mudança na tradução", "StartupDirectory": "Diretório de arranque", @@ -274,7 +274,7 @@ "UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação, tenta novamente.", "UISettings": "Definições da IU", "UILanguageHelpTextWarning": "É preciso reiniciar o browser", - "UILanguageHelpText": "Idioma que o Prowlarr usará para a IU", + "UILanguageHelpText": "Idioma que o {appName} usará para a IU", "UILanguage": "Idioma da IU", "Torrents": "Torrents", "FocusSearchBox": "Focar no campo de pesquisa", @@ -288,10 +288,10 @@ "SearchIndexers": "Pesquisar indexadores", "IndexerRss": "RSS do indexador", "IndexerQuery": "Consulta do indexador", - "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram actualizados: {0}. Remova-os e/ou adicione-os novamente ao Prowlarr", + "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram actualizados: {0}. Remova-os e/ou adicione-os novamente ao {appName}", "IndexerLongTermStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a erros por mais de 6 horas: {0}", "IndexerLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a erros por mais de 6 horas", - "IndexerHealthCheckNoIndexers": "Não há indexadores activados, o Prowlarr não retornará resultados de pesquisa", + "IndexerHealthCheckNoIndexers": "Não há indexadores activados, o {appName} não retornará resultados de pesquisa", "IndexerAuth": "Autenticação do indexador", "EnableRssHelpText": "Activar feed RSS para o indexador", "EnableIndexer": "Activar indexador", @@ -299,7 +299,7 @@ "DevelopmentSettings": "Definições de desenvolvimento", "DeleteApplicationMessageText": "Tem a certeza que quer eliminar a aplicação \"{name}\"?", "DeleteApplication": "Eliminar aplicação", - "ClearHistoryMessageText": "Tem a certeza que deseja limpar todo o histórico do Prowlarr?", + "ClearHistoryMessageText": "Tem a certeza que deseja limpar todo o histórico do {appName}?", "ClearHistory": "Limpar histórico", "ApplicationStatusCheckSingleClientMessage": "Aplicações indisponíveis devido a falhas: {0}", "ApplicationStatusCheckAllClientMessage": "Todas as aplicações estão indisponíveis devido a falhas", @@ -315,7 +315,7 @@ "Today": "Hoje", "TestAllApps": "Testar todas as aplicações", "SyncAppIndexers": "Sincronizar indexadores da aplicação", - "SettingsSqlLoggingHelpText": "Registar todas as consultas de SQL do Prowlarr", + "SettingsSqlLoggingHelpText": "Registar todas as consultas de SQL do {appName}", "SettingsLogSql": "Registar SQL", "SettingsLogRotateHelpText": "Quantidade máxima de ficheiros de log a manter na pasta", "SettingsLogRotate": "Rotação de logs", @@ -323,7 +323,7 @@ "SettingsIndexerLogging": "Registo em log avançado do indexador", "SettingsFilterSentryEvents": "Filtrar eventos de análise", "RSS": "RSS", - "RedirectHelpText": "Redireccionar as solicitações de transferência de entrada para o indexador e obter diretamente, em vez de por proxy usando o Prowlarr", + "RedirectHelpText": "Redireccionar as solicitações de transferência de entrada para o indexador e obter diretamente, em vez de por proxy usando o {appName}", "Redirect": "Redireccionar", "Reddit": "Reddit", "HomePage": "Home Page", @@ -351,15 +351,15 @@ "UnableToAddANewAppProfilePleaseTryAgain": "Não é possível adicionar um novo perfil da aplicação, tenta novamente.", "UnableToAddANewApplicationPleaseTryAgain": "Não é possível adicionar uma nova aplicação, tenta novamente.", "Torrent": "Torrent", - "SyncLevelFull": "Sincronização completa: a aplicação estará sempre sincronizada. Mudanças feitas no Prowlar serão sincronizadas posteriormente com a aplicação. Qualquer mudança feita remotamente será substituída pelo Prowlarr na sincronização seguinte.", - "SyncLevelAddRemove": "Somente adicionar e eliminar: esta aplicação remota será actualizada ao adicionar ou eliminar indexadores do Prowlarr.", + "SyncLevelFull": "Sincronização completa: a aplicação estará sempre sincronizada. Mudanças feitas no Prowlar serão sincronizadas posteriormente com a aplicação. Qualquer mudança feita remotamente será substituída pelo {appName} na sincronização seguinte.", + "SyncLevelAddRemove": "Somente adicionar e eliminar: esta aplicação remota será actualizada ao adicionar ou eliminar indexadores do {appName}.", "SyncLevel": "Nível da sincronização", "Stats": "Estatísticas", "Query": "Consulta", "Privacy": "Privacidade", "FullSync": "Sincronização completa", "AddRemoveOnly": "Adicionar e remover apenas", - "AddDownloadClientToProwlarr": "Adicionar um cliente de transferências possibilita ao Prowlarr enviar versões diretamente da IU ao realizar uma pesquisa manual.", + "AddDownloadClientToProwlarr": "Adicionar um cliente de transferências possibilita ao {appName} enviar versões diretamente da IU ao realizar uma pesquisa manual.", "Add": "Adicionar", "DeleteIndexerProxy": "Apagar Proxy de Indexador", "DeleteIndexerProxyMessageText": "Tem a certeza que quer eliminar o proxy \"{name}\"?", @@ -404,7 +404,7 @@ "Queued": "Em fila", "Remove": "Remover", "Replace": "Substituir", - "TheLatestVersionIsAlreadyInstalled": "A versão mais recente do Prowlarr já está instalada", + "TheLatestVersionIsAlreadyInstalled": "A versão mais recente do {appName} já está instalada", "AddSyncProfile": "Adicionar Perfil de Sincronização", "AddApplication": "Adicionar Aplicação", "AddCustomFilter": "Adicionar Filtro customizado", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index d2d4deb81..aa9ef6203 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -6,7 +6,7 @@ "AddApplication": "Adicionar Aplicativo", "AddCustomFilter": "Adicionar filtro personalizado", "AddDownloadClient": "Adicionar cliente de download", - "AddDownloadClientToProwlarr": "Adicionar um cliente de download possibilita que o Prowlarr envie lançamentos diretamente da interface ao executar uma pesquisa manual.", + "AddDownloadClientToProwlarr": "Adicionar um cliente de download possibilita que o {appName} envie lançamentos diretamente da interface ao executar uma pesquisa manual.", "AddIndexer": "Adicionar indexador", "AddIndexerProxy": "Adicionar Proxy ao Indexador", "AddNewIndexer": "Adicionar novo indexador", @@ -21,14 +21,14 @@ "All": "Todos", "AllIndexersHiddenDueToFilter": "Todos os indexadores estão ocultos devido ao filtro aplicado.", "Analytics": "Análises", - "AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do Prowlarr. Isso inclui informações sobre seu navegador, quais páginas da interface Web do Prowlarr você usa, relatórios de erros, e a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.", + "AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do {appName}. Isso inclui informações sobre seu navegador, quais páginas da interface Web do {appName} você usa, relatórios de erros, e a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.", "ApiKey": "Chave da API", "ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração", "AppDataDirectory": "Diretório AppData", "AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização", "AppProfileInUse": "Perfil de aplicativo em uso", "AppProfileSelectHelpText": "Os perfis de aplicativos são usados para controlar as configurações de RSS, Pesquisa automática e Pesquisa interativa ao sincronizar o aplicativo", - "AppSettingsSummary": "Aplicativos e configurações para configurar como Prowlarr interage com seus programas PVR", + "AppSettingsSummary": "Aplicativos e configurações para configurar como {appName} interage com seus programas PVR", "Application": "Aplicação", "ApplicationLongTermStatusCheckAllClientMessage": "Todos os aplicativos estão indisponíveis devido a falhas por mais de 6 horas", "ApplicationLongTermStatusCheckSingleClientMessage": "Aplicativos indisponíveis devido a falhas por mais de 6 horas: {0}", @@ -54,7 +54,7 @@ "AutomaticSearch": "Pesquisa automática", "AverageResponseTimesMs": "Tempos Médios de Resposta do Indexador (ms)", "Backup": "Backup", - "BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do Prowlarr", + "BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do {appName}", "BackupIntervalHelpText": "Intervalo entre backups automáticos", "BackupNow": "Fazer backup agora", "BackupRetentionHelpText": "Backups automáticos anteriores ao período de retenção serão limpos automaticamente", @@ -66,7 +66,7 @@ "BookSearch": "Pesquisar Livro", "BookSearchTypes": "Tipos de Pesquisa de Livros", "Branch": "Ramificação", - "BranchUpdate": "Ramificação para atualização do Prowlarr", + "BranchUpdate": "Ramificação para atualização do {appName}", "BranchUpdateMechanism": "Ramificação usada pelo mecanismo externo de atualização", "BypassProxyForLocalAddresses": "Ignorar proxy para endereços locais", "Cancel": "Cancelar", @@ -78,7 +78,7 @@ "ChangeHasNotBeenSavedYet": "A alteração ainda não foi salva", "Clear": "Limpar", "ClearHistory": "Limpar histórico", - "ClearHistoryMessageText": "Tem certeza de que deseja limpar o histórico do Prowlarr?", + "ClearHistoryMessageText": "Tem certeza de que deseja limpar o histórico do {appName}?", "ClientPriority": "Prioridade do cliente", "CloneProfile": "Clonar perfil", "Close": "Fechar", @@ -126,7 +126,7 @@ "DownloadClientStatusCheckAllClientMessage": "Todos os clientes de download estão indisponíveis devido a falhas", "DownloadClientStatusCheckSingleClientMessage": "Clientes de download indisponíveis devido a falhas: {0}", "DownloadClients": "Clientes de download", - "DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do usuário do Prowlarr", + "DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do usuário do {appName}", "Duration": "Duração", "Edit": "Editar", "EditIndexer": "Editar Indexador", @@ -134,7 +134,7 @@ "ElapsedTime": "Tempo Decorrido", "Enable": "Habilitar", "EnableAutomaticSearch": "Ativar a pesquisa automática", - "EnableAutomaticSearchHelpText": "Será usado ao realizar pesquisas automáticas pela interface ou pelo Prowlarr", + "EnableAutomaticSearchHelpText": "Será usado ao realizar pesquisas automáticas pela interface ou pelo {appName}", "EnableIndexer": "Habilitar indexador", "EnableInteractiveSearch": "Ativar pesquisa interativa", "EnableInteractiveSearchHelpText": "Será usado com a pesquisa interativa", @@ -188,7 +188,7 @@ "IgnoredAddresses": "Endereços ignorados", "IllRestartLater": "Reiniciarei mais tarde", "IncludeHealthWarningsHelpText": "Incluir avisos de integridade", - "IncludeManualGrabsHelpText": "Incluir Capturas Manuais feitas no Prowlarr", + "IncludeManualGrabsHelpText": "Incluir Capturas Manuais feitas no {appName}", "Indexer": "Indexador", "IndexerAlreadySetup": "Pelo menos uma instância do indexador já está configurada", "IndexerAuth": "Autenticação do indexador", @@ -196,13 +196,13 @@ "IndexerDisabled": "Indexador Desabilitado", "IndexerFailureRate": "Taxa de falha do indexador", "IndexerFlags": "Sinalizadores do indexador", - "IndexerHealthCheckNoIndexers": "Não há indexadores habilitados, o Prowlarr não retornará resultados para a pesquisa", + "IndexerHealthCheckNoIndexers": "Não há indexadores habilitados, o {appName} não retornará resultados para a pesquisa", "IndexerInfo": "Info do Indexador", "IndexerLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas por mais de 6 horas", "IndexerLongTermStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas por mais de 6 horas: {0}", "IndexerName": "Nome do Indexador", - "IndexerNoDefCheckMessage": "Os indexadores não têm definição e não funcionarão: {0}. Por favor, remova e (ou) adicione novamente ao Prowlarr", - "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao Prowlarr", + "IndexerNoDefCheckMessage": "Os indexadores não têm definição e não funcionarão: {0}. Por favor, remova e (ou) adicione novamente ao {appName}", + "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao {appName}", "IndexerPriority": "Prioridade do indexador", "IndexerPriorityHelpText": "Prioridade do Indexador de 1 (Mais Alta) a 50 (Mais Baixa). Padrão: 25.", "IndexerProxies": "Proxies do Indexador", @@ -232,7 +232,7 @@ "LastExecution": "Última Execução", "LastFailure": "Última Falha", "LastWriteTime": "Hora da Última Gravação", - "LaunchBrowserHelpText": " Abrir o navegador Web e navegar até a página inicial do Prowlarr ao iniciar o aplicativo.", + "LaunchBrowserHelpText": " Abrir o navegador Web e navegar até a página inicial do {appName} ao iniciar o aplicativo.", "Level": "Nível", "Link": "Link", "LogFiles": "Arquivos de registro", @@ -306,8 +306,8 @@ "Privacy": "Privacidade", "Private": "Privado", "Protocol": "Protocolo", - "ProwlarrSupportsAnyDownloadClient": "O Prowlarr é compatível com todos os clientes de download listados abaixo.", - "ProwlarrSupportsAnyIndexer": "Prowlarr suporte muitos indexadores em adição a qualquer indexador que use o padrão Newznab/Torznab usando 'Newznab Genérico' (para usenet) ou 'Torznab Genérico' (para torrents). Busque & Selecione seu indexador dos abaixo.", + "ProwlarrSupportsAnyDownloadClient": "O {appName} é compatível com todos os clientes de download listados abaixo.", + "ProwlarrSupportsAnyIndexer": "{appName} suporte muitos indexadores em adição a qualquer indexador que use o padrão Newznab/Torznab usando 'Newznab Genérico' (para usenet) ou 'Torznab Genérico' (para torrents). Busque & Selecione seu indexador dos abaixo.", "Proxies": "Proxies", "Proxy": "Proxy", "ProxyBypassFilterHelpText": "Use ',' como separador e '*.' como curinga para subdomínios", @@ -330,10 +330,10 @@ "ReadTheWikiForMoreInformation": "Leia o Wiki para obter mais informações", "Reddit": "Reddit", "Redirect": "Redirecionar", - "RedirectHelpText": "Redirecionar a solicitação de download de entrada para o indexador e passar diretamente para a obtenção, em vez de por proxy usando o Prowlarr", + "RedirectHelpText": "Redirecionar a solicitação de download de entrada para o indexador e passar diretamente para a obtenção, em vez de por proxy usando o {appName}", "Refresh": "Atualizar", "RefreshMovie": "Atualizar filme", - "ReleaseBranchCheckOfficialBranchMessage": "A ramificação {0} não é de uma versão válida para o Prowlarr, você não receberá atualizações", + "ReleaseBranchCheckOfficialBranchMessage": "A ramificação {0} não é de uma versão válida para o {appName}, você não receberá atualizações", "ReleaseStatus": "Status da versão", "Reload": "Recarregar", "Remove": "Remover", @@ -346,7 +346,7 @@ "ResetAPIKey": "Redefinir chave de API", "Restart": "Reiniciar", "RestartNow": "Reiniciar Agora", - "RestartProwlarr": "Reiniciar o Prowlarr", + "RestartProwlarr": "Reiniciar o {appName}", "RestartRequiredHelpTextWarning": "Requer reinicialização para entrar em vigor", "Restore": "Restaurar", "RestoreBackup": "Restaurar backup", @@ -390,7 +390,7 @@ "SettingsShortDateFormat": "Formato curto da data", "SettingsShowRelativeDates": "Mostrar datas relativas", "SettingsShowRelativeDatesHelpText": "Mostrar datas absolutas ou relativas (Hoje, Ontem, etc.)", - "SettingsSqlLoggingHelpText": "Registrar todas as consultas de SQL do Prowlarr", + "SettingsSqlLoggingHelpText": "Registrar todas as consultas de SQL do {appName}", "SettingsTimeFormat": "Formato de hora", "ShowAdvanced": "Mostrar opções avançadas", "ShowSearch": "Mostrar pesquisa", @@ -409,8 +409,8 @@ "SuggestTranslationChange": "Sugerir mudança de tradução", "SyncAppIndexers": "Sincronizar indexadores do aplicativo", "SyncLevel": "Nível de sincronização", - "SyncLevelAddRemove": "Adicione e remova somente: quando os indexadores são adicionados ou removidos do Prowlarr, ele atualizará este aplicativo remoto.", - "SyncLevelFull": "Full Sync: manterá totalmente os indexadores deste aplicativo em sincronia. As alterações feitas em indexadores em Prowlarr são então sincronizadas com este aplicativo. Qualquer alteração feita para indexadores remotamente dentro deste aplicativo será substituída por Prowlarr na próxima sincronização.", + "SyncLevelAddRemove": "Adicione e remova somente: quando os indexadores são adicionados ou removidos do {appName}, ele atualizará este aplicativo remoto.", + "SyncLevelFull": "Full Sync: manterá totalmente os indexadores deste aplicativo em sincronia. As alterações feitas em indexadores em {appName} são então sincronizadas com este aplicativo. Qualquer alteração feita para indexadores remotamente dentro deste aplicativo será substituída por {appName} na próxima sincronização.", "SyncProfile": "Perfil de Sincronização", "SyncProfiles": "Perfis de Sincronização", "System": "Sistema", @@ -449,7 +449,7 @@ "Type": "Tipo", "UI": "IU", "UILanguage": "Idioma da interface", - "UILanguageHelpText": "Idioma que o Prowlarr usará para a interface", + "UILanguageHelpText": "Idioma que o {appName} usará para a interface", "UILanguageHelpTextWarning": "É necessário recarregar o navegador", "UISettings": "Configurações da interface", "UISettingsSummary": "Opções de daltonismo, data e idioma", @@ -479,7 +479,7 @@ "UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.", "UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.", "UpdateCheckUINotWritableMessage": "Não é possível instalar a atualização porque a pasta de IU '{0}' não pode ser gravada pelo usuário '{1}'.", - "UpdateMechanismHelpText": "Usar o atualizador integrado do Prowlarr ou um script", + "UpdateMechanismHelpText": "Usar o atualizador integrado do {appName} ou um script", "UpdateScriptPathHelpText": "Caminho para um script personalizado que usa um pacote de atualização extraído e lida com o restante do processo de atualização", "Updates": "Atualizações", "Uptime": "Tempo de atividade", @@ -531,7 +531,7 @@ "FoundCountReleases": "Encontrou {itemCount} lançamentos", "DeleteSelectedIndexer": "Excluir indexador selecionado", "IndexerCategories": "Categorias do indexador", - "IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para capturas feitas no Prowlarr a partir deste indexador", + "IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para capturas feitas no {appName} a partir deste indexador", "IndexerStatus": "Status do indexador", "ManageApplications": "Gerenciar aplicativos", "NoHistoryFound": "Nenhum histórico encontrado", @@ -548,7 +548,7 @@ "NewznabUrl": "Url Newznab", "TorznabUrl": "Url Torznab", "GoToApplication": "Ir para o aplicativo", - "AreYouSureYouWantToDeleteIndexer": "Tem certeza de que deseja excluir '{name}' do Prowlarr?", + "AreYouSureYouWantToDeleteIndexer": "Tem certeza de que deseja excluir '{name}' do {appName}?", "AuthQueries": "Consultas de autenticação", "RssQueries": "Consultas RSS", "SearchQueries": "Consultas de pesquisa", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 6e302ffaa..a20ff75e0 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -112,7 +112,7 @@ "Restart": "Repornește", "Reload": "Reîncarcă", "ReleaseStatus": "Statusul apariției", - "ReleaseBranchCheckOfficialBranchMessage": "Branchul {0} nu este un branch Prowlarr valid, nu vei primi actualizări", + "ReleaseBranchCheckOfficialBranchMessage": "Branchul {0} nu este un branch {appName} valid, nu vei primi actualizări", "Refresh": "Reîmprospătează", "Queue": "Coadă", "New": "Nou", @@ -124,7 +124,7 @@ "SettingsTimeFormat": "Format ora", "RSSIsNotSupportedWithThisIndexer": "RSS nu este suportat de acest indexator", "ShowSearchHelpText": "Afișați butonul de căutare pe hover", - "UILanguageHelpText": "Limba pe care Prowlarr o va folosi pentru interfața de utilizare", + "UILanguageHelpText": "Limba pe care {appName} o va folosi pentru interfața de utilizare", "UILanguageHelpTextWarning": "Reîncărcare browser necesară", "Wiki": "Wiki", "YesCancel": "Da, Anulați", @@ -132,19 +132,19 @@ "DeleteNotificationMessageText": "Sigur doriți să ștergeți notificarea „{0}”?", "DeleteTag": "Ștergeți eticheta", "AddingTag": "Se adaugă etichetă", - "LaunchBrowserHelpText": " Deschideți un browser web și navigați la pagina de pornire Prowlarr la pornirea aplicației.", + "LaunchBrowserHelpText": " Deschideți un browser web și navigați la pagina de pornire {appName} la pornirea aplicației.", "AppDataDirectory": "Directorul AppData", "ApplicationStatusCheckAllClientMessage": "Toate aplicațiile sunt indisponibile datorită erorilor", "Authentication": "Autentificare", - "AuthenticationMethodHelpText": "Solicitați nume utilizator și parola pentru a accesa Prowlarr", + "AuthenticationMethodHelpText": "Solicitați nume utilizator și parola pentru a accesa {appName}", "AutomaticSearch": "Căutare automată", - "BackupFolderHelpText": "Căile relative vor fi în directorul AppData al lui Prowlarr", + "BackupFolderHelpText": "Căile relative vor fi în directorul AppData al lui {appName}", "BackupIntervalHelpText": "Interval între crearea copiile de rezervă automate", "Backups": "Copii de rezervă", "BeforeUpdate": "Înainte de actualizare", "BindAddressHelpText": "Adresă IP validă, localhost sau '*' pentru toate interfețele", "Branch": "Ramură", - "BranchUpdate": "Ramură utilizată pentru a actualiza Prowlarr", + "BranchUpdate": "Ramură utilizată pentru a actualiza {appName}", "BranchUpdateMechanism": "Ramură utilizată de mecanismul extern de actualizare", "BypassProxyForLocalAddresses": "Nu folosiți Proxy pentru adrese locale", "CancelPendingTask": "Sigur doriți să anulați această sarcină în așteptare?", @@ -153,7 +153,7 @@ "ClientPriority": "Prioritate client", "CloseCurrentModal": "Închideți modul curent", "EnableAutomaticSearch": "Activați căutarea automată", - "EnableAutomaticSearchHelpText": "Va fi utilizat atunci când căutările automate sunt efectuate prin interfața de utilizare sau de către Prowlarr", + "EnableAutomaticSearchHelpText": "Va fi utilizat atunci când căutările automate sunt efectuate prin interfața de utilizare sau de către {appName}", "EnableInteractiveSearchHelpText": "Va fi utilizat atunci când este utilizată căutarea interactivă", "ForMoreInformationOnTheIndividualDownloadClients": "Pentru mai multe informații despre clienții individuali de descărcare, faceți clic pe butoanele de informații.", "IllRestartLater": "Voi reporni mai târziu", @@ -220,8 +220,8 @@ "UnableToLoadNotifications": "Nu se pot încărca notificările", "UnableToLoadTags": "Nu se pot încărca etichete", "UnableToLoadUISettings": "Nu se pot încărca setările UI", - "UpdateMechanismHelpText": "Utilizați actualizatorul încorporat al lui Prowlarr sau un script", - "AnalyticsEnabledHelpText": "Trimiteți informații anonime privind utilizarea și erorile către serverele Prowlarr. Aceasta include informații despre browserul folosit, ce pagini WebUI Prowlarr utilizați, raportarea erorilor, precum și sistemul de operare și versiunea de execuție. Vom folosi aceste informații pentru a acorda prioritate caracteristicilor și remedierilor de erori.", + "UpdateMechanismHelpText": "Utilizați actualizatorul încorporat al lui {appName} sau un script", + "AnalyticsEnabledHelpText": "Trimiteți informații anonime privind utilizarea și erorile către serverele {appName}. Aceasta include informații despre browserul folosit, ce pagini WebUI {appName} utilizați, raportarea erorilor, precum și sistemul de operare și versiunea de execuție. Vom folosi aceste informații pentru a acorda prioritate caracteristicilor și remedierilor de erori.", "ApiKey": "Cheie API", "BackupRetentionHelpText": "Copiile de rezervă automate mai vechi decât perioada de păstrare vor fi curățate automat", "BindAddress": "Adresa de legare", @@ -326,10 +326,10 @@ "Yes": "Da", "IndexerSettingsSummary": "Configurați diverse setări globale indexatoare inclusiv proxiuri.", "EnableRssHelpText": "Activați flux RSS pentru indexator", - "IndexerHealthCheckNoIndexers": "Niciun indexator nu este activat, Prowlarr nu va returna rezultate la căutare.", + "IndexerHealthCheckNoIndexers": "Niciun indexator nu este activat, {appName} nu va returna rezultate la căutare.", "IndexerProxy": "Proxy indexator", "IndexerVipCheckExpiredClientMessage": "Beneficiile VIP pentru indexator au expirat: {0}", - "IndexerNoDefCheckMessage": "Indexatorii nu au definiție și nu vor funcționa: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în Prowlarr", + "IndexerNoDefCheckMessage": "Indexatorii nu au definiție și nu vor funcționa: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în {appName}", "IndexerRss": "RSS indexator", "EnabledRedirected": "Activat, Redirecționat", "Ended": "Încheiat", @@ -346,7 +346,7 @@ "IndexerSite": "Site indexator", "IndexerTagsHelpText": "Folosiți etichete pentru a specifica proxiurile indexatoarelor, cu ce aplicații sunt sincronizate indexatoarele, sau doar pentru a le organiza.", "SyncAppIndexers": "Sincronizați indexatoare aplicații", - "SyncLevelAddRemove": "Doar adaugă și șterge: Când indexatoarele sunt adăugate sau șterse din Prowlarr, va actualiza această aplicație.", + "SyncLevelAddRemove": "Doar adaugă și șterge: Când indexatoarele sunt adăugate sau șterse din {appName}, va actualiza această aplicație.", "DeleteIndexerProxy": "Ștergeți proxy indexator", "UnableToLoadIndexerProxies": "Nu se pot încărca proxiurile indexatoarelor", "SettingsIndexerLoggingHelpText": "Logați informații adiționale despre indexatoare, inclusiv răspunsul", @@ -354,14 +354,14 @@ "AddNewIndexer": "Adăugați indexator nou", "IndexerAlreadySetup": "Cel puțin o instanță de indexator e deja configurată", "MinimumSeedersHelpText": "Seederi necesari pentru ca aplicația să descarce folosind indexatorul", - "ProwlarrSupportsAnyIndexer": "Prowlarr suportă multe indexatoare pe lângă orice indexator ce folosește standardul Newznab/Torznab folosind 'Generic Newznab' (pentru usenet) sau 'Generic Torznab' (pentru torrent). Căutați și selectați-vă indexatorul mai jos.", - "RedirectHelpText": "Redirecționați cererile de descărcare pentru indexator și predați descărcarea direct, in loc de a-o trece prin Prowlarr", + "ProwlarrSupportsAnyIndexer": "{appName} suportă multe indexatoare pe lângă orice indexator ce folosește standardul Newznab/Torznab folosind 'Generic Newznab' (pentru usenet) sau 'Generic Torznab' (pentru torrent). Căutați și selectați-vă indexatorul mai jos.", + "RedirectHelpText": "Redirecționați cererile de descărcare pentru indexator și predați descărcarea direct, in loc de a-o trece prin {appName}", "SearchIndexers": "Căutare folosind indexatoare", "SettingsIndexerLogging": "Logare îmbunătățită indexator", - "SyncLevelFull": "Sincronizare completă: Va păstra indexatoarele acestei aplicații sincronizate complet. Schimbările făcute indexatoarelor în Prowlarr sunt sincronizate cu această aplicație. Orice schimbare făcută indexatoarelor în această aplicație vor fi șterse la următoarea sincronizare cu Prowlarr.", + "SyncLevelFull": "Sincronizare completă: Va păstra indexatoarele acestei aplicații sincronizate complet. Schimbările făcute indexatoarelor în {appName} sunt sincronizate cu această aplicație. Orice schimbare făcută indexatoarelor în această aplicație vor fi șterse la următoarea sincronizare cu {appName}.", "Encoding": "Encodare", "FullSync": "Sincronizare completă", - "IndexerObsoleteCheckMessage": "Indexatorii sunt învechiți sau nu au fost actualizați: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în Prowlarr", + "IndexerObsoleteCheckMessage": "Indexatorii sunt învechiți sau nu au fost actualizați: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în {appName}", "IndexerProxies": "Proxiuri indexatoare", "IndexerVipCheckExpiringClientMessage": "Beneficiile VIP pentru indexator expiră în curând: {0}", "ApplicationLongTermStatusCheckAllClientMessage": "Toate aplicațiile sunt indisponibile din cauza unor eșecuri pentru mai mult de 6 ore", @@ -374,7 +374,7 @@ "NextExecution": "Următoarea execuție", "Remove": "Elimina", "Replace": "A inlocui", - "TheLatestVersionIsAlreadyInstalled": "Cea mai recentă versiune a Prowlarr este deja instalată", + "TheLatestVersionIsAlreadyInstalled": "Cea mai recentă versiune a {appName} este deja instalată", "AddApplication": "Adaugă", "AddCustomFilter": "Adaugă filtru personalizat", "Track": "Urmă", @@ -407,7 +407,7 @@ "GoToApplication": "Mergeți la aplicație", "QueryType": "Tipul interogării", "AuthQueries": "Interogări de autentificare", - "AreYouSureYouWantToDeleteIndexer": "Sigur doriți să ștergeți '{0}' din Prowlarr?", + "AreYouSureYouWantToDeleteIndexer": "Sigur doriți să ștergeți '{0}' din {appName}?", "RssQueries": "Interogări RSS", "SearchQueries": "Interogări de căutare", "days": "zile", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 628fba304..24a1699d4 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -83,22 +83,22 @@ "KeyboardShortcuts": "Горячие клавиши", "Language": "Язык", "LastWriteTime": "Последнее время записи", - "LaunchBrowserHelpText": " Открывать браузер и переходить на страницу Prowlarr при запуске программы.", + "LaunchBrowserHelpText": " Открывать браузер и переходить на страницу {appName} при запуске программы.", "Level": "Уровень", "Ok": "Ok", "AddDownloadClient": "Добавить программу для скачивания", - "UpdateMechanismHelpText": "Используйте встроенную в Prowlarr функцию обновления или скрипт", + "UpdateMechanismHelpText": "Используйте встроенную в {appName} функцию обновления или скрипт", "IndexerStatusCheckSingleClientMessage": "Индексаторы недоступны из-за ошибок: {0}", "NoTagsHaveBeenAddedYet": "Теги еще не добавлены", "UnableToLoadTags": "Невозможно загрузить теги", - "AnalyticsEnabledHelpText": "Отправлять в Prowlarr информацию о использовании и ошибках. Анонимная статистика включает в себя информацию о браузере, какие страницы загружены, сообщения об ошибках, а так же операционной системе. Мы используем эту информацию для выявления ошибок, а так же для разработки нового функционала.", - "AuthenticationMethodHelpText": "Необходим логин и пароль для доступа в Prowlarr", - "BackupFolderHelpText": "Относительные пути будут в каталоге AppData Prowlarr", + "AnalyticsEnabledHelpText": "Отправлять в {appName} информацию о использовании и ошибках. Анонимная статистика включает в себя информацию о браузере, какие страницы загружены, сообщения об ошибках, а так же операционной системе. Мы используем эту информацию для выявления ошибок, а так же для разработки нового функционала.", + "AuthenticationMethodHelpText": "Необходим логин и пароль для доступа в {appName}", + "BackupFolderHelpText": "Относительные пути будут в каталоге AppData {appName}", "BeforeUpdate": "До обновления", "BindAddress": "Привязать адрес", "BindAddressHelpText": "Действительный IP-адрес, локальный адрес или '*' для всех интерфейсов", "Branch": "Ветка", - "BranchUpdate": "Ветвь для обновления Prowlarr", + "BranchUpdate": "Ветвь для обновления {appName}", "BranchUpdateMechanism": "Ветвь, используемая внешним механизмом обновления", "BypassProxyForLocalAddresses": "Обход прокси для локальных адресов", "Cancel": "Отменить", @@ -131,7 +131,7 @@ "DownloadClientStatusCheckAllClientMessage": "Все клиенты для скачивания недоступны из-за ошибок", "DownloadClientStatusCheckSingleClientMessage": "Клиенты для скачивания недоступны из-за ошибок: {0}", "EnableAutomaticSearch": "Включить автоматический поиск", - "EnableAutomaticSearchHelpText": "Будет использовано для автоматических поисков через интерфейс или Prowlarr", + "EnableAutomaticSearchHelpText": "Будет использовано для автоматических поисков через интерфейс или {appName}", "Enabled": "Включено", "EnableInteractiveSearch": "Включить интерактивный поиск", "EnableRss": "Включить RSS", @@ -185,7 +185,7 @@ "ProxyUsernameHelpText": "Нужно ввести имя пользователя и пароль только если они необходимы. В противном случае оставьте их пустыми.", "Queue": "Очередь", "ReadTheWikiForMoreInformation": "Прочтите Wiki для получения дополнительной информации", - "ReleaseBranchCheckOfficialBranchMessage": "Ветка {0} не является допустимой веткой выпуска Prowlarr, вы не будете получать обновления", + "ReleaseBranchCheckOfficialBranchMessage": "Ветка {0} не является допустимой веткой выпуска {appName}, вы не будете получать обновления", "ReleaseStatus": "Статус релиза", "Reload": "Перезагрузить", "RemovedFromTaskQueue": "Удалено из очереди задач", @@ -276,7 +276,7 @@ "View": "Просмотр", "AddingTag": "Добавить ярлык", "SSLPort": "SSL порт", - "UILanguageHelpText": "Язык, который Prowlarr будет использовать для пользовательского интерфейса", + "UILanguageHelpText": "Язык, который {appName} будет использовать для пользовательского интерфейса", "EnableSslHelpText": " Требуется перезапуск от администратора", "ErrorLoadingContents": "Ошибка при загрузке содержимого", "Events": "События", @@ -328,7 +328,7 @@ "AddNewIndexer": "Добавить Новый Индексатор", "AddToDownloadClient": "Добавить выпуск в Загрузочный клиент", "AddedToDownloadClient": "Выпуск добавлен в клиент", - "AddDownloadClientToProwlarr": "Добавление клиента загрузки позволяет Prowlarr отправлять выпуски прямо из пользовательского интерфейса, выполняя поиск вручную.", + "AddDownloadClientToProwlarr": "Добавление клиента загрузки позволяет {appName} отправлять выпуски прямо из пользовательского интерфейса, выполняя поиск вручную.", "AddIndexerProxy": "Добавить индексатор прокси", "Connect": "Оповещения", "Notification": "Оповещения", @@ -351,7 +351,7 @@ "ThemeHelpText": "Измените тему пользовательского интерфейса приложения, тема «Авто» будет использовать тему вашей ОС для установки светлого или темного режима. Вдохновленный Theme.Park", "Remove": "Удалить", "Replace": "Заменить", - "TheLatestVersionIsAlreadyInstalled": "Последняя версия Prowlarr уже установлена", + "TheLatestVersionIsAlreadyInstalled": "Последняя версия {appName} уже установлена", "ApplicationURL": "URL-адрес приложения", "ApplicationUrlHelpText": "Внешний URL-адрес этого приложения, включая http(s)://, порт и базовый URL-адрес", "Label": "Ярлык", diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index 3baebcc99..926f6ada0 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -35,10 +35,10 @@ "DeleteNotificationMessageText": "Naozaj chcete zmazať značku formátu {0} ?", "DeleteTagMessageText": "Naozaj chcete zmazať značku formátu {0} ?", "AllIndexersHiddenDueToFilter": "Všetky filmy sú skryté kvôli použitému filtru.", - "AnalyticsEnabledHelpText": "Odosielajte anonymné informácie o používaní a chybách na servery Prowlarru. To zahŕňa informácie o vašom prehliadači, ktoré stránky Prowlarr WebUI používate, hlásenia chýb a taktiež verziu operačného systému a spúšťacieho prostredia. Tieto informácie použijeme k uprednostňovaniu funkcií a oprav chýb.", - "AuthenticationMethodHelpText": "Vyžadovať používateľské meno a heslo pre prístup k Prowlarru", - "BackupFolderHelpText": "Relatívne cesty budú v priečinku AppData Prowlarru", - "BranchUpdate": "Vetva, ktorá sa má použiť k aktualizácií Prowlarru", + "AnalyticsEnabledHelpText": "Odosielajte anonymné informácie o používaní a chybách na servery {appName}u. To zahŕňa informácie o vašom prehliadači, ktoré stránky {appName} WebUI používate, hlásenia chýb a taktiež verziu operačného systému a spúšťacieho prostredia. Tieto informácie použijeme k uprednostňovaniu funkcií a oprav chýb.", + "AuthenticationMethodHelpText": "Vyžadovať používateľské meno a heslo pre prístup k {appName}u", + "BackupFolderHelpText": "Relatívne cesty budú v priečinku AppData {appName}u", + "BranchUpdate": "Vetva, ktorá sa má použiť k aktualizácií {appName}u", "DeleteDownloadClientMessageText": "Naozaj chcete zmazať značku formátu {0} ?", "ChangeHasNotBeenSavedYet": "Zmena ešte nebola uložená", "Clear": "Vymazať", @@ -77,7 +77,7 @@ "Host": "Hostiteľ", "Hostname": "Názov hostiteľa", "Info": "Info", - "UpdateMechanismHelpText": "Použiť vstavaný Prowlarr aktualizátor alebo skript", + "UpdateMechanismHelpText": "Použiť vstavaný {appName} aktualizátor alebo skript", "Events": "Udalosť", "Grabs": "Grab", "Indexers": "Indexery", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 863f87dc3..a61b5e976 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -57,7 +57,7 @@ "Scheduled": "Schemalagt", "SaveChanges": "Spara ändringar", "RestoreBackup": "Återställ säkerhetskopia", - "ReleaseBranchCheckOfficialBranchMessage": "Gren {0} är inte en giltig gren av Prowlarr, du kommer ej erhålla uppdateringar", + "ReleaseBranchCheckOfficialBranchMessage": "Gren {0} är inte en giltig gren av {appName}, du kommer ej erhålla uppdateringar", "Refresh": "Uppdatera", "Queue": "Kö", "ProxyCheckResolveIpMessage": "Misslyckades att slå upp IP-adressen till konfigurerad proxyvärd {0}", @@ -145,7 +145,7 @@ "ShowSearchHelpText": "Visa sökknappen på svävaren", "ConnectSettings": "Anslutnings inställningar", "EditIndexer": "Redigera indexerare", - "EnableAutomaticSearchHelpText": "Används när automatiska sökningar utförs via användargränssnittet eller av Prowlarr", + "EnableAutomaticSearchHelpText": "Används när automatiska sökningar utförs via användargränssnittet eller av {appName}", "Password": "Lösenord", "Port": "Port", "Add": "Lägg till", @@ -182,7 +182,7 @@ "StartupDirectory": "Startkatalog", "TestAllClients": "Testa samtliga klienter", "Today": "Idag", - "UILanguageHelpText": "Språk som Prowlarr kommer att använda för användargränssnitt", + "UILanguageHelpText": "Språk som {appName} kommer att använda för användargränssnitt", "UISettings": "UI-inställningar", "UnableToLoadNotifications": "Det gick inte att läsa in aviseringar", "UnableToLoadTags": "Det gick inte att ladda taggar", @@ -209,11 +209,11 @@ "UnsavedChanges": "Osparade ändringar", "UpdateAutomaticallyHelpText": "Automatiskt ladda ned och installera uppdateringar. Du kommer fortfarande att kunna installera från System: Uppdateringar", "UrlBaseHelpText": "För omvänd proxy-stöd är standard tom", - "AnalyticsEnabledHelpText": "Skicka anonym användning och felinformation till Prowlarr's servrar. Detta inkluderar information i din webbläsare, vilka Prowlarr's WebUI-sidor du använder, felrapportering samt operativsystem och runtime-version. Vi kommer att använda denna information för att prioritera funktioner och buggfixar.", + "AnalyticsEnabledHelpText": "Skicka anonym användning och felinformation till {appName}'s servrar. Detta inkluderar information i din webbläsare, vilka {appName}'s WebUI-sidor du använder, felrapportering samt operativsystem och runtime-version. Vi kommer att använda denna information för att prioritera funktioner och buggfixar.", "AppDataDirectory": "AppData-katalog", "ApplicationStatusCheckSingleClientMessage": "Listor otillgängliga på grund av fel: {0}", "BindAddressHelpText": "Giltig IP4-adress eller '*' för alla gränssnitt", - "BranchUpdate": "Gren att använda för att uppdatera Prowlarr", + "BranchUpdate": "Gren att använda för att uppdatera {appName}", "BranchUpdateMechanism": "Gren som används av extern uppdateringsmekanism", "BypassProxyForLocalAddresses": "Bypass Proxy för lokala adresser", "CancelPendingTask": "Är du säker på att du vill avbryta den väntande uppgiften?", @@ -246,7 +246,7 @@ "IndexerPriorityHelpText": "Indexeringsprioritet från 1 (högst) till 50 (lägst). Standard: 25.", "InteractiveSearch": "Interaktiv sökning", "Interval": "Intervall", - "LaunchBrowserHelpText": " Öppna en webbläsare och navigera till Prowlarr-hemsidan vid appstart.", + "LaunchBrowserHelpText": " Öppna en webbläsare och navigera till {appName}-hemsidan vid appstart.", "Logs": "Loggar", "Manual": "Manuell", "Mechanism": "Mekanism", @@ -295,9 +295,9 @@ "New": "Ny", "NoBackupsAreAvailable": "Inga säkerhetskopior tillgängliga", "NoLeaveIt": "Nej, lämna det", - "AuthenticationMethodHelpText": "Kräva användarnamn och lösenord för att komma åt Prowlarr", + "AuthenticationMethodHelpText": "Kräva användarnamn och lösenord för att komma åt {appName}", "AutomaticSearch": "Automatisk sökning", - "BackupFolderHelpText": "Relativa sökvägar finns under Prowlarr's AppData-katalog", + "BackupFolderHelpText": "Relativa sökvägar finns under {appName}'s AppData-katalog", "BackupIntervalHelpText": "Intervall mellan automatiska säkerhetskopior", "BackupRetentionHelpText": "Automatiska säkerhetskopior som är äldre än lagringsperioden rensas automatiskt", "Backups": "Säkerhetskopior", @@ -309,18 +309,18 @@ "LogLevel": "Loggnivå", "NoLogFiles": "Inga loggfiler", "UnableToLoadDownloadClients": "Det gick inte att ladda nedladdningsklienter", - "UpdateMechanismHelpText": "Använd Prowlarrs inbyggda uppdaterare eller ett skript", - "AddDownloadClientToProwlarr": "Lägg till en nedladdningsklient tillåter Prowlarr att sända nyutgåvor direkt från UI:t samtidigt som en manuell sökning genomförs.", + "UpdateMechanismHelpText": "Använd {appName}s inbyggda uppdaterare eller ett skript", + "AddDownloadClientToProwlarr": "Lägg till en nedladdningsklient tillåter {appName} att sända nyutgåvor direkt från UI:t samtidigt som en manuell sökning genomförs.", "UnableToLoadIndexerProxies": "Kunde inte ladda Indexer Proxies", "UnableToLoadDevelopmentSettings": "Kunde inte ladda Utvecklingsinställningar", "UnableToLoadAppProfiles": "Kunde inte ladda app-profiler", "TestAllApps": "Testa Alla Appar", - "SyncLevelFull": "Full Synkronisering: Kommer att hålla den här appen fullständigt synkad. Ändringar gjorda i Prowlarr är sedan synkade till den här appen. Några ändringar gjorda fjärrvis kommer bli överskrivna av Prowlarr under nästa synkning.", - "SyncLevelAddRemove": "Lägg till och Ta bort Endast: När det är tillagt eller borttaget från Prowlarr, det kommer uppdatera den här fjärrstyrda appen.", + "SyncLevelFull": "Full Synkronisering: Kommer att hålla den här appen fullständigt synkad. Ändringar gjorda i {appName} är sedan synkade till den här appen. Några ändringar gjorda fjärrvis kommer bli överskrivna av {appName} under nästa synkning.", + "SyncLevelAddRemove": "Lägg till och Ta bort Endast: När det är tillagt eller borttaget från {appName}, det kommer uppdatera den här fjärrstyrda appen.", "SyncLevel": "Synka Nivå", "SyncAppIndexers": "Synka App Indexers", "Stats": "Statistik", - "SettingsSqlLoggingHelpText": "Logga alla SQL frågor från Prowlarr", + "SettingsSqlLoggingHelpText": "Logga alla SQL frågor från {appName}", "SettingsLogSql": "Logga Sql", "SettingsLogRotateHelpText": "Största nummer av loggfiler att ha sparat i logg-mappen", "SettingsLogRotate": "Logga Rotation", @@ -330,12 +330,12 @@ "SettingsFilterSentryEvents": "Filtrera Analytiska Events", "SettingsConsoleLogLevel": "Konsol Logg Nivå", "SearchIndexers": "Sök Indexers", - "RestartProwlarr": "Starta om Prowlarr", - "RedirectHelpText": "Omdirigera inkomna nedladdningsförfrågningar för indexer och hoppa över \"hämta direkt\" istället för proxying förfrågan via Prowlarr", + "RestartProwlarr": "Starta om {appName}", + "RedirectHelpText": "Omdirigera inkomna nedladdningsförfrågningar för indexer och hoppa över \"hämta direkt\" istället för proxying förfrågan via {appName}", "Redirect": "Omdirigera", "Query": "Fråga", - "ProwlarrSupportsAnyIndexer": "Prowlarr stödjer många indexers i komplettering till vilken indexer som helst, som använder Newznab/Torznab standard användning 'Generic Newznab' (för usenet) eller 'Generic Torznab' (för torrents). Sök & Markera dina indexers nedan.", - "ProwlarrSupportsAnyDownloadClient": "Prowlarr stödjer alla nedladdningsklienter listade nedan.", + "ProwlarrSupportsAnyIndexer": "{appName} stödjer många indexers i komplettering till vilken indexer som helst, som använder Newznab/Torznab standard användning 'Generic Newznab' (för usenet) eller 'Generic Torznab' (för torrents). Sök & Markera dina indexers nedan.", + "ProwlarrSupportsAnyDownloadClient": "{appName} stödjer alla nedladdningsklienter listade nedan.", "Privacy": "Privat", "NotificationTriggersHelpText": "Markera vilka event som ska utlösa den här notifikationen", "Notification": "Notifikation", @@ -350,8 +350,8 @@ "IndexerQuery": "Indexer Fråga", "IndexerProxy": "Indexer Proxy", "IndexerProxies": "Indexer Proxies", - "IndexerObsoleteCheckMessage": "Indexer är obsolete eller har blivit uppdaterad: {0}. Var god ta bort och (eller) lägg till igen i Prowlarr", - "IndexerHealthCheckNoIndexers": "Ingen indexer aktiverad, Prowlarr kommer inte returnera sökresultat", + "IndexerObsoleteCheckMessage": "Indexer är obsolete eller har blivit uppdaterad: {0}. Var god ta bort och (eller) lägg till igen i {appName}", + "IndexerHealthCheckNoIndexers": "Ingen indexer aktiverad, {appName} kommer inte returnera sökresultat", "IndexerAuth": "Indexer Författa", "Id": "Id", "FullSync": "Full Synkronisering", @@ -365,7 +365,7 @@ "DeleteAppProfile": "Radera App Profil", "DeleteApplication": "Radera Applikation", "Notifications": "Anslut", - "ClearHistoryMessageText": "Är du säker på att du vill rensa all Prowlarr historik?", + "ClearHistoryMessageText": "Är du säker på att du vill rensa all {appName} historik?", "ClearHistory": "Rensa Historik", "Category": "Kategori", "AddToDownloadClient": "Lägg till nyutgåva i nedladdningsklienten", @@ -374,7 +374,7 @@ "AddIndexerProxy": "Lägg till Indexer Proxy", "AddedToDownloadClient": "Nyutgåva lades till i klienten", "Auth": "Förafa", - "AppSettingsSummary": "Applikationer och inställningar för att konfigurera hur Prowlarr interagerar med PVR program", + "AppSettingsSummary": "Applikationer och inställningar för att konfigurera hur {appName} interagerar med PVR program", "Apps": "Appar", "AppProfileSelectHelpText": "App profiler är använda för att kontrollera RSS, Automatisk Sökning och interaktiv Sökningsinställningar på applikationen sync", "AppProfileInUse": "App Profil i användning", @@ -402,7 +402,7 @@ "Queued": "Köad", "Remove": "Ta bort", "Replace": "Ersätta", - "TheLatestVersionIsAlreadyInstalled": "Den senaste versionen av Prowlarr är redan installerad", + "TheLatestVersionIsAlreadyInstalled": "Den senaste versionen av {appName} är redan installerad", "ApplicationURL": "Applikations-URL", "ApplicationUrlHelpText": "Denna applikations externa URL inklusive http(s)://, port och URL-bas", "Episode": "Avsnitt", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index e4418e817..ad11466ee 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -10,7 +10,7 @@ "AllIndexersHiddenDueToFilter": "ภาพยนตร์ทั้งหมดถูกซ่อนเนื่องจากใช้ฟิลเตอร์", "Analytics": "การวิเคราะห์", "Backup": "การสำรองข้อมูล", - "BackupFolderHelpText": "เส้นทางสัมพัทธ์จะอยู่ภายใต้ไดเรกทอรี AppData ของ Prowlarr", + "BackupFolderHelpText": "เส้นทางสัมพัทธ์จะอยู่ภายใต้ไดเรกทอรี AppData ของ {appName}", "IncludeHealthWarningsHelpText": "รวมคำเตือนด้านสุขภาพ", "PortNumber": "หมายเลขพอร์ต", "Restart": "เริ่มต้นใหม่", @@ -21,7 +21,7 @@ "Info": "ข้อมูล", "InteractiveSearch": "การค้นหาแบบโต้ตอบ", "LastWriteTime": "เวลาเขียนล่าสุด", - "LaunchBrowserHelpText": " เปิดเว็บเบราว์เซอร์และไปที่หน้าแรกของ Prowlarr เมื่อเริ่มแอป", + "LaunchBrowserHelpText": " เปิดเว็บเบราว์เซอร์และไปที่หน้าแรกของ {appName} เมื่อเริ่มแอป", "Mode": "โหมด", "MoreInfo": "ข้อมูลเพิ่มเติม", "MovieIndexScrollBottom": "ดัชนีภาพยนตร์: เลื่อนด้านล่าง", @@ -54,7 +54,7 @@ "TestAllClients": "ทดสอบลูกค้าทั้งหมด", "Time": "เวลา", "Title": "หัวข้อ", - "UILanguageHelpText": "ภาษาที่ Prowlarr จะใช้สำหรับ UI", + "UILanguageHelpText": "ภาษาที่ {appName} จะใช้สำหรับ UI", "UILanguageHelpTextWarning": "จำเป็นต้องโหลดเบราว์เซอร์ใหม่", "UnableToAddANewIndexerPleaseTryAgain": "ไม่สามารถเพิ่มตัวสร้างดัชนีใหม่ได้โปรดลองอีกครั้ง", "UnableToAddANewIndexerProxyPleaseTryAgain": "ไม่สามารถเพิ่มตัวสร้างดัชนีใหม่ได้โปรดลองอีกครั้ง", @@ -123,7 +123,7 @@ "BeforeUpdate": "ก่อนการอัปเดต", "BindAddress": "ผูกที่อยู่", "BindAddressHelpText": "ที่อยู่ IP4 ที่ถูกต้องหรือ \"*\" สำหรับอินเทอร์เฟซทั้งหมด", - "BranchUpdate": "สาขาที่จะใช้ในการอัปเดต Prowlarr", + "BranchUpdate": "สาขาที่จะใช้ในการอัปเดต {appName}", "BranchUpdateMechanism": "สาขาที่ใช้โดยกลไกการอัพเดตภายนอก", "BypassProxyForLocalAddresses": "บายพาสพร็อกซีสำหรับที่อยู่ท้องถิ่น", "CancelPendingTask": "แน่ใจไหมว่าต้องการยกเลิกงานที่รอดำเนินการนี้", @@ -155,7 +155,7 @@ "EditIndexer": "แก้ไข Indexer", "Enable": "เปิดใช้งาน", "EnableAutomaticSearch": "เปิดใช้งานการค้นหาอัตโนมัติ", - "EnableAutomaticSearchHelpText": "จะใช้เมื่อทำการค้นหาอัตโนมัติผ่าน UI หรือโดย Prowlarr", + "EnableAutomaticSearchHelpText": "จะใช้เมื่อทำการค้นหาอัตโนมัติผ่าน UI หรือโดย {appName}", "Enabled": "เปิดใช้งาน", "EnableInteractiveSearch": "เปิดใช้งานการค้นหาแบบโต้ตอบ", "EnableInteractiveSearchHelpText": "จะใช้เมื่อใช้การค้นหาแบบโต้ตอบ", @@ -208,7 +208,7 @@ "SettingsShowRelativeDates": "แสดงวันที่สัมพัทธ์", "SettingsShowRelativeDatesHelpText": "แสดงญาติ (วันนี้ / เมื่อวาน / ฯลฯ ) หรือวันที่แน่นอน", "SettingsTimeFormat": "รูปแบบเวลา", - "UpdateMechanismHelpText": "ใช้ตัวอัปเดตหรือสคริปต์ในตัวของ Prowlarr", + "UpdateMechanismHelpText": "ใช้ตัวอัปเดตหรือสคริปต์ในตัวของ {appName}", "UnableToLoadGeneralSettings": "ไม่สามารถโหลดการตั้งค่าทั่วไป", "UnableToLoadHistory": "ไม่สามารถโหลดประวัติ", "UnableToLoadTags": "ไม่สามารถโหลดแท็ก", @@ -297,11 +297,11 @@ "UnableToAddANewApplicationPleaseTryAgain": "ไม่สามารถเพิ่มการแจ้งเตือนใหม่โปรดลองอีกครั้ง", "UnableToAddANewAppProfilePleaseTryAgain": "ไม่สามารถเพิ่มโปรไฟล์คุณภาพใหม่ได้โปรดลองอีกครั้ง", "UnableToAddANewDownloadClientPleaseTryAgain": "ไม่สามารถเพิ่มไคลเอนต์ดาวน์โหลดใหม่ได้โปรดลองอีกครั้ง", - "AnalyticsEnabledHelpText": "ส่งข้อมูลการใช้งานและข้อผิดพลาดโดยไม่ระบุชื่อไปยังเซิร์ฟเวอร์ของ Prowlarr ซึ่งรวมถึงข้อมูลบนเบราว์เซอร์ของคุณเพจ Prowlarr WebUI ที่คุณใช้การรายงานข้อผิดพลาดตลอดจนระบบปฏิบัติการและเวอร์ชันรันไทม์ เราจะใช้ข้อมูลนี้เพื่อจัดลำดับความสำคัญของคุณสมบัติและการแก้ไขข้อบกพร่อง", + "AnalyticsEnabledHelpText": "ส่งข้อมูลการใช้งานและข้อผิดพลาดโดยไม่ระบุชื่อไปยังเซิร์ฟเวอร์ของ {appName} ซึ่งรวมถึงข้อมูลบนเบราว์เซอร์ของคุณเพจ {appName} WebUI ที่คุณใช้การรายงานข้อผิดพลาดตลอดจนระบบปฏิบัติการและเวอร์ชันรันไทม์ เราจะใช้ข้อมูลนี้เพื่อจัดลำดับความสำคัญของคุณสมบัติและการแก้ไขข้อบกพร่อง", "AppDataLocationHealthCheckMessage": "การอัปเดตจะเป็นไปไม่ได้เพื่อป้องกันการลบ AppData ในการอัปเดต", "DeleteDownloadClientMessageText": "แน่ใจไหมว่าต้องการลบไคลเอนต์ดาวน์โหลด \"{0}\"", "PageSize": "ขนาดหน้า", - "ReleaseBranchCheckOfficialBranchMessage": "สาขา {0} ไม่ใช่สาขาการเผยแพร่ Prowlarr ที่ถูกต้องคุณจะไม่ได้รับการอัปเดต", + "ReleaseBranchCheckOfficialBranchMessage": "สาขา {0} ไม่ใช่สาขาการเผยแพร่ {appName} ที่ถูกต้องคุณจะไม่ได้รับการอัปเดต", "ReleaseStatus": "สถานะการเปิดตัว", "SaveSettings": "บันทึกการตั้งค่า", "Branch": "สาขา", @@ -329,7 +329,7 @@ "Queued": "อยู่ในคิว", "Remove": "ลบ", "Replace": "แทนที่", - "TheLatestVersionIsAlreadyInstalled": "มีการติดตั้ง Prowlarr เวอร์ชันล่าสุดแล้ว", + "TheLatestVersionIsAlreadyInstalled": "มีการติดตั้ง {appName} เวอร์ชันล่าสุดแล้ว", "Track": "ติดตาม", "DeleteSelectedApplicationsMessageText": "แน่ใจไหมว่าต้องการลบตัวสร้างดัชนี \"{0}\"", "ApplyTagsHelpTextAdd": "เพิ่ม: เพิ่มแท็กในรายการแท็กที่มีอยู่", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 617b7e5e5..86430e8b0 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -45,7 +45,7 @@ "Search": "Ara", "SaveChanges": "Değişiklikleri Kaydet", "ReleaseStatus": "Yayın Durumu", - "ReleaseBranchCheckOfficialBranchMessage": "Dal {0} geçerli bir Prowlarr sürüm dalı değil, güncelleme almayacaksınız", + "ReleaseBranchCheckOfficialBranchMessage": "Dal {0} geçerli bir {appName} sürüm dalı değil, güncelleme almayacaksınız", "Refresh": "Yenile", "Queue": "Sıra", "Protocol": "Protokol", @@ -113,7 +113,7 @@ "DeleteDownloadClient": "İndirme İstemcisini Sil", "DeleteDownloadClientMessageText": "İndirme istemcisini '{0}' silmek istediğinizden emin misiniz?", "DownloadClientSettings": "İstemci Ayarlarını İndir", - "EnableAutomaticSearchHelpText": "Kullanıcı arayüzü veya Prowlarr tarafından otomatik aramalar yapıldığında kullanılacaktır", + "EnableAutomaticSearchHelpText": "Kullanıcı arayüzü veya {appName} tarafından otomatik aramalar yapıldığında kullanılacaktır", "ForMoreInformationOnTheIndividualDownloadClients": "Bireysel indirme istemcileri hakkında daha fazla bilgi için bilgi düğmelerine tıklayın.", "Hostname": "Hostname", "OpenThisModal": "Bu Modeli Aç", @@ -134,14 +134,14 @@ "SendAnonymousUsageData": "Anonim Kullanım Verilerini Gönderin", "Age": "Yaş", "AllIndexersHiddenDueToFilter": "Uygulanan filtre nedeniyle tüm filmler gizlendi.", - "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini Prowlarr sunucularına gönderin. Bu, tarayıcınızla ilgili bilgileri, kullandığınız Prowlarr WebUI sayfalarını, hata raporlamasının yanı sıra işletim sistemi ve çalışma zamanı sürümünü içerir. Bu bilgileri, özellikleri ve hata düzeltmelerini önceliklendirmek için kullanacağız.", + "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Bu, tarayıcınızla ilgili bilgileri, kullandığınız {appName} WebUI sayfalarını, hata raporlamasının yanı sıra işletim sistemi ve çalışma zamanı sürümünü içerir. Bu bilgileri, özellikleri ve hata düzeltmelerini önceliklendirmek için kullanacağız.", "ApiKey": "API Anahtarı", "AppDataDirectory": "AppData dizini", "NoUpdatesAreAvailable": "Güncelleme yok", "OAuthPopupMessage": "Pop-up'lar tarayıcınız tarafından engelleniyor", "Ok": "Tamam", "OnHealthIssueHelpText": "Sağlık Sorunu Hakkında", - "BranchUpdate": "Prowlarr'ı güncellemek için kullanılacak dal", + "BranchUpdate": "{appName}'ı güncellemek için kullanılacak dal", "Close": "Kapat", "ApplicationStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", "ApplyTags": "Etiketleri Uygula", @@ -149,7 +149,7 @@ "Interval": "Aralık", "Logs": "Kütükler", "Authentication": "Doğrulama", - "AuthenticationMethodHelpText": "Prowlarr'a erişmek için Kullanıcı Adı ve Şifre gerektir", + "AuthenticationMethodHelpText": "{appName}'a erişmek için Kullanıcı Adı ve Şifre gerektir", "BackupIntervalHelpText": "Otomatik yedeklemeler arasındaki aralık", "BackupNow": "Şimdi yedekle", "BackupRetentionHelpText": "Saklama süresinden daha eski olan otomatik yedeklemeler otomatik olarak temizlenecektir", @@ -192,7 +192,7 @@ "Info": "Bilgi", "InteractiveSearch": "Etkileşimli Arama", "KeyboardShortcuts": "Klavye kısayolları", - "LaunchBrowserHelpText": " Bir web tarayıcısı açın ve uygulama başlangıcında Prowlarr ana sayfasına gidin.", + "LaunchBrowserHelpText": " Bir web tarayıcısı açın ve uygulama başlangıcında {appName} ana sayfasına gidin.", "LogLevel": "Günlük Düzeyi", "Mode": "Mod", "NoTagsHaveBeenAddedYet": "Henüz etiket eklenmedi", @@ -234,7 +234,7 @@ "Torrent": "Torrentler", "Torrents": "Torrentler", "Type": "Tür", - "UILanguageHelpText": "Prowlarr'ın UI için kullanacağı dil", + "UILanguageHelpText": "{appName}'ın UI için kullanacağı dil", "UILanguageHelpTextWarning": "Tarayıcının Yeniden Yüklenmesi Gerekiyor", "UISettings": "UI Ayarları", "UnableToAddANewAppProfilePleaseTryAgain": "Yeni bir kaliteli profil eklenemiyor, lütfen tekrar deneyin.", @@ -295,11 +295,11 @@ "Warn": "Uyar", "Wiki": "Wiki", "Apply": "Uygulamak", - "BackupFolderHelpText": "Göreli yollar Prowlarr'ın AppData dizini altında olacaktır", + "BackupFolderHelpText": "Göreli yollar {appName}'ın AppData dizini altında olacaktır", "Grabbed": "Yakalandı", "ProxyPasswordHelpText": "Gerekirse yalnızca bir kullanıcı adı ve şifre girmeniz gerekir. Aksi takdirde boş bırakın.", "UpdateAutomaticallyHelpText": "Güncellemeleri otomatik olarak indirin ve yükleyin. Yine de Sistem'den yükleyebileceksiniz: Güncellemeler", - "UpdateMechanismHelpText": "Prowlarr'ın yerleşik güncelleyicisini veya bir komut dosyasını kullanın", + "UpdateMechanismHelpText": "{appName}'ın yerleşik güncelleyicisini veya bir komut dosyasını kullanın", "ShowSearch": "Aramayı Göster", "UnableToLoadDownloadClients": "İndirme istemcileri yüklenemiyor", "UnableToLoadGeneralSettings": "Genel ayarlar yüklenemiyor", @@ -332,7 +332,7 @@ "ApplicationLongTermStatusCheckSingleClientMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {0}", "Remove": "Kaldırmak", "Replace": "Değiştir", - "TheLatestVersionIsAlreadyInstalled": "Prowlarr'ın en son sürümü zaten kurulu", + "TheLatestVersionIsAlreadyInstalled": "{appName}'ın en son sürümü zaten kurulu", "ApplyTagsHelpTextAdd": "Ekle: Etiketleri mevcut etiket listesine ekleyin", "ApplyTagsHelpTextHowToApplyApplications": "Seçilen filmlere etiketler nasıl uygulanır", "ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 0a40b4211..936fa31db 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -53,12 +53,12 @@ "Close": "Закрити", "CloseCurrentModal": "Закрити поточне вікно", "Columns": "Колонки", - "AuthenticationMethodHelpText": "Для доступу до Prowlarr потрібні ім’я користувача та пароль", - "BackupFolderHelpText": "Відносні шляхи будуть у каталозі AppData Prowlarr", + "AuthenticationMethodHelpText": "Для доступу до {appName} потрібні ім’я користувача та пароль", + "BackupFolderHelpText": "Відносні шляхи будуть у каталозі AppData {appName}", "BindAddressHelpText": "Дійсна адреса IP або '*' для всіх інтерфейсів", - "BranchUpdate": "Гілка для оновлення Prowlarr", + "BranchUpdate": "Гілка для оновлення {appName}", "AllIndexersHiddenDueToFilter": "Всі фільми заховані відповідно до фільтра.", - "AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери Prowlarr. Це включає інформацію про ваш веб-переглядач, які сторінки Prowlarr WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.", + "AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери {appName}. Це включає інформацію про ваш веб-переглядач, які сторінки {appName} WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.", "Delete": "Видалити", "DeleteApplicationMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{0}'?", "DeleteTagMessageText": "Ви впевнені, що хочете видалити тег {0} ?", @@ -308,11 +308,11 @@ "SSLCertPassword": "Пароль SSL сертифіката", "MaintenanceRelease": "Випуск для обслуговування: виправлення помилок та інші покращення. Щоб отримати докладнішу інформацію, перегляньте історію фіксації Github", "ThemeHelpText": "Змініть тему інтерфейсу додатка, тема «Авто» використовуватиме вашу тему ОС, щоб установити світлий або темний режим. Натхненний Theme.Park", - "UILanguageHelpText": "Мова, яку Prowlarr використовуватиме для інтерфейсу користувача", - "UpdateMechanismHelpText": "Використовуйте вбудований засіб оновлення Prowlarr або скрипт", + "UILanguageHelpText": "Мова, яку {appName} використовуватиме для інтерфейсу користувача", + "UpdateMechanismHelpText": "Використовуйте вбудований засіб оновлення {appName} або скрипт", "ApplicationStatusCheckSingleClientMessage": "Списки недоступні через помилки: {0}", "ApplicationStatusCheckAllClientMessage": "Усі списки недоступні через помилки", - "LaunchBrowserHelpText": " Відкрийте веб-браузер і перейдіть на домашню сторінку Prowlarr під час запуску програми.", + "LaunchBrowserHelpText": " Відкрийте веб-браузер і перейдіть на домашню сторінку {appName} під час запуску програми.", "Torrent": "Торренти", "TagsHelpText": "Застосовується до фільмів із принаймні одним відповідним тегом", "EnableRss": "Увімкнути RSS", @@ -320,12 +320,12 @@ "HistoryCleanupDaysHelpTextWarning": "Файли в кошику, старші за вибрану кількість днів, будуть очищені автоматично", "IndexerProxyStatusCheckAllClientMessage": "Усі індексатори недоступні через збої", "IndexerProxyStatusCheckSingleClientMessage": "Індексатори недоступні через помилки: {0}", - "ReleaseBranchCheckOfficialBranchMessage": "Гілка {0} не є дійсною гілкою випуску Prowlarr, ви не отримуватимете оновлення", + "ReleaseBranchCheckOfficialBranchMessage": "Гілка {0} не є дійсною гілкою випуску {appName}, ви не отримуватимете оновлення", "UnableToAddANewApplicationPleaseTryAgain": "Не вдалося додати нове сповіщення, спробуйте ще раз.", "UnableToAddANewAppProfilePleaseTryAgain": "Не вдалося додати новий профіль якості, спробуйте ще раз.", "UnableToAddANewIndexerProxyPleaseTryAgain": "Не вдалося додати новий індексатор, спробуйте ще раз.", "UserAgentProvidedByTheAppThatCalledTheAPI": "Агент користувача, наданий програмою, яка викликала API", - "EnableAutomaticSearchHelpText": "Використовуватиметься, коли автоматичний пошук виконується через інтерфейс користувача або Prowlarr", + "EnableAutomaticSearchHelpText": "Використовуватиметься, коли автоматичний пошук виконується через інтерфейс користувача або {appName}", "Encoding": "Кодування", "ForMoreInformationOnTheIndividualDownloadClients": "Щоб отримати додаткові відомості про окремі клієнти для завантаження, натисніть кнопки додаткових відомостей.", "GeneralSettingsSummary": "Порт, SSL, ім’я користувача/пароль, проксі, аналітика та оновлення", @@ -336,7 +336,7 @@ "ApplicationLongTermStatusCheckSingleClientMessage": "Індексатори недоступні через збої більше 6 годин: {0}", "Remove": "Видалити", "Replace": "Замінити", - "TheLatestVersionIsAlreadyInstalled": "Остання версія Prowlarr вже встановлена", + "TheLatestVersionIsAlreadyInstalled": "Остання версія {appName} вже встановлена", "ApplicationURL": "URL програми", "Theme": "Тема", "ApplyTagsHelpTextAdd": "Додати: додати теги до наявного списку тегів", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index 2c2a2e310..165b6b019 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -42,7 +42,7 @@ "ProxyUsernameHelpText": "Bạn chỉ cần nhập tên người dùng và mật khẩu nếu được yêu cầu. Nếu không, hãy để trống chúng.", "Reddit": "Reddit", "Refresh": "Làm tươi", - "ReleaseBranchCheckOfficialBranchMessage": "Nhánh {0} không phải là nhánh phát hành Prowlarr hợp lệ, bạn sẽ không nhận được cập nhật", + "ReleaseBranchCheckOfficialBranchMessage": "Nhánh {0} không phải là nhánh phát hành {appName} hợp lệ, bạn sẽ không nhận được cập nhật", "ReleaseStatus": "Tình trạng phát hành", "Reload": "Nạp lại", "RemovedFromTaskQueue": "Đã xóa khỏi hàng đợi tác vụ", @@ -127,7 +127,7 @@ "KeyboardShortcuts": "Các phím tắt bàn phím", "Language": "Ngôn ngữ", "LastWriteTime": "Lần viết cuối cùng", - "LaunchBrowserHelpText": " Mở trình duyệt web và điều hướng đến trang chủ Prowlarr khi khởi động ứng dụng.", + "LaunchBrowserHelpText": " Mở trình duyệt web và điều hướng đến trang chủ {appName} khi khởi động ứng dụng.", "Level": "Cấp độ", "LogFiles": "Tệp nhật ký", "Logging": "Ghi nhật ký", @@ -141,11 +141,11 @@ "ProxyCheckBadRequestMessage": "Không thể kiểm tra proxy. Mã trạng thái: {0}", "BackupRetentionHelpText": "Các bản sao lưu tự động cũ hơn khoảng thời gian lưu giữ sẽ tự động được dọn dẹp", "BindAddress": "Địa chỉ ràng buộc", - "BranchUpdate": "Nhánh sử dụng để cập nhật Prowlarr", + "BranchUpdate": "Nhánh sử dụng để cập nhật {appName}", "CloseCurrentModal": "Đóng phương thức hiện tại", "RSSIsNotSupportedWithThisIndexer": "RSS không được hỗ trợ với trình chỉ mục này", "SettingsEnableColorImpairedMode": "Bật Chế độ Khuyết màu", - "AnalyticsEnabledHelpText": "Gửi thông tin sử dụng và lỗi ẩn danh đến máy chủ của Prowlarr. Điều này bao gồm thông tin về trình duyệt của bạn, trang WebUI của Prowlarr mà bạn sử dụng, báo cáo lỗi cũng như hệ điều hành và phiên bản thời gian chạy. Chúng tôi sẽ sử dụng thông tin này để ưu tiên các tính năng và sửa lỗi.", + "AnalyticsEnabledHelpText": "Gửi thông tin sử dụng và lỗi ẩn danh đến máy chủ của {appName}. Điều này bao gồm thông tin về trình duyệt của bạn, trang WebUI của {appName} mà bạn sử dụng, báo cáo lỗi cũng như hệ điều hành và phiên bản thời gian chạy. Chúng tôi sẽ sử dụng thông tin này để ưu tiên các tính năng và sửa lỗi.", "ApiKey": "Mã API", "AppDataDirectory": "Thư mục AppData", "AppDataLocationHealthCheckMessage": "Việc cập nhật sẽ không thể ngăn việc xóa AppData khi cập nhật", @@ -153,9 +153,9 @@ "ApplicationStatusCheckSingleClientMessage": "Danh sách không có sẵn do lỗi: {0}", "Apply": "Ứng dụng", "ApplyTags": "Áp dụng thẻ", - "AuthenticationMethodHelpText": "Yêu cầu Tên người dùng và Mật khẩu để truy cập Prowlarr", + "AuthenticationMethodHelpText": "Yêu cầu Tên người dùng và Mật khẩu để truy cập {appName}", "AutomaticSearch": "Tìm kiếm tự động", - "BackupFolderHelpText": "Các đường dẫn tương đối sẽ nằm trong thư mục AppData của Prowlarr", + "BackupFolderHelpText": "Các đường dẫn tương đối sẽ nằm trong thư mục AppData của {appName}", "BackupIntervalHelpText": "Khoảng thời gian giữa các bản sao lưu tự động", "BackupNow": "Sao lưu ngay", "BindAddressHelpText": "Địa chỉ IP4 hợp lệ hoặc '*' cho tất cả các giao diện", @@ -207,7 +207,7 @@ "Torrents": "Torrents", "Type": "Kiểu", "UILanguage": "Ngôn ngữ giao diện người dùng", - "UILanguageHelpText": "Ngôn ngữ mà Prowlarr sẽ sử dụng cho giao diện người dùng", + "UILanguageHelpText": "Ngôn ngữ mà {appName} sẽ sử dụng cho giao diện người dùng", "UILanguageHelpTextWarning": "Yêu cầu tải lại trình duyệt", "UnableToAddANewApplicationPleaseTryAgain": "Không thể thêm thông báo mới, vui lòng thử lại.", "UnableToAddANewAppProfilePleaseTryAgain": "Không thể thêm hồ sơ chất lượng mới, vui lòng thử lại.", @@ -267,7 +267,7 @@ "Sort": "Sắp xếp", "Source": "Nguồn", "Status": "Trạng thái", - "UpdateMechanismHelpText": "Sử dụng trình cập nhật tích hợp của Prowlarr hoặc một tập lệnh", + "UpdateMechanismHelpText": "Sử dụng trình cập nhật tích hợp của {appName} hoặc một tập lệnh", "Updates": "Cập nhật", "Uptime": "Thời gian hoạt động", "Username": "tên tài khoản", @@ -276,7 +276,7 @@ "DeleteTag": "Xóa thẻ", "Enable": "Kích hoạt", "EnableAutomaticSearch": "Bật tìm kiếm tự động", - "EnableAutomaticSearchHelpText": "Sẽ được sử dụng khi tìm kiếm tự động được thực hiện qua giao diện người dùng hoặc bằng Prowlarr", + "EnableAutomaticSearchHelpText": "Sẽ được sử dụng khi tìm kiếm tự động được thực hiện qua giao diện người dùng hoặc bằng {appName}", "General": "Chung", "Warn": "Cảnh báo", "DeleteDownloadClient": "Xóa ứng dụng khách tải xuống", @@ -329,7 +329,7 @@ "Queued": "Đã xếp hàng", "Remove": "Tẩy", "Replace": "Thay thế", - "TheLatestVersionIsAlreadyInstalled": "Phiên bản mới nhất của Prowlarr đã được cài đặt", + "TheLatestVersionIsAlreadyInstalled": "Phiên bản mới nhất của {appName} đã được cài đặt", "ApplyChanges": "Áp dụng thay đổi", "ApplyTagsHelpTextAdd": "Thêm: Thêm thẻ vào danh sách thẻ hiện có", "ApplyTagsHelpTextHowToApplyApplications": "Cách áp dụng thẻ cho các phim đã chọn", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index c4fec281c..adf690e4e 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -6,7 +6,7 @@ "AddApplication": "添加应用程序", "AddCustomFilter": "添加自定义过滤器", "AddDownloadClient": "添加下载客户端", - "AddDownloadClientToProwlarr": "添加下载客户端允许 Prowlarr 在进行手动搜索时从 UI直接发送结果.", + "AddDownloadClientToProwlarr": "添加下载客户端允许 {appName} 在进行手动搜索时从 UI直接发送结果.", "AddIndexer": "添加索引器", "AddIndexerProxy": "添加搜刮器代理", "AddNewIndexer": "添加新的索引器", @@ -20,14 +20,14 @@ "All": "全部", "AllIndexersHiddenDueToFilter": "由于应用了筛选器,所有索引器都被隐藏。", "Analytics": "分析", - "AnalyticsEnabledHelpText": "将匿名使用情况和错误信息发送到Prowlarr的服务器。这包括有关您的浏览器的信息、您使用的Prowlarr WebUI页面、错误报告以及操作系统和运行时版本。我们将使用此信息来确定功能和错误修复的优先级。", + "AnalyticsEnabledHelpText": "将匿名使用情况和错误信息发送到{appName}的服务器。这包括有关您的浏览器的信息、您使用的{appName} WebUI页面、错误报告以及操作系统和运行时版本。我们将使用此信息来确定功能和错误修复的优先级。", "ApiKey": "API Key", "ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{0}个字符长。您可以通过设置或配置文件执行此操作", "AppDataDirectory": "AppData目录", "AppDataLocationHealthCheckMessage": "正在更新期间的 AppData 不会被更新删除", "AppProfileInUse": "正在使用的应用程序配置文件", "AppProfileSelectHelpText": "应用程序配置用于控制应用程序同步设置 RSS、自动搜索和交互式搜索设置", - "AppSettingsSummary": "配置Prowlarr与PVR程序交互方式的应用和设置", + "AppSettingsSummary": "配置{appName}与PVR程序交互方式的应用和设置", "Application": "程序", "ApplicationLongTermStatusCheckAllClientMessage": "由于故障超过6小时,所有程序都不可用", "ApplicationLongTermStatusCheckSingleClientMessage": "由于故障超过6小时而无法使用的程序:{0}", @@ -53,7 +53,7 @@ "AutomaticSearch": "自动搜索", "AverageResponseTimesMs": "索引器平均响应时间(毫秒)", "Backup": "备份", - "BackupFolderHelpText": "相对路径将在 Prowlarr 的 AppData 目录下", + "BackupFolderHelpText": "相对路径将在 {appName} 的 AppData 目录下", "BackupIntervalHelpText": "自动备份时间间隔", "BackupNow": "马上备份", "BackupRetentionHelpText": "超过保留期限的自动备份将被自动清理", @@ -65,7 +65,7 @@ "BookSearch": "图书搜索", "BookSearchTypes": "搜索图书类型", "Branch": "分支", - "BranchUpdate": "更新Prowlarr的分支", + "BranchUpdate": "更新{appName}的分支", "BranchUpdateMechanism": "外部更新机制使用的分支", "BypassProxyForLocalAddresses": "对局域网地址不使用代理", "Cancel": "取消", @@ -77,7 +77,7 @@ "ChangeHasNotBeenSavedYet": "修改暂未保存", "Clear": "清除", "ClearHistory": "清楚历史", - "ClearHistoryMessageText": "您确定要清除Prowlarr所有的历史记录吗?", + "ClearHistoryMessageText": "您确定要清除{appName}所有的历史记录吗?", "ClientPriority": "客户端优先级", "CloneProfile": "复制配置", "Close": "关闭", @@ -125,7 +125,7 @@ "DownloadClientStatusCheckAllClientMessage": "所有下载客户端都不可用", "DownloadClientStatusCheckSingleClientMessage": "所有下载客户端都不可用: {0}", "DownloadClients": "下载客户端", - "DownloadClientsSettingsSummary": "下载客户端配置以集成到 Prowlarr UI 搜索中", + "DownloadClientsSettingsSummary": "下载客户端配置以集成到 {appName} UI 搜索中", "Duration": "时长", "Edit": "编辑", "EditIndexer": "编辑搜刮器", @@ -133,7 +133,7 @@ "ElapsedTime": "运行时间", "Enable": "启用", "EnableAutomaticSearch": "启用自动搜索", - "EnableAutomaticSearchHelpText": "当自动搜索通过UI或Prowlarr执行时将被使用", + "EnableAutomaticSearchHelpText": "当自动搜索通过UI或{appName}执行时将被使用", "EnableIndexer": "启用搜刮器", "EnableInteractiveSearch": "启用手动搜索", "EnableInteractiveSearchHelpText": "当手动搜索启用时使用", @@ -187,7 +187,7 @@ "IgnoredAddresses": "已忽略地址", "IllRestartLater": "稍后重启", "IncludeHealthWarningsHelpText": "包含健康度警告", - "IncludeManualGrabsHelpText": "安装手动抓取Prowlarr", + "IncludeManualGrabsHelpText": "安装手动抓取{appName}", "Indexer": "索引器", "IndexerAlreadySetup": "至少已经设置了一个索引器", "IndexerAuth": "搜刮器认证", @@ -195,13 +195,13 @@ "IndexerDisabled": "索引器已被禁用", "IndexerFailureRate": "Indexer失败率", "IndexerFlags": "搜刮器标记", - "IndexerHealthCheckNoIndexers": "未启用任何搜刮器,Prowlarr将不会返回搜索结果", + "IndexerHealthCheckNoIndexers": "未启用任何搜刮器,{appName}将不会返回搜索结果", "IndexerInfo": "索引器信息", "IndexerLongTermStatusCheckAllClientMessage": "由于故障超过6小时,所有搜刮器均不可用", "IndexerLongTermStatusCheckSingleClientMessage": "由于故障6小时,下列搜刮器都已不可用:{0}", "IndexerName": "‎索引‎‎名字‎", - "IndexerNoDefCheckMessage": "索引器没有定义,将无法工作: {0}. 请删除或重新添加到Prowlarr", - "IndexerObsoleteCheckMessage": "搜刮器已过弃用或已更新:{0}。请将其删除和(或)重新添加到 Prowlarr", + "IndexerNoDefCheckMessage": "索引器没有定义,将无法工作: {0}. 请删除或重新添加到{appName}", + "IndexerObsoleteCheckMessage": "搜刮器已过弃用或已更新:{0}。请将其删除和(或)重新添加到 {appName}", "IndexerPriority": "搜刮器优先级", "IndexerPriorityHelpText": "索引器优先级从1(最高)到50(最低),默认25。", "IndexerProxies": "搜刮器代理", @@ -231,7 +231,7 @@ "LastExecution": "上一次执行", "LastFailure": "最后一次失败", "LastWriteTime": "最后写入时间", - "LaunchBrowserHelpText": " 启动浏览器时导航到Prowlarr 主页。", + "LaunchBrowserHelpText": " 启动浏览器时导航到{appName} 主页。", "Level": "等级", "Link": "链接", "LogFiles": "日志文件", @@ -303,8 +303,8 @@ "Privacy": "隐私", "Private": "私有", "Protocol": "协议", - "ProwlarrSupportsAnyDownloadClient": "Prowlarr 支持以下列出的下载客户端。", - "ProwlarrSupportsAnyIndexer": "Prowlarr支持多种搜刮器,包括任何使用Newznab/Torznab标准的搜刮器(“通用Newznab”对应Usenet,“Generic Torznab”对应Torrents)。从以下搜索并选择你的搜刮器。", + "ProwlarrSupportsAnyDownloadClient": "{appName} 支持以下列出的下载客户端。", + "ProwlarrSupportsAnyIndexer": "{appName}支持多种搜刮器,包括任何使用Newznab/Torznab标准的搜刮器(“通用Newznab”对应Usenet,“Generic Torznab”对应Torrents)。从以下搜索并选择你的搜刮器。", "Proxies": "代理", "Proxy": "代理", "ProxyBypassFilterHelpText": "使用“ , ”作为分隔符,和“ *. ”作为二级域名的通配符", @@ -327,10 +327,10 @@ "ReadTheWikiForMoreInformation": "查阅Wiki获得更多信息", "Reddit": "Reddit", "Redirect": "重定向", - "RedirectHelpText": "重定向搜刮器的传入下载请求并直接传递抓取,而不是通过Prowlarr代理请求搜刮器", + "RedirectHelpText": "重定向搜刮器的传入下载请求并直接传递抓取,而不是通过{appName}代理请求搜刮器", "Refresh": "刷新", "RefreshMovie": "刷新影片", - "ReleaseBranchCheckOfficialBranchMessage": "分支 {0} 不是合法的Prowlarr发布分支,您不会收到任何更新", + "ReleaseBranchCheckOfficialBranchMessage": "分支 {0} 不是合法的{appName}发布分支,您不会收到任何更新", "ReleaseStatus": "发布状态", "Reload": "重新加载", "Remove": "移除", @@ -343,7 +343,7 @@ "ResetAPIKey": "重置API Key", "Restart": "重启", "RestartNow": "马上重启", - "RestartProwlarr": "重启Prowlarr", + "RestartProwlarr": "重启{appName}", "RestartRequiredHelpTextWarning": "需要重新启动才能生效", "Restore": "恢复", "RestoreBackup": "恢复备份", @@ -387,7 +387,7 @@ "SettingsShortDateFormat": "短日期格式", "SettingsShowRelativeDates": "显示相对日期", "SettingsShowRelativeDatesHelpText": "显示相对日期(今天昨天等)或绝对日期", - "SettingsSqlLoggingHelpText": "记录来自Prowlarr的所有SQL查询", + "SettingsSqlLoggingHelpText": "记录来自{appName}的所有SQL查询", "SettingsTimeFormat": "时间格式", "ShowAdvanced": "显示高级设置", "ShowSearch": "显示搜索", @@ -406,8 +406,8 @@ "SuggestTranslationChange": "建议翻译改变 Suggest translation change", "SyncAppIndexers": "同步应用索引", "SyncLevel": "同步级别", - "SyncLevelAddRemove": "仅添加和删除:当索引器从 Prowlarr 添加或删除时,它将更新与此关联的应用程序。", - "SyncLevelFull": "完全同步:将保持此应用的索引器完全同步。当在Prowlarr中所做的更改将同步到与此关联的应用程序。任何关联应用上的更改都将在下次同步时被Prowlarr覆盖。", + "SyncLevelAddRemove": "仅添加和删除:当索引器从 {appName} 添加或删除时,它将更新与此关联的应用程序。", + "SyncLevelFull": "完全同步:将保持此应用的索引器完全同步。当在{appName}中所做的更改将同步到与此关联的应用程序。任何关联应用上的更改都将在下次同步时被{appName}覆盖。", "SyncProfile": "同步配置文件", "SyncProfiles": "同步配置文件", "System": "系统", @@ -439,7 +439,7 @@ "Type": "类型", "UI": "UI界面", "UILanguage": "UI界面语言", - "UILanguageHelpText": "Prowlarr使用的UI界面语言", + "UILanguageHelpText": "{appName}使用的UI界面语言", "UILanguageHelpTextWarning": "浏览器需重新加载", "UISettings": "UI设置", "UISettingsSummary": "日期,语言及色盲选项", @@ -469,7 +469,7 @@ "UpdateCheckStartupNotWritableMessage": "无法安装更新,因为用户“{1}”对于启动文件夹“{0}”没有写入权限。", "UpdateCheckStartupTranslocationMessage": "无法安装更新,因为启动文件夹“{0}”在一个应用程序迁移文件夹。Cannot install update because startup folder '{0}' is in an App Translocation folder.", "UpdateCheckUINotWritableMessage": "无法安装升级,因为用户“{1}”不可写入界面文件夹“{0}”。", - "UpdateMechanismHelpText": "使用 Prowlarr 内置的更新器或者脚本", + "UpdateMechanismHelpText": "使用 {appName} 内置的更新器或者脚本", "UpdateScriptPathHelpText": "自定义脚本的路径,该脚本处理获取的更新包并处理更新过程的其余部分", "Updates": "更新", "Uptime": "运行时间", @@ -525,7 +525,7 @@ "DeleteSelectedIndexers": "删除选中的索引器", "FoundCountReleases": "找到{itemCount}版本", "IndexerCategories": "索引器分类", - "IndexerDownloadClientHelpText": "请确认在Prowlarr内从此索引器中抓取时使用的下载客户端", + "IndexerDownloadClientHelpText": "请确认在{appName}内从此索引器中抓取时使用的下载客户端", "IndexerStatus": "索引器状态", "NewznabUrl": "Newznab链接", "PackSeedTimeHelpText": "种子下载的时间(季或专辑)应在停止前保持上传状态,应用程序默认设定为empty", @@ -537,7 +537,7 @@ "GoToApplication": "前往应用程序", "NoHistoryFound": "未发现历史记录", "SelectedCountOfCountReleases": "选中{itemCount} 中的 {selectedCount} 版本", - "AreYouSureYouWantToDeleteIndexer": "您确定要从Prowlarr中删除“{name}”吗?", + "AreYouSureYouWantToDeleteIndexer": "您确定要从{appName}中删除“{name}”吗?", "AuthQueries": "认证请求", "CountApplicationsSelected": "{count}应用程序被选中", "ManageApplications": "管理应用程序", diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index 8778a0240..1072856aa 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -16,7 +16,7 @@ "Language": "語言", "Filter": "篩選", "Reload": "重新載入", - "UpdateMechanismHelpText": "使用 Prowlarr內建的更新程式或是腳本文件", + "UpdateMechanismHelpText": "使用 {appName}內建的更新程式或是腳本文件", "URLBase": "URL Base", "Username": "使用者名稱", "Details": "詳情", From cad42fd005255c79b3d6f79e122fb76c04234bd4 Mon Sep 17 00:00:00 2001 From: Servarr Date: Sun, 19 Nov 2023 20:38:28 +0000 Subject: [PATCH 308/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index eb98f9846..74ff899ca 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -4779,6 +4779,10 @@ "type": "string", "nullable": true }, + "passwordConfirmation": { + "type": "string", + "nullable": true + }, "logLevel": { "type": "string", "nullable": true From 257c9ab2484cb1b0f4ad2416c22e4cb3ac7f47cf Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 20 Nov 2023 02:37:13 +0200 Subject: [PATCH 309/964] Return 429 right away after release search --- .../IndexerSearch/ReleaseSearchService.cs | 19 ++++++--------- .../Indexers/NewznabController.cs | 23 +++++++++++++++---- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index e0b5c52c0..03f546c42 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -39,19 +39,14 @@ namespace NzbDrone.Core.IndexerSearch public Task Search(NewznabRequest request, List indexerIds, bool interactiveSearch) { - switch (request.t) + return request.t switch { - case "movie": - return MovieSearch(request, indexerIds, interactiveSearch); - case "music": - return MusicSearch(request, indexerIds, interactiveSearch); - case "tvsearch": - return TvSearch(request, indexerIds, interactiveSearch); - case "book": - return BookSearch(request, indexerIds, interactiveSearch); - default: - return BasicSearch(request, indexerIds, interactiveSearch); - } + "movie" => MovieSearch(request, indexerIds, interactiveSearch), + "music" => MusicSearch(request, indexerIds, interactiveSearch), + "tvsearch" => TvSearch(request, indexerIds, interactiveSearch), + "book" => BookSearch(request, indexerIds, interactiveSearch), + _ => BasicSearch(request, indexerIds, interactiveSearch) + }; } private async Task MovieSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) diff --git a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs index 2189135a8..4ee129caf 100644 --- a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs +++ b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs @@ -146,14 +146,13 @@ namespace NzbDrone.Api.V1.Indexers var indexer = _indexerFactory.GetInstance(indexerDef); - var blockedIndexerStatus = GetBlockedIndexerStatus(indexer); + var blockedIndexerStatusPre = GetBlockedIndexerStatus(indexer); - if (blockedIndexerStatus?.DisabledTill != null) + if (blockedIndexerStatusPre?.DisabledTill != null) { - var retryAfterDisabledTill = Convert.ToInt32(blockedIndexerStatus.DisabledTill.Value.ToLocalTime().Subtract(DateTime.Now).TotalSeconds); - AddRetryAfterHeader(retryAfterDisabledTill); + AddRetryAfterHeader(CalculateRetryAfterDisabledTill(blockedIndexerStatusPre.DisabledTill.Value)); - return CreateResponse(CreateErrorXML(429, $"Indexer is disabled till {blockedIndexerStatus.DisabledTill.Value.ToLocalTime()} due to recent failures."), statusCode: StatusCodes.Status429TooManyRequests); + return CreateResponse(CreateErrorXML(429, $"Indexer is disabled till {blockedIndexerStatusPre.DisabledTill.Value.ToLocalTime()} due to recent failures."), statusCode: StatusCodes.Status429TooManyRequests); } // TODO Optimize this so it's not called here and in ReleaseSearchService (for manual search) @@ -180,6 +179,15 @@ namespace NzbDrone.Api.V1.Indexers case "movie": var results = await _releaseSearchService.Search(request, new List { indexerDef.Id }, false); + var blockedIndexerStatusPost = GetBlockedIndexerStatus(indexer); + + if (blockedIndexerStatusPost?.DisabledTill != null) + { + AddRetryAfterHeader(CalculateRetryAfterDisabledTill(blockedIndexerStatusPost.DisabledTill.Value)); + + return CreateResponse(CreateErrorXML(429, $"Indexer is disabled till {blockedIndexerStatusPost.DisabledTill.Value.ToLocalTime()} due to recent failures."), statusCode: StatusCodes.Status429TooManyRequests); + } + foreach (var result in results.Releases) { result.DownloadUrl = result.DownloadUrl.IsNotNullOrWhiteSpace() ? _downloadMappingService.ConvertToProxyLink(new Uri(result.DownloadUrl), request.server, indexerDef.Id, result.Title).AbsoluteUri : null; @@ -336,5 +344,10 @@ namespace NzbDrone.Api.V1.Indexers HttpContext.Response.Headers.Add("Retry-After", $"{retryAfterSeconds}"); } } + + private static int CalculateRetryAfterDisabledTill(DateTime disabledTill) + { + return Convert.ToInt32(disabledTill.ToLocalTime().Subtract(DateTime.Now).TotalSeconds); + } } } From 92cf329174fa77d8be607882faa2178e96ae0872 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 21 Nov 2023 10:58:05 +0000 Subject: [PATCH 310/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Havok Dan Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ar.json | 3 ++- src/NzbDrone.Core/Localization/Core/bg.json | 3 ++- src/NzbDrone.Core/Localization/Core/ca.json | 3 ++- src/NzbDrone.Core/Localization/Core/cs.json | 3 ++- src/NzbDrone.Core/Localization/Core/da.json | 3 ++- src/NzbDrone.Core/Localization/Core/el.json | 3 ++- src/NzbDrone.Core/Localization/Core/es.json | 3 ++- src/NzbDrone.Core/Localization/Core/he.json | 8 +++++++- src/NzbDrone.Core/Localization/Core/hr.json | 6 +++++- src/NzbDrone.Core/Localization/Core/is.json | 3 ++- src/NzbDrone.Core/Localization/Core/nl.json | 4 +++- src/NzbDrone.Core/Localization/Core/pl.json | 3 ++- src/NzbDrone.Core/Localization/Core/pt.json | 8 +++++++- src/NzbDrone.Core/Localization/Core/pt_BR.json | 5 ++++- src/NzbDrone.Core/Localization/Core/ro.json | 3 ++- src/NzbDrone.Core/Localization/Core/ru.json | 3 ++- src/NzbDrone.Core/Localization/Core/th.json | 3 ++- src/NzbDrone.Core/Localization/Core/tr.json | 10 +++++++++- src/NzbDrone.Core/Localization/Core/vi.json | 3 ++- 19 files changed, 61 insertions(+), 19 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 2cbc38939..1f6073725 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -352,5 +352,6 @@ "AuthForm": "النماذج (صفحة تسجيل الدخول)", "DisabledForLocalAddresses": "معطل بسبب العناوين المحلية", "None": "لا شيء", - "ResetAPIKeyMessageText": "هل أنت متأكد أنك تريد إعادة تعيين مفتاح API الخاص بك؟" + "ResetAPIKeyMessageText": "هل أنت متأكد أنك تريد إعادة تعيين مفتاح API الخاص بك؟", + "RestartProwlarr": "أعد تشغيل {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 1c9f3d83f..acab726cb 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -352,5 +352,6 @@ "AuthForm": "Формуляри (Страница за вход)", "DisabledForLocalAddresses": "Забранено за местни адреси", "None": "Нито един", - "ResetAPIKeyMessageText": "Наистина ли искате да нулирате своя API ключ?" + "ResetAPIKeyMessageText": "Наистина ли искате да нулирате своя API ключ?", + "RestartProwlarr": "Рестартирайте {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 39a33ca5b..c3c962957 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -376,5 +376,6 @@ "AuthForm": "Formularis (pàgina d'inici de sessió)", "DisabledForLocalAddresses": "Desactivat per a adreces locals", "None": "Cap", - "ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?" + "ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?", + "RestartProwlarr": "Reinicia {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 99e993ca8..df2e95ac0 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -396,5 +396,6 @@ "CountIndexersSelected": "{count} vybraných indexátorů", "EditIndexerProxyImplementation": "Přidat indexátor - {implementationName}", "AuthBasic": "Základní (vyskakovací okno prohlížeče)", - "AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName} povolení ověření. Ověřování z místních adres můžete volitelně zakázat." + "AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName} povolení ověření. Ověřování z místních adres můžete volitelně zakázat.", + "RestartProwlarr": "Restartujte {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 69cd9b3aa..74b19207d 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -368,5 +368,6 @@ "DisabledForLocalAddresses": "Deaktiveret for lokale adresser", "ResetAPIKeyMessageText": "Er du sikker på, at du vil nulstille din API-nøgle?", "AuthBasic": "Grundlæggende (pop op-browser)", - "None": "Ingen" + "None": "Ingen", + "RestartProwlarr": "Genstart {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 6182c6ad8..05c1a5225 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -516,5 +516,6 @@ "EditApplicationImplementation": "Προσθήκη", "AddApplicationImplementation": "Προσθήκη", "AddConnectionImplementation": "Προσθήκη", - "AddIndexerImplementation": "Προσθήκη" + "AddIndexerImplementation": "Προσθήκη", + "EditIndexerProxyImplementation": "Προσθήκη" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 0adc79675..7985e3f38 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -439,5 +439,6 @@ "AuthenticationRequiredPasswordHelpTextWarning": "Introduzca una nueva contraseña", "AuthenticationRequiredUsernameHelpTextWarning": "Introduzca un nuevo nombre de usuario", "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.", - "EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}" + "EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", + "DefaultNameCopiedProfile": "{name} - Copia" } diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 42359c955..96cd0c06d 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -401,5 +401,11 @@ "Album": "אלבום", "Artist": "אמן", "NotificationStatusAllClientHealthCheckMessage": "כל הרשימות אינן זמינות בגלל כשלים", - "NotificationStatusSingleClientHealthCheckMessage": "רשימות לא זמינות בגלל כשלים: {0}" + "NotificationStatusSingleClientHealthCheckMessage": "רשימות לא זמינות בגלל כשלים: {0}", + "ResetAPIKeyMessageText": "האם אתה בטוח שברצונך לאפס את מפתח ה- API שלך?", + "DisabledForLocalAddresses": "מושבת לכתובות מקומיות", + "Publisher": "מוציא לאור", + "None": "אף אחד", + "AuthForm": "טפסים (דף כניסה)", + "AuthBasic": "בסיסי (חלון קופץ לדפדפן)" } diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index 9346fed4f..c4113b3d7 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -170,5 +170,9 @@ "Url": "Url", "Result": "Rezultat", "SaveChanges": "Spremi izmjene", - "DeleteAppProfileMessageText": "Jeste li sigurni da želite obrisati ovaj profil odgode?" + "DeleteAppProfileMessageText": "Jeste li sigurni da želite obrisati ovaj profil odgode?", + "DisabledForLocalAddresses": "Onemogućeno za Lokalne Adrese", + "ResetAPIKeyMessageText": "Jeste li sigurni da želite resetirati vaš API Ključ?", + "AuthBasic": "Osnovno (Skočni prozor preglednika)", + "AuthForm": "Forme (Login Stranica)" } diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 466f05f75..539af123b 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -352,5 +352,6 @@ "AuthForm": "Eyðublöð (Innskráningarsíða)", "DisabledForLocalAddresses": "Óvirkt vegna heimilisfanga", "None": "Enginn", - "ResetAPIKeyMessageText": "Ertu viss um að þú viljir endurstilla API lykilinn þinn?" + "ResetAPIKeyMessageText": "Ertu viss um að þú viljir endurstilla API lykilinn þinn?", + "RestartProwlarr": "Endurræstu {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index d7c6a6722..57229a7d6 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -471,5 +471,7 @@ "EditDownloadClientImplementation": "Voeg Downloadclient toe - {implementationName}", "EditIndexerImplementation": "Indexeerder toevoegen - {implementationName}", "AddApplicationImplementation": "Voeg connectie toe - {implementationName}", - "AddIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}" + "AddIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}", + "EditApplicationImplementation": "Voeg connectie toe - {implementationName}", + "EditIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 740773e96..163d50328 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -374,5 +374,6 @@ "DisabledForLocalAddresses": "Wyłączone dla adresów lokalnych", "None": "Żaden", "AuthBasic": "Podstawowe (wyskakujące okienko przeglądarki)", - "ResetAPIKeyMessageText": "Czy na pewno chcesz zresetować swój klucz API?" + "ResetAPIKeyMessageText": "Czy na pewno chcesz zresetować swój klucz API?", + "RestartProwlarr": "Zrestartuj {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index f94fdd3a6..00639373d 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -466,5 +466,11 @@ "AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido", "AuthenticationRequiredPasswordHelpTextWarning": "Insira uma nova senha", "AuthenticationRequiredUsernameHelpTextWarning": "Insira um novo Nome de Usuário", - "EditIndexerImplementation": "Adicionar Indexador - {implementationName}" + "EditIndexerImplementation": "Adicionar Indexador - {implementationName}", + "CountDownloadClientsSelected": "{count} cliente(s) de transferência selecionado(s)", + "CountIndexersSelected": "{count} indexador(es) selecionado(s)", + "EditSelectedDownloadClients": "Editar Clientes de Transferência Selecionados", + "Album": "álbum", + "Artist": "artista", + "DefaultNameCopiedProfile": "{name} - Copiar" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index aa9ef6203..f70733597 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -597,5 +597,8 @@ "TotalQueries": "Total de Consultas", "ApplicationTagsHelpText": "Sincronize indexadores com este aplicativo que não possuem tags ou que possuem 1 ou mais tags correspondentes", "ApplicationTagsHelpTextWarning": "As tags devem ser usadas com cautela, pois podem ter efeitos indesejados. Um aplicativo com uma tag só será sincronizado com indexadores que tenham a mesma tag.", - "IndexerTagsHelpTextWarning": "As tags devem ser usadas com cautela, pois podem ter efeitos indesejados. Um indexador com uma tag sincronizará apenas com aplicativos com a mesma tag." + "IndexerTagsHelpTextWarning": "As tags devem ser usadas com cautela, pois podem ter efeitos indesejados. Um indexador com uma tag sincronizará apenas com aplicativos com a mesma tag.", + "NoIndexerCategories": "Nenhuma categoria encontrada para este indexador", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirme a nova senha", + "PasswordConfirmation": "Confirmação Da Senha" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index a20ff75e0..8b31ccaa2 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -461,5 +461,6 @@ "EditDownloadClientImplementation": "Adăugați client de descărcare - {implementationName}", "EditIndexerImplementation": "Adăugați Indexator - {implementationName}", "EditIndexerProxyImplementation": "Adăugați proxy indexator - {implementationName}", - "EditApplicationImplementation": "Adăugați aplicație - {implementareName}" + "EditApplicationImplementation": "Adăugați aplicație - {implementareName}", + "RestartProwlarr": "Reporniți {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 24a1699d4..a8003a615 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -418,5 +418,6 @@ "AddCustomFilter": "Добавить специальный фильтр", "AuthenticationMethod": "Способ авторизации", "AuthenticationRequiredPasswordHelpTextWarning": "Введите новый пароль", - "AuthenticationRequiredUsernameHelpTextWarning": "Введите новое имя пользователя" + "AuthenticationRequiredUsernameHelpTextWarning": "Введите новое имя пользователя", + "RestartProwlarr": "Перезапустить {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index ad11466ee..42e6c587f 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -355,5 +355,6 @@ "AuthForm": "แบบฟอร์ม (หน้าเข้าสู่ระบบ)", "DisabledForLocalAddresses": "ปิดใช้งานสำหรับที่อยู่ท้องถิ่น", "None": "ไม่มี", - "ResetAPIKeyMessageText": "แน่ใจไหมว่าต้องการรีเซ็ตคีย์ API" + "ResetAPIKeyMessageText": "แน่ใจไหมว่าต้องการรีเซ็ตคีย์ API", + "RestartProwlarr": "รีสตาร์ท {appName}" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 86430e8b0..d18c1e40b 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -359,5 +359,13 @@ "ResetAPIKeyMessageText": "API Anahtarınızı sıfırlamak istediğinizden emin misiniz?", "Categories": "Kategoriler", "Application": "Uygulamalar", - "Episode": "bölüm" + "Episode": "bölüm", + "AddApplicationImplementation": "Koşul Ekle - {uygulama Adı}", + "AddConnection": "Bağlantı Ekle", + "AddConnectionImplementation": "Koşul Ekle - {uygulama Adı}", + "AddIndexerImplementation": "Koşul Ekle - {uygulama Adı}", + "AddIndexerProxyImplementation": "Koşul Ekle - {uygulama Adı}", + "EditConnectionImplementation": "Koşul Ekle - {uygulama Adı}", + "EditApplicationImplementation": "Koşul Ekle - {uygulama Adı}", + "EditIndexerImplementation": "Koşul Ekle - {uygulama Adı}" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index 165b6b019..3df1ac935 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -354,5 +354,6 @@ "DisabledForLocalAddresses": "Bị vô hiệu hóa đối với địa chỉ địa phương", "None": "không ai", "ResetAPIKeyMessageText": "Bạn có chắc chắn muốn đặt lại Khóa API của mình không?", - "ApiKeyValidationHealthCheckMessage": "Hãy cập nhật mã API để dài ít nhất {length} kí tự. Bạn có thể làm điều này trong cài đặt hoặc trong tập config" + "ApiKeyValidationHealthCheckMessage": "Hãy cập nhật mã API để dài ít nhất {length} kí tự. Bạn có thể làm điều này trong cài đặt hoặc trong tập config", + "RestartProwlarr": "Khởi động lại {appName}" } From 51259ceb3085135b215e227a49a484d801526e62 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 22 Nov 2023 07:25:53 +0200 Subject: [PATCH 311/964] Fixed: (HDBits) Enable Use Filenames by default --- src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs index 9047a26d5..d171a7299 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs @@ -25,7 +25,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits Codecs = Array.Empty(); Mediums = Array.Empty(); FreeleechOnly = false; - UseFilenames = false; + UseFilenames = true; } [FieldDefinition(2, Label = "Username", HelpText = "Site Username", Privacy = PrivacyLevel.UserName)] From 6cb787c17bb58c898e91b365178d6527f6e753dd Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 22 Nov 2023 07:57:37 +0200 Subject: [PATCH 312/964] Fix title in tests --- .../IndexerTests/HDBitsTests/HDBitsFixture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs index debe6c891..39d628d79 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs @@ -57,7 +57,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests var first = torrents.First() as TorrentInfo; first.Guid.Should().Be("HDBits-257142"); - first.Title.Should().Be("Supernatural S10E17 1080p WEB-DL DD5.1 H.264-ECI"); + first.Title.Should().Be("Supernatural.S10E17.1080p.WEB-DL.DD5.1.H.264-ECI"); first.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); first.DownloadUrl.Should().Be("https://hdbits.org/download.php?id=257142&passkey=fakekey"); first.InfoUrl.Should().Be("https://hdbits.org/details.php?id=257142"); From 8ac68e894613b909ab04db12a4c5eb81131e73da Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 23 Nov 2023 04:08:59 +0200 Subject: [PATCH 313/964] Fixed: (Cardigann) Use of the default value for new select settings Fixes #1929 --- .../Definitions/Cardigann/CardigannBase.cs | 80 ++++++++++--------- .../Indexers/IndexerResource.cs | 32 ++------ 2 files changed, 48 insertions(+), 64 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs index 70cec36f6..d61f413d7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs @@ -292,56 +292,60 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann foreach (var setting in _definition.Settings) { var name = ".Config." + setting.Name; - var value = Settings.ExtraFieldData.GetValueOrDefault(setting.Name, setting.Default); - if ((setting.Type != "password" && setting.Name != "apikey" && setting.Name != "rsskey") && indexerLogging) + object defaultValue = setting.Type switch + { + "select" => setting.Options.OrderBy(x => x.Key).Select(x => x.Key).ToList().IndexOf(setting.Default).ToString().ParseInt64() ?? 0, + _ => setting.Default + }; + + var value = Settings.ExtraFieldData.GetValueOrDefault(setting.Name, defaultValue); + + if (indexerLogging && setting.Type != "password" && setting.Name != "apikey" && setting.Name != "rsskey") { _logger.Trace($"{name} got value {value.ToJson()}"); } - if (setting.Type == "text" || setting.Type == "password") + switch (setting.Type) { - variables[name] = value; - } - else if (setting.Type == "checkbox") - { - if (value is string stringValue && bool.TryParse(stringValue, out var result)) - { - value = result; - } + case "text": + case "password": + variables[name] = value; + break; + case "checkbox": + if (value is string stringValue && bool.TryParse(stringValue, out var result)) + { + value = result; + } - variables[name] = (bool)value ? ".True" : null; - } - else if (setting.Type == "select") - { - if (indexerLogging) - { - _logger.Trace($"Setting options: {setting.Options.ToJson()}"); - } + variables[name] = (bool)value ? ".True" : null; + break; + case "select": + if (indexerLogging) + { + _logger.Trace($"Setting options: {setting.Options.ToJson()}"); + } - var sorted = setting.Options.OrderBy(x => x.Key).ToList(); - var selected = sorted[(int)(long)value]; + var sorted = setting.Options.OrderBy(x => x.Key).ToList(); + var selected = sorted[(int)(long)value]; - if (indexerLogging) - { - _logger.Debug($"Selected option: {selected.ToJson()}"); - } + if (indexerLogging) + { + _logger.Debug($"Selected option: {selected.ToJson()}"); + } - variables[name] = selected.Key; - } - else if (setting.Type == "info") - { - variables[name] = value; - } - else if (setting.Type == "cardigannCaptcha") - { - } - else - { - throw new NotSupportedException($"Type {setting.Type} is not supported."); + variables[name] = selected.Key; + break; + case "info": + variables[name] = value; + break; + case "cardigannCaptcha": + break; + default: + throw new NotSupportedException($"Type {setting.Type} is not supported."); } - if (setting.Type != "password" && setting.Name != "apikey" && setting.Name != "rsskey" && indexerLogging && variables.ContainsKey(name)) + if (indexerLogging && setting.Type != "password" && setting.Name != "apikey" && setting.Name != "rsskey" && variables.ContainsKey(name)) { _logger.Debug($"Setting {setting.Name} to {variables[name].ToJson()}"); } diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs b/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs index 9ba47c50b..832d7f219 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs @@ -152,25 +152,12 @@ namespace Prowlarr.Api.V1.Indexers private object MapValue(SettingsField setting, object value) { - if (setting.Type == "select") + return setting.Type switch { - return value.ToString().ParseInt64() ?? 0; - } - else if (setting.Type == "checkbox") - { - if (bool.TryParse(value.ToString(), out var result)) - { - return result; - } - else - { - return false; - } - } - else - { - return value?.ToString() ?? string.Empty; - } + "select" => value.ToString().ParseInt64() ?? 0, + "checkbox" => bool.TryParse(value.ToString(), out var result) && result, + _ => value?.ToString() ?? string.Empty + }; } private Field MapField(SettingsField setting, int order) @@ -196,14 +183,7 @@ namespace Prowlarr.Api.V1.Indexers } else if (setting.Type == "checkbox") { - if (bool.TryParse(setting.Default, out var value)) - { - field.Value = value; - } - else - { - field.Value = false; - } + field.Value = bool.TryParse(setting.Default, out var value) && value; } else { From 01a9799ce8662e682a17295efb59df250d623fa2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 23 Nov 2023 05:53:52 +0200 Subject: [PATCH 314/964] BB has shutdown --- src/NzbDrone.Core/Indexers/Definitions/BB.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BB.cs b/src/NzbDrone.Core/Indexers/Definitions/BB.cs index d5fa934f0..a2439873f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BB.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BB.cs @@ -20,6 +20,7 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions { + [Obsolete("Site has shutdown")] public class BB : TorrentIndexerBase { public override string Name => "BB"; From f2a709f725538556dea8ee76b722be788849db0f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 23 Nov 2023 23:09:04 +0200 Subject: [PATCH 315/964] Remove OZnzb from default definitions Fixes #1932 --- src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs index cc9ff97a6..882cb6e5e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs @@ -102,7 +102,6 @@ namespace NzbDrone.Core.Indexers.Newznab yield return GetDefinition("NZBNDX", GetSettings("https://www.nzbndx.com")); yield return GetDefinition("NzbPlanet", GetSettings("https://api.nzbplanet.net")); yield return GetDefinition("NZBStars", GetSettings("https://nzbstars.com")); - yield return GetDefinition("OZnzb", GetSettings("https://api.oznzb.com")); yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api")); yield return GetDefinition("Generic Newznab", GetSettings("")); } From c4b0ecdafe68142b9b33701b5af478fc0e7047fc Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 12 Nov 2023 21:51:52 +0200 Subject: [PATCH 316/964] Bump dotnet to 6.0.25 --- azure-pipelines.yml | 2 +- package.json | 2 +- src/NzbDrone.Common/Prowlarr.Common.csproj | 4 ++-- src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj | 2 +- src/NzbDrone.Core/Prowlarr.Core.csproj | 10 +++++----- src/NzbDrone.Host/Prowlarr.Host.csproj | 2 +- .../Prowlarr.Integration.Test.csproj | 2 +- src/NzbDrone.Update/Prowlarr.Update.csproj | 2 +- yarn.lock | 8 ++++---- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4e45206c2..c7ab632ae 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,7 +15,7 @@ variables: buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' sentryOrg: 'servarr' sentryUrl: 'https://sentry.servarr.com' - dotnetVersion: '6.0.413' + dotnetVersion: '6.0.417' nodeVersion: '16.X' innoVersion: '6.2.0' windowsImage: 'windows-2022' diff --git a/package.json b/package.json index 7c3d85f11..0f15e6f5f 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@fortawesome/free-solid-svg-icons": "6.4.0", "@fortawesome/react-fontawesome": "0.2.0", "@juggle/resize-observer": "3.4.0", - "@microsoft/signalr": "6.0.21", + "@microsoft/signalr": "6.0.25", "@sentry/browser": "7.51.2", "@sentry/integrations": "7.51.2", "@types/node": "18.15.11", diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index dedf52f8a..5210a351a 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -4,13 +4,13 @@ ISMUSL - + - + diff --git a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj index dbfd06861..854825b1f 100644 --- a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index a72228da0..0333bb54b 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -6,10 +6,10 @@ - + - + @@ -19,10 +19,10 @@ - + - - + + diff --git a/src/NzbDrone.Host/Prowlarr.Host.csproj b/src/NzbDrone.Host/Prowlarr.Host.csproj index 02c6b0c96..4eb549ced 100644 --- a/src/NzbDrone.Host/Prowlarr.Host.csproj +++ b/src/NzbDrone.Host/Prowlarr.Host.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj b/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj index 66de72830..ef7cc21f3 100644 --- a/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj +++ b/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj @@ -4,7 +4,7 @@ Library - + diff --git a/src/NzbDrone.Update/Prowlarr.Update.csproj b/src/NzbDrone.Update/Prowlarr.Update.csproj index dca354a24..2d2812f00 100644 --- a/src/NzbDrone.Update/Prowlarr.Update.csproj +++ b/src/NzbDrone.Update/Prowlarr.Update.csproj @@ -4,7 +4,7 @@ net6.0 - + diff --git a/yarn.lock b/yarn.lock index 3713eb241..e94d1f4c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1212,10 +1212,10 @@ resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== -"@microsoft/signalr@6.0.21": - version "6.0.21" - resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.21.tgz#b45f335df7011abba831cb3d7974b58da7e725c7" - integrity sha512-3MWhSUE7AxkQs3QBuJ/spJJpg1mAHo0/6yRGhs5+Hew3Z+iqYrHVfo0yTElC7W2bVA9t3fW3jliQ9rBN0OvJLA== +"@microsoft/signalr@6.0.25": + version "6.0.25" + resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.25.tgz#009f043066d383e2de41a483bd7e02bfd74d3cf8" + integrity sha512-8AzrpxS+E0yn1tXSlv7+UlURLmSxTQDgbvOT0pGKXjZT7MkhnDP+/GLuk7veRtUjczou/x32d9PHhYlr2NBy6Q== dependencies: abort-controller "^3.0.0" eventsource "^1.0.7" From c690e9a50a0317bcff5e6cd206d30b5785a1918b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 24 Nov 2023 22:31:00 +0200 Subject: [PATCH 317/964] New: Add NeutralLeech to indexer flags --- src/NzbDrone.Core/Indexers/IndexerBase.cs | 11 ++++++++++- src/NzbDrone.Core/Indexers/IndexerFlag.cs | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/IndexerBase.cs b/src/NzbDrone.Core/Indexers/IndexerBase.cs index 2e2e7cdd9..5f54dd620 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBase.cs @@ -134,11 +134,20 @@ namespace NzbDrone.Core.Indexers //Add common flags if (Protocol == DownloadProtocol.Torrent && c is TorrentInfo torrentRelease) { - if (torrentRelease.DownloadVolumeFactor == 0) + if (torrentRelease.DownloadVolumeFactor == 0.0) { torrentRelease.IndexerFlags.Add(IndexerFlag.FreeLeech); } + if (torrentRelease.UploadVolumeFactor == 0.0) + { + torrentRelease.IndexerFlags.Add(IndexerFlag.NeutralLeech); + } + else if (torrentRelease.UploadVolumeFactor == 2.0) + { + torrentRelease.IndexerFlags.Add(IndexerFlag.DoubleUpload); + } + if (torrentRelease.Scene.GetValueOrDefault(false)) { torrentRelease.IndexerFlags.Add(IndexerFlag.Scene); diff --git a/src/NzbDrone.Core/Indexers/IndexerFlag.cs b/src/NzbDrone.Core/Indexers/IndexerFlag.cs index 41092dfab..26a65e96c 100644 --- a/src/NzbDrone.Core/Indexers/IndexerFlag.cs +++ b/src/NzbDrone.Core/Indexers/IndexerFlag.cs @@ -63,7 +63,8 @@ namespace NzbDrone.Core.Indexers } public static IndexerFlag Internal => new ("internal", "Uploader is an internal release group"); - public static IndexerFlag FreeLeech => new ("freeleech", "Release doesn't count toward ratio"); + public static IndexerFlag FreeLeech => new ("freeleech", "Download doesn't count toward ratio"); + public static IndexerFlag NeutralLeech => new ("neutralleech", "Download and upload doesn't count toward ratio"); public static IndexerFlag HalfLeech => new ("halfleech", "Release counts 50% to ratio"); public static IndexerFlag Scene => new ("scene", "Uploader follows scene rules"); public static IndexerFlag DoubleUpload => new ("doubleupload", "Seeding counts double for release"); From c107011659fe91f9f87cff2198da49f1470da29e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 24 Nov 2023 22:35:56 +0200 Subject: [PATCH 318/964] Use album year in Redacted/Orpheus --- src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs | 1 + src/NzbDrone.Core/Indexers/Definitions/Redacted.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index 8c94d83e0..c8513296e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -289,6 +289,7 @@ namespace NzbDrone.Core.Indexers.Definitions Title = WebUtility.HtmlDecode(title), Artist = WebUtility.HtmlDecode(result.Artist), Album = WebUtility.HtmlDecode(result.GroupName), + Year = int.Parse(result.GroupYear), Container = torrent.Encoding, Codec = torrent.Format, Size = long.Parse(torrent.Size), diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index d2f829732..6cdece2bd 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -255,6 +255,7 @@ namespace NzbDrone.Core.Indexers.Definitions Title = WebUtility.HtmlDecode(title), Artist = WebUtility.HtmlDecode(result.Artist), Album = WebUtility.HtmlDecode(result.GroupName), + Year = int.Parse(result.GroupYear), Container = torrent.Encoding, Codec = torrent.Format, Size = long.Parse(torrent.Size), From 9c243c7e0d2b432cea7f3af5045eb821550f9804 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 24 Nov 2023 22:36:40 +0200 Subject: [PATCH 319/964] Fixed: (Redacted) Treat freeload torrents as neutral leech Towards #1933 --- .../Indexers/Definitions/Gazelle/GazelleApi.cs | 2 ++ src/NzbDrone.Core/Indexers/Definitions/Redacted.cs | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleApi.cs b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleApi.cs index 088c5c2a4..0703a00d2 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleApi.cs @@ -35,6 +35,7 @@ public class GazelleTorrent public string Category { get; set; } public bool IsFreeLeech { get; set; } public bool IsNeutralLeech { get; set; } + public bool IsFreeload { get; set; } public bool IsPersonalFreeLeech { get; set; } public bool CanUseToken { get; set; } } @@ -63,6 +64,7 @@ public class GazelleRelease public List Torrents { get; set; } public bool IsFreeLeech { get; set; } public bool IsNeutralLeech { get; set; } + public bool IsFreeload { get; set; } public bool IsPersonalFreeLeech { get; set; } public bool CanUseToken { get; set; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index 6cdece2bd..b54bf4199 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -265,8 +265,8 @@ namespace NzbDrone.Core.Indexers.Definitions Scene = torrent.Scene, Files = torrent.FileCount, Grabs = torrent.Snatches, - DownloadVolumeFactor = torrent.IsFreeLeech || torrent.IsNeutralLeech || torrent.IsPersonalFreeLeech ? 0 : 1, - UploadVolumeFactor = torrent.IsNeutralLeech ? 0 : 1 + DownloadVolumeFactor = torrent.IsFreeLeech || torrent.IsNeutralLeech || torrent.IsFreeload || torrent.IsPersonalFreeLeech ? 0 : 1, + UploadVolumeFactor = torrent.IsNeutralLeech || torrent.IsFreeload ? 0 : 1 }; var category = torrent.Category; @@ -301,8 +301,8 @@ namespace NzbDrone.Core.Indexers.Definitions PublishDate = DateTimeOffset.FromUnixTimeSeconds(ParseUtil.CoerceLong(result.GroupTime)).UtcDateTime, Files = result.FileCount, Grabs = result.Snatches, - DownloadVolumeFactor = result.IsFreeLeech || result.IsNeutralLeech || result.IsPersonalFreeLeech ? 0 : 1, - UploadVolumeFactor = result.IsNeutralLeech ? 0 : 1 + DownloadVolumeFactor = result.IsFreeLeech || result.IsNeutralLeech || result.IsFreeload || result.IsPersonalFreeLeech ? 0 : 1, + UploadVolumeFactor = result.IsNeutralLeech || result.IsFreeload ? 0 : 1 }; var category = result.Category; From fab4bd5eadf15fdfc20830c1125c651f3e28765d Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 16 Oct 2023 23:51:00 -0700 Subject: [PATCH 320/964] Initial support to use named tokens for backend translations (cherry picked from commit 11f96c31048c2d1aafca0c91736d439f7f9a95a8) --- .../LocalizationServiceFixture.cs | 15 +++--- .../Localization/LocalizationService.cs | 49 ++++++++++++++----- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs b/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs index e49b0592d..9e8ee6d94 100644 --- a/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs @@ -29,19 +29,22 @@ namespace NzbDrone.Core.Test.Localization } [Test] - public void should_get_string_in_default_dictionary_if_no_lang_exists_and_string_exists() + public void should_get_string_in_french() { - var localizedString = Subject.GetLocalizedString("BackupNow", "an"); + Mocker.GetMock().Setup(m => m.UILanguage).Returns("fr_fr"); - localizedString.Should().Be("Backup Now"); + var localizedString = Subject.GetLocalizedString("BackupNow"); + + localizedString.Should().Be("Sauvegarder maintenant"); ExceptionVerification.ExpectedErrors(1); } [Test] - public void should_get_string_in_default_dictionary_if_lang_empty_and_string_exists() + public void should_get_string_in_default_dictionary_if_unknown_language_and_string_exists() { - var localizedString = Subject.GetLocalizedString("BackupNow", ""); + Mocker.GetMock().Setup(m => m.UILanguage).Returns(""); + var localizedString = Subject.GetLocalizedString("BackupNow"); localizedString.Should().Be("Backup Now"); } @@ -49,7 +52,7 @@ namespace NzbDrone.Core.Test.Localization [Test] public void should_return_argument_if_string_doesnt_exists() { - var localizedString = Subject.GetLocalizedString("BadString", "en"); + var localizedString = Subject.GetLocalizedString("BadString"); localizedString.Should().Be("BadString"); } diff --git a/src/NzbDrone.Core/Localization/LocalizationService.cs b/src/NzbDrone.Core/Localization/LocalizationService.cs index a73cdc9bf..c534336f3 100644 --- a/src/NzbDrone.Core/Localization/LocalizationService.cs +++ b/src/NzbDrone.Core/Localization/LocalizationService.cs @@ -1,12 +1,13 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text.Json; +using System.Text.RegularExpressions; using System.Threading.Tasks; using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration.Events; using NzbDrone.Core.Messaging.Events; @@ -16,14 +17,17 @@ namespace NzbDrone.Core.Localization public interface ILocalizationService { Dictionary GetLocalizationDictionary(); + string GetLocalizedString(string phrase); - string GetLocalizedString(string phrase, string language); + string GetLocalizedString(string phrase, Dictionary tokens); IEnumerable GetLocalizationOptions(); } public class LocalizationService : ILocalizationService, IHandleAsync { private const string DefaultCulture = "en"; + private static readonly Regex TokenRegex = new Regex(@"(?:\{)(?[a-z0-9]+)(?:\})", + RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); private readonly ICached> _cache; @@ -44,30 +48,25 @@ namespace NzbDrone.Core.Localization public Dictionary GetLocalizationDictionary() { - var language = _configService.UILanguage; + var language = GetLanguageFileName(); return GetLocalizationDictionary(language); } public string GetLocalizedString(string phrase) { - var language = _configService.UILanguage; - - return GetLocalizedString(phrase, language); + return GetLocalizedString(phrase, new Dictionary()); } - public string GetLocalizedString(string phrase, string language) + public string GetLocalizedString(string phrase, Dictionary tokens) { + var language = GetLanguageFileName(); + if (string.IsNullOrEmpty(phrase)) { throw new ArgumentNullException(nameof(phrase)); } - if (language.IsNullOrWhiteSpace()) - { - language = _configService.UILanguage; - } - if (language == null) { language = DefaultCulture; @@ -77,7 +76,7 @@ namespace NzbDrone.Core.Localization if (dictionary.TryGetValue(phrase, out var value)) { - return value; + return ReplaceTokens(value, tokens); } return phrase; @@ -130,6 +129,30 @@ namespace NzbDrone.Core.Localization yield return new LocalizationOption("漢語 (繁体字)", "zh_TW"); } + public string GetLanguageIdentifier() + { + return GetLocalizationOptions().FirstOrDefault(l => l.Value == _configService.UILanguage)?.Value ?? DefaultCulture; + } + + private string ReplaceTokens(string input, Dictionary tokens) + { + tokens.TryAdd("appName", "Prowlarr"); + + return TokenRegex.Replace(input, match => + { + var tokenName = match.Groups["token"].Value; + + tokens.TryGetValue(tokenName, out var token); + + return token?.ToString() ?? $"{{{tokenName}}}"; + }); + } + + private string GetLanguageFileName() + { + return GetLanguageIdentifier().Replace("-", "_").ToLowerInvariant(); + } + private Dictionary GetLocalizationDictionary(string language) { if (string.IsNullOrEmpty(language)) From fc482d4808ddca4a9db7cb9099c263b34d351075 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Fri, 1 Sep 2023 02:47:38 +0200 Subject: [PATCH 321/964] Fixed: Fallback to English translations if invalid UI language in config (cherry picked from commit 4c7201741276eccaea2fb1f33daecc31e8b2d54e) --- frontend/src/Settings/UI/UISettings.js | 7 +++++++ src/NzbDrone.Core/Localization/Core/en.json | 1 + src/Prowlarr.Api.V1/Config/UiConfigController.cs | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/frontend/src/Settings/UI/UISettings.js b/frontend/src/Settings/UI/UISettings.js index cfb7c04f6..caa013db3 100644 --- a/frontend/src/Settings/UI/UISettings.js +++ b/frontend/src/Settings/UI/UISettings.js @@ -176,6 +176,13 @@ class UISettings extends Component { helpTextWarning={translate('UILanguageHelpTextWarning')} onChange={onInputChange} {...settings.uiLanguage} + errors={ + languages.some((language) => language.key === settings.uiLanguage.value) ? + settings.uiLanguage.errors : + [ + ...settings.uiLanguage.errors, + { message: translate('InvalidUILanguage') } + ]} />
diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 2c2bcd6fa..2b4176417 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -294,6 +294,7 @@ "InstanceNameHelpText": "Instance name in tab and for Syslog app name", "InteractiveSearch": "Interactive Search", "Interval": "Interval", + "InvalidUILanguage": "Your UI is set to an invalid language, correct it and save your settings", "KeyboardShortcuts": "Keyboard Shortcuts", "Label": "Label", "Language": "Language", diff --git a/src/Prowlarr.Api.V1/Config/UiConfigController.cs b/src/Prowlarr.Api.V1/Config/UiConfigController.cs index e6ddb073a..a22852863 100644 --- a/src/Prowlarr.Api.V1/Config/UiConfigController.cs +++ b/src/Prowlarr.Api.V1/Config/UiConfigController.cs @@ -1,7 +1,9 @@ using System.Linq; using System.Reflection; +using FluentValidation; using Microsoft.AspNetCore.Mvc; using NzbDrone.Core.Configuration; +using NzbDrone.Core.Localization; using NzbDrone.Http.REST.Attributes; using Prowlarr.Http; @@ -12,10 +14,22 @@ namespace Prowlarr.Api.V1.Config { private readonly IConfigFileProvider _configFileProvider; - public UiConfigController(IConfigFileProvider configFileProvider, IConfigService configService) + public UiConfigController(IConfigFileProvider configFileProvider, IConfigService configService, ILocalizationService localizationService) : base(configService) { _configFileProvider = configFileProvider; + + SharedValidator.RuleFor(c => c.UILanguage) + .NotEmpty() + .WithMessage("The UI Language value cannot be empty"); + + SharedValidator.RuleFor(c => c.UILanguage).Custom((value, context) => + { + if (!localizationService.GetLocalizationOptions().Any(o => o.Value == value)) + { + context.AddFailure("Invalid UI Language value"); + } + }); } [RestPutById] From 0d69a42ae018ea16747cf9fad593e3f83af8e526 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 25 Nov 2023 05:59:03 +0200 Subject: [PATCH 322/964] Fix Localization test --- .../Localization/LocalizationServiceFixture.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs b/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs index 9e8ee6d94..cd1b189ed 100644 --- a/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs @@ -5,7 +5,6 @@ using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Core.Configuration; using NzbDrone.Core.Localization; using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.Localization { @@ -31,13 +30,11 @@ namespace NzbDrone.Core.Test.Localization [Test] public void should_get_string_in_french() { - Mocker.GetMock().Setup(m => m.UILanguage).Returns("fr_fr"); + Mocker.GetMock().Setup(m => m.UILanguage).Returns("fr"); var localizedString = Subject.GetLocalizedString("BackupNow"); localizedString.Should().Be("Sauvegarder maintenant"); - - ExceptionVerification.ExpectedErrors(1); } [Test] From 36c8806f88b55e34fa137e41cdfd87d33519b26d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 23 Nov 2023 04:45:43 +0200 Subject: [PATCH 323/964] New: Add Freeleech Only for HDS, iS and XS --- ...indexers_freeleech_only_config_contract.cs | 16 +++++ .../Indexers/Definitions/HDSpace.cs | 63 +++++++++++-------- .../Indexers/Definitions/ImmortalSeed.cs | 47 +++++++++----- .../Indexers/Definitions/XSpeeds.cs | 47 +++++++++----- 4 files changed, 116 insertions(+), 57 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/038_indexers_freeleech_only_config_contract.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/038_indexers_freeleech_only_config_contract.cs b/src/NzbDrone.Core/Datastore/Migration/038_indexers_freeleech_only_config_contract.cs new file mode 100644 index 000000000..7832dbf71 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/038_indexers_freeleech_only_config_contract.cs @@ -0,0 +1,16 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(038)] + public class indexers_freeleech_only_config_contract : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Update.Table("Indexers").Set(new { ConfigContract = "HDSpaceSettings" }).Where(new { Implementation = "HDSpace" }); + Update.Table("Indexers").Set(new { ConfigContract = "ImmortalSeedSettings" }).Where(new { Implementation = "ImmortalSeed" }); + Update.Table("Indexers").Set(new { ConfigContract = "XSpeedsSettings" }).Where(new { Implementation = "XSpeeds" }); + } + } +} diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs b/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs index e2ec566e1..486f69448 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs @@ -9,6 +9,7 @@ using AngleSharp.Html.Parser; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; +using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; @@ -19,7 +20,7 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions { - public class HDSpace : TorrentIndexerBase + public class HDSpace : TorrentIndexerBase { public override string Name => "HD-Space"; public override string[] IndexerUrls => new[] { "https://hd-space.org/" }; @@ -225,10 +226,10 @@ namespace NzbDrone.Core.Indexers.Definitions public class HDSpaceParser : IParseIndexerResponse { - private readonly UserPassTorrentBaseSettings _settings; + private readonly HDSpaceSettings _settings; private readonly IndexerCapabilitiesCategories _categories; - public HDSpaceParser(UserPassTorrentBaseSettings settings, IndexerCapabilitiesCategories categories) + public HDSpaceParser(HDSpaceSettings settings, IndexerCapabilitiesCategories categories) { _settings = settings; _categories = categories; @@ -251,9 +252,34 @@ namespace NzbDrone.Core.Indexers.Definitions continue; } - var release = new TorrentInfo(); - release.MinimumRatio = 1; - release.MinimumSeedTime = 86400; // 24 hours + var downloadVolumeFactor = 1.0; + + if (row.QuerySelector("img[title=\"FreeLeech\"]") != null) + { + downloadVolumeFactor = 0; + } + else if (row.QuerySelector("img[src=\"images/sf.png\"]") != null) + { + downloadVolumeFactor = 0; + } + else if (row.QuerySelector("img[title=\"Half FreeLeech\"]") != null) + { + downloadVolumeFactor = 0.5; + } + + // Skip non-freeleech results when freeleech only is set + if (_settings.FreeleechOnly && downloadVolumeFactor != 0.0) + { + continue; + } + + var release = new TorrentInfo + { + DownloadVolumeFactor = downloadVolumeFactor, + UploadVolumeFactor = 1, + MinimumRatio = 1, + MinimumSeedTime = 86400 // 24 hours + }; var qLink = row.QuerySelector("td:nth-child(2) a[href^=\"index.php?page=torrent-details&id=\"]"); release.Title = qLink?.TextContent.Trim(); @@ -292,25 +318,6 @@ namespace NzbDrone.Core.Indexers.Definitions var grabs = row.QuerySelector("td:nth-child(10)")?.TextContent.Trim().Replace("---", "0"); release.Grabs = ParseUtil.CoerceInt(grabs); - if (row.QuerySelector("img[title=\"FreeLeech\"]") != null) - { - release.DownloadVolumeFactor = 0; - } - else if (row.QuerySelector("img[src=\"images/sf.png\"]") != null) - { - release.DownloadVolumeFactor = 0; - } - else if (row.QuerySelector("img[title=\"Half FreeLeech\"]") != null) - { - release.DownloadVolumeFactor = 0.5; - } - else - { - release.DownloadVolumeFactor = 1; - } - - release.UploadVolumeFactor = 1; - var categoryLink = row.QuerySelector("a[href^=\"index.php?page=torrents&category=\"]").GetAttribute("href"); var cat = ParseUtil.GetArgumentFromQueryString(categoryLink, "category"); release.Categories = _categories.MapTrackerCatToNewznab(cat); @@ -323,4 +330,10 @@ namespace NzbDrone.Core.Indexers.Definitions public Action, DateTime?> CookiesUpdater { get; set; } } + + public class HDSpaceSettings : UserPassTorrentBaseSettings + { + [FieldDefinition(4, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech releases only")] + public bool FreeleechOnly { get; set; } = false; + } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs b/src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs index 7803fff78..d904c4d05 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/ImmortalSeed.cs @@ -10,6 +10,7 @@ using AngleSharp.Html.Parser; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; +using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; @@ -20,7 +21,7 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions { - public class ImmortalSeed : TorrentIndexerBase + public class ImmortalSeed : TorrentIndexerBase { public override string Name => "ImmortalSeed"; public override string[] IndexerUrls => new[] { "https://immortalseed.me/" }; @@ -46,7 +47,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IParseIndexerResponse GetParser() { - return new ImmortalSeedParser(Capabilities.Categories); + return new ImmortalSeedParser(Settings, Capabilities.Categories); } protected override async Task DoLogin() @@ -253,11 +254,14 @@ namespace NzbDrone.Core.Indexers.Definitions public class ImmortalSeedParser : IParseIndexerResponse { + private readonly ImmortalSeedSettings _settings; private readonly IndexerCapabilitiesCategories _categories; + private readonly Regex _dateAddedRegex = new (@"\d{4}-\d{2}-\d{2} \d{2}:\d{2} [AaPp][Mm]", RegexOptions.Compiled); - public ImmortalSeedParser(IndexerCapabilitiesCategories categories) + public ImmortalSeedParser(ImmortalSeedSettings settings, IndexerCapabilitiesCategories categories) { + _settings = settings; _categories = categories; } @@ -271,6 +275,23 @@ namespace NzbDrone.Core.Indexers.Definitions var rows = dom.QuerySelectorAll("table#sortabletable > tbody > tr:has(a[href*=\"details.php?id=\"])"); foreach (var row in rows) { + var downloadVolumeFactor = 1.0; + + if (row.QuerySelector("img[title^=\"Free Torrent\"], img[title^=\"Sitewide Free Torrent\"]") != null) + { + downloadVolumeFactor = 0.0; + } + else if (row.QuerySelector("img[title^=\"Silver Torrent\"]") != null) + { + downloadVolumeFactor = 0.5; + } + + // Skip non-freeleech results when freeleech only is set + if (_settings.FreeleechOnly && downloadVolumeFactor != 0.0) + { + continue; + } + // details link, release name gets shortened if it's to long var qDetails = row.QuerySelector("div > a[href*=\"details.php?id=\"]"); @@ -300,6 +321,7 @@ namespace NzbDrone.Core.Indexers.Definitions Peers = peers, Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(5)")?.TextContent.Trim()), Grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(6)")?.TextContent), + DownloadVolumeFactor = downloadVolumeFactor, UploadVolumeFactor = row.QuerySelector("img[title^=\"x2 Torrent\"]") != null ? 2 : 1, MinimumRatio = 1, MinimumSeedTime = 86400 // 24 hours @@ -311,19 +333,6 @@ namespace NzbDrone.Core.Indexers.Definitions release.PublishDate = DateTime.ParseExact(dateAddedMatch.Value, "yyyy-MM-dd hh:mm tt", CultureInfo.InvariantCulture); } - if (row.QuerySelector("img[title^=\"Free Torrent\"], img[title^=\"Sitewide Free Torrent\"]") != null) - { - release.DownloadVolumeFactor = 0; - } - else if (row.QuerySelector("img[title^=\"Silver Torrent\"]") != null) - { - release.DownloadVolumeFactor = 0.5; - } - else - { - release.DownloadVolumeFactor = 1; - } - releaseInfos.Add(release); } @@ -332,4 +341,10 @@ namespace NzbDrone.Core.Indexers.Definitions public Action, DateTime?> CookiesUpdater { get; set; } } + + public class ImmortalSeedSettings : UserPassTorrentBaseSettings + { + [FieldDefinition(4, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech releases only")] + public bool FreeleechOnly { get; set; } = false; + } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs index fabfd9533..99efc2ecc 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs @@ -9,6 +9,7 @@ using AngleSharp.Html.Parser; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; +using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; @@ -19,7 +20,7 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions; -public class XSpeeds : TorrentIndexerBase +public class XSpeeds : TorrentIndexerBase { public override string Name => "XSpeeds"; public override string[] IndexerUrls => new[] { "https://www.xspeeds.eu/" }; @@ -45,7 +46,7 @@ public class XSpeeds : TorrentIndexerBase public override IParseIndexerResponse GetParser() { - return new XSpeedsParser(Capabilities.Categories); + return new XSpeedsParser(Settings, Capabilities.Categories); } protected override async Task DoLogin() @@ -276,11 +277,14 @@ public class XSpeedsRequestGenerator : IIndexerRequestGenerator public class XSpeedsParser : IParseIndexerResponse { + private readonly XSpeedsSettings _settings; private readonly IndexerCapabilitiesCategories _categories; + private readonly Regex _dateAddedRegex = new (@"\d{2}-\d{2}-\d{4} \d{2}:\d{2}", RegexOptions.Compiled); - public XSpeedsParser(IndexerCapabilitiesCategories categories) + public XSpeedsParser(XSpeedsSettings settings, IndexerCapabilitiesCategories categories) { + _settings = settings; _categories = categories; } @@ -294,6 +298,23 @@ public class XSpeedsParser : IParseIndexerResponse var rows = dom.QuerySelectorAll("table#sortabletable > tbody > tr:has(a[href*=\"details.php?id=\"])"); foreach (var row in rows) { + var downloadVolumeFactor = 1.0; + + if (row.QuerySelector("img[title^=\"Free Torrent\"], img[title^=\"Sitewide Free Torrent\"]") != null) + { + downloadVolumeFactor = 0.0; + } + else if (row.QuerySelector("img[title^=\"Silver Torrent\"]") != null) + { + downloadVolumeFactor = 0.5; + } + + // Skip non-freeleech results when freeleech only is set + if (_settings.FreeleechOnly && downloadVolumeFactor != 0.0) + { + continue; + } + var qDetails = row.QuerySelector("div > a[href*=\"details.php?id=\"]"); var title = qDetails?.TextContent.Trim(); @@ -320,6 +341,7 @@ public class XSpeedsParser : IParseIndexerResponse Peers = peers, Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(5)")?.TextContent.Trim()), Grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(6)")?.TextContent), + DownloadVolumeFactor = downloadVolumeFactor, UploadVolumeFactor = row.QuerySelector("img[title^=\"x2 Torrent\"]") != null ? 2 : 1, MinimumRatio = 0.8 }; @@ -330,19 +352,6 @@ public class XSpeedsParser : IParseIndexerResponse release.PublishDate = DateTime.ParseExact(dateAddedMatch.Value, "dd-MM-yyyy HH:mm", CultureInfo.InvariantCulture); } - if (row.QuerySelector("img[title^=\"Free Torrent\"], img[title^=\"Sitewide Free Torrent\"]") != null) - { - release.DownloadVolumeFactor = 0; - } - else if (row.QuerySelector("img[title^=\"Silver Torrent\"]") != null) - { - release.DownloadVolumeFactor = 0.5; - } - else - { - release.DownloadVolumeFactor = 1; - } - releaseInfos.Add(release); } @@ -351,3 +360,9 @@ public class XSpeedsParser : IParseIndexerResponse public Action, DateTime?> CookiesUpdater { get; set; } } + +public class XSpeedsSettings : UserPassTorrentBaseSettings +{ + [FieldDefinition(4, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech releases only")] + public bool FreeleechOnly { get; set; } = false; +} From c19802c4718236b1e933b90bf4631bfbc208debc Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Sat, 25 Nov 2023 21:23:00 +0100 Subject: [PATCH 324/964] New: Remove defunct Boxcar notifications (cherry picked from commit c6ad2396bb98dc8eb1ad47bf5d066b227a47f8b5) --- .../Notifications/Boxcar/Boxcar.cs | 48 ---------- .../Notifications/Boxcar/BoxcarException.cs | 18 ---- .../Notifications/Boxcar/BoxcarProxy.cs | 96 ------------------- .../Notifications/Boxcar/BoxcarSettings.cs | 28 ------ 4 files changed, 190 deletions(-) delete mode 100644 src/NzbDrone.Core/Notifications/Boxcar/Boxcar.cs delete mode 100644 src/NzbDrone.Core/Notifications/Boxcar/BoxcarException.cs delete mode 100644 src/NzbDrone.Core/Notifications/Boxcar/BoxcarProxy.cs delete mode 100644 src/NzbDrone.Core/Notifications/Boxcar/BoxcarSettings.cs diff --git a/src/NzbDrone.Core/Notifications/Boxcar/Boxcar.cs b/src/NzbDrone.Core/Notifications/Boxcar/Boxcar.cs deleted file mode 100644 index c1f616d5a..000000000 --- a/src/NzbDrone.Core/Notifications/Boxcar/Boxcar.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Collections.Generic; -using FluentValidation.Results; -using NzbDrone.Common.Extensions; - -namespace NzbDrone.Core.Notifications.Boxcar -{ - public class Boxcar : NotificationBase - { - private readonly IBoxcarProxy _proxy; - - public Boxcar(IBoxcarProxy proxy) - { - _proxy = proxy; - } - - public override string Link => "https://boxcar.io/client"; - public override string Name => "Boxcar"; - - public override void OnGrab(GrabMessage message) - { - _proxy.SendNotification(RELEASE_GRABBED_TITLE, message.Message, Settings); - } - - public override void OnHealthIssue(HealthCheck.HealthCheck message) - { - _proxy.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings); - } - - public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck) - { - _proxy.SendNotification(HEALTH_RESTORED_TITLE, $"The following issue is now resolved: {previousCheck.Message}", Settings); - } - - public override void OnApplicationUpdate(ApplicationUpdateMessage message) - { - _proxy.SendNotification(APPLICATION_UPDATE_TITLE, message.Message, Settings); - } - - public override ValidationResult Test() - { - var failures = new List(); - - failures.AddIfNotNull(_proxy.Test(Settings)); - - return new ValidationResult(failures); - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Boxcar/BoxcarException.cs b/src/NzbDrone.Core/Notifications/Boxcar/BoxcarException.cs deleted file mode 100644 index 6108d4aab..000000000 --- a/src/NzbDrone.Core/Notifications/Boxcar/BoxcarException.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using NzbDrone.Common.Exceptions; - -namespace NzbDrone.Core.Notifications.Boxcar -{ - public class BoxcarException : NzbDroneException - { - public BoxcarException(string message) - : base(message) - { - } - - public BoxcarException(string message, Exception innerException, params object[] args) - : base(message, innerException, args) - { - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Boxcar/BoxcarProxy.cs b/src/NzbDrone.Core/Notifications/Boxcar/BoxcarProxy.cs deleted file mode 100644 index 9b60fde16..000000000 --- a/src/NzbDrone.Core/Notifications/Boxcar/BoxcarProxy.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Net; -using FluentValidation.Results; -using NLog; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Http; - -namespace NzbDrone.Core.Notifications.Boxcar -{ - public interface IBoxcarProxy - { - void SendNotification(string title, string message, BoxcarSettings settings); - ValidationFailure Test(BoxcarSettings settings); - } - - public class BoxcarProxy : IBoxcarProxy - { - private const string URL = "https://new.boxcar.io/api/notifications"; - private readonly IHttpClient _httpClient; - private readonly Logger _logger; - - public BoxcarProxy(IHttpClient httpClient, Logger logger) - { - _httpClient = httpClient; - _logger = logger; - } - - public void SendNotification(string title, string message, BoxcarSettings settings) - { - try - { - ProcessNotification(title, message, settings); - } - catch (BoxcarException ex) - { - _logger.Error(ex, "Unable to send message"); - throw new BoxcarException("Unable to send Boxcar notifications"); - } - } - - public ValidationFailure Test(BoxcarSettings settings) - { - try - { - const string title = "Test Notification"; - const string body = "This is a test message from Prowlarr"; - - SendNotification(title, body, settings); - return null; - } - catch (HttpException ex) - { - if (ex.Response.StatusCode == HttpStatusCode.Unauthorized) - { - _logger.Error(ex, "Access Token is invalid: " + ex.Message); - return new ValidationFailure("Token", "Access Token is invalid"); - } - - _logger.Error(ex, "Unable to send test message: " + ex.Message); - return new ValidationFailure("Token", "Unable to send test message"); - } - catch (Exception ex) - { - _logger.Error(ex, "Unable to send test message: " + ex.Message); - return new ValidationFailure("", "Unable to send test message"); - } - } - - private void ProcessNotification(string title, string message, BoxcarSettings settings) - { - try - { - var requestBuilder = new HttpRequestBuilder(URL).Post(); - - var request = requestBuilder.AddFormParameter("user_credentials", settings.Token) - .AddFormParameter("notification[title]", title) - .AddFormParameter("notification[long_message]", message) - .AddFormParameter("notification[source_name]", BuildInfo.AppName) - .AddFormParameter("notification[icon_url]", "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/64.png") - .Build(); - - _httpClient.Post(request); - } - catch (HttpException ex) - { - if (ex.Response.StatusCode == HttpStatusCode.Unauthorized) - { - _logger.Error(ex, "Access Token is invalid: " + ex.Message); - throw; - } - - throw new BoxcarException("Unable to send text message: " + ex.Message, ex); - } - } - } -} diff --git a/src/NzbDrone.Core/Notifications/Boxcar/BoxcarSettings.cs b/src/NzbDrone.Core/Notifications/Boxcar/BoxcarSettings.cs deleted file mode 100644 index 0fec4e2b6..000000000 --- a/src/NzbDrone.Core/Notifications/Boxcar/BoxcarSettings.cs +++ /dev/null @@ -1,28 +0,0 @@ -using FluentValidation; -using NzbDrone.Core.Annotations; -using NzbDrone.Core.ThingiProvider; -using NzbDrone.Core.Validation; - -namespace NzbDrone.Core.Notifications.Boxcar -{ - public class BoxcarSettingsValidator : AbstractValidator - { - public BoxcarSettingsValidator() - { - RuleFor(c => c.Token).NotEmpty(); - } - } - - public class BoxcarSettings : IProviderConfig - { - private static readonly BoxcarSettingsValidator Validator = new BoxcarSettingsValidator(); - - [FieldDefinition(0, Label = "Access Token", Privacy = PrivacyLevel.ApiKey, HelpText = "Your Access Token, from your Boxcar account settings: https://new.boxcar.io/account/edit", HelpLink = "https://new.boxcar.io/account/edit")] - public string Token { get; set; } - - public NzbDroneValidationResult Validate() - { - return new NzbDroneValidationResult(Validator.Validate(this)); - } - } -} From 3df33e1a86ca1b89f4f52463850c089b21e02534 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 25 Nov 2023 20:23:03 +0000 Subject: [PATCH 325/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Appoxo Co-authored-by: Charlie Co-authored-by: Dimitri Co-authored-by: Havok Dan Co-authored-by: RicardoVelaC Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 11 ++++++++++- src/NzbDrone.Core/Localization/Core/es.json | 3 ++- src/NzbDrone.Core/Localization/Core/fr.json | 12 ++++++++---- src/NzbDrone.Core/Localization/Core/pt_BR.json | 3 ++- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index a1d22f674..d5be5ed3c 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -507,5 +507,14 @@ "ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?", "AddCustomFilter": "Eigenen Filter hinzufügen", "AddApplication": "Application hinzufügen", - "AddCategory": "Kategorie hinzufügen" + "AddCategory": "Kategorie hinzufügen", + "AdvancedSettingsHiddenClickToShow": "Erweiterte Einstellungen versteckt, klicke hier zum anzeigen", + "AdvancedSettingsShownClickToHide": "Erweitere Einstellung angezeigt, klicke hier zum verstecken", + "AppUpdated": "{appName} aktualisiert", + "TotalQueries": "Gesamte Abfragen", + "days": "Tage", + "VipExpiration": "VIP Ablaufdatum", + "TotalUserAgentQueries": "Gesamte Nutzeragent Anfragen", + "ActiveApps": "Aktive Apps", + "ActiveIndexers": "Aktive Indexer" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 7985e3f38..709d36070 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -440,5 +440,6 @@ "AuthenticationRequiredUsernameHelpTextWarning": "Introduzca un nuevo nombre de usuario", "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.", "EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", - "DefaultNameCopiedProfile": "{name} - Copia" + "DefaultNameCopiedProfile": "{name} - Copia", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 6b5a9adc9..306cf05a0 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -12,7 +12,7 @@ "Events": "Événements", "Edit": "Modifier", "DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", - "DownloadClients": "Clients de téléchargements", + "DownloadClients": "Clients de télécharg.", "Dates": "Dates", "Date": "Date", "Delete": "Supprimer", @@ -148,9 +148,9 @@ "ApiKey": "Clé API", "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de {appName}. Cela inclut des informations sur votre navigateur, quelle page {appName} WebUI vous utilisez, les rapports d'erreurs, ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.", "IgnoredAddresses": "Adresses ignorées", - "Hostname": "Hostname", + "Hostname": "Nom d'hôte", "GeneralSettings": "Réglages généraux", - "Fixed": "Fixé", + "Fixed": "Corrigés", "EnableSslHelpText": " Nécessite un redémarrage en tant qu'administrateur pour être effectif", "EnableSSL": "Activer le SSL", "EnableInteractiveSearch": "Activer la recherche interactive", @@ -597,5 +597,9 @@ "PackSeedTime": "Temps de Seed", "ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune balise ou qui ont une ou plusieurs balises correspondantes", "OnHealthRestored": "Sur la santé restaurée", - "OnHealthRestoredHelpText": "Sur la santé restaurée" + "OnHealthRestoredHelpText": "Sur la santé restaurée", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe", + "PasswordConfirmation": "Confirmation du mot de passe", + "NoIndexerCategories": "Aucune catégorie disponible pour cet indexeur", + "InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index f70733597..3e2129e72 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -600,5 +600,6 @@ "IndexerTagsHelpTextWarning": "As tags devem ser usadas com cautela, pois podem ter efeitos indesejados. Um indexador com uma tag sincronizará apenas com aplicativos com a mesma tag.", "NoIndexerCategories": "Nenhuma categoria encontrada para este indexador", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirme a nova senha", - "PasswordConfirmation": "Confirmação Da Senha" + "PasswordConfirmation": "Confirmação Da Senha", + "InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações" } From 81e9c29d54cf610ebfa942a44cfe1e9bf6a908db Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 26 Nov 2023 22:46:36 +0200 Subject: [PATCH 326/964] Bump version to 1.11.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c7ab632ae..5d219fdf2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.10.5' + majorVersion: '1.11.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From b66a85269f4e1cd4eaa94f0d81d72db3ca10b6ae Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 27 Nov 2023 03:02:03 +0200 Subject: [PATCH 327/964] Add color to links in info inputs --- frontend/src/Components/Form/InfoInput.css | 13 +++++++++++++ frontend/src/Components/Form/InfoInput.js | 6 +++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 frontend/src/Components/Form/InfoInput.css diff --git a/frontend/src/Components/Form/InfoInput.css b/frontend/src/Components/Form/InfoInput.css new file mode 100644 index 000000000..6a37f8ddf --- /dev/null +++ b/frontend/src/Components/Form/InfoInput.css @@ -0,0 +1,13 @@ +.message { + composes: alert from '~Components/Alert.css'; + + a { + color: var(--linkColor); + text-decoration: none; + + &:hover { + color: var(--linkHoverColor); + text-decoration: underline; + } + } +} diff --git a/frontend/src/Components/Form/InfoInput.js b/frontend/src/Components/Form/InfoInput.js index d26a519a4..77b833c4b 100644 --- a/frontend/src/Components/Form/InfoInput.js +++ b/frontend/src/Components/Form/InfoInput.js @@ -2,6 +2,7 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import Alert from 'Components/Alert'; import { kinds } from 'Helpers/Props'; +import styles from './InfoInput.css'; class InfoInput extends Component { @@ -12,7 +13,10 @@ class InfoInput extends Component { const { value } = this.props; return ( - + ); From bbf9945b494c59d27733cf3972c9bd7913236b5a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 27 Nov 2023 05:34:03 +0200 Subject: [PATCH 328/964] Add missing CSS typing --- frontend/src/Components/Form/InfoInput.css.d.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 frontend/src/Components/Form/InfoInput.css.d.ts diff --git a/frontend/src/Components/Form/InfoInput.css.d.ts b/frontend/src/Components/Form/InfoInput.css.d.ts new file mode 100644 index 000000000..65c237dff --- /dev/null +++ b/frontend/src/Components/Form/InfoInput.css.d.ts @@ -0,0 +1,7 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'message': string; +} +export const cssExports: CssExports; +export default cssExports; From 6d134750ffd46195b3251417503f92bee869717a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 27 Nov 2023 05:32:50 +0200 Subject: [PATCH 329/964] New: (Redacted) Add Freeload Only option --- .../Indexers/Definitions/Redacted.cs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index b54bf4199..a3c5356cb 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -193,6 +193,11 @@ namespace NzbDrone.Core.Indexers.Definitions queryCats.ForEach(cat => parameters.Set($"filter_cat[{cat}]", "1")); } + if (_settings.FreeloadOnly) + { + parameters.Set("freetorrent", "4"); + } + var searchUrl = _settings.BaseUrl.TrimEnd('/') + $"/ajax.php?{parameters.GetQueryString()}"; var request = new IndexerRequest(searchUrl, HttpAccept.Json); @@ -242,6 +247,12 @@ namespace NzbDrone.Core.Indexers.Definitions { foreach (var torrent in result.Torrents) { + // skip non-freeload results when freeload only is set + if (_settings.FreeloadOnly && !torrent.IsFreeload) + { + continue; + } + var id = torrent.TorrentId; var title = GetTitle(result, torrent); @@ -251,7 +262,7 @@ namespace NzbDrone.Core.Indexers.Definitions { Guid = infoUrl, InfoUrl = infoUrl, - DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken), + DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken && !torrent.IsFreeload), Title = WebUtility.HtmlDecode(title), Artist = WebUtility.HtmlDecode(result.Artist), Album = WebUtility.HtmlDecode(result.GroupName), @@ -286,6 +297,12 @@ namespace NzbDrone.Core.Indexers.Definitions // Non-Audio files are formatted a little differently (1:1 for group and torrents) else { + // skip non-freeload results when freeload only is set + if (_settings.FreeloadOnly && !result.IsFreeload) + { + continue; + } + var id = result.TorrentId; var infoUrl = GetInfoUrl(result.GroupId, id); @@ -294,7 +311,7 @@ namespace NzbDrone.Core.Indexers.Definitions Guid = infoUrl, Title = WebUtility.HtmlDecode(result.GroupName), Size = long.Parse(result.Size), - DownloadUrl = GetDownloadUrl(id, result.CanUseToken), + DownloadUrl = GetDownloadUrl(id, result.CanUseToken && !result.IsFreeload), InfoUrl = infoUrl, Seeders = int.Parse(result.Seeders), Peers = int.Parse(result.Leechers) + int.Parse(result.Seeders), @@ -394,12 +411,15 @@ namespace NzbDrone.Core.Indexers.Definitions UseFreeleechToken = false; } - [FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "API Key from the Site (Found in Settings => Access Settings)")] public string Apikey { get; set; } - [FieldDefinition(3, Label = "Use Freeleech Tokens", HelpText = "Use freeleech tokens when available", Type = FieldType.Checkbox)] + [FieldDefinition(3, Label = "Use Freeleech Tokens", Type = FieldType.Checkbox, HelpText = "Use freeleech tokens when available")] public bool UseFreeleechToken { get; set; } + [FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 6 January 2024, 23:59 UTC.")] + public bool FreeloadOnly { get; set; } + public override NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); From fdaca64d607336a9d5d4c670aa2d9ef539bf3348 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 28 Nov 2023 03:54:47 +0200 Subject: [PATCH 330/964] Fixed: (BTN) Add MST, indexer flags and parse IMDb ID --- .../BroadcastheNet/BroadcastheNet.cs | 11 +-- .../BroadcastheNet/BroadcastheNetParser.cs | 79 +++++++++++-------- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNet.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNet.cs index 074e3ec43..023dde674 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNet.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNet.cs @@ -9,7 +9,9 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet public class BroadcastheNet : TorrentIndexerBase { public override string Name => "BroadcasTheNet"; - + public override string[] IndexerUrls => new[] { "https://api.broadcasthe.net/" }; + public override string[] LegacyUrls => new[] { "http://api.broadcasthe.net/" }; + public override string Description => "BroadcasTheNet (BTN) is an invite-only torrent tracker focused on TV shows"; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override bool SupportsRss => true; public override bool SupportsSearch => true; @@ -18,11 +20,6 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet public override IndexerCapabilities Capabilities => SetCapabilities(); public override TimeSpan RateLimit => TimeSpan.FromSeconds(5); - public override string[] IndexerUrls => new string[] { "https://api.broadcasthe.net/" }; - public override string[] LegacyUrls => new string[] { "http://api.broadcasthe.net/" }; - - public override string Description => "BroadcasTheNet (BTN) is an invite-only torrent tracker focused on TV shows"; - public BroadcastheNet(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) : base(httpClient, eventAggregator, indexerStatusService, configService, logger) { @@ -30,7 +27,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet public override IIndexerRequestGenerator GetRequestGenerator() { - var requestGenerator = new BroadcastheNetRequestGenerator() { Settings = Settings, PageSize = PageSize, Capabilities = Capabilities }; + var requestGenerator = new BroadcastheNetRequestGenerator { Settings = Settings, PageSize = PageSize, Capabilities = Capabilities }; var releaseInfo = _indexerStatusService.GetLastRssSyncReleaseInfo(Definition.Id); if (releaseInfo != null) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetParser.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetParser.cs index 4650671c5..88d66a0b2 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetParser.cs @@ -25,7 +25,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet public IList ParseResponse(IndexerResponse indexerResponse) { - var results = new List(); + var releaseInfos = new List(); var indexerHttpResponse = indexerResponse.HttpResponse; switch (indexerHttpResponse.StatusCode) @@ -69,60 +69,71 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet if (jsonResponse.Result.Results == 0 || jsonResponse.Result?.Torrents?.Values == null) { - return results; + return releaseInfos; } var protocol = indexerResponse.HttpRequest.Url.Scheme + ":"; foreach (var torrent in jsonResponse.Result.Torrents.Values) { - var torrentInfo = new TorrentInfo(); + var flags = new HashSet(); - torrentInfo.Guid = string.Format("BTN-{0}", torrent.TorrentID); - torrentInfo.Title = CleanReleaseName(torrent.ReleaseName); - torrentInfo.Size = torrent.Size; - torrentInfo.DownloadUrl = RegexProtocol.Replace(torrent.DownloadURL, protocol); - torrentInfo.InfoUrl = string.Format("{0}//broadcasthe.net/torrents.php?id={1}&torrentid={2}", protocol, torrent.GroupID, torrent.TorrentID); - - //torrentInfo.CommentUrl = - if (torrent.TvdbID.HasValue) + if (torrent.Origin.ToUpperInvariant() == "INTERNAL") { - torrentInfo.TvdbId = torrent.TvdbID.Value; + flags.Add(IndexerFlag.Internal); } - if (torrent.TvrageID.HasValue) + var releaseInfo = new TorrentInfo { - torrentInfo.TvRageId = torrent.TvrageID.Value; + Guid = $"BTN-{torrent.TorrentID}", + InfoUrl = $"{protocol}//broadcasthe.net/torrents.php?id={torrent.GroupID}&torrentid={torrent.TorrentID}", + DownloadUrl = RegexProtocol.Replace(torrent.DownloadURL, protocol), + Title = CleanReleaseName(torrent.ReleaseName), + Categories = _categories.MapTrackerCatToNewznab(torrent.Resolution), + InfoHash = torrent.InfoHash, + Size = torrent.Size, + Grabs = torrent.Snatched, + Seeders = torrent.Seeders, + Peers = torrent.Leechers + torrent.Seeders, + PublishDate = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().AddSeconds(torrent.Time), + Origin = torrent.Origin, + Source = torrent.Source, + Container = torrent.Container, + Codec = torrent.Codec, + Resolution = torrent.Resolution, + Scene = torrent.Origin.ToUpperInvariant() == "SCENE", + IndexerFlags = flags, + DownloadVolumeFactor = 0, + UploadVolumeFactor = 1, + MinimumRatio = 1, + MinimumSeedTime = torrent.Category.ToUpperInvariant() == "SEASON" ? 432000 : 86400, // 120 hours for seasons and 24 hours for episodes + }; + + if (torrent.TvdbID is > 0) + { + releaseInfo.TvdbId = torrent.TvdbID.Value; } - torrentInfo.PublishDate = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().AddSeconds(torrent.Time); + if (torrent.TvrageID is > 0) + { + releaseInfo.TvRageId = torrent.TvrageID.Value; + } - //torrentInfo.MagnetUrl = - torrentInfo.InfoHash = torrent.InfoHash; - torrentInfo.Seeders = torrent.Seeders; - torrentInfo.Peers = torrent.Leechers + torrent.Seeders; - - torrentInfo.Origin = torrent.Origin; - torrentInfo.Source = torrent.Source; - torrentInfo.Container = torrent.Container; - torrentInfo.Codec = torrent.Codec; - torrentInfo.Resolution = torrent.Resolution; - torrentInfo.UploadVolumeFactor = 1; - torrentInfo.DownloadVolumeFactor = 0; - torrentInfo.MinimumRatio = 1; - - torrentInfo.Categories = _categories.MapTrackerCatToNewznab(torrent.Resolution); + if (torrent.ImdbID.IsNotNullOrWhiteSpace() && int.TryParse(torrent.ImdbID, out var imdbId)) + { + releaseInfo.ImdbId = imdbId; + } // Default to TV if category could not be mapped - if (torrentInfo.Categories == null || !torrentInfo.Categories.Any()) + if (releaseInfo.Categories == null || !releaseInfo.Categories.Any()) { - torrentInfo.Categories = new List { NewznabStandardCategory.TV }; + releaseInfo.Categories = new List { NewznabStandardCategory.TV }; } - results.Add(torrentInfo); + releaseInfos.Add(releaseInfo); } - return results; + return releaseInfos; } private string CleanReleaseName(string releaseName) From 9dc117191e3ef0a8f888c7095b18a5f5821455b8 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 28 Nov 2023 09:22:13 +0200 Subject: [PATCH 331/964] Minor cleanup for BTN --- .../BroadcastheNet/BroadcastheNet.cs | 15 ++------ .../BroadcastheNet/BroadcastheNetParser.cs | 4 +-- .../BroadcastheNetRequestGenerator.cs | 35 ++++++++----------- .../BroadcastheNetTorrentQuery.cs | 13 +++---- 4 files changed, 25 insertions(+), 42 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNet.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNet.cs index 023dde674..9a2e802d9 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNet.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNet.cs @@ -27,18 +27,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet public override IIndexerRequestGenerator GetRequestGenerator() { - var requestGenerator = new BroadcastheNetRequestGenerator { Settings = Settings, PageSize = PageSize, Capabilities = Capabilities }; - - var releaseInfo = _indexerStatusService.GetLastRssSyncReleaseInfo(Definition.Id); - if (releaseInfo != null) - { - if (int.TryParse(releaseInfo.Guid.Replace("BTN-", string.Empty), out var torrentId)) - { - requestGenerator.LastRecentTorrentID = torrentId; - } - } - - return requestGenerator; + return new BroadcastheNetRequestGenerator { Settings = Settings, Capabilities = Capabilities, PageSize = PageSize }; } public override IParseIndexerResponse GetParser() @@ -62,7 +51,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet caps.Categories.AddCategoryMapping("720p", NewznabStandardCategory.TVHD, "720p"); caps.Categories.AddCategoryMapping("1080p", NewznabStandardCategory.TVHD, "1080p"); caps.Categories.AddCategoryMapping("1080i", NewznabStandardCategory.TVHD, "1080i"); - caps.Categories.AddCategoryMapping("2160p", NewznabStandardCategory.TVHD, "2160p"); + caps.Categories.AddCategoryMapping("2160p", NewznabStandardCategory.TVUHD, "2160p"); caps.Categories.AddCategoryMapping("Portable Device", NewznabStandardCategory.TVSD, "Portable Device"); return caps; diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetParser.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetParser.cs index 88d66a0b2..394fed9ad 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetParser.cs @@ -138,9 +138,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet private string CleanReleaseName(string releaseName) { - releaseName = releaseName.Replace("\\", ""); - - return releaseName; + return releaseName.Replace("\\", ""); } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs index 17fc12a44..6705c9773 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs @@ -9,31 +9,13 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet { public class BroadcastheNetRequestGenerator : IIndexerRequestGenerator { - public int MaxPages { get; set; } - public int PageSize { get; set; } public BroadcastheNetSettings Settings { get; set; } public IndexerCapabilities Capabilities { get; set; } - - public int? LastRecentTorrentID { get; set; } + public int PageSize { get; set; } public Func> GetCookies { get; set; } public Action, DateTime?> CookiesUpdater { get; set; } - public BroadcastheNetRequestGenerator() - { - MaxPages = 10; - PageSize = 100; - } - - private IEnumerable GetPagedRequests(BroadcastheNetTorrentQuery parameters, int results, int offset) - { - var builder = new JsonRpcRequestBuilder(Settings.BaseUrl) - .Call("getTorrents", Settings.ApiKey, parameters, results, offset); - builder.SuppressHttpError = true; - - yield return new IndexerRequest(builder.Build()); - } - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { return new IndexerPageableRequestChain(); @@ -132,11 +114,24 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet var btnOffset = searchCriteria.Offset.GetValueOrDefault(0); - parameters.Search = searchString.Replace(" ", "%"); + if (searchString.IsNotNullOrWhiteSpace()) + { + parameters.Search = searchString.Replace(" ", "%"); + } pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset)); return pageableRequests; } + + private IEnumerable GetPagedRequests(BroadcastheNetTorrentQuery parameters, int results, int offset) + { + var builder = new JsonRpcRequestBuilder(Settings.BaseUrl) + .Call("getTorrents", Settings.ApiKey, parameters, results, offset); + + builder.SuppressHttpError = true; + + yield return new IndexerRequest(builder.Build()); + } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetTorrentQuery.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetTorrentQuery.cs index 1180f9b63..5cfadcef3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetTorrentQuery.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetTorrentQuery.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using System.Collections.Generic; +using Newtonsoft.Json; namespace NzbDrone.Core.Indexers.BroadcastheNet { @@ -13,15 +14,15 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] public string Search { get; set; } [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Codec { get; set; } + public IEnumerable Codec { get; set; } [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Container { get; set; } + public IEnumerable Container { get; set; } [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Source { get; set; } + public IEnumerable Source { get; set; } [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Resolution { get; set; } + public IEnumerable Resolution { get; set; } [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Origin { get; set; } + public IEnumerable Origin { get; set; } [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] public string Hash { get; set; } [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] From e12cd68772c488bc269f524ec0feb70be34164c2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 29 Nov 2023 08:18:24 +0200 Subject: [PATCH 332/964] Fixed: (RED/OPS) Add log score to release titles --- .../IndexerTests/OrpheusTests/OrpheusFixture.cs | 2 +- .../IndexerTests/RedactedTests/RedactedFixture.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs | 15 ++++++++++++--- .../Indexers/Definitions/Redacted.cs | 15 ++++++++++++--- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs index 1ba9c0af1..e324ced6b 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Core.Test.IndexerTests.OrpheusTests var torrentInfo = releases.First() as TorrentInfo; - torrentInfo.Title.Should().Be("The Beatles - Abbey Road [1969] [Album] [2.0 Mix 2019] [MP3 V2 (VBR)] [BD]"); + torrentInfo.Title.Should().Be("The Beatles - Abbey Road [1969] [Album] [2.0 Mix 2019] [MP3 V2 (VBR) / BD]"); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); torrentInfo.DownloadUrl.Should().Be("https://orpheus.network/ajax.php?action=download&id=1902448"); torrentInfo.InfoUrl.Should().Be("https://orpheus.network/torrents.php?id=466&torrentid=1902448"); diff --git a/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs index 7a7cc836f..0b1b79563 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests var torrentInfo = releases.First() as TorrentInfo; - torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication [1999] [Album] [US / Reissue 2020] [FLAC 24bit Lossless] [Vinyl]"); + torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication [1999] [Album] [US / Reissue 2020] [FLAC 24bit Lossless / Vinyl]"); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); torrentInfo.DownloadUrl.Should().Be("https://redacted.ch/ajax.php?action=download&id=3892313"); torrentInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=16720&torrentid=3892313"); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index c8513296e..7fd1b94b7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -374,14 +374,23 @@ namespace NzbDrone.Core.Indexers.Definitions title += $" [{$"{torrent.RemasterTitle} {torrent.RemasterYear}".Trim()}]"; } - title += $" [{torrent.Format} {torrent.Encoding}] [{torrent.Media}]"; + var flags = new List + { + $"{torrent.Format} {torrent.Encoding}", + $"{torrent.Media}" + }; + + if (torrent.HasLog) + { + flags.Add("Log (" + torrent.LogScore + "%)"); + } if (torrent.HasCue) { - title += " [Cue]"; + flags.Add("Cue"); } - return title; + return $"{title} [{string.Join(" / ", flags)}]"; } private string GetDownloadUrl(int torrentId, bool canUseToken) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index a3c5356cb..e73e1ead6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -357,14 +357,23 @@ namespace NzbDrone.Core.Indexers.Definitions title += $" [{$"{torrent.RemasterTitle} {torrent.RemasterYear}".Trim()}]"; } - title += $" [{torrent.Format} {torrent.Encoding}] [{torrent.Media}]"; + var flags = new List + { + $"{torrent.Format} {torrent.Encoding}", + $"{torrent.Media}" + }; + + if (torrent.HasLog) + { + flags.Add("Log (" + torrent.LogScore + "%)"); + } if (torrent.HasCue) { - title += " [Cue]"; + flags.Add("Cue"); } - return title; + return $"{title} [{string.Join(" / ", flags)}]"; } private string GetDownloadUrl(int torrentId, bool canUseToken) From a0d0e3e2329949eb00507ff52bdbf249e779084b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 29 Nov 2023 08:22:17 +0200 Subject: [PATCH 333/964] Fixed: (OPS) Use `canUseToken` for download links when using `Use Freeleech Tokens` --- src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index 7fd1b94b7..b5b57cd01 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -401,7 +401,7 @@ namespace NzbDrone.Core.Indexers.Definitions .AddQueryParam("id", torrentId); // Orpheus fails to download if usetoken=0 so we need to only add if we will use one - if (_settings.UseFreeleechToken) + if (_settings.UseFreeleechToken && canUseToken) { url = url.AddQueryParam("usetoken", "1"); } From 12ca70555639810d6d0eade569f997a6fbc692cf Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 30 Nov 2023 01:57:32 +0200 Subject: [PATCH 334/964] Fixed: (AvistaZ) Increase rate limit and use workaround for Retry-After in auth --- .../Indexers/Definitions/Avistaz/AvistazBase.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs index 4d9c7e5fc..cd09785c6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs @@ -17,7 +17,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz public override bool SupportsSearch => true; public override bool SupportsPagination => true; public override int PageSize => 50; - public override TimeSpan RateLimit => TimeSpan.FromSeconds(5); + public override TimeSpan RateLimit => TimeSpan.FromSeconds(6); public override IndexerCapabilities Capabilities => SetCapabilities(); protected virtual string LoginUrl => Settings.BaseUrl + "api/v1/jackett/auth"; private IIndexerRepository _indexerRepository; @@ -50,10 +50,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz return new AvistazParserBase(); } - protected virtual IndexerCapabilities SetCapabilities() - { - return new IndexerCapabilities(); - } + protected abstract IndexerCapabilities SetCapabilities(); protected override async Task DoLogin() { @@ -116,11 +113,12 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz Method = HttpMethod.Post }; + // TODO: Change to HttpAccept.Json after they fix the issue with missing headers var authLoginRequest = requestBuilder .AddFormParameter("username", Settings.Username) .AddFormParameter("password", Settings.Password) .AddFormParameter("pid", Settings.Pid.Trim()) - .Accept(HttpAccept.Json) + .Accept(HttpAccept.Html) .Build(); var response = await ExecuteAuth(authLoginRequest); From badb9dee613b8d06a0a9a007917904d00d97e9a3 Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 30 Nov 2023 13:58:09 +0000 Subject: [PATCH 335/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Appoxo Co-authored-by: David Molero Co-authored-by: Havok Dan Co-authored-by: Patatra Co-authored-by: Zalhera Co-authored-by: liimee Co-authored-by: resi23 Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 25 +++++++++++------ src/NzbDrone.Core/Localization/Core/es.json | 7 +++-- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- src/NzbDrone.Core/Localization/Core/id.json | 28 +++++++++++++++---- .../Localization/Core/pt_BR.json | 2 +- 5 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index d5be5ed3c..1bfae0b18 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -280,23 +280,23 @@ "ProwlarrSupportsAnyIndexer": "{appName} unterstützt alle Indexer, welcher den Newznab/Torznab Standard implementiert (verwende 'Generic Newznab' (für Usenet) oder 'Generic Torznab' (für Torrents)) und darüber hinaus viele weitere Indexer. Wählen Sie im Folgenden Ihren Indexer aus der Liste.", "Proxies": "Proxies", "Proxy": "Proxy", - "ProxyBypassFilterHelpText": "Verwende ',' als Trennzeichen und '*.' als Platzhalter für Subdomains", + "ProxyBypassFilterHelpText": "Verwenden Sie ',' als Trennzeichen und '*.' als Wildcard für Subdomains", "ProxyCheckBadRequestMessage": "Proxy konnte nicht getestet werden. StatusCode: {0}", "ProxyCheckFailedToTestMessage": "Proxy konnte nicht getestet werden: {0}", "ProxyCheckResolveIpMessage": "Fehler beim Auflösen der IP-Adresse für den konfigurierten Proxy-Host {0}", - "ProxyPasswordHelpText": "Nur wenn ein Benutzername und Passwort erforderlich ist, muss es eingegeben werden. Ansonsten leer lassen.", - "ProxyType": "Proxy Typ", - "ProxyUsernameHelpText": "Nur wenn ein Benutzername und Passwort erforderlich ist, muss es eingegeben werden. Ansonsten leer lassen.", + "ProxyPasswordHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.", + "ProxyType": "Proxy-Typ", + "ProxyUsernameHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.", "Public": "Öffentlich", "Query": "Abfrage", "QueryOptions": "Abfrage-Optionen", "QueryResults": "Abfrageergebnisse", "Queue": "Warteschlange", - "Queued": "In der Warteschlange", + "Queued": "In Warteschlange", "RSS": "RSS", "RSSIsNotSupportedWithThisIndexer": "RSS wird von diesem Indexer nicht unterstützt", "RawSearchSupported": "Raw-Suche unterstützt", - "ReadTheWikiForMoreInformation": "Lese das Wiki für mehr Informationen", + "ReadTheWikiForMoreInformation": "Lesen Sie das Wiki für weitere Informationen", "Reddit": "Reddit", "Redirect": "Umleiten", "RedirectHelpText": "Eingehende Download-Anfragen für den Indexer umleiten, anstatt Proxying mit {appName}", @@ -493,7 +493,7 @@ "Book": "Buch", "ConnectionLostReconnect": "Radarr wird automatisch versuchen zu verbinden oder klicke unten auf neuladen.", "ConnectionLostToBackend": "Radarr hat die Verbindung zum Backend verloren und muss neugeladen werden.", - "RecentChanges": "Neuste Änderungen", + "RecentChanges": "Kürzliche Änderungen", "WhatsNew": "Was gibt's Neues?", "minutes": "Minuten", "DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?", @@ -516,5 +516,14 @@ "VipExpiration": "VIP Ablaufdatum", "TotalUserAgentQueries": "Gesamte Nutzeragent Anfragen", "ActiveApps": "Aktive Apps", - "ActiveIndexers": "Aktive Indexer" + "ActiveIndexers": "Aktive Indexer", + "AppsMinimumSeeders": "Apps Mindestanzahl von Seedern", + "ApplicationTagsHelpText": "Synchronisiere Indexer für diese Anwendung die keine passenden Tags oder mindestens 1 passendes Tag haben", + "ApplicationTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.", + "AddApplicationImplementation": "Anwendung hinzufügen - {implementationName}", + "AddConnectionImplementation": "Verbindung hinzufügen - {implementationName}", + "AddDownloadClientImplementation": "Download-Client hinzufügen - {implementationName}", + "AddIndexerImplementation": "Indexer hinzufügen - {implementationName}", + "AddIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}", + "AppUpdatedVersion": "{appName} wurde auf die Version `{version}` aktualisiert. Um die neusten Funktionen zu bekommen lade {appName} neu" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 709d36070..cf5e297d6 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -1,7 +1,7 @@ { "Indexers": "Indexadores", "Host": "Host", - "History": "Historia", + "History": "Historial", "HideAdvanced": "Ocultar Avanzado", "Health": "Salud", "General": "General", @@ -167,7 +167,7 @@ "URLBase": "URL Base", "Uptime": "Tiempo de actividad", "UpdateScriptPathHelpText": "Ruta del script propio que toma el paquete de actualización y se encarga del proceso de actualización restante", - "UpdateMechanismHelpText": "Usar el actualizador de {appName} o un script", + "UpdateMechanismHelpText": "Usar el actualizador incorporado de {appName} o un script", "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Se podrán instalar desde Sistema: Actualizaciones también", "UnableToLoadTags": "No se pueden cargar las Etiquetas", "UnableToLoadNotifications": "No se pueden cargar las Notificaciones", @@ -441,5 +441,6 @@ "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.", "EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", "DefaultNameCopiedProfile": "{name} - Copia", - "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña" + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña", + "NoHistoryFound": "No se encontró historial" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 306cf05a0..842ce4cc3 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -12,7 +12,7 @@ "Events": "Événements", "Edit": "Modifier", "DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", - "DownloadClients": "Clients de télécharg.", + "DownloadClients": "Clients de téléchargement", "Dates": "Dates", "Date": "Date", "Delete": "Supprimer", diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index 8a538e620..017e0ba5f 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -19,7 +19,7 @@ "ChangeHasNotBeenSavedYet": "Perubahan belum disimpan", "EnableInteractiveSearch": "Aktifkan Penelusuran Interaktif", "Ended": "Berakhir", - "AuthenticationMethodHelpText": "Perlukan Nama Pengguna dan Sandi untuk mengakses Radarr", + "AuthenticationMethodHelpText": "Perlukan Nama Pengguna dan Sandi untuk mengakses {appName}", "Host": "Host", "Enable": "Aktif", "EnableRss": "Aktifkan RSS", @@ -34,7 +34,7 @@ "Categories": "Kategori", "Close": "Tutup", "ConnectionLost": "Koneksi Terputus", - "Connections": "Koleksi", + "Connections": "Koneksi", "Custom": "Khusus", "Dates": "Tanggal", "Delete": "Hapus", @@ -46,7 +46,7 @@ "Hostname": "Hostname", "Info": "Informasi", "Language": "Bahasa", - "LogFiles": "Berkas Log", + "LogFiles": "File Log", "NoChange": "Tidak Ada Perubahan", "NoChanges": "Tidak Ada Perubahan", "Queued": "Antrean", @@ -58,7 +58,25 @@ "Actions": "Tindakan", "AllIndexersHiddenDueToFilter": "Semua film disembunyikan karena penyaringan yang diterapkan.", "AnalyticsEnabledHelpText": "Kirimkan informasi penggunaan secara anonim ke server Radarr. Informasi tersebut mengandung browser kamu, halaman WebUI Radarr yang kamu gunakan, pelaporan masalah serta OS dan versi runtime. Kami akan memanfaatkan informasi ini untuk memprioritaskan fitur dan perbaikan bug.", - "ConnectionLostReconnect": "Radarr akan mencoba untuk menghubungi secara otomatis, atau klik muat ulang di bawah.", + "ConnectionLostReconnect": "{appName} akan mencoba untuk menghubungkan secara otomatis, atau silakan klik muat ulang di bawah.", "AuthBasic": "Dasar (Popup Browser)", - "AuthForm": "Formulir (Halaman Login)" + "AuthForm": "Formulir (Halaman Masuk)", + "Category": "Kategori", + "ApplyChanges": "Terapkan Perubahan", + "Today": "Hari Ini", + "Yesterday": "Kemarin", + "Search": "Cari", + "ConnectSettings": "Pengaturan Koneksi", + "Refresh": "Muat Ulang", + "ConnectionLostToBackend": "Koneksi {appName} telah terputus dari backend dan perlu dimuat ulang untuk dipulihkan.", + "Edit": "Edit", + "Files": "File", + "History": "Riwayat", + "AuthenticationMethod": "Metode Autentikasi", + "AuthenticationMethodHelpTextWarning": "Silakan pilih metode autentikasi yang sah", + "AuthenticationRequired": "Autentikasi Diperlukan", + "AuthenticationRequiredPasswordHelpTextWarning": "Masukkan sandi baru", + "AuthenticationRequiredUsernameHelpTextWarning": "Masukkan nama pengguna baru", + "AuthenticationRequiredWarning": "Untuk mencegah akses jarak jauh tanpa autentikasi, {appName} kini mewajibkan pengaktifkan autentikasi. Kamu dapat menonaktifkan autentikasi dari jaringan lokal.", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Konfirmasi sandi baru" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 3e2129e72..61ab4112d 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -479,7 +479,7 @@ "UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.", "UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.", "UpdateCheckUINotWritableMessage": "Não é possível instalar a atualização porque a pasta de IU '{0}' não pode ser gravada pelo usuário '{1}'.", - "UpdateMechanismHelpText": "Usar o atualizador integrado do {appName} ou um script", + "UpdateMechanismHelpText": "Use o atualizador integrado do {appName} ou um script", "UpdateScriptPathHelpText": "Caminho para um script personalizado que usa um pacote de atualização extraído e lida com o restante do processo de atualização", "Updates": "Atualizações", "Uptime": "Tempo de atividade", From dcfdd4911917b47d6bc2287bc803e3a15e48bd5d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 2 Dec 2023 11:30:24 +0200 Subject: [PATCH 336/964] Rollback YamlDotNet --- src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj | 2 +- src/NzbDrone.Core/Prowlarr.Core.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj index 854825b1f..dbfd06861 100644 --- a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj @@ -6,7 +6,7 @@ - +
diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 0333bb54b..275d74c11 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -21,7 +21,7 @@ - + From 7c38ec2baafbc7d18b4d250d84cc781fdc1e4ddf Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 2 Dec 2023 12:07:40 +0200 Subject: [PATCH 337/964] Fixed: (AvistaZ) Improve message for failed logins --- .../Definitions/Avistaz/AvistazBase.cs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs index cd09785c6..560487825 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs @@ -7,6 +7,7 @@ using NLog; using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; using NzbDrone.Core.Configuration; +using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Indexers.Definitions.Avistaz @@ -54,14 +55,24 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz protected override async Task DoLogin() { - Settings.Token = await GetToken(); - - if (Definition.Id > 0) + try { - _indexerRepository.UpdateSettings((IndexerDefinition)Definition); - } + Settings.Token = await GetToken(); - _logger.Debug("Avistaz authentication succeeded."); + if (Definition.Id > 0) + { + _indexerRepository.UpdateSettings((IndexerDefinition)Definition); + } + + _logger.Debug("Avistaz authentication succeeded."); + } + catch (HttpException ex) when (ex.Response.StatusCode == HttpStatusCode.Unauthorized) + { + _logger.Warn(ex, "Failed to authenticate with Avistaz"); + + var jsonResponse = STJson.Deserialize(ex.Response.Content); + throw new IndexerAuthException(jsonResponse?.Message ?? "Unauthorized request to indexer"); + } } protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) From aaf4c73c83e3288c2a1b7a848be210deb23930e3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 3 Dec 2023 08:46:25 +0200 Subject: [PATCH 338/964] Bump version to 1.11.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5d219fdf2..d45d94155 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.11.0' + majorVersion: '1.11.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From b88f8e5fdee7e04d6f5651820a9e252c90e5d300 Mon Sep 17 00:00:00 2001 From: Maksym Ivanchenko Date: Sun, 3 Dec 2023 02:37:39 -0500 Subject: [PATCH 339/964] Fixed: (Toloka) Support RAW search (#1944) --- src/NzbDrone.Core/Indexers/Definitions/Toloka.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Toloka.cs b/src/NzbDrone.Core/Indexers/Definitions/Toloka.cs index 2e4955699..ea1f5f9af 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Toloka.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Toloka.cs @@ -110,7 +110,8 @@ namespace NzbDrone.Core.Indexers.Definitions BookSearchParams = new List { BookSearchParam.Q - } + }, + SupportsRawSearch = true }; caps.Categories.AddCategoryMapping("117", NewznabStandardCategory.Movies, "Українське кіно"); From fbc3c0909467ad8c1ce8a66d1505486346602aa3 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 19 Nov 2023 00:17:32 -0800 Subject: [PATCH 340/964] Always validate Custom Script path (cherry picked from commit c922cc5dc617dd776d4523cbf62376821c5a4ad9) --- .../Notifications/CustomScript/CustomScript.cs | 8 -------- .../Notifications/CustomScript/CustomScriptSettings.cs | 1 + 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs index f87917468..7ca1dc8fc 100755 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs @@ -93,14 +93,6 @@ namespace NzbDrone.Core.Notifications.CustomScript failures.Add(new NzbDroneValidationFailure("Path", "File does not exist")); } - foreach (var systemFolder in SystemFolders.GetSystemFolders()) - { - if (systemFolder.IsParentPath(Settings.Path)) - { - failures.Add(new NzbDroneValidationFailure("Path", $"Must not be a descendant of '{systemFolder}'")); - } - } - if (failures.Empty()) { try diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScriptSettings.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScriptSettings.cs index f4d4d7803..ce5a398ed 100644 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScriptSettings.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScriptSettings.cs @@ -11,6 +11,7 @@ namespace NzbDrone.Core.Notifications.CustomScript public CustomScriptSettingsValidator() { RuleFor(c => c.Path).IsValidPath(); + RuleFor(c => c.Path).SetValidator(new SystemFolderValidator()).WithMessage("Must not be a descendant of '{systemFolder}'"); RuleFor(c => c.Arguments).Empty().WithMessage("Arguments are no longer supported for custom scripts"); } } From c3aa377ed50ec6fd6c8ddeeef4f38cf866c5574d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 4 Dec 2023 10:41:29 +0200 Subject: [PATCH 341/964] Fixed: (PTP) Parse half leech --- .../Definitions/PassThePopcorn/PassThePopcornParser.cs | 7 ++++++- src/NzbDrone.Core/Indexers/IndexerBase.cs | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index bc4d11463..997ba97e0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -94,7 +94,12 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn ImdbId = result.ImdbId.IsNotNullOrWhiteSpace() ? int.Parse(result.ImdbId) : 0, Scene = torrent.Scene, IndexerFlags = flags, - DownloadVolumeFactor = torrent.FreeleechType is "Freeleech" ? 0 : 1, + DownloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch + { + "FREELEECH" => 0, + "HALF LEECH" => 0.5, + _ => 1 + }, UploadVolumeFactor = 1, MinimumRatio = 1, MinimumSeedTime = 345600, diff --git a/src/NzbDrone.Core/Indexers/IndexerBase.cs b/src/NzbDrone.Core/Indexers/IndexerBase.cs index 5f54dd620..5acbba5dd 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBase.cs @@ -138,6 +138,10 @@ namespace NzbDrone.Core.Indexers { torrentRelease.IndexerFlags.Add(IndexerFlag.FreeLeech); } + else if (torrentRelease.DownloadVolumeFactor == 0.5) + { + torrentRelease.IndexerFlags.Add(IndexerFlag.HalfLeech); + } if (torrentRelease.UploadVolumeFactor == 0.0) { From 515f4dff8b4f6dc2c8e6506926f2fd24a193c402 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 4 Dec 2023 13:45:39 +0200 Subject: [PATCH 342/964] New: (NorBits) Login with 2FA support --- src/NzbDrone.Core/Indexers/Definitions/NorBits.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index ddfff26cf..dafc9f229 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.Linq; -using System.Net.Http; using System.Text; using System.Threading.Tasks; using AngleSharp.Dom; @@ -76,12 +75,16 @@ public class NorBits : TorrentIndexerBase { LogResponseContent = true, AllowAutoRedirect = true, - Method = HttpMethod.Post + SuppressHttpError = true }; var authLoginCheckRequest = requestBuilder3 + .Post() .AddFormParameter("username", Settings.Username) .AddFormParameter("password", Settings.Password) + .AddFormParameter("code", Settings.TwoFactorAuthCode ?? string.Empty) + .AddFormParameter("logout", "no") + .AddFormParameter("returnto", "/") .SetCookies(indexPage.GetCookies()) .SetHeader("Referer", loginUrl) .Build(); @@ -343,6 +346,9 @@ public class NorBitsSettings : UserPassTorrentBaseSettings UseFullSearch = false; } - [FieldDefinition(4, Label = "Use Full Search", HelpText = "Use Full Search from Site", Type = FieldType.Checkbox)] + [FieldDefinition(4, Label = "2FA code", Type = FieldType.Textbox, HelpText = "Only fill in the 2FA code box if you have enabled 2FA on the NorBits Web Site. Otherwise just leave it empty.")] + public string TwoFactorAuthCode { get; set; } + + [FieldDefinition(5, Label = "Use Full Search", HelpText = "Use Full Search from Site", Type = FieldType.Checkbox)] public bool UseFullSearch { get; set; } } From 43d56f681777f4a506ea085dce5f2b8e19f30937 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 4 Dec 2023 15:58:10 +0200 Subject: [PATCH 343/964] New: (NorBits) Add FreeLeech Only option --- src/NzbDrone.Core/Indexers/Definitions/NorBits.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index dafc9f229..5022f32d7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -177,6 +177,11 @@ public class NorBitsRequestGenerator : IIndexerRequestGenerator { "scenerelease", "0" } }; + if (_settings.FreeLeechOnly) + { + parameters.Set("FL", "1"); + } + var searchTerm = "search="; if (!string.IsNullOrWhiteSpace(imdbId)) @@ -349,6 +354,9 @@ public class NorBitsSettings : UserPassTorrentBaseSettings [FieldDefinition(4, Label = "2FA code", Type = FieldType.Textbox, HelpText = "Only fill in the 2FA code box if you have enabled 2FA on the NorBits Web Site. Otherwise just leave it empty.")] public string TwoFactorAuthCode { get; set; } - [FieldDefinition(5, Label = "Use Full Search", HelpText = "Use Full Search from Site", Type = FieldType.Checkbox)] + [FieldDefinition(5, Label = "Use Full Search", Type = FieldType.Checkbox, HelpText = "Use Full Search from Site")] public bool UseFullSearch { get; set; } + + [FieldDefinition(6, Label = "FreeLeech Only", Type = FieldType.Checkbox, HelpText = "Search FreeLeech torrents only")] + public bool FreeLeechOnly { get; set; } } From 67355ec07b4f73f3e9de9da8e228d08f5eaf2ecc Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 5 Dec 2023 14:00:02 +0200 Subject: [PATCH 344/964] Fixed: (aro.lol) Removed, site has shutdown --- src/NzbDrone.Core/Indexers/Definitions/AroLol.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AroLol.cs b/src/NzbDrone.Core/Indexers/Definitions/AroLol.cs index 5c12cdfc6..a3d68a63f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AroLol.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AroLol.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using AngleSharp.Html.Parser; using NLog; @@ -10,6 +11,7 @@ using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Indexers.Definitions; +[Obsolete("Site has shutdown")] public class AroLol : GazelleBase { public override string Name => "aro.lol"; From e5d7a217141bcdd7d6934e98ba9149bd8e3a3a4a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 6 Dec 2023 10:24:08 +0200 Subject: [PATCH 345/964] New: (Discord) Add size grab field and improve field selection --- .../Notifications/Discord/Discord.cs | 5 +++++ .../Notifications/Discord/DiscordFieldType.cs | 3 ++- .../Notifications/Discord/DiscordSettings.cs | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs index 9eb41e989..0e442d8ec 100644 --- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs +++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs @@ -65,6 +65,11 @@ namespace NzbDrone.Core.Notifications.Discord discordField.Name = "Host"; discordField.Value = message.Host ?? string.Empty; break; + case DiscordGrabFieldType.Size: + discordField.Name = "Size"; + discordField.Value = BytesToString(message.Release.Size.GetValueOrDefault(0)); + discordField.Inline = true; + break; } if (discordField.Name.IsNotNullOrWhiteSpace() && discordField.Value.IsNotNullOrWhiteSpace()) diff --git a/src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs b/src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs index bfce31544..b84f633e2 100644 --- a/src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs +++ b/src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs @@ -7,6 +7,7 @@ namespace NzbDrone.Core.Notifications.Discord DownloadClient, GrabTrigger, Source, - Host + Host, + Size } } diff --git a/src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs b/src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs index 45aedf189..106c4b95a 100644 --- a/src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs +++ b/src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs @@ -19,10 +19,19 @@ namespace NzbDrone.Core.Notifications.Discord public DiscordSettings() { //Set Default Fields - GrabFields = new List { 0, 1, 2, 3, 5, 6, 7, 8, 9 }; + GrabFields = new List + { + (int)DiscordGrabFieldType.Release, + (int)DiscordGrabFieldType.Indexer, + (int)DiscordGrabFieldType.DownloadClient, + (int)DiscordGrabFieldType.GrabTrigger, + (int)DiscordGrabFieldType.Source, + (int)DiscordGrabFieldType.Host, + (int)DiscordGrabFieldType.Size + }; } - private static readonly DiscordSettingsValidator Validator = new DiscordSettingsValidator(); + private static readonly DiscordSettingsValidator Validator = new (); [FieldDefinition(0, Label = "Webhook URL", HelpText = "Discord channel webhook url")] public string WebHookUrl { get; set; } @@ -36,7 +45,7 @@ namespace NzbDrone.Core.Notifications.Discord [FieldDefinition(3, Label = "Host", Advanced = true, HelpText = "Override the Host that shows for this notification, Blank is machine name", Type = FieldType.Textbox)] public string Author { get; set; } - [FieldDefinition(4, Label = "On Grab Fields", Advanced = true, SelectOptions = typeof(DiscordGrabFieldType), HelpText = "Change the fields that are passed in for this 'on grab' notification", Type = FieldType.TagSelect)] + [FieldDefinition(4, Label = "On Grab Fields", Advanced = true, SelectOptions = typeof(DiscordGrabFieldType), HelpText = "Change the fields that are passed in for this 'on grab' notification", Type = FieldType.Select)] public IEnumerable GrabFields { get; set; } public NzbDroneValidationResult Validate() From a4ae80060373fbe297adf40c20c53c432c21d0e2 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 6 Dec 2023 13:58:11 +0000 Subject: [PATCH 346/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Augusto Poletti Co-authored-by: Dominika Matějková Co-authored-by: VisoTC Co-authored-by: 米大饭 <1246333567@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/cs.json | 44 +++++++++++-------- src/NzbDrone.Core/Localization/Core/es.json | 18 ++++---- .../Localization/Core/zh_CN.json | 9 ++-- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index df2e95ac0..995273150 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -1,7 +1,7 @@ { "Add": "Přidat", "CertificateValidation": "Ověření certifikátu", - "DeleteBackupMessageText": "Opravdu chcete smazat zálohu „{0}“?", + "DeleteBackupMessageText": "Opravdu chcete odstranit zálohu '{name}'?", "YesCancel": "Ano, zrušit", "About": "O aplikaci", "Component": "Komponenta", @@ -35,7 +35,7 @@ "Warn": "Varovat", "Wiki": "Wiki", "Connections": "Připojení", - "DeleteDownloadClientMessageText": "Opravdu chcete odstranit klienta pro stahování „{0}“?", + "DeleteDownloadClientMessageText": "Opravdu chcete odstranit klienta pro stahování '{name}'?", "Details": "Detaily", "Disabled": "Zakázáno", "Docker": "Přístavní dělník", @@ -114,7 +114,7 @@ "AcceptConfirmationModal": "Přijměte potvrzovací modální okno", "Actions": "Akce", "Added": "Přidáno", - "AddIndexer": "Přidat indexátor", + "AddIndexer": "Přidat indexer", "LaunchBrowserHelpText": " Otevřete webový prohlížeč a při spuštění aplikace přejděte na domovskou stránku {appName}.", "Logging": "Protokolování", "Mechanism": "Mechanismus", @@ -249,7 +249,7 @@ "DeleteApplicationMessageText": "Opravdu chcete smazat oznámení „{0}“?", "DeleteBackup": "Odstranit zálohu", "DeleteDownloadClient": "Odstranit staženého klienta", - "DeleteNotificationMessageText": "Opravdu chcete smazat oznámení „{0}“?", + "DeleteNotificationMessageText": "Opravdu chcete smazat oznámení '{name}'?", "DeleteTagMessageText": "Opravdu chcete smazat značku „{0}“?", "Discord": "Svár", "DownloadClient": "Stáhnout klienta", @@ -333,22 +333,22 @@ "More": "Více", "ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu", "ApplyTagsHelpTextHowToApplyApplications": "Jak použít značky na vybrané filmy", - "DeleteSelectedDownloadClients": "Odstranit staženého klienta", - "DeleteSelectedIndexersMessageText": "Opravdu chcete odstranit indexer „{0}“?", + "DeleteSelectedDownloadClients": "Odstranit klienta pro stahování", + "DeleteSelectedIndexersMessageText": "Opravdu chcete smazat {count} vybraný(ch) indexer(ů)?", "DeleteSelectedApplicationsMessageText": "Opravdu chcete odstranit indexer „{0}“?", - "DeleteSelectedDownloadClientsMessageText": "Opravdu chcete odstranit indexer „{0}“?", + "DeleteSelectedDownloadClientsMessageText": "Opravdu chcete smazat {count} vybraných klientů pro stahování?", "Year": "Rok", "ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky", "DownloadClientPriorityHelpText": "Upřednostněte více klientů pro stahování. Round-Robin se používá pro klienty se stejnou prioritou.", - "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexátory", - "ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (zadáním žádné značky vymažete všechny značky)", + "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexery", + "ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (prázdné pole vymaže všechny značky)", "Track": "Stopa", "Genre": "Žánry", "ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.", "RecentChanges": "Nedávné změny", "WhatsNew": "Co je nového?", "DeleteAppProfileMessageText": "Opravdu chcete smazat kvalitní profil {0}", - "ConnectionLostToBackend": "{appName} ztratila spojení s backendem a pro obnovení funkčnosti bude třeba ji znovu načíst.", + "ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude třebaho znovu načíst.", "minutes": "Minut", "ApplicationURL": "URL aplikace", "ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základní adresy URL", @@ -361,29 +361,29 @@ "AddCustomFilter": "Přidat vlastní filtr", "AddConnection": "Přidat spojení", "AddConnectionImplementation": "Přidat spojení - {implementationName}", - "AddIndexerImplementation": "Přidat indexátor - {implementationName}", + "AddIndexerImplementation": "Přidat indexer - {implementationName}", "Publisher": "Vydavatel", "Categories": "Kategorie", "Notification": "Oznámení", "AddApplicationImplementation": "Přidat spojení - {implementationName}", "AddIndexerProxyImplementation": "Přidat indexátor - {implementationName}", - "Artist": "umělec", - "EditIndexerImplementation": "Přidat indexátor - {implementationName}", + "Artist": "Umělec", + "EditIndexerImplementation": "Upravit indexer - {implementationName}", "Episode": "epizoda", "NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání", "NotificationStatusSingleClientHealthCheckMessage": "Seznamy nejsou k dispozici z důvodu selhání: {0}", "Application": "Aplikace", - "AppUpdatedVersion": "{appName} byla aktualizována na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}.", + "AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}", "Encoding": "Kódování", "Notifications": "Oznámení", "Season": "Řada", "Theme": "Motiv", "Label": "Etiketa", - "Album": "album", + "Album": "Album", "Applications": "Aplikace", "Connect": "Oznámení", "EditConnectionImplementation": "Přidat spojení - {implementationName}", - "EditDownloadClientImplementation": "Přidat klienta pro stahování - {implementationName}", + "EditDownloadClientImplementation": "Upravit klienta pro stahování - {implementationName}", "AuthForm": "Formuláře (přihlašovací stránka)", "Clone": "Klonovat", "DefaultNameCopiedProfile": "{name} - Kopírovat", @@ -393,9 +393,17 @@ "ResetAPIKeyMessageText": "Opravdu chcete resetovat klíč API?", "Database": "Databáze", "CountDownloadClientsSelected": "{count} vybraných klientů ke stahování", - "CountIndexersSelected": "{count} vybraných indexátorů", + "CountIndexersSelected": "{count} vybraných indexerů", "EditIndexerProxyImplementation": "Přidat indexátor - {implementationName}", "AuthBasic": "Základní (vyskakovací okno prohlížeče)", "AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName} povolení ověření. Ověřování z místních adres můžete volitelně zakázat.", - "RestartProwlarr": "Restartujte {appName}" + "RestartProwlarr": "Restartujte {appName}", + "Duration": "Trvání", + "EditSelectedDownloadClients": "Upravit vybrané klienty pro stahování", + "EditSelectedIndexers": "Upravit vybrané indexery", + "AuthenticationMethod": "Metoda ověřování", + "AuthenticationRequiredPasswordHelpTextWarning": "Vložte nové heslo", + "AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno", + "AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index cf5e297d6..127b348d8 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -110,7 +110,7 @@ "ConnectionLost": "Conexión perdida", "Component": "Componente", "Columns": "Columnas", - "Close": "Cerrar", + "Close": "", "Cancel": "Cancelar", "Apply": "Aplicar", "Age": "Antigüedad", @@ -139,11 +139,11 @@ "DeleteDownloadClient": "Borrar Gestor de Descargas", "DeleteBackup": "Borrar Backup", "DBMigration": "Migración de DB", - "CloneProfile": "Clonar Perfil", - "ClientPriority": "Prioridad de Cliente", + "CloneProfile": "", + "ClientPriority": "", "ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado", "CertificateValidationHelpText": "Cambiar la rigidez de la validación de la certificación HTTPS", - "CertificateValidation": "Validación del certificado", + "CertificateValidation": "Validacion de certificado", "BypassProxyForLocalAddresses": "Omitir Proxy para Direcciones Locales", "Branch": "Rama", "BindAddressHelpText": "Dirección IP4 válida, localhost o '*' para todas las interfaces", @@ -240,9 +240,9 @@ "DeleteNotificationMessageText": "Seguro que quieres elminiar la notificación '{0}'?", "DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{0}'?", "DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{0}'?", - "CancelPendingTask": "Seguro que quieres cancelar esta tarea pendiente?", - "BranchUpdateMechanism": "Rama usada por el mecanismo de actualización externo", - "BranchUpdate": "Qué rama usar para actualizar {appName}", + "CancelPendingTask": "Estas seguro de que deseas cancelar esta tarea pendiente?", + "BranchUpdateMechanism": "La rama se uso por un mecanisco de actualizacion externo", + "BranchUpdate": "Rama a usar para actualizar {appName}", "BeforeUpdate": "Antes de actualizar", "AddingTag": "Añadir etiqueta", "UnableToLoadUISettings": "No se han podido cargar los ajustes de UI", @@ -333,7 +333,7 @@ "Applications": "Aplicaciones", "AppProfileInUse": "Perfil de aplicación en uso", "AddDownloadClientToProwlarr": "Añadir un cliente de descargas permite a {appName} enviar descargas directamente desde la interfaz en una búsqueda manual.", - "Category": "Categoría", + "Category": "Categoria", "Application": "Aplicación", "BookSearch": "Búsqueda de libros", "BookSearchTypes": "Tipos de búsqueda de libros", @@ -405,7 +405,7 @@ "ConnectionLostReconnect": "Radarr intentará conectarse automáticamente, o haz clic en el botón de recarga abajo.", "ConnectionLostToBackend": "Radarr ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", "RecentChanges": "Cambios recientes", - "WhatsNew": "¿Qué hay de nuevo?", + "WhatsNew": "Que es lo nuevo?", "minutes": "Minutos", "Album": "álbum", "Artist": "artista", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index adf690e4e..ad1080138 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -46,7 +46,7 @@ "Authentication": "认证", "AuthenticationMethodHelpText": "需要用户名和密码以访问 {appName}", "AuthenticationRequired": "需要身份验证", - "AuthenticationRequiredHelpText": "更改身份验证的请求。除非您了解风险,否则请勿更改。", + "AuthenticationRequiredHelpText": "修改哪些请求需要认证。除非你了解其中的风险,否则不要更改。", "AuthenticationRequiredWarning": "为了防止未经身份验证的远程访问,{appName} 现在需要启用身份验证。您可以禁用本地地址的身份验证。", "Author": "作者", "Automatic": "自动化", @@ -469,7 +469,7 @@ "UpdateCheckStartupNotWritableMessage": "无法安装更新,因为用户“{1}”对于启动文件夹“{0}”没有写入权限。", "UpdateCheckStartupTranslocationMessage": "无法安装更新,因为启动文件夹“{0}”在一个应用程序迁移文件夹。Cannot install update because startup folder '{0}' is in an App Translocation folder.", "UpdateCheckUINotWritableMessage": "无法安装升级,因为用户“{1}”不可写入界面文件夹“{0}”。", - "UpdateMechanismHelpText": "使用 {appName} 内置的更新器或者脚本", + "UpdateMechanismHelpText": "使用 {appName} 内置的更新程序或脚本", "UpdateScriptPathHelpText": "自定义脚本的路径,该脚本处理获取的更新包并处理更新过程的其余部分", "Updates": "更新", "Uptime": "运行时间", @@ -597,5 +597,8 @@ "ActiveIndexers": "活动索引器", "ActiveApps": "活动应用程序", "AppsMinimumSeeders": "应用程序最少种子数", - "PackSeedTime": "做种时间" + "PackSeedTime": "做种时间", + "PasswordConfirmation": "确认密码", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "确认新密码", + "InvalidUILanguage": "语言" } From 8c7f73ed169b8a7ca53f8f9e61c60269c67dd434 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 8 Dec 2023 13:58:10 +0000 Subject: [PATCH 347/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Jurriaan Den Toonder Co-authored-by: RicardoVelaC Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 6 +++--- src/NzbDrone.Core/Localization/Core/nl.json | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 127b348d8..6e943e651 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -110,7 +110,7 @@ "ConnectionLost": "Conexión perdida", "Component": "Componente", "Columns": "Columnas", - "Close": "", + "Close": "Cerrar", "Cancel": "Cancelar", "Apply": "Aplicar", "Age": "Antigüedad", @@ -139,8 +139,8 @@ "DeleteDownloadClient": "Borrar Gestor de Descargas", "DeleteBackup": "Borrar Backup", "DBMigration": "Migración de DB", - "CloneProfile": "", - "ClientPriority": "", + "CloneProfile": "Clonar Perfil", + "ClientPriority": "Prioridad del Cliente", "ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado", "CertificateValidationHelpText": "Cambiar la rigidez de la validación de la certificación HTTPS", "CertificateValidation": "Validacion de certificado", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 57229a7d6..083062ba2 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -473,5 +473,8 @@ "AddApplicationImplementation": "Voeg connectie toe - {implementationName}", "AddIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}", "EditApplicationImplementation": "Voeg connectie toe - {implementationName}", - "EditIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}" + "EditIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}", + "AuthenticationMethod": "Authenticatiemethode", + "AuthenticationRequired": "Verificatie vereist", + "AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode" } From fe142b8a1c12bbda4e3a822cdb4a9c269995dde3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 9 Dec 2023 23:22:33 +0200 Subject: [PATCH 348/964] Fixed: (IPTorrents) Parse size column using index by name --- .../Indexers/Definitions/IPTorrents.cs | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs index 5036239f7..ee29dc384 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs @@ -293,6 +293,10 @@ namespace NzbDrone.Core.Indexers.Definitions var parser = new HtmlParser(); using var doc = parser.ParseDocument(indexerResponse.Content); + var headerColumns = doc.QuerySelectorAll("table[id=\"torrents\"] > thead > tr > th").Select(x => x.TextContent.Trim()).ToList(); + var sizeIndex = FindColumnIndexOrDefault(headerColumns, "Sort by size", 5); + var filesIndex = FindColumnIndexOrDefault(headerColumns, "Sort by files"); + var rows = doc.QuerySelectorAll("table[id=\"torrents\"] > tbody > tr"); foreach (var row in rows) { @@ -314,7 +318,6 @@ namespace NzbDrone.Core.Indexers.Definitions var dateSplit = descrSplit.Last().Split(new[] { " by " }, StringSplitOptions.None); var publishDate = DateTimeUtil.FromTimeAgo(dateSplit.First()); var description = descrSplit.Length > 1 ? "Tags: " + descrSplit.First().Trim() : ""; - description += dateSplit.Length > 1 ? " Uploaded by: " + dateSplit.Last().Trim() : ""; var catIcon = row.QuerySelector("td:nth-of-type(1) a"); if (catIcon == null) @@ -327,36 +330,40 @@ namespace NzbDrone.Core.Indexers.Definitions // Torrents - Category column == Icons var cat = _categories.MapTrackerCatToNewznab(catIcon.GetAttribute("href").Substring(1)); - var size = ParseUtil.GetBytes(row.Children[5].TextContent); + var size = ParseUtil.GetBytes(row.Children[sizeIndex].TextContent); - var colIndex = 6; int? files = null; - if (row.Children.Length == 10) + if (filesIndex != -1) { - files = ParseUtil.CoerceInt(row.Children[colIndex].TextContent.Replace("Go to files", "")); - colIndex++; + files = ParseUtil.CoerceInt(row.Children[filesIndex].TextContent.Replace("Go to files", "")); } - var grabs = ParseUtil.CoerceInt(row.Children[colIndex++].TextContent); - var seeders = ParseUtil.CoerceInt(row.Children[colIndex++].TextContent); - var leechers = ParseUtil.CoerceInt(row.Children[colIndex].TextContent); - var dlVolumeFactor = row.QuerySelector("span.free") != null ? 0 : 1; + var colIndex = row.Children.Length == 10 ? 7 : 6; + + var grabsIndex = FindColumnIndexOrDefault(headerColumns, "Sort by snatches", colIndex++); + var seedersIndex = FindColumnIndexOrDefault(headerColumns, "Sort by seeders", colIndex++); + var leechersIndex = FindColumnIndexOrDefault(headerColumns, "Sort by leechers", colIndex); + + var grabs = ParseUtil.CoerceInt(row.Children[grabsIndex].TextContent); + var seeders = ParseUtil.CoerceInt(row.Children[seedersIndex].TextContent); + var leechers = ParseUtil.CoerceInt(row.Children[leechersIndex].TextContent); var release = new TorrentInfo { - Title = title, Guid = details.AbsoluteUri, DownloadUrl = link.AbsoluteUri, InfoUrl = details.AbsoluteUri, - PublishDate = publishDate, + Title = title, + Description = description, Categories = cat, Size = size, Files = files, Grabs = grabs, Seeders = seeders, Peers = seeders + leechers, - DownloadVolumeFactor = dlVolumeFactor, + PublishDate = publishDate, + DownloadVolumeFactor = row.QuerySelector("span.free") != null ? 0 : 1, UploadVolumeFactor = 1, MinimumRatio = 1, MinimumSeedTime = 1209600 // 336 hours @@ -368,6 +375,13 @@ namespace NzbDrone.Core.Indexers.Definitions return torrentInfos.ToArray(); } + private static int FindColumnIndexOrDefault(List columns, string name, int defaultIndex = -1) + { + var index = columns.FindIndex(x => x.Equals(name, StringComparison.Ordinal)); + + return index != -1 ? index : defaultIndex; + } + public Action, DateTime?> CookiesUpdater { get; set; } private static string CleanTitle(string title) From 7b5e1f40baf7c8b98c0f1bd9f7312401f9eea69e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Dec 2023 13:44:44 +0200 Subject: [PATCH 349/964] Bump version to 1.11.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d45d94155..db8b2bd9f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.11.1' + majorVersion: '1.11.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From df89450428bf791a0bec4238e1546a133edbb622 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 8 Dec 2023 18:58:17 +0200 Subject: [PATCH 350/964] New: External links for search results --- frontend/src/Search/Table/ReleaseLinks.css | 13 +++ .../src/Search/Table/ReleaseLinks.css.d.ts | 9 ++ frontend/src/Search/Table/ReleaseLinks.tsx | 90 +++++++++++++++++++ frontend/src/Search/Table/SearchIndexRow.css | 6 +- frontend/src/Search/Table/SearchIndexRow.js | 35 ++++++++ src/Prowlarr.Api.V1/Search/ReleaseResource.cs | 7 +- 6 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 frontend/src/Search/Table/ReleaseLinks.css create mode 100644 frontend/src/Search/Table/ReleaseLinks.css.d.ts create mode 100644 frontend/src/Search/Table/ReleaseLinks.tsx diff --git a/frontend/src/Search/Table/ReleaseLinks.css b/frontend/src/Search/Table/ReleaseLinks.css new file mode 100644 index 000000000..d37a082a1 --- /dev/null +++ b/frontend/src/Search/Table/ReleaseLinks.css @@ -0,0 +1,13 @@ +.links { + margin: 0; +} + +.link { + white-space: nowrap; +} + +.linkLabel { + composes: label from '~Components/Label.css'; + + cursor: pointer; +} diff --git a/frontend/src/Search/Table/ReleaseLinks.css.d.ts b/frontend/src/Search/Table/ReleaseLinks.css.d.ts new file mode 100644 index 000000000..9f91f93a4 --- /dev/null +++ b/frontend/src/Search/Table/ReleaseLinks.css.d.ts @@ -0,0 +1,9 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'link': string; + 'linkLabel': string; + 'links': string; +} +export const cssExports: CssExports; +export default cssExports; diff --git a/frontend/src/Search/Table/ReleaseLinks.tsx b/frontend/src/Search/Table/ReleaseLinks.tsx new file mode 100644 index 000000000..38260bc21 --- /dev/null +++ b/frontend/src/Search/Table/ReleaseLinks.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import Label from 'Components/Label'; +import Link from 'Components/Link/Link'; +import { kinds, sizes } from 'Helpers/Props'; +import { IndexerCategory } from 'Indexer/Indexer'; +import styles from './ReleaseLinks.css'; + +interface ReleaseLinksProps { + categories: IndexerCategory[]; + imdbId?: string; + tmdbId?: number; + tvdbId?: number; + tvMazeId?: number; +} + +function ReleaseLinks(props: ReleaseLinksProps) { + const { categories = [], imdbId, tmdbId, tvdbId, tvMazeId } = props; + + const categoryNames = categories + .filter((item) => item.id < 100000) + .map((c) => c.name); + + return ( +
+ {imdbId ? ( + + + + ) : null} + + {tmdbId ? ( + + + + ) : null} + + {tvdbId ? ( + + + + ) : null} + + {tvMazeId ? ( + + + + ) : null} +
+ ); +} + +export default ReleaseLinks; diff --git a/frontend/src/Search/Table/SearchIndexRow.css b/frontend/src/Search/Table/SearchIndexRow.css index 342092b81..37b59a35d 100644 --- a/frontend/src/Search/Table/SearchIndexRow.css +++ b/frontend/src/Search/Table/SearchIndexRow.css @@ -63,7 +63,7 @@ } .externalLinks { - margin: 0 2px; - width: 22px; - text-align: center; + composes: button from '~Components/Link/IconButton.css'; + + color: var(--textColor); } diff --git a/frontend/src/Search/Table/SearchIndexRow.js b/frontend/src/Search/Table/SearchIndexRow.js index 67c267696..613605e02 100644 --- a/frontend/src/Search/Table/SearchIndexRow.js +++ b/frontend/src/Search/Table/SearchIndexRow.js @@ -16,6 +16,7 @@ import titleCase from 'Utilities/String/titleCase'; import translate from 'Utilities/String/translate'; import CategoryLabel from './CategoryLabel'; import Peers from './Peers'; +import ReleaseLinks from './ReleaseLinks'; import styles from './SearchIndexRow.css'; function getDownloadIcon(isGrabbing, isGrabbed, grabError) { @@ -118,6 +119,10 @@ class SearchIndexRow extends Component { grabs, seeders, leechers, + imdbId, + tmdbId, + tvdbId, + tvMazeId, indexerFlags, columns, isGrabbing, @@ -343,6 +348,32 @@ class SearchIndexRow extends Component { /> : null } + + { + imdbId || tmdbId || tvdbId || tvMazeId ? ( + + } + title={translate('Links')} + body={ + + } + kind={kinds.INVERSE} + position={tooltipPositions.TOP} + /> + ) : null + } ); } @@ -375,6 +406,10 @@ SearchIndexRow.propTypes = { grabs: PropTypes.number, seeders: PropTypes.number, leechers: PropTypes.number, + imdbId: PropTypes.number, + tmdbId: PropTypes.number, + tvdbId: PropTypes.number, + tvMazeId: PropTypes.number, indexerFlags: PropTypes.arrayOf(PropTypes.string).isRequired, columns: PropTypes.arrayOf(PropTypes.object).isRequired, onGrabPress: PropTypes.func.isRequired, diff --git a/src/Prowlarr.Api.V1/Search/ReleaseResource.cs b/src/Prowlarr.Api.V1/Search/ReleaseResource.cs index 49364f445..77f68ca16 100644 --- a/src/Prowlarr.Api.V1/Search/ReleaseResource.cs +++ b/src/Prowlarr.Api.V1/Search/ReleaseResource.cs @@ -23,8 +23,10 @@ namespace Prowlarr.Api.V1.Search public string ReleaseHash { get; set; } public string Title { get; set; } public string SortTitle { get; set; } - public bool Approved { get; set; } public int ImdbId { get; set; } + public int TmdbId { get; set; } + public int TvdbId { get; set; } + public int TvMazeId { get; set; } public DateTime PublishDate { get; set; } public string CommentUrl { get; set; } public string DownloadUrl { get; set; } @@ -80,6 +82,9 @@ namespace Prowlarr.Api.V1.Search Title = releaseInfo.Title, SortTitle = releaseInfo.Title.NormalizeTitle(), ImdbId = releaseInfo.ImdbId, + TmdbId = releaseInfo.TmdbId, + TvdbId = releaseInfo.TvdbId, + TvMazeId = releaseInfo.TvMazeId, PublishDate = releaseInfo.PublishDate, CommentUrl = releaseInfo.CommentUrl, DownloadUrl = releaseInfo.DownloadUrl, From a2395dccb51e9512e37a6294e11912f10bdc4e82 Mon Sep 17 00:00:00 2001 From: Servarr Date: Sun, 10 Dec 2023 14:07:34 +0000 Subject: [PATCH 351/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index 74ff899ca..d75411166 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -5751,13 +5751,22 @@ "type": "string", "nullable": true }, - "approved": { - "type": "boolean" - }, "imdbId": { "type": "integer", "format": "int32" }, + "tmdbId": { + "type": "integer", + "format": "int32" + }, + "tvdbId": { + "type": "integer", + "format": "int32" + }, + "tvMazeId": { + "type": "integer", + "format": "int32" + }, "publishDate": { "type": "string", "format": "date-time" From d4bbb2e14a559d142d3efd3cdc556ae58b5c4156 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Dec 2023 20:05:09 +0200 Subject: [PATCH 352/964] Fixed: (FL/BHD/IPT) Filter releases by query --- src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs | 7 +++++++ .../Indexers/Definitions/FileList/FileList.cs | 10 ++++++++++ src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs | 7 +++++++ 3 files changed, 24 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index 80d2856bb..8277a5da7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -48,6 +48,13 @@ namespace NzbDrone.Core.Indexers.Definitions return new BeyondHDParser(Capabilities.Categories); } + protected override IList CleanupReleases(IEnumerable releases, SearchCriteriaBase searchCriteria) + { + var cleanReleases = base.CleanupReleases(releases, searchCriteria); + + return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList(); + } + private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs index 8367a2db0..c2494aa15 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileList.cs @@ -1,7 +1,10 @@ using System.Collections.Generic; +using System.Linq; using NLog; using NzbDrone.Core.Configuration; +using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions.FileList; @@ -40,6 +43,13 @@ public class FileList : TorrentIndexerBase return new FileListParser(Settings, Capabilities.Categories); } + protected override IList CleanupReleases(IEnumerable releases, SearchCriteriaBase searchCriteria) + { + var cleanReleases = base.CleanupReleases(releases, searchCriteria); + + return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList(); + } + private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities diff --git a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs index ee29dc384..8e6756020 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs @@ -73,6 +73,13 @@ namespace NzbDrone.Core.Indexers.Definitions return CookieUtil.CookieHeaderToDictionary(Settings.Cookie); } + protected override IList CleanupReleases(IEnumerable releases, SearchCriteriaBase searchCriteria) + { + var cleanReleases = base.CleanupReleases(releases, searchCriteria); + + return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList(); + } + private IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities From e1264d7cdad3ecc0867ea7d206d86d2517f7da9b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 12 Dec 2023 15:33:06 +0200 Subject: [PATCH 353/964] Implement DatabaseConnectionInfo Co-authored-by: Qstick --- .../Datastore/ConnectionStringFactory.cs | 37 ++++++++++--------- .../Datastore/DatabaseConnectionInfo.cs | 14 +++++++ src/NzbDrone.Core/Datastore/DbFactory.cs | 21 ++++++----- .../Instrumentation/DatabaseTarget.cs | 13 ++++--- 4 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/DatabaseConnectionInfo.cs diff --git a/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs b/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs index ff97ec020..19c938737 100644 --- a/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs +++ b/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs @@ -9,8 +9,8 @@ namespace NzbDrone.Core.Datastore { public interface IConnectionStringFactory { - string MainDbConnectionString { get; } - string LogDbConnectionString { get; } + DatabaseConnectionInfo MainDbConnection { get; } + DatabaseConnectionInfo LogDbConnection { get; } string GetDatabasePath(string connectionString); } @@ -22,15 +22,15 @@ namespace NzbDrone.Core.Datastore { _configFileProvider = configFileProvider; - MainDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresMainDb) : + MainDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresMainDb) : GetConnectionString(appFolderInfo.GetDatabase()); - LogDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresLogDb) : + LogDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresLogDb) : GetConnectionString(appFolderInfo.GetLogDatabase()); } - public string MainDbConnectionString { get; private set; } - public string LogDbConnectionString { get; private set; } + public DatabaseConnectionInfo MainDbConnection { get; private set; } + public DatabaseConnectionInfo LogDbConnection { get; private set; } public string GetDatabasePath(string connectionString) { @@ -39,7 +39,7 @@ namespace NzbDrone.Core.Datastore return connectionBuilder.DataSource; } - private static string GetConnectionString(string dbPath) + private static DatabaseConnectionInfo GetConnectionString(string dbPath) { var connectionBuilder = new SQLiteConnectionStringBuilder { @@ -57,21 +57,22 @@ namespace NzbDrone.Core.Datastore connectionBuilder.Add("Full FSync", true); } - return connectionBuilder.ConnectionString; + return new DatabaseConnectionInfo(DatabaseType.SQLite, connectionBuilder.ConnectionString); } - private string GetPostgresConnectionString(string dbName) + private DatabaseConnectionInfo GetPostgresConnectionString(string dbName) { - var connectionBuilder = new NpgsqlConnectionStringBuilder(); + var connectionBuilder = new NpgsqlConnectionStringBuilder + { + Database = dbName, + Host = _configFileProvider.PostgresHost, + Username = _configFileProvider.PostgresUser, + Password = _configFileProvider.PostgresPassword, + Port = _configFileProvider.PostgresPort, + Enlist = false + }; - connectionBuilder.Database = dbName; - connectionBuilder.Host = _configFileProvider.PostgresHost; - connectionBuilder.Username = _configFileProvider.PostgresUser; - connectionBuilder.Password = _configFileProvider.PostgresPassword; - connectionBuilder.Port = _configFileProvider.PostgresPort; - connectionBuilder.Enlist = false; - - return connectionBuilder.ConnectionString; + return new DatabaseConnectionInfo(DatabaseType.PostgreSQL, connectionBuilder.ConnectionString); } } } diff --git a/src/NzbDrone.Core/Datastore/DatabaseConnectionInfo.cs b/src/NzbDrone.Core/Datastore/DatabaseConnectionInfo.cs new file mode 100644 index 000000000..5b53f086f --- /dev/null +++ b/src/NzbDrone.Core/Datastore/DatabaseConnectionInfo.cs @@ -0,0 +1,14 @@ +namespace NzbDrone.Core.Datastore +{ + public class DatabaseConnectionInfo + { + public DatabaseConnectionInfo(DatabaseType databaseType, string connectionString) + { + DatabaseType = databaseType; + ConnectionString = connectionString; + } + + public DatabaseType DatabaseType { get; internal set; } + public string ConnectionString { get; internal set; } + } +} diff --git a/src/NzbDrone.Core/Datastore/DbFactory.cs b/src/NzbDrone.Core/Datastore/DbFactory.cs index c592d17f2..bd1492bd3 100644 --- a/src/NzbDrone.Core/Datastore/DbFactory.cs +++ b/src/NzbDrone.Core/Datastore/DbFactory.cs @@ -2,6 +2,7 @@ using System; using System.Data.Common; using System.Data.SQLite; using System.Net.Sockets; +using System.Threading; using NLog; using Npgsql; using NzbDrone.Common.Disk; @@ -60,22 +61,22 @@ namespace NzbDrone.Core.Datastore public IDatabase Create(MigrationContext migrationContext) { - string connectionString; + DatabaseConnectionInfo connectionInfo; switch (migrationContext.MigrationType) { case MigrationType.Main: { - connectionString = _connectionStringFactory.MainDbConnectionString; - CreateMain(connectionString, migrationContext); + connectionInfo = _connectionStringFactory.MainDbConnection; + CreateMain(connectionInfo.ConnectionString, migrationContext); break; } case MigrationType.Log: { - connectionString = _connectionStringFactory.LogDbConnectionString; - CreateLog(connectionString, migrationContext); + connectionInfo = _connectionStringFactory.LogDbConnection; + CreateLog(connectionInfo.ConnectionString, migrationContext); break; } @@ -90,14 +91,14 @@ namespace NzbDrone.Core.Datastore { DbConnection conn; - if (connectionString.Contains(".db")) + if (connectionInfo.DatabaseType == DatabaseType.SQLite) { conn = SQLiteFactory.Instance.CreateConnection(); - conn.ConnectionString = connectionString; + conn.ConnectionString = connectionInfo.ConnectionString; } else { - conn = new NpgsqlConnection(connectionString); + conn = new NpgsqlConnection(connectionInfo.ConnectionString); } conn.Open(); @@ -135,15 +136,17 @@ namespace NzbDrone.Core.Datastore { Logger.Error(e, "Failure to connect to Postgres DB, {0} retries remaining", retryCount); + Thread.Sleep(5000); + try { _migrationController.Migrate(connectionString, migrationContext); + return; } catch (Exception ex) { if (--retryCount > 0) { - System.Threading.Thread.Sleep(5000); continue; } diff --git a/src/NzbDrone.Core/Instrumentation/DatabaseTarget.cs b/src/NzbDrone.Core/Instrumentation/DatabaseTarget.cs index e33cebc4d..896b274a6 100644 --- a/src/NzbDrone.Core/Instrumentation/DatabaseTarget.cs +++ b/src/NzbDrone.Core/Instrumentation/DatabaseTarget.cs @@ -88,16 +88,15 @@ namespace NzbDrone.Core.Instrumentation log.Level = logEvent.Level.Name; - var connectionString = _connectionStringFactory.LogDbConnectionString; + var connectionInfo = _connectionStringFactory.LogDbConnection; - //TODO: Probably need more robust way to differentiate what's being used - if (connectionString.Contains(".db")) + if (connectionInfo.DatabaseType == DatabaseType.SQLite) { - WriteSqliteLog(log, connectionString); + WriteSqliteLog(log, connectionInfo.ConnectionString); } else { - WritePostgresLog(log, connectionString); + WritePostgresLog(log, connectionInfo.ConnectionString); } } catch (NpgsqlException ex) @@ -136,8 +135,10 @@ namespace NzbDrone.Core.Instrumentation private void WriteSqliteLog(Log log, string connectionString) { using (var connection = - new SQLiteConnection(connectionString).OpenAndReturn()) + SQLiteFactory.Instance.CreateConnection()) { + connection.ConnectionString = connectionString; + connection.Open(); using (var sqlCommand = connection.CreateCommand()) { sqlCommand.CommandText = INSERT_COMMAND; From 4dbf5aa9f474b1b1c395efc3adb3f05b5767db46 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 2 Dec 2023 19:05:12 -0600 Subject: [PATCH 354/964] Fixed: Correctly handle Migration when PG Host has ".db" (cherry picked from commit 97ee24507f4306e3b62c3d00cd3ade6a09d1b957) --- src/NzbDrone.Core/Datastore/DbFactory.cs | 16 ++++++++-------- .../Migration/Framework/MigrationController.cs | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Core/Datastore/DbFactory.cs b/src/NzbDrone.Core/Datastore/DbFactory.cs index bd1492bd3..0122757a7 100644 --- a/src/NzbDrone.Core/Datastore/DbFactory.cs +++ b/src/NzbDrone.Core/Datastore/DbFactory.cs @@ -68,7 +68,7 @@ namespace NzbDrone.Core.Datastore case MigrationType.Main: { connectionInfo = _connectionStringFactory.MainDbConnection; - CreateMain(connectionInfo.ConnectionString, migrationContext); + CreateMain(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType); break; } @@ -76,7 +76,7 @@ namespace NzbDrone.Core.Datastore case MigrationType.Log: { connectionInfo = _connectionStringFactory.LogDbConnection; - CreateLog(connectionInfo.ConnectionString, migrationContext); + CreateLog(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType); break; } @@ -108,12 +108,12 @@ namespace NzbDrone.Core.Datastore return db; } - private void CreateMain(string connectionString, MigrationContext migrationContext) + private void CreateMain(string connectionString, MigrationContext migrationContext, DatabaseType databaseType) { try { _restoreDatabaseService.Restore(); - _migrationController.Migrate(connectionString, migrationContext); + _migrationController.Migrate(connectionString, migrationContext, databaseType); } catch (SQLiteException e) { @@ -140,7 +140,7 @@ namespace NzbDrone.Core.Datastore try { - _migrationController.Migrate(connectionString, migrationContext); + _migrationController.Migrate(connectionString, migrationContext, databaseType); return; } catch (Exception ex) @@ -165,11 +165,11 @@ namespace NzbDrone.Core.Datastore } } - private void CreateLog(string connectionString, MigrationContext migrationContext) + private void CreateLog(string connectionString, MigrationContext migrationContext, DatabaseType databaseType) { try { - _migrationController.Migrate(connectionString, migrationContext); + _migrationController.Migrate(connectionString, migrationContext, databaseType); } catch (SQLiteException e) { @@ -189,7 +189,7 @@ namespace NzbDrone.Core.Datastore Logger.Error("Unable to recreate logging database automatically. It will need to be removed manually."); } - _migrationController.Migrate(connectionString, migrationContext); + _migrationController.Migrate(connectionString, migrationContext, databaseType); } catch (Exception e) { diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs index 45593cb53..7a045864d 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs @@ -14,7 +14,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework { public interface IMigrationController { - void Migrate(string connectionString, MigrationContext migrationContext); + void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType); } public class MigrationController : IMigrationController @@ -29,7 +29,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework _migrationLoggerProvider = migrationLoggerProvider; } - public void Migrate(string connectionString, MigrationContext migrationContext) + public void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType) { var sw = Stopwatch.StartNew(); @@ -37,7 +37,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework ServiceProvider serviceProvider; - var db = connectionString.Contains(".db") ? "sqlite" : "postgres"; + var db = databaseType == DatabaseType.SQLite ? "sqlite" : "postgres"; serviceProvider = new ServiceCollection() .AddLogging(b => b.AddNLog()) From 0f1b01adab060eb644d074afb2c6bf7000db60a4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 12 Dec 2023 16:52:16 +0200 Subject: [PATCH 355/964] Log invalid torrent files contents as info --- src/NzbDrone.Core/Indexers/TorrentIndexerBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/TorrentIndexerBase.cs b/src/NzbDrone.Core/Indexers/TorrentIndexerBase.cs index f727ef2f1..242fc802a 100644 --- a/src/NzbDrone.Core/Indexers/TorrentIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/TorrentIndexerBase.cs @@ -24,7 +24,7 @@ namespace NzbDrone.Core.Indexers } catch { - _logger.Trace("Invalid torrent file contents: {0}", Encoding.ASCII.GetString(fileData)); + _logger.Info("Invalid torrent file contents: {0}", Encoding.ASCII.GetString(fileData)); throw; } } From 8704bef69a25ef2dab6f6578def8000ca63e876f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 13 Dec 2023 19:49:54 +0200 Subject: [PATCH 356/964] Update year format in titles for RED/OPS --- .../IndexerTests/OrpheusTests/OrpheusFixture.cs | 2 +- .../IndexerTests/RedactedTests/RedactedFixture.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Redacted.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs index e324ced6b..d33dde2d3 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/OrpheusTests/OrpheusFixture.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Core.Test.IndexerTests.OrpheusTests var torrentInfo = releases.First() as TorrentInfo; - torrentInfo.Title.Should().Be("The Beatles - Abbey Road [1969] [Album] [2.0 Mix 2019] [MP3 V2 (VBR) / BD]"); + torrentInfo.Title.Should().Be("The Beatles - Abbey Road (1969) [Album] [2.0 Mix 2019] [MP3 V2 (VBR) / BD]"); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); torrentInfo.DownloadUrl.Should().Be("https://orpheus.network/ajax.php?action=download&id=1902448"); torrentInfo.InfoUrl.Should().Be("https://orpheus.network/torrents.php?id=466&torrentid=1902448"); diff --git a/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs index 0b1b79563..61c664072 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests var torrentInfo = releases.First() as TorrentInfo; - torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication [1999] [Album] [US / Reissue 2020] [FLAC 24bit Lossless / Vinyl]"); + torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication (1999) [Album] [US / Reissue 2020] [FLAC 24bit Lossless / Vinyl]"); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); torrentInfo.DownloadUrl.Should().Be("https://redacted.ch/ajax.php?action=download&id=3892313"); torrentInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=16720&torrentid=3892313"); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index b5b57cd01..ab7237196 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -362,7 +362,7 @@ namespace NzbDrone.Core.Indexers.Definitions private string GetTitle(GazelleRelease result, GazelleTorrent torrent) { - var title = $"{result.Artist} - {result.GroupName} [{result.GroupYear}]"; + var title = $"{result.Artist} - {result.GroupName} ({result.GroupYear})"; if (result.ReleaseType.IsNotNullOrWhiteSpace() && result.ReleaseType != "Unknown") { diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index e73e1ead6..c2a7a2916 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -345,7 +345,7 @@ namespace NzbDrone.Core.Indexers.Definitions private string GetTitle(GazelleRelease result, GazelleTorrent torrent) { - var title = $"{result.Artist} - {result.GroupName} [{result.GroupYear}]"; + var title = $"{result.Artist} - {result.GroupName} ({result.GroupYear})"; if (result.ReleaseType.IsNotNullOrWhiteSpace() && result.ReleaseType != "Unknown") { From 426159b452132a9a342840a15616ad81a5c1acf3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 13 Dec 2023 21:40:33 +0200 Subject: [PATCH 357/964] Fixed: (RetroFlix) Remove unrelated results --- .../Indexers/Definitions/SpeedApp.cs | 10 -------- .../Definitions/SpeedApp/SpeedAppBase.cs | 23 +++++++++++-------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp.cs b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp.cs index d89837432..c1dfc58ba 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp.cs @@ -1,10 +1,7 @@ using System.Collections.Generic; -using System.Linq; using NLog; using NzbDrone.Core.Configuration; -using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions { @@ -22,13 +19,6 @@ namespace NzbDrone.Core.Indexers.Definitions { } - protected override IList CleanupReleases(IEnumerable releases, SearchCriteriaBase searchCriteria) - { - var cleanReleases = base.CleanupReleases(releases, searchCriteria); - - return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList(); - } - protected override IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities diff --git a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs index e1e878160..22e44f515 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Net; -using System.Net.Http; using System.Net.Mime; using System.Text; using System.Text.RegularExpressions; @@ -51,6 +50,13 @@ namespace NzbDrone.Core.Indexers.Definitions return new SpeedAppParser(Settings, Capabilities.Categories, MinimumSeedTime); } + protected override IList CleanupReleases(IEnumerable releases, SearchCriteriaBase searchCriteria) + { + var cleanReleases = base.CleanupReleases(releases, searchCriteria); + + return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList(); + } + protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) { return Settings.ApiKey.IsNullOrWhiteSpace() || httpResponse.StatusCode == HttpStatusCode.Unauthorized; @@ -58,14 +64,13 @@ namespace NzbDrone.Core.Indexers.Definitions protected override async Task DoLogin() { - var requestBuilder = new HttpRequestBuilder(LoginUrl) - { - LogResponseContent = true, - AllowAutoRedirect = true, - Method = HttpMethod.Post, - }; - - var request = requestBuilder.Build(); + var request = new HttpRequestBuilder(LoginUrl) + { + LogResponseContent = true, + AllowAutoRedirect = true + } + .Post() + .Build(); var data = new SpeedAppAuthenticationRequest { From df18ee77e7759eaf93edebf46dbd38a8bf348bcd Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 14 Dec 2023 11:58:14 +0000 Subject: [PATCH 358/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: ROSERAT Ugo Co-authored-by: RicardoVelaC Co-authored-by: SHUAI.W Co-authored-by: matiasba Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/lv/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 29 +++++++++++++++++-- src/NzbDrone.Core/Localization/Core/fr.json | 4 +-- src/NzbDrone.Core/Localization/Core/lv.json | 10 ++++++- .../Localization/Core/zh_CN.json | 4 +-- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 6e943e651..39bb8444f 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -413,7 +413,7 @@ "AddConnection": "Añadir Conexión", "NotificationStatusAllClientHealthCheckMessage": "Las listas no están disponibles debido a errores", "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}", - "EditIndexerImplementation": "Agregar Condición - { implementationName}", + "EditIndexerImplementation": "Editar indexador - {implementationName}", "AuthBasic": "Básico (ventana emergente del navegador)", "AuthForm": "Formularios (página de inicio de sesión)", "Author": "Autor", @@ -442,5 +442,30 @@ "EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", "DefaultNameCopiedProfile": "{name} - Copia", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña", - "NoHistoryFound": "No se encontró historial" + "NoHistoryFound": "No se encontró historial", + "DeleteApplication": "Eliminar Aplicación", + "AreYouSureYouWantToDeleteCategory": "Esta seguro que desea eliminar la categoría mapeada?", + "AdvancedSettingsHiddenClickToShow": "Configuraciones avanzadas escondidas, click para mostrar", + "AdvancedSettingsShownClickToHide": "Se muestran las configuraciones avanzadas, click para esconder", + "AppsMinimumSeeders": "Semillas mínimas para las Aplicaciones", + "ClearHistoryMessageText": "Esta seguro que desea borrar todo el historial de {appName}?", + "ClearHistory": "Borrar Historial", + "AreYouSureYouWantToDeleteIndexer": "Esta seguro que desea eliminar '{name}' de {appName}?", + "AuthQueries": "Consultas de Autorización", + "ApplicationTagsHelpText": "Sincronizar los Indexadores a esta aplicación que no tengan etiquetas o que tengan al menos una etiqueta coincidente", + "ApplicationTagsHelpTextWarning": "Las etiquetas deben utilizarse con cuidado, pueden tener efectos involuntarios. Una aplicación con una etiqueta solo sincronizara con Indexadores que tengan la misma etiqueta.", + "AppsMinimumSeedersHelpText": "Cantidad mínima de semillas requerida por las Aplicaciones para que el Indexador capture, vacío aplica la configuración por defecto del perfil", + "AverageResponseTimesMs": "Tiempo promedio de respuesta del Indexador (ms)", + "CountIndexersAvailable": "{count} indexadores disponibles", + "DeleteAppProfile": "Eliminar Perfil de Aplicación", + "AddSyncProfile": "Agregar Perfil de Sincronización", + "AppSettingsSummary": "Aplicaciones y configuraciones para determinar como {appName} interactúa con sus programas de PVR", + "AddCategory": "Agregar Categoría", + "AppProfileSelectHelpText": "Los perfiles de la aplicación se usan para controlar la configuración por aplicación de RSS, Búsqueda Automática y Búsqueda Interactiva", + "ActiveApps": "Aplicaciones Activas", + "ActiveIndexers": "Indexadores Activos", + "AudioSearch": "Búsqueda de Música", + "Auth": "Autenticación", + "BasicSearch": "Búsqueda Básica", + "CountApplicationsSelected": "{count} aplicaciones seleccionadas" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 842ce4cc3..2f8345c82 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -3,7 +3,7 @@ "Indexers": "Indexeurs", "Host": "Hôte", "History": "Historique", - "HideAdvanced": "Masquer param. av.", + "HideAdvanced": "Masquer les Options Avancées", "Health": "Santé", "General": "Général", "Folder": "Dossier", @@ -207,7 +207,7 @@ "ProxyBypassFilterHelpText": "Utilisez ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines", "Uptime": "Disponibilité", "UpdateScriptPathHelpText": "Chemin d'accès à un script personnalisé qui prend un package de mise à jour extrait et gère le reste du processus de mise à jour", - "UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de {appName} ou un script", + "UpdateMechanismHelpText": "Utilisez le programme de mise à jour intégré de {appName} ou un script", "UpdateAutomaticallyHelpText": "Téléchargez et installez automatiquement les mises à jour. Vous pourrez toujours installer à partir du système : mises à jour", "UnableToLoadUISettings": "Impossible de charger les paramètres de l'interface utilisateur", "UnableToLoadTags": "Impossible de charger les étiquettes", diff --git a/src/NzbDrone.Core/Localization/Core/lv.json b/src/NzbDrone.Core/Localization/Core/lv.json index 0967ef424..86c6096e2 100644 --- a/src/NzbDrone.Core/Localization/Core/lv.json +++ b/src/NzbDrone.Core/Localization/Core/lv.json @@ -1 +1,9 @@ -{} +{ + "About": "Par", + "AcceptConfirmationModal": "Apstiprināt Apstiprināšanas Modālu", + "Actions": "Darbības", + "Add": "Pievienot", + "AddDownloadClient": "Pievienot Lejupielādes Klientu", + "AddConnection": "Pievienot Savienojumu", + "AddConnectionImplementation": "Pievienot Savienojumu - {implementationName}" +} diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index ad1080138..e49741428 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -21,7 +21,7 @@ "AllIndexersHiddenDueToFilter": "由于应用了筛选器,所有索引器都被隐藏。", "Analytics": "分析", "AnalyticsEnabledHelpText": "将匿名使用情况和错误信息发送到{appName}的服务器。这包括有关您的浏览器的信息、您使用的{appName} WebUI页面、错误报告以及操作系统和运行时版本。我们将使用此信息来确定功能和错误修复的优先级。", - "ApiKey": "API Key", + "ApiKey": "接口密钥 (API Key)", "ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{0}个字符长。您可以通过设置或配置文件执行此操作", "AppDataDirectory": "AppData目录", "AppDataLocationHealthCheckMessage": "正在更新期间的 AppData 不会被更新删除", @@ -139,7 +139,7 @@ "EnableInteractiveSearchHelpText": "当手动搜索启用时使用", "EnableRss": "启用RSS", "EnableRssHelpText": "为搜刮器启用 RSS订阅", - "EnableSSL": "启用SSL", + "EnableSSL": "启用 SSL", "EnableSslHelpText": " 重启生效", "Enabled": "已启用", "EnabledRedirected": "启用, 修改", From a443a876039dbccf325af33ebe7503b837d36049 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Dec 2023 20:35:06 +0200 Subject: [PATCH 359/964] Fixed: (AvistaZ) Disable pagination and implement MST formula --- .../Indexers/Definitions/Avistaz/AvistazBase.cs | 2 +- .../Definitions/Avistaz/AvistazParserBase.cs | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs index 560487825..d4b5d617b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs @@ -16,7 +16,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz { public override bool SupportsRss => true; public override bool SupportsSearch => true; - public override bool SupportsPagination => true; + public override bool SupportsPagination => false; public override int PageSize => 50; public override TimeSpan RateLimit => TimeSpan.FromSeconds(6); public override IndexerCapabilities Capabilities => SetCapabilities(); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs index 993efb931..83d7e013b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs @@ -69,11 +69,22 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz DownloadVolumeFactor = row.DownloadMultiply, UploadVolumeFactor = row.UploadMultiply, MinimumRatio = 1, - MinimumSeedTime = 172800, // 48 hours + MinimumSeedTime = 259200, // 72 hours Languages = row.Audio?.Select(x => x.Language).ToList() ?? new List(), Subs = row.Subtitle?.Select(x => x.Language).ToList() ?? new List() }; + if (row.FileSize is > 0) + { + var sizeGigabytes = row.FileSize.Value / Math.Pow(1024, 3); + + release.MinimumSeedTime = sizeGigabytes switch + { + > 50.0 => (long)((100 * Math.Log(sizeGigabytes)) - 219.2023) * 3600, + _ => 259200 + (long)(sizeGigabytes * 7200) + }; + } + if (row.MovieTvinfo != null) { release.ImdbId = ParseUtil.GetImdbId(row.MovieTvinfo.Imdb).GetValueOrDefault(); From d8d5170ab8f4d2671d851e702d5ed04f671283f7 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 15 Dec 2023 14:37:38 +0000 Subject: [PATCH 360/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Menno Liefstingh Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/nl.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 083062ba2..800b94a16 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -5,7 +5,7 @@ "Add": "Toevoegen", "AddApplication": "Applicatie Toevoegen", "AddCustomFilter": "Aangepaste Filter Toevoegen", - "AddDownloadClient": "Download Client Toevoegen", + "AddDownloadClient": "Downloadclient Toevoegen", "AddDownloadClientToProwlarr": "Door een downloadclient toe te voegen, kan {appName} releases rechtstreeks vanuit de gebruikersinterface verzenden tijdens een handmatige zoekopdracht.", "AddIndexer": "Voeg Indexeerder Toe", "AddIndexerProxy": "Indexeerproxy toevoegen", @@ -90,9 +90,9 @@ "DeleteApplication": "Applicatie verwijderen", "DeleteApplicationMessageText": "Weet u zeker dat u de applicatie '{0}' wilt verwijderen?", "DeleteBackup": "Verwijder Backup", - "DeleteBackupMessageText": "Bent u zeker dat u de veiligheidskopie '{0}' wilt verwijderen?", + "DeleteBackupMessageText": "Bent u zeker dat u de veiligheidskopie '{name}' wilt verwijderen?", "DeleteDownloadClient": "Verwijder Downloader", - "DeleteDownloadClientMessageText": "Bent u zeker dat u de downloader '{0}' wilt verwijderen?", + "DeleteDownloadClientMessageText": "Bent u zeker dat u de downloader '{name}' wilt verwijderen?", "DeleteIndexerProxy": "Indexeerproxy verwijderen", "DeleteIndexerProxyMessageText": "Weet u zeker dat u de proxy '{0}' wilt verwijderen?", "DeleteNotification": "Verwijder Notificatie", @@ -425,7 +425,7 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Hoe tags toepassen op de geselecteerde indexeerders", "ApplyTagsHelpTextRemove": "Verwijderen: Verwijder de ingevoerde tags", "ApplyTagsHelpTextReplace": "Vervangen: Vervang de tags met de ingevoerde tags (vul geen tags in om alle tags te wissen)", - "CountIndexersSelected": "{0} Indexer(s) Geselecteerd", + "CountIndexersSelected": "{count} Indexer(s) Geselecteerd", "DeleteSelectedApplicationsMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?", "DeleteSelectedDownloadClients": "Verwijder Downloader", "DeleteSelectedDownloadClientsMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?", @@ -458,7 +458,7 @@ "None": "Geen", "ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?", "AddConnectionImplementation": "Voeg connectie toe - {implementationName}", - "AddDownloadClientImplementation": "Voeg Downloadclient toe - {implementationName}", + "AddDownloadClientImplementation": "Voeg Downloadclient Toe - {implementationName}", "AddIndexerImplementation": "Indexeerder toevoegen - {implementationName}", "AdvancedSettingsHiddenClickToShow": "Geavanceerde instellingen zijn verborgen, klik om te tonen", "AdvancedSettingsShownClickToHide": "Geavanceerde instellingen worden getoond, klik om te verbergen", From 1b3695187912ebbc66c1fb8b2d458481ac8bf1f5 Mon Sep 17 00:00:00 2001 From: Agneev Mukherjee <19761269+agneevX@users.noreply.github.com> Date: Fri, 15 Dec 2023 06:54:09 +0530 Subject: [PATCH 361/964] Enable browser navigation buttons for PWA (cherry picked from commit da9a60691f363323565a293ed9eaeb6349ceccb6) --- frontend/src/Content/Images/Icons/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Content/Images/Icons/manifest.json b/frontend/src/Content/Images/Icons/manifest.json index f53279dd3..abb5b4647 100644 --- a/frontend/src/Content/Images/Icons/manifest.json +++ b/frontend/src/Content/Images/Icons/manifest.json @@ -15,5 +15,5 @@ "start_url": "../../../../", "theme_color": "#3a3f51", "background_color": "#3a3f51", - "display": "standalone" + "display": "minimal-ui" } From df8e4e5acbf21a1d97b0439a4f740feac65ca540 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 17 Dec 2023 01:58:39 +0000 Subject: [PATCH 362/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Fixer Co-authored-by: Weblate Co-authored-by: lifeisfreedom048 Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/nl.json | 2 +- src/NzbDrone.Core/Localization/Core/tr.json | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 800b94a16..25eece3ed 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -5,7 +5,7 @@ "Add": "Toevoegen", "AddApplication": "Applicatie Toevoegen", "AddCustomFilter": "Aangepaste Filter Toevoegen", - "AddDownloadClient": "Downloadclient Toevoegen", + "AddDownloadClient": "Download Client Toevoegen", "AddDownloadClientToProwlarr": "Door een downloadclient toe te voegen, kan {appName} releases rechtstreeks vanuit de gebruikersinterface verzenden tijdens een handmatige zoekopdracht.", "AddIndexer": "Voeg Indexeerder Toe", "AddIndexerProxy": "Indexeerproxy toevoegen", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index d18c1e40b..fe1b24370 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -360,12 +360,12 @@ "Categories": "Kategoriler", "Application": "Uygulamalar", "Episode": "bölüm", - "AddApplicationImplementation": "Koşul Ekle - {uygulama Adı}", + "AddApplicationImplementation": "Koşul Ekle - {implementationName}", "AddConnection": "Bağlantı Ekle", - "AddConnectionImplementation": "Koşul Ekle - {uygulama Adı}", - "AddIndexerImplementation": "Koşul Ekle - {uygulama Adı}", - "AddIndexerProxyImplementation": "Koşul Ekle - {uygulama Adı}", - "EditConnectionImplementation": "Koşul Ekle - {uygulama Adı}", - "EditApplicationImplementation": "Koşul Ekle - {uygulama Adı}", - "EditIndexerImplementation": "Koşul Ekle - {uygulama Adı}" + "AddConnectionImplementation": "Koşul Ekle - {implementationName}", + "AddIndexerImplementation": "Koşul Ekle - {implementationName}", + "AddIndexerProxyImplementation": "Koşul Ekle - {implementationName}", + "EditConnectionImplementation": "Koşul Ekle - {implementationName}", + "EditApplicationImplementation": "Koşul Ekle - {implementationName}", + "EditIndexerImplementation": "Koşul Ekle - {implementationName}" } From 7890ef6f9dfe9c62cb52a930359a53dd7cf23a65 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Dec 2023 04:01:35 +0200 Subject: [PATCH 363/964] Remove invalid Turkish translations --- src/NzbDrone.Core/Localization/Core/tr.json | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index fe1b24370..5c5d150de 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -360,12 +360,5 @@ "Categories": "Kategoriler", "Application": "Uygulamalar", "Episode": "bölüm", - "AddApplicationImplementation": "Koşul Ekle - {implementationName}", - "AddConnection": "Bağlantı Ekle", - "AddConnectionImplementation": "Koşul Ekle - {implementationName}", - "AddIndexerImplementation": "Koşul Ekle - {implementationName}", - "AddIndexerProxyImplementation": "Koşul Ekle - {implementationName}", - "EditConnectionImplementation": "Koşul Ekle - {implementationName}", - "EditApplicationImplementation": "Koşul Ekle - {implementationName}", - "EditIndexerImplementation": "Koşul Ekle - {implementationName}" + "AddConnection": "Bağlantı Ekle" } From f54280b88829685a32b52de6bf2911d0b92d7798 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Dec 2023 15:53:28 +0200 Subject: [PATCH 364/964] Bump version to 1.11.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index db8b2bd9f..c2b90b8a3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.11.2' + majorVersion: '1.11.3' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From ed17d91a7b04bf564a3040700d69f8ddb2dbd0d8 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 19 Dec 2023 17:58:15 +0000 Subject: [PATCH 365/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: ηg Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 1bfae0b18..f0ae283bd 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -525,5 +525,12 @@ "AddDownloadClientImplementation": "Download-Client hinzufügen - {implementationName}", "AddIndexerImplementation": "Indexer hinzufügen - {implementationName}", "AddIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}", - "AppUpdatedVersion": "{appName} wurde auf die Version `{version}` aktualisiert. Um die neusten Funktionen zu bekommen lade {appName} neu" + "AppUpdatedVersion": "{appName} wurde auf die Version `{version}` aktualisiert. Um die neusten Funktionen zu bekommen lade {appName} neu", + "AuthenticationRequiredWarning": "Um unberechtigte Fernzugriffe zu vermeiden benötigt {appName} jetzt , dass Authentifizierung eingeschaltet ist. Du kannst Authentifizierung optional für lokale Adressen ausschalten.", + "AuthenticationRequired": "Authentifizierung benötigt", + "AuthenticationRequiredHelpText": "Ändern, welche anfragen Authentifizierung benötigen. Ändere nichts wenn du dir nicht des Risikos bewusst bist.", + "AuthenticationRequiredUsernameHelpTextWarning": "Gib einen neuen Benutzernamen ein", + "AuthenticationMethodHelpTextWarning": "Bitte wähle eine gültige Authentifizierungsmethode aus", + "AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen" } From 14f9a75a73cbbd85f768bfc00f38d5e0231fa6a8 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 20 Dec 2023 18:58:16 +0000 Subject: [PATCH 366/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Aitzol Garmendia Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 63 ++++++++++++++------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 39bb8444f..c8b36909a 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -53,7 +53,7 @@ "Queue": "Cola", "ProxyCheckResolveIpMessage": "No se pudo resolver la dirección IP del Host Proxy configurado {0}", "ProxyCheckFailedToTestMessage": "Fallo al comprobar el proxy: {0}", - "ProxyCheckBadRequestMessage": "Fallo al comprobar el proxy. StatusCode: {0}", + "ProxyCheckBadRequestMessage": "Fallo al comprobar el proxy. Status code: {0}", "Proxy": "Proxy", "Options": "Opciones", "NoChange": "Sin Cambio", @@ -65,7 +65,7 @@ "IndexerStatusCheckAllClientMessage": "Los indexers no están disponibles debido a errores", "Added": "Añadido", "Actions": "Acciones", - "UISettingsSummary": "Calendario, fecha y opciones de color deteriorado", + "UISettingsSummary": "Fecha, idioma, y opciones de color deteriorado", "TagsSettingsSummary": "Ver todas las etiquetas y cómo se usan. Las etiquetas no utilizadas se pueden eliminar", "Size": "Tamaño", "ReleaseStatus": "Estado del Estreno", @@ -74,14 +74,14 @@ "IndexerStatusCheckSingleClientMessage": "Indexers no disponibles debido a errores: {0}", "Indexer": "Indexador", "Grabbed": "Añadido", - "GeneralSettingsSummary": "Puerto, SSL, nombre de usuario/contraseña , proxy, analíticas y actualizaciones", + "GeneralSettingsSummary": "Puerto, SSL, nombre de usuario/contraseña , proxy, analíticas, y actualizaciones", "Filename": "Nombre del archivo", "Failed": "Fallido", "EventType": "Tipo de Evento", - "DownloadClientsSettingsSummary": "Gestores de descargas, manipulación de descargas y mapeados remotos", + "DownloadClientsSettingsSummary": "Configuración del cliente de descargas para la integración en {appName} UI search", "DownloadClient": "Gestor de Descargas", "Details": "Detalles", - "ConnectSettingsSummary": "Notificaciones, conexiones a servidores/reproductores y scripts personalizados", + "ConnectSettingsSummary": "Notificaciones y scripts personalizados", "Warn": "Advertencia", "Type": "Tipo", "Title": "Título", @@ -236,10 +236,10 @@ "ExistingTag": "Etiqueta existente", "EnableInteractiveSearchHelpText": "Se usará cuando se utilice la búsqueda interactiva", "EnableAutomaticSearchHelpText": "Se usará cuando las búsquedas automáticas se realicen desde el UI o por {appName}", - "DeleteTagMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?", - "DeleteNotificationMessageText": "Seguro que quieres elminiar la notificación '{0}'?", - "DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{0}'?", - "DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{0}'?", + "DeleteTagMessageText": "¿Está seguro de querer eliminar la etiqueta '{label}'?", + "DeleteNotificationMessageText": "¿Seguro que quieres eliminar la notificación '{name}'?", + "DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{name}'?", + "DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{name}'?", "CancelPendingTask": "Estas seguro de que deseas cancelar esta tarea pendiente?", "BranchUpdateMechanism": "La rama se uso por un mecanisco de actualizacion externo", "BranchUpdate": "Rama a usar para actualizar {appName}", @@ -256,12 +256,12 @@ "StartTypingOrSelectAPathBelow": "Comienza a escribir o selecciona una ruta debajo", "Restore": "Restaurar", "ProwlarrSupportsAnyIndexer": "{appName} soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.", - "ProwlarrSupportsAnyDownloadClient": "Raddar soporta cualquier gestor de descargas que utilice el estandar Newznab, como también los clientes indicados debajo.", + "ProwlarrSupportsAnyDownloadClient": "{appName} soporta cualquier gestor de descargas indicado debajo.", "NoUpdatesAreAvailable": "No hay actualizaciones disponibles", "NoTagsHaveBeenAddedYet": "No se han añadido etiquetas todavía", "NoLogFiles": "Sin archivos de registro", "NoBackupsAreAvailable": "No hay copias de seguridad disponibles", - "MaintenanceRelease": "Lanzamiento de mantenimiento", + "MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle", "ForMoreInformationOnTheIndividualDownloadClients": "Para más información individual de los gestores de descarga, haz clic en lls botones de información.", "FilterPlaceHolder": "Buscar películas", "Exception": "Excepción", @@ -288,7 +288,7 @@ "IndexerLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas", "Reddit": "Reddit", "UnableToAddANewAppProfilePleaseTryAgain": "No se ha podido añadir un nuevo perfil de calidad, prueba otra vez.", - "DeleteIndexerProxyMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?", + "DeleteIndexerProxyMessageText": "¿Seguro que quieres eliminar el proxy indexador '{name}'?", "Discord": "Discord", "Add": "Añadir", "Custom": "Personalizado", @@ -307,7 +307,7 @@ "ApplicationStatusCheckAllClientMessage": "Las listas no están disponibles debido a errores", "ApplicationStatusCheckSingleClientMessage": "Listas no disponibles debido a errores: {0}", "AllIndexersHiddenDueToFilter": "Todos los indexadores están ocultas debido al filtro aplicado.", - "DeleteApplicationMessageText": "Seguro que quieres elminiar la notificación '{0}'?", + "DeleteApplicationMessageText": "Seguro que quieres eliminar la notificación '{name}'?", "IndexerProxyStatusCheckAllClientMessage": "Los indexers no están disponibles debido a errores", "IndexerProxyStatusCheckSingleClientMessage": "Indexers no disponibles debido a errores: {0}", "NoLinks": "Sin enlaces", @@ -375,14 +375,14 @@ "ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas", "DeleteSelectedApplicationsMessageText": "Seguro que quieres eliminar el indexer '{0}'?", "DeleteSelectedDownloadClients": "Borrar Gestor de Descargas", - "DeleteSelectedIndexersMessageText": "Seguro que quieres eliminar el indexer '{0}'?", - "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {0} cliente(s) de descarga seleccionado(s)?", + "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", + "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", "ApplyTagsHelpTextHowToApplyApplications": "Cómo añadir etiquetas a las películas seleccionadas", "SelectIndexers": "Buscar películas", "ApplyTagsHelpTextHowToApplyIndexers": "Cómo añadir etiquetas a los indexadores seleccionados", "ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas", "ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)", - "ThemeHelpText": "Cambia el tema de la interfaz de usuario de la aplicación. El tema \"automático\" utilizará el tema de tu sistema operativo para establecer el modo claro u oscuro. Inspirado por Theme.Park", + "ThemeHelpText": "Cambia el tema de la interfaz de usuario de la aplicación. El tema \"automático\" utilizará el tema de tu sistema operativo para establecer el modo claro u oscuro. Inspirado por {inspiredBy}.", "DownloadClientPriorityHelpText": "Priorizar múltiples Gestores de Descargas. Se usa Round-Robin para gestores con la misma prioridad.", "Season": "Temporada", "More": "Más", @@ -393,8 +393,8 @@ "Publisher": "Editor", "AuthenticationRequired": "Autenticación requerida", "ApplyChanges": "Aplicar Cambios", - "CountIndexersSelected": "{0} indexador(es) seleccionado(s)", - "CountDownloadClientsSelected": "{0} cliente(s) de descarga seleccionado(s)", + "CountIndexersSelected": "{count} indexador(es) seleccionado(s)", + "CountDownloadClientsSelected": "{count} cliente(s) de descarga seleccionado(s)", "EditSelectedDownloadClients": "Editar Clientes de Descarga Seleccionados", "EditSelectedIndexers": "Editar Indexadores Seleccionados", "Implementation": "Implementación", @@ -467,5 +467,30 @@ "AudioSearch": "Búsqueda de Música", "Auth": "Autenticación", "BasicSearch": "Búsqueda Básica", - "CountApplicationsSelected": "{count} aplicaciones seleccionadas" + "CountApplicationsSelected": "{count} aplicaciones seleccionadas", + "IndexerHealthCheckNoIndexers": "Ningún indexador habilitado, {appName} no devolverá resultados de búsqueda", + "IndexerAuth": "Autentificación de indexador", + "DeleteSelectedApplications": "Eliminar aplicaciones seleccionadas", + "DeleteSelectedIndexer": "Eliminar indexador seleccionado", + "IndexerCategories": "Categorías de indexador", + "IndexerDownloadClientHelpText": "Especifique qué cliente de descarga se utiliza para capturas hechas desde {appName} a partir de este indexador", + "FullSync": "Sincronización total", + "GoToApplication": "Ir a la aplicación", + "FoundCountReleases": "{itemCount} releases hallados", + "HistoryDetails": "Detalles de historial", + "DeleteClientCategory": "Eliminar categoría de cliente de descarga", + "DeleteSelectedIndexers": "Eliminar indexadores seleccionados", + "DevelopmentSettings": "Ajustes de desarrollo", + "EnabledRedirected": "Habilitado, redireccionado", + "IndexerDetails": "Detalles de indexador", + "IndexerDisabled": "Indexador deshabilitado", + "IndexerFailureRate": "Tasa de fallo del indexador", + "IndexerAlreadySetup": "Hay al menos una instancia de indexador configurada", + "DisabledUntil": "Deshabilitado hasta", + "DownloadClientCategory": "Categoría de cliente de descarga", + "HistoryCleanup": "Limpieza de historial", + "Id": "Id", + "EditCategory": "Editar categoría", + "EditSyncProfile": "Editar perfil de sincronización", + "EnableIndexer": "Habilitar indexador" } From 52667b979bdf05b90cdf946609a481de72b3085e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 24 Dec 2023 09:13:43 +0200 Subject: [PATCH 367/964] Bump version to 1.11.4 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c2b90b8a3..66fddfbe7 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.11.3' + majorVersion: '1.11.4' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 1dabbc94f8d551e5cff782e18ed420a63e3fb921 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 24 Dec 2023 22:44:34 +0200 Subject: [PATCH 368/964] Fixed: BinSearch removed --- src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs b/src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs index a261f2c71..309da6b26 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BinSearch.cs @@ -19,6 +19,7 @@ using NzbDrone.Core.Validation; namespace NzbDrone.Core.Indexers.Definitions { + [Obsolete("Site has shutdown")] public class BinSearch : UsenetIndexerBase { public override string Name => "BinSearch"; From 8b7c488173679ea49e42bff9c2939fba7238bab6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 25 Dec 2023 13:16:00 +0200 Subject: [PATCH 369/964] New: (Discord) Remove size grab field --- src/NzbDrone.Core/Notifications/Discord/Discord.cs | 5 ----- src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs | 3 +-- src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs | 3 +-- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs index 0e442d8ec..9eb41e989 100644 --- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs +++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs @@ -65,11 +65,6 @@ namespace NzbDrone.Core.Notifications.Discord discordField.Name = "Host"; discordField.Value = message.Host ?? string.Empty; break; - case DiscordGrabFieldType.Size: - discordField.Name = "Size"; - discordField.Value = BytesToString(message.Release.Size.GetValueOrDefault(0)); - discordField.Inline = true; - break; } if (discordField.Name.IsNotNullOrWhiteSpace() && discordField.Value.IsNotNullOrWhiteSpace()) diff --git a/src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs b/src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs index b84f633e2..bfce31544 100644 --- a/src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs +++ b/src/NzbDrone.Core/Notifications/Discord/DiscordFieldType.cs @@ -7,7 +7,6 @@ namespace NzbDrone.Core.Notifications.Discord DownloadClient, GrabTrigger, Source, - Host, - Size + Host } } diff --git a/src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs b/src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs index 106c4b95a..c571b4fb5 100644 --- a/src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs +++ b/src/NzbDrone.Core/Notifications/Discord/DiscordSettings.cs @@ -26,8 +26,7 @@ namespace NzbDrone.Core.Notifications.Discord (int)DiscordGrabFieldType.DownloadClient, (int)DiscordGrabFieldType.GrabTrigger, (int)DiscordGrabFieldType.Source, - (int)DiscordGrabFieldType.Host, - (int)DiscordGrabFieldType.Size + (int)DiscordGrabFieldType.Host }; } From 8beff3211715aeeec984c1d1af12fbfc91117ba1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 25 Dec 2023 14:13:35 +0200 Subject: [PATCH 370/964] Minor cleanup in AudioBookBay --- .../Indexers/Definitions/AudioBookBay.cs | 82 +++---------------- 1 file changed, 11 insertions(+), 71 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs b/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs index a416510bc..8f08fe857 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs @@ -26,8 +26,7 @@ public class AudioBookBay : TorrentIndexerBase public override string Name => "AudioBook Bay"; public override string[] IndexerUrls => new[] { - "https://audiobookbay.is/", - "https://audiobookbay.se/" + "https://audiobookbay.is/" }; public override string[] LegacyUrls => new[] { @@ -55,12 +54,14 @@ public class AudioBookBay : TorrentIndexerBase "https://audiobookbay.unblockit.pet/", "https://audiobookbay.unblockit.ink/", "https://audiobookbay.unblockit.bio/", // error 502 - "https://audiobookbay.li/" + "https://audiobookbay.li/", + "https://audiobookbay.se/" // redirects to .is but has invalid CA }; public override string Description => "AudioBook Bay (ABB) is a public Torrent Tracker for AUDIOBOOKS"; public override string Language => "en-US"; public override IndexerPrivacy Privacy => IndexerPrivacy.Public; public override int PageSize => 15; + public override TimeSpan RateLimit => TimeSpan.FromSeconds(5); public override IndexerCapabilities Capabilities => SetCapabilities(); public AudioBookBay(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) @@ -70,7 +71,7 @@ public class AudioBookBay : TorrentIndexerBase public override IIndexerRequestGenerator GetRequestGenerator() { - return new AudioBookBayRequestGenerator(Settings, Capabilities); + return new AudioBookBayRequestGenerator(Settings); } public override IParseIndexerResponse GetParser() @@ -119,64 +120,7 @@ public class AudioBookBay : TorrentIndexerBase } }; - // Age - caps.Categories.AddCategoryMapping("children", NewznabStandardCategory.AudioAudiobook, "Children"); - caps.Categories.AddCategoryMapping("teen-young-adult", NewznabStandardCategory.AudioAudiobook, "Teen & Young Adult"); - caps.Categories.AddCategoryMapping("adults", NewznabStandardCategory.AudioAudiobook, "Adults"); - - // Category - caps.Categories.AddCategoryMapping("postapocalyptic", NewznabStandardCategory.AudioAudiobook, "(Post)apocalyptic"); - caps.Categories.AddCategoryMapping("action", NewznabStandardCategory.AudioAudiobook, "Action"); - caps.Categories.AddCategoryMapping("adventure", NewznabStandardCategory.AudioAudiobook, "Adventure"); - caps.Categories.AddCategoryMapping("art", NewznabStandardCategory.AudioAudiobook, "Art"); - caps.Categories.AddCategoryMapping("autobiography-biographies", NewznabStandardCategory.AudioAudiobook, "Autobiography & Biographies"); - caps.Categories.AddCategoryMapping("business", NewznabStandardCategory.AudioAudiobook, "Business"); - caps.Categories.AddCategoryMapping("computer", NewznabStandardCategory.AudioAudiobook, "Computer"); - caps.Categories.AddCategoryMapping("contemporary", NewznabStandardCategory.AudioAudiobook, "Contemporary"); - caps.Categories.AddCategoryMapping("crime", NewznabStandardCategory.AudioAudiobook, "Crime"); - caps.Categories.AddCategoryMapping("detective", NewznabStandardCategory.AudioAudiobook, "Detective"); - caps.Categories.AddCategoryMapping("doctor-who-sci-fi", NewznabStandardCategory.AudioAudiobook, "Doctor Who"); - caps.Categories.AddCategoryMapping("education", NewznabStandardCategory.AudioAudiobook, "Education"); - caps.Categories.AddCategoryMapping("fantasy", NewznabStandardCategory.AudioAudiobook, "Fantasy"); - caps.Categories.AddCategoryMapping("general-fiction", NewznabStandardCategory.AudioAudiobook, "General Fiction"); - caps.Categories.AddCategoryMapping("historical-fiction", NewznabStandardCategory.AudioAudiobook, "Historical Fiction"); - caps.Categories.AddCategoryMapping("history", NewznabStandardCategory.AudioAudiobook, "History"); - caps.Categories.AddCategoryMapping("horror", NewznabStandardCategory.AudioAudiobook, "Horror"); - caps.Categories.AddCategoryMapping("humor", NewznabStandardCategory.AudioAudiobook, "Humor"); - caps.Categories.AddCategoryMapping("lecture", NewznabStandardCategory.AudioAudiobook, "Lecture"); - caps.Categories.AddCategoryMapping("lgbt", NewznabStandardCategory.AudioAudiobook, "LGBT"); - caps.Categories.AddCategoryMapping("literature", NewznabStandardCategory.AudioAudiobook, "Literature"); - caps.Categories.AddCategoryMapping("litrpg", NewznabStandardCategory.AudioAudiobook, "LitRPG"); - caps.Categories.AddCategoryMapping("general-non-fiction", NewznabStandardCategory.AudioAudiobook, "Misc. Non-fiction"); - caps.Categories.AddCategoryMapping("mystery", NewznabStandardCategory.AudioAudiobook, "Mystery"); - caps.Categories.AddCategoryMapping("paranormal", NewznabStandardCategory.AudioAudiobook, "Paranormal"); - caps.Categories.AddCategoryMapping("plays-theater", NewznabStandardCategory.AudioAudiobook, "Plays & Theater"); - caps.Categories.AddCategoryMapping("poetry", NewznabStandardCategory.AudioAudiobook, "Poetry"); - caps.Categories.AddCategoryMapping("political", NewznabStandardCategory.AudioAudiobook, "Political"); - caps.Categories.AddCategoryMapping("radio-productions", NewznabStandardCategory.AudioAudiobook, "Radio Productions"); - caps.Categories.AddCategoryMapping("romance", NewznabStandardCategory.AudioAudiobook, "Romance"); - caps.Categories.AddCategoryMapping("sci-fi", NewznabStandardCategory.AudioAudiobook, "Sci-Fi"); - caps.Categories.AddCategoryMapping("science", NewznabStandardCategory.AudioAudiobook, "Science"); - caps.Categories.AddCategoryMapping("self-help", NewznabStandardCategory.AudioAudiobook, "Self-help"); - caps.Categories.AddCategoryMapping("spiritual", NewznabStandardCategory.AudioAudiobook, "Spiritual & Religious"); - caps.Categories.AddCategoryMapping("sports", NewznabStandardCategory.AudioAudiobook, "Sport & Recreation"); - caps.Categories.AddCategoryMapping("suspense", NewznabStandardCategory.AudioAudiobook, "Suspense"); - caps.Categories.AddCategoryMapping("thriller", NewznabStandardCategory.AudioAudiobook, "Thriller"); - caps.Categories.AddCategoryMapping("true-crime", NewznabStandardCategory.AudioAudiobook, "True Crime"); - caps.Categories.AddCategoryMapping("tutorial", NewznabStandardCategory.AudioAudiobook, "Tutorial"); - caps.Categories.AddCategoryMapping("westerns", NewznabStandardCategory.AudioAudiobook, "Westerns"); - caps.Categories.AddCategoryMapping("zombies", NewznabStandardCategory.AudioAudiobook, "Zombies"); - - // Category Modifiers - caps.Categories.AddCategoryMapping("anthology", NewznabStandardCategory.AudioAudiobook, "Anthology"); - caps.Categories.AddCategoryMapping("bestsellers", NewznabStandardCategory.AudioAudiobook, "Bestsellers"); - caps.Categories.AddCategoryMapping("classic", NewznabStandardCategory.AudioAudiobook, "Classic"); - caps.Categories.AddCategoryMapping("documentary", NewznabStandardCategory.AudioAudiobook, "Documentary"); - caps.Categories.AddCategoryMapping("full-cast", NewznabStandardCategory.AudioAudiobook, "Full Cast"); - caps.Categories.AddCategoryMapping("libertarian", NewznabStandardCategory.AudioAudiobook, "Libertarian"); - caps.Categories.AddCategoryMapping("military", NewznabStandardCategory.AudioAudiobook, "Military"); - caps.Categories.AddCategoryMapping("novel", NewznabStandardCategory.AudioAudiobook, "Novel"); - caps.Categories.AddCategoryMapping("short-story", NewznabStandardCategory.AudioAudiobook, "Short Story"); + caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.AudioAudiobook); return caps; } @@ -185,12 +129,10 @@ public class AudioBookBay : TorrentIndexerBase public class AudioBookBayRequestGenerator : IIndexerRequestGenerator { private readonly NoAuthTorrentBaseSettings _settings; - private readonly IndexerCapabilities _capabilities; - public AudioBookBayRequestGenerator(NoAuthTorrentBaseSettings settings, IndexerCapabilities capabilities) + public AudioBookBayRequestGenerator(NoAuthTorrentBaseSettings settings) { _settings = settings; - _capabilities = capabilities; } public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) @@ -246,8 +188,6 @@ public class AudioBookBayRequestGenerator : IIndexerRequestGenerator } yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/" }.Uri.AbsoluteUri, HttpAccept.Html); - yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/page/2/" }.Uri.AbsoluteUri, HttpAccept.Html); - yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/page/3/" }.Uri.AbsoluteUri, HttpAccept.Html); } public Func> GetCookies { get; set; } @@ -300,8 +240,7 @@ public class AudioBookBayParser : IParseIndexerResponse var postInfo = row.QuerySelector("div.postInfo")?.FirstChild?.TextContent.Trim().Replace("\xA0", ";") ?? string.Empty; var matchCategory = Regex.Match(postInfo, @"Category: (.+)$", RegexOptions.IgnoreCase); - var category = matchCategory.Groups[1].Success ? matchCategory.Groups[1].Value.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() : new List(); - var categories = category.SelectMany(_categories.MapTrackerCatDescToNewznab).Distinct().ToList(); + var genres = matchCategory.Groups[1].Success ? matchCategory.Groups[1].Value.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() : new List(); var release = new TorrentInfo { @@ -309,13 +248,14 @@ public class AudioBookBayParser : IParseIndexerResponse InfoUrl = infoUrl, DownloadUrl = infoUrl, Title = CleanTitle(title), - Categories = categories, + Categories = new List { NewznabStandardCategory.AudioAudiobook }, Size = size, Seeders = 1, Peers = 1, PublishDate = publishDate, DownloadVolumeFactor = 0, - UploadVolumeFactor = 1 + UploadVolumeFactor = 1, + Genres = genres }; var cover = row.QuerySelector("img[src]")?.GetAttribute("src")?.Trim(); From 20cc146d825e6acab70752f9b66e45345a00946d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 30 Dec 2023 14:40:04 +0200 Subject: [PATCH 371/964] Fixed: Don't die when grabbing releases in bulk --- frontend/src/Store/Actions/releaseActions.js | 3 +- .../Search/SearchController.cs | 42 +++++++++++++++---- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/frontend/src/Store/Actions/releaseActions.js b/frontend/src/Store/Actions/releaseActions.js index 7ade2652d..bdb3ce2df 100644 --- a/frontend/src/Store/Actions/releaseActions.js +++ b/frontend/src/Store/Actions/releaseActions.js @@ -369,8 +369,9 @@ export const actionHandlers = handleThunks({ promise.done((data) => { dispatch(batchActions([ - ...data.map((release) => { + ...data.map(({ guid }) => { return updateRelease({ + guid, isGrabbing: false, isGrabbed: true, grabError: null diff --git a/src/Prowlarr.Api.V1/Search/SearchController.cs b/src/Prowlarr.Api.V1/Search/SearchController.cs index bc421f876..23fb2ab47 100644 --- a/src/Prowlarr.Api.V1/Search/SearchController.cs +++ b/src/Prowlarr.Api.V1/Search/SearchController.cs @@ -9,6 +9,7 @@ using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; using NzbDrone.Core.Download; +using NzbDrone.Core.Download.Clients; using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers; using NzbDrone.Core.IndexerSearch; @@ -54,7 +55,7 @@ namespace Prowlarr.Api.V1.Search [HttpPost] [Consumes("application/json")] [Produces("application/json")] - public ActionResult GrabRelease(ReleaseResource release) + public async Task> GrabRelease(ReleaseResource release) { ValidateResource(release); @@ -73,11 +74,12 @@ namespace Prowlarr.Api.V1.Search try { - _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null).GetAwaiter().GetResult(); + await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null); } catch (ReleaseDownloadException ex) { _logger.Error(ex, "Getting release from indexer failed"); + throw new NzbDroneClientException(HttpStatusCode.Conflict, "Getting release from indexer failed"); } @@ -87,12 +89,16 @@ namespace Prowlarr.Api.V1.Search [HttpPost("bulk")] [Consumes("application/json")] [Produces("application/json")] - public ActionResult GrabReleases(List releases) + public async Task> GrabReleases(List releases) { + releases.ForEach(release => ValidateResource(release)); + var source = Request.GetSource(); var host = Request.GetHostName(); - var groupedReleases = releases.GroupBy(r => r.IndexerId); + var grabbedReleases = new List(); + + var groupedReleases = releases.GroupBy(r => r.IndexerId).ToList(); foreach (var indexerReleases in groupedReleases) { @@ -100,22 +106,42 @@ namespace Prowlarr.Api.V1.Search foreach (var release in indexerReleases) { - ValidateResource(release); - var releaseInfo = _remoteReleaseCache.Find(GetCacheKey(release)); + if (releaseInfo == null) + { + _logger.Error("Couldn't find requested release in cache, cache timeout probably expired."); + + continue; + } + try { - _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null).GetAwaiter().GetResult(); + await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null); } catch (ReleaseDownloadException ex) { _logger.Error(ex, "Getting release from indexer failed"); + + continue; } + catch (DownloadClientException ex) + { + _logger.Error(ex, "Failed to send grabbed release to download client"); + + continue; + } + + grabbedReleases.Add(release); } } - return Ok(releases); + if (!grabbedReleases.Any()) + { + throw new NzbDroneClientException(HttpStatusCode.BadRequest, "Failed to grab any release"); + } + + return Ok(grabbedReleases); } [HttpGet] From 9d40a64be49785bf69dcb4ad088a157752b5a3b7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 31 Dec 2023 06:36:27 +0200 Subject: [PATCH 372/964] Bump version to 1.12.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 66fddfbe7..a180add87 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.11.4' + majorVersion: '1.12.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 67eeb4373c1b1392d12a914a6e847b5109fbdc98 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Dec 2023 22:09:13 +0200 Subject: [PATCH 373/964] Fixed: Ignore empty tags when adding items to Flood (cherry picked from commit 0a5200766ea80fc1c97bfa497cdfed31b9af687f) --- src/NzbDrone.Core/Download/Clients/Flood/Flood.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs b/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs index 73c6de8a2..845b4fa1c 100644 --- a/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs +++ b/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs @@ -4,6 +4,7 @@ using System.Linq; using FluentValidation.Results; using NLog; using NzbDrone.Common.Disk; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.Flood.Models; using NzbDrone.Core.Indexers; @@ -56,7 +57,7 @@ namespace NzbDrone.Core.Download.Clients.Flood } } - return result; + return result.Where(t => t.IsNotNullOrWhiteSpace()); } public override string Name => "Flood"; From ae1bc8366c701dba8a39aca256b795e914704db9 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 25 Nov 2023 15:52:01 -0800 Subject: [PATCH 374/964] New: Add qBittorrent option for Content Layout (cherry picked from commit 4b22200708ca120cfdcf9cb796be92183adb95d1) --- .../Clients/QBittorrent/QBittorrentContentLayout.cs | 9 +++++++++ .../Download/Clients/QBittorrent/QBittorrentProxyV2.cs | 9 +++++++++ .../Download/Clients/QBittorrent/QBittorrentSettings.cs | 3 +++ src/NzbDrone.Core/Localization/Core/en.json | 2 ++ 4 files changed, 23 insertions(+) create mode 100644 src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentContentLayout.cs diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentContentLayout.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentContentLayout.cs new file mode 100644 index 000000000..874fbff7a --- /dev/null +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentContentLayout.cs @@ -0,0 +1,9 @@ +namespace NzbDrone.Core.Download.Clients.QBittorrent +{ + public enum QBittorrentContentLayout + { + Default = 0, + Original = 1, + Subfolder = 2 + } +} diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentProxyV2.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentProxyV2.cs index 5e967d095..0d9d55be1 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentProxyV2.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentProxyV2.cs @@ -265,6 +265,15 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent { request.AddFormParameter("firstLastPiecePrio", true); } + + if ((QBittorrentContentLayout)settings.ContentLayout == QBittorrentContentLayout.Original) + { + request.AddFormParameter("contentLayout", "Original"); + } + else if ((QBittorrentContentLayout)settings.ContentLayout == QBittorrentContentLayout.Subfolder) + { + request.AddFormParameter("contentLayout", "Subfolder"); + } } public void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, QBittorrentSettings settings) diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs index 4427472ae..fe3b6a4a8 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs @@ -62,6 +62,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent [FieldDefinition(10, Label = "First and Last First", Type = FieldType.Checkbox, HelpText = "Download first and last pieces first (qBittorrent 4.1.0+)")] public bool FirstAndLast { get; set; } + [FieldDefinition(13, Label = "DownloadClientQbittorrentSettingsContentLayout", Type = FieldType.Select, SelectOptions = typeof(QBittorrentContentLayout), HelpText = "DownloadClientQbittorrentSettingsContentLayoutHelpText")] + public int ContentLayout { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 2b4176417..171db1112 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -173,6 +173,8 @@ "DownloadClient": "Download Client", "DownloadClientCategory": "Download Client Category", "DownloadClientPriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.", + "DownloadClientQbittorrentSettingsContentLayout": "Content Layout", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)", "DownloadClientSettings": "Download Client Settings", "DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures", "DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}", From cb98b1046886d6bce75b5deaf5588c12c6ea28de Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Fri, 10 Nov 2023 17:44:04 +0100 Subject: [PATCH 375/964] Translate fields on the backend (cherry picked from commit 48b12f5b00429a7cd218d23f0544641b0da62a06) --- .../Annotations/FieldDefinitionAttribute.cs | 24 ++++++++++ src/NzbDrone.Host/Bootstrap.cs | 3 ++ .../Client/IndexerClient.cs | 9 +++- .../IntegrationTest.cs | 26 ++++++----- src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs | 2 + .../ClientSchemaTests/SchemaBuilderFixture.cs | 13 ++++++ .../ClientSchema/SchemaBuilder.cs | 46 +++++++++++++++++-- 7 files changed, 108 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs b/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs index d35409c0b..8d31502fa 100644 --- a/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs +++ b/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs @@ -41,6 +41,23 @@ namespace NzbDrone.Core.Annotations public string Hint { get; set; } } + [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] + public class FieldTokenAttribute : Attribute + { + public FieldTokenAttribute(TokenField field, string label = "", string token = "", object value = null) + { + Label = label; + Field = field; + Token = token; + Value = value?.ToString(); + } + + public string Label { get; set; } + public TokenField Field { get; set; } + public string Token { get; set; } + public string Value { get; set; } + } + public class FieldSelectOption { public int Value { get; set; } @@ -82,4 +99,11 @@ namespace NzbDrone.Core.Annotations ApiKey, UserName } + + public enum TokenField + { + Label, + HelpText, + HelpTextWarning + } } diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index 5f4a750e2..5f3bfe0b4 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -24,6 +24,7 @@ using NzbDrone.Common.Instrumentation; using NzbDrone.Common.Instrumentation.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Datastore.Extensions; +using Prowlarr.Http.ClientSchema; using PostgresOptions = NzbDrone.Core.Datastore.PostgresOptions; namespace NzbDrone.Host @@ -147,6 +148,8 @@ namespace NzbDrone.Host .AddNzbDroneLogger() .AddDatabase() .AddStartupContext(context); + + SchemaBuilder.Initialize(c); }) .ConfigureServices(services => { diff --git a/src/NzbDrone.Integration.Test/Client/IndexerClient.cs b/src/NzbDrone.Integration.Test/Client/IndexerClient.cs index ba88aca50..f8213f186 100644 --- a/src/NzbDrone.Integration.Test/Client/IndexerClient.cs +++ b/src/NzbDrone.Integration.Test/Client/IndexerClient.cs @@ -1,4 +1,5 @@ -using Prowlarr.Api.V1.Indexers; +using System.Collections.Generic; +using Prowlarr.Api.V1.Indexers; using RestSharp; namespace NzbDrone.Integration.Test.Client @@ -9,5 +10,11 @@ namespace NzbDrone.Integration.Test.Client : base(restClient, apiKey) { } + + public List Schema() + { + var request = BuildRequest("/schema"); + return Get>(request); + } } } diff --git a/src/NzbDrone.Integration.Test/IntegrationTest.cs b/src/NzbDrone.Integration.Test/IntegrationTest.cs index c58d35f89..cb060c56f 100644 --- a/src/NzbDrone.Integration.Test/IntegrationTest.cs +++ b/src/NzbDrone.Integration.Test/IntegrationTest.cs @@ -1,13 +1,14 @@ +using System; +using System.Linq; using System.Threading; using NLog; using NUnit.Framework; using NzbDrone.Common.Extensions; using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore.Migration.Framework; -using NzbDrone.Core.Indexers.Definitions.FileList; +using NzbDrone.Core.Indexers.Newznab; using NzbDrone.Test.Common; using NzbDrone.Test.Common.Datastore; -using Prowlarr.Http.ClientSchema; namespace NzbDrone.Integration.Test { @@ -49,16 +50,19 @@ namespace NzbDrone.Integration.Test { WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("CheckHealth"), 20000); - Indexers.Post(new Prowlarr.Api.V1.Indexers.IndexerResource + var indexer = Indexers.Schema().FirstOrDefault(i => i.Implementation == nameof(Newznab)); + + if (indexer == null) { - Enable = false, - ConfigContract = nameof(FileListSettings), - Implementation = nameof(FileList), - Name = "NewznabTest", - Protocol = Core.Indexers.DownloadProtocol.Usenet, - AppProfileId = 1, - Fields = SchemaBuilder.ToSchema(new FileListSettings()) - }); + throw new NullReferenceException("Expected valid indexer schema, found null"); + } + + indexer.Enable = false; + indexer.ConfigContract = nameof(NewznabSettings); + indexer.Implementation = nameof(Newznab); + indexer.Name = "NewznabTest"; + indexer.Protocol = Core.Indexers.DownloadProtocol.Usenet; + indexer.AppProfileId = 1; // Change Console Log Level to Debug so we get more details. var config = HostConfig.Get(1); diff --git a/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs b/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs index 945dd3aae..821b91fa7 100644 --- a/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs +++ b/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs @@ -23,6 +23,8 @@ namespace NzbDrone.Test.Common.AutoMoq SetupAutoMoqer(CreateTestContainer(new Container())); } + public IContainer Container => _container; + public virtual T Resolve() { var result = _container.Resolve(); diff --git a/src/Prowlarr.Api.V1.Test/ClientSchemaTests/SchemaBuilderFixture.cs b/src/Prowlarr.Api.V1.Test/ClientSchemaTests/SchemaBuilderFixture.cs index 16b54921f..2b982e78a 100644 --- a/src/Prowlarr.Api.V1.Test/ClientSchemaTests/SchemaBuilderFixture.cs +++ b/src/Prowlarr.Api.V1.Test/ClientSchemaTests/SchemaBuilderFixture.cs @@ -1,6 +1,9 @@ +using System.Collections.Generic; using FluentAssertions; +using Moq; using NUnit.Framework; using NzbDrone.Core.Annotations; +using NzbDrone.Core.Localization; using NzbDrone.Test.Common; using Prowlarr.Http.ClientSchema; @@ -9,6 +12,16 @@ namespace NzbDrone.Api.Test.ClientSchemaTests [TestFixture] public class SchemaBuilderFixture : TestBase { + [SetUp] + public void Setup() + { + Mocker.GetMock() + .Setup(s => s.GetLocalizedString(It.IsAny(), It.IsAny>())) + .Returns>((s, d) => s); + + SchemaBuilder.Initialize(Mocker.Container); + } + [Test] public void should_return_field_for_every_property() { diff --git a/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs b/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs index 171c9db04..ddfbe40f9 100644 --- a/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs +++ b/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs @@ -3,17 +3,25 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.Json; +using DryIoc; using NzbDrone.Common.EnsureThat; using NzbDrone.Common.Extensions; using NzbDrone.Common.Reflection; using NzbDrone.Common.Serializer; using NzbDrone.Core.Annotations; +using NzbDrone.Core.Localization; namespace Prowlarr.Http.ClientSchema { public static class SchemaBuilder { private static Dictionary _mappings = new Dictionary(); + private static ILocalizationService _localizationService; + + public static void Initialize(IContainer container) + { + _localizationService = container.Resolve(); + } public static List ToSchema(object model) { @@ -93,13 +101,27 @@ namespace Prowlarr.Http.ClientSchema if (propertyInfo.PropertyType.IsSimpleType()) { var fieldAttribute = property.Item2; + + var label = fieldAttribute.Label.IsNotNullOrWhiteSpace() + ? _localizationService.GetLocalizedString(fieldAttribute.Label, + GetTokens(type, fieldAttribute.Label, TokenField.Label)) + : fieldAttribute.Label; + var helpText = fieldAttribute.HelpText.IsNotNullOrWhiteSpace() + ? _localizationService.GetLocalizedString(fieldAttribute.HelpText, + GetTokens(type, fieldAttribute.Label, TokenField.HelpText)) + : fieldAttribute.HelpText; + var helpTextWarning = fieldAttribute.HelpTextWarning.IsNotNullOrWhiteSpace() + ? _localizationService.GetLocalizedString(fieldAttribute.HelpTextWarning, + GetTokens(type, fieldAttribute.Label, TokenField.HelpTextWarning)) + : fieldAttribute.HelpTextWarning; + var field = new Field { Name = prefix + GetCamelCaseName(propertyInfo.Name), - Label = fieldAttribute.Label, + Label = label, Unit = fieldAttribute.Unit, - HelpText = fieldAttribute.HelpText, - HelpTextWarning = fieldAttribute.HelpTextWarning, + HelpText = helpText, + HelpTextWarning = helpTextWarning, HelpLink = fieldAttribute.HelpLink, Order = fieldAttribute.Order, Advanced = fieldAttribute.Advanced, @@ -158,6 +180,24 @@ namespace Prowlarr.Http.ClientSchema .ToArray(); } + private static Dictionary GetTokens(Type type, string label, TokenField field) + { + var tokens = new Dictionary(); + + foreach (var propertyInfo in type.GetProperties()) + { + foreach (var attribute in propertyInfo.GetCustomAttributes(true)) + { + if (attribute is FieldTokenAttribute fieldTokenAttribute && fieldTokenAttribute.Field == field && fieldTokenAttribute.Label == label) + { + tokens.Add(fieldTokenAttribute.Token, fieldTokenAttribute.Value); + } + } + } + + return tokens; + } + private static List GetSelectOptions(Type selectOptions) { if (selectOptions.IsEnum) From bdfbda3805a5fced4bb3cdae56ecddd929d801cd Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 28 Dec 2023 17:58:20 +0000 Subject: [PATCH 376/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dimitri Co-authored-by: Koch Norbert Co-authored-by: Pietro Ribeiro Co-authored-by: Weblate Co-authored-by: chrizl Co-authored-by: resi23 Co-authored-by: slammingdeath Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 140 ++++++++++---------- src/NzbDrone.Core/Localization/Core/fr.json | 10 +- src/NzbDrone.Core/Localization/Core/hu.json | 65 +++++---- src/NzbDrone.Core/Localization/Core/nl.json | 11 +- src/NzbDrone.Core/Localization/Core/pl.json | 2 +- src/NzbDrone.Core/Localization/Core/pt.json | 7 +- 6 files changed, 129 insertions(+), 106 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index f0ae283bd..7b38d709e 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -17,11 +17,11 @@ "Age": "Alter", "All": "Alle", "AllIndexersHiddenDueToFilter": "Alle Indexer sind durch den ausgewählten Filter ausgeblendet.", - "Analytics": "Analytik", - "AnalyticsEnabledHelpText": "Sende anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen über Browser, welche Seiten der {appName}-Weboberfläche aufgerufen wurden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.", + "Analytics": "Analysen", + "AnalyticsEnabledHelpText": "Senden Sie anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen zu Ihrem Browser, welche {appName}-WebUI-Seiten Sie verwenden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.", "ApiKey": "API-Schlüssel", "ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {0} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen", - "AppDataDirectory": "AppData Ordner", + "AppDataDirectory": "AppData-Verzeichnis", "AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern", "AppProfileInUse": "App-Profil im Einsatz", "AppProfileSelectHelpText": "App-Profile werden verwendet, um die Einstellungen für RSS, automatische Suche und interaktive Suche bei der Anwendungssynchronisierung zu steuern", @@ -33,23 +33,23 @@ "ApplicationStatusCheckSingleClientMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}", "Applications": "Anwendungen", "Apply": "Anwenden", - "ApplyTags": "Tags setzen", + "ApplyTags": "Schlagworte anwenden", "Apps": "Anwendungen", "AudioSearch": "Audio Suche", "Auth": "Authentifizierung", "Authentication": "Authentifizierung", - "AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich", + "AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich.", "Automatic": "Automatisch", "AutomaticSearch": "Automatische Suche", - "Backup": "Backups", - "BackupFolderHelpText": "Relative Pfade befinden sich unter {appName}s AppData Ordner", - "BackupIntervalHelpText": "Intervall zum sichern der Datenbank und Einstellungen", + "Backup": "Sicherung", + "BackupFolderHelpText": "Relative Pfade befinden sich im AppData-Verzeichnis von {appName}", + "BackupIntervalHelpText": "Intervall zwischen automatischen Sicherungen", "BackupNow": "Jetzt sichern", - "BackupRetentionHelpText": "Automatische Backups, die älter als die Aufbewahrungsfrist sind, werden automatisch gelöscht", + "BackupRetentionHelpText": "Automatische Backups, die älter als der Aufbewahrungszeitraum sind, werden automatisch bereinigt", "Backups": "Sicherungen", "BeforeUpdate": "Vor dem Update", "BindAddress": "Adresse binden", - "BindAddressHelpText": "Gültige IP Adresse oder \"*\" für alle Netzwerke", + "BindAddressHelpText": "Gültige IP-Adresse, localhost oder „*“ für alle Schnittstellen", "BookSearch": "Buch Suche", "BookSearchTypes": "Buch-Suchtypen", "Branch": "Git-Branch", @@ -57,29 +57,29 @@ "BranchUpdateMechanism": "Git-Branch für den externen Updateablauf", "BypassProxyForLocalAddresses": "Proxy für lokale Adressen umgehen", "Cancel": "Abbrechen", - "CancelPendingTask": "Diese laufende Aufgabe wirklich abbrechen?", + "CancelPendingTask": "Möchten Sie diese ausstehende Aufgabe wirklich abbrechen?", "Categories": "Kategorien", "Category": "Kategorie", - "CertificateValidation": "Zertifikat Validierung", + "CertificateValidation": "Zertifikatsvalidierung", "CertificateValidationHelpText": "Ändere wie streng die Validierung der HTTPS-Zertifizierung ist", "ChangeHasNotBeenSavedYet": "Änderung wurde noch nicht gespeichert", "Clear": "Leeren", "ClearHistory": "Verlauf leeren", "ClearHistoryMessageText": "Wirklich den ganzen {appName} Verlauf löschen?", "ClientPriority": "Priorität", - "CloneProfile": "Profil kopieren", + "CloneProfile": "Profil klonen", "Close": "Schließen", "CloseCurrentModal": "Momentanes Modal schließen", "Columns": "Spalten", "Component": "Komponente", "Connect": "Benachrichtigungen", - "ConnectSettings": "Eintellungen für Verbindungen", + "ConnectSettings": "Verbindungseinstellungen", "ConnectSettingsSummary": "Benachrichtigungen und eigene Scripte", "ConnectionLost": "Verbindung unterbrochen", "Connections": "Verbindungen", "CouldNotConnectSignalR": "Es konnte keine Verbindung zu SignalR hergestellt werden, die Benutzeroberfläche wird nicht aktualisiert", "Custom": "Benutzerdefiniert", - "CustomFilters": "Eigene Filter", + "CustomFilters": "Benutzerdefinierte Filter", "DBMigration": "DB Migration", "Database": "Datenbank", "Date": "Datum", @@ -88,24 +88,24 @@ "DeleteAppProfile": "App-Profil löschen", "DeleteApplication": "Applikation löschen", "DeleteApplicationMessageText": "Wirklich die Applikation '{0}' löschen?", - "DeleteBackup": "Backup löschen", - "DeleteBackupMessageText": "Backup '{0}' wirkich löschen?", - "DeleteDownloadClient": "Downloader löschen", - "DeleteDownloadClientMessageText": "Downloader '{0}' wirklich löschen?", + "DeleteBackup": "Sicherung löschen", + "DeleteBackupMessageText": "Sind Sie sicher, dass Sie die Sicherung „{name}“ löschen möchten?", + "DeleteDownloadClient": "Download-Client löschen", + "DeleteDownloadClientMessageText": "Sind Sie sicher, dass Sie den Download-Client „{name}“ löschen möchten?", "DeleteIndexerProxy": "Indexer Proxy löschen", "DeleteIndexerProxyMessageText": "Tag '{0}' wirklich löschen?", "DeleteNotification": "Benachrichtigung löschen", - "DeleteNotificationMessageText": "Benachrichtigung '{0}' wirklich löschen?", + "DeleteNotificationMessageText": "Sind Sie sicher, dass Sie die Benachrichtigung „{name}“ löschen möchten?", "DeleteTag": "Tag löschen", - "DeleteTagMessageText": "Tag '{0}' wirklich löschen?", + "DeleteTagMessageText": "Sind Sie sicher, dass Sie das Tag „{label}“ löschen möchten?", "Description": "Beschreibung", - "Details": "Details", + "Details": "Einzelheiten", "DevelopmentSettings": "Entwicklungseinstellungen", "Disabled": "Deaktiviert", "Discord": "Discord", "Docker": "Docker", "Donations": "Spenden", - "DownloadClient": "Downloader", + "DownloadClient": "", "DownloadClientSettings": "Downloader Einstellungen", "DownloadClientStatusCheckAllClientMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar", "DownloadClientStatusCheckSingleClientMessage": "Download Clients aufgrund von Fehlern nicht verfügbar: {0}", @@ -307,19 +307,19 @@ "Reload": "Neuladen", "Remove": "Entfernen", "RemoveFilter": "Filter entfernen", - "RemovedFromTaskQueue": "Aus der Aufgabenwarteschlage entfernt", + "RemovedFromTaskQueue": "Aus der Aufgabenwarteschlange entfernt", "RemovingTag": "Tag entfernen", "Replace": "Ersetzen", "Reset": "Zurücksetzen", "ResetAPIKey": "API-Schlüssel zurücksetzen", - "Restart": "Neustarten", + "Restart": "Neu starten", "RestartNow": "Jetzt neustarten", "RestartProwlarr": "{appName} Neustarten", - "RestartRequiredHelpTextWarning": "Erfordert einen Neustart", + "RestartRequiredHelpTextWarning": "Erfordert einen Neustart, damit die Aktion wirksam wird", "Restore": "Wiederherstellen", - "RestoreBackup": "Backup einspielen", + "RestoreBackup": "Sicherung wiederherstellen", "Result": "Ergebnis", - "Retention": "Aufbewahrung ( Retention )", + "Retention": "", "SSLCertPassword": "SSL Zertifikat Passwort", "SSLCertPasswordHelpText": "Passwort für die PFX Datei", "SSLCertPath": "Pfad zum SSL Zertifikat", @@ -337,10 +337,10 @@ "SearchTypes": "Suchtyp", "Security": "Sicherheit", "Seeders": "Seeders", - "SelectAll": "Alle wählen", + "SelectAll": "Alles auswählen", "SemiPrivate": "Halbprivat", - "SendAnonymousUsageData": "Anonyme Nutzungsdaten übertragen", - "SetTags": "Tags setzen", + "SendAnonymousUsageData": "Sende anonyme Nutzungsdaten", + "SetTags": "Tags festlegen", "Settings": "Einstellungen", "SettingsConsoleLogLevel": "Konsolen Log Level", "SettingsEnableColorImpairedMode": "Farbbeeinträchtigter Modus aktivieren", @@ -358,7 +358,7 @@ "SettingsShowRelativeDatesHelpText": "Relatives (z.B.: Heute, gestern, etc) oder absolutes Datum anzeigen", "SettingsSqlLoggingHelpText": "Log alle SQL Abfragen von {appName}", "SettingsTimeFormat": "Zeitformat", - "ShowAdvanced": "Einfache Ansicht", + "ShowAdvanced": "Erweitert anzeigen", "ShowSearch": "Suche anzeigen", "ShowSearchHelpText": "Suchbutton anzeigen beim draufzeigen", "Shutdown": "Herunterfahren", @@ -366,7 +366,7 @@ "Sort": "Sortieren", "Source": "Quelle", "StartTypingOrSelectAPathBelow": "Eingeben oder unten auswählen", - "Started": "gestartet", + "Started": "Gestartet", "StartupDirectory": "Start-Verzeichnis", "Stats": "Statistiken", "Status": "Status", @@ -384,16 +384,16 @@ "TableOptions": "Tabellen Optionen", "TableOptionsColumnsMessage": "Wähle aus welche Spalten angezeigt werden und in welcher Reihenfolge", "TagCannotBeDeletedWhileInUse": "Kann während der Benutzung nicht gelöscht werden", - "TagIsNotUsedAndCanBeDeleted": "Tag wird nicht benutzt und kann gelöscht werden", - "Tags": "Tags", + "TagIsNotUsedAndCanBeDeleted": "", + "Tags": "", "TagsHelpText": "Wird auf Filme mit mindestens einem passenden Tag angewandt", - "TagsSettingsSummary": "Alle Tags und deren Benutzung anzeigen. Unbenutzte Tags können entfernt werden", + "TagsSettingsSummary": "Sehen Sie sich alle Tags und deren Verwendung an. Nicht verwendete Tags können entfernt werden", "Tasks": "Aufgaben", - "Test": "Testen", - "TestAll": "Alle testen", + "Test": "Prüfen", + "TestAll": "Alle prüfen", "TestAllApps": "Alle Apps testen", - "TestAllClients": "Alle testen", - "TestAllIndexers": "Alle testen", + "TestAllClients": "Prüfe alle Clients", + "TestAllIndexers": "Prüfe alle Indexer", "TheLatestVersionIsAlreadyInstalled": "Die aktuellste Version ist bereits installiert", "ThemeHelpText": "Ändere das UI-Theme der Anwendung. Das 'Auto'-Theme verwendet dein Betriebssystem-Theme, um den hellen oder dunklen Modus einzustellen. Inspiriert von {0}", "Time": "Zeit", @@ -419,7 +419,7 @@ "UnableToAddANewNotificationPleaseTryAgain": "Die neue Benachrichtigung konnte nicht hinzugefügt werden, bitte erneut probieren.", "UnableToLoadAppProfiles": "App-Profile können nicht geladen werden", "UnableToLoadApplicationList": "Anwendungsliste kann nicht geladen werden", - "UnableToLoadBackups": "Backups konnten nicht geladen werden", + "UnableToLoadBackups": "Sicherungen können nicht geladen werden", "UnableToLoadDevelopmentSettings": "Entwicklereinstellungen konnten nicht geladen werden", "UnableToLoadDownloadClients": "Downloader konnten nicht geladen werden", "UnableToLoadGeneralSettings": "Allgemeine Einstellungen konnten nicht geladen werden", @@ -429,41 +429,41 @@ "UnableToLoadNotifications": "Benachrichtigungen konnten nicht geladen werden", "UnableToLoadTags": "Tags konnten nicht geladen werden", "UnableToLoadUISettings": "Oberflächen Einstellungen konnten nicht geladen werden", - "UnsavedChanges": "Ungespeicherte Änderungen", - "UnselectAll": "Keine wählen", - "UpdateAutomaticallyHelpText": "Updates automatisch herunteraden und installieren. Es kann weiterhin unter \"System -> Updates\" ein manuelles Update angestoßen werden", + "UnsavedChanges": "Nicht gespeicherte Änderungen", + "UnselectAll": "Alle abwählen", + "UpdateAutomaticallyHelpText": "Updates automatisch herunterladen und installieren. Sie können weiterhin über System: Updates installieren", "UpdateCheckStartupNotWritableMessage": "Update kann nicht installiert werden, da der Startordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.", "UpdateCheckStartupTranslocationMessage": "Update kann nicht installiert werden, da sich der Startordner '{0}' in einem App Translocation-Ordner befindet.", "UpdateCheckUINotWritableMessage": "Update kann nicht installiert werden, da der Benutzeroberflächenordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.", - "UpdateMechanismHelpText": "Benutze {appName}'s Built-In Updater oder ein Script", + "UpdateMechanismHelpText": "Verwenden Sie den integrierten Updater von {appName} oder ein Skript", "UpdateScriptPathHelpText": "Pfad zu einem benutzerdefinierten Skript, das ein extrahiertes Update-Paket übernimmt und den Rest des Update-Prozesses abwickelt", - "Updates": "Updates", - "Uptime": "Laufzeit", + "Updates": "Aktualisierung", + "Uptime": "Betriebszeit", "Url": "Url", - "UrlBaseHelpText": "Für Reverse-Proxy-Unterstützung. Die Standardeinstellung leer", - "UseProxy": "Proxy benutzen", + "UrlBaseHelpText": "Für die Reverse-Proxy-Unterstützung ist der Standardwert leer", + "UseProxy": "Verwende Proxy", "Usenet": "Usenet", "UserAgentProvidedByTheAppThatCalledTheAPI": "UserAgent von der App welcher die API aufgerufen hat", - "Username": "Benutzername", + "Username": "Nutzername", "Version": "Version", "View": "Ansicht", - "Warn": "Warnung", + "Warn": "Achtung", "Website": "Webseite", "Wiki": "Wiki", "Yes": "Ja", - "YesCancel": "Ja, abbrechen", + "YesCancel": "Ja Abbrechen", "Yesterday": "Gestern", "OnHealthRestoredHelpText": "Bei Wiederherstellung des Zustands", "OnHealthRestored": "Bei Wiederherstellung des Zustands", "StopSelecting": "Auswahl stoppen", "ApplicationURL": "Anwendungs-URL", - "ApplicationUrlHelpText": "Die externe URL der Anwendung inklusive http(s)://, Port und URL-Basis", + "ApplicationUrlHelpText": "Die externe URL dieser Anwendung, einschließlich http(s)://, Port und URL-Basis", "ApplyChanges": "Änderungen anwenden", - "CountIndexersSelected": "{0} Indexer ausgewählt", + "CountIndexersSelected": "{count} Indexer ausgewählt", "DeleteSelectedDownloadClients": "Lösche Download Client(s)", "DeleteSelectedApplicationsMessageText": "Indexer '{0}' wirklich löschen?", - "DeleteSelectedDownloadClientsMessageText": "Indexer '{0}' wirklich löschen?", - "DeleteSelectedIndexersMessageText": "Indexer '{0}' wirklich löschen?", + "DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?", + "DeleteSelectedIndexersMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte(n) Indexer löschen möchten?", "EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten", "Implementation": "Integration", "ManageDownloadClients": "Verwalte Download Clienten", @@ -471,11 +471,11 @@ "NoIndexersFound": "Keine Indexer gefunden", "Theme": "Design", "Season": "Staffel", - "ApplyTagsHelpTextAdd": "Hinzufügen: Füge neu Tags zu den existierenden Tags hinzu", + "ApplyTagsHelpTextAdd": "Hinzufügen: Fügen Sie die Tags der vorhandenen Tag-Liste hinzu", "ApplyTagsHelpTextHowToApplyApplications": "Wie werden Tags zu ausgewählten Autoren zugeteilt", - "ApplyTagsHelpTextHowToApplyIndexers": "Wie werden Tags zu ausgewählten Indexern zugeteilt", - "ApplyTagsHelpTextRemove": "Entfernen: Eingegebene Tags entfernen", - "ApplyTagsHelpTextReplace": "Ersetzen: Nur eingegebene Tags übernehmen und vorhandene entfernen( keine Tags eingeben um alle zu entfernen )", + "ApplyTagsHelpTextHowToApplyIndexers": "So wenden Sie Tags auf die ausgewählten Indexer an", + "ApplyTagsHelpTextRemove": "Entfernen: Die eingegebenen Tags entfernen", + "ApplyTagsHelpTextReplace": "Ersetzen: Ersetzen Sie die Tags durch die eingegebenen Tags (geben Sie keine Tags ein, um alle Tags zu löschen).", "DownloadClientPriorityHelpText": "Priorisiere mehrere Downloader. Rundlauf-Verfahren wird für Downloader mit der gleichen Priorität verwendet.", "EditSelectedIndexers": "Ausgewähle Indexer bearbeiten", "SelectIndexers": "Indexer suchen", @@ -491,20 +491,20 @@ "Artist": "Künstler", "Author": "Autor", "Book": "Buch", - "ConnectionLostReconnect": "Radarr wird automatisch versuchen zu verbinden oder klicke unten auf neuladen.", - "ConnectionLostToBackend": "Radarr hat die Verbindung zum Backend verloren und muss neugeladen werden.", + "ConnectionLostReconnect": "{appName} wird versuchen, automatisch eine Verbindung herzustellen, oder Sie können unten auf „Neu laden“ klicken.", + "ConnectionLostToBackend": "{appName} hat die Verbindung zum Backend verloren und muss neu geladen werden, um die Funktionalität wiederherzustellen.", "RecentChanges": "Kürzliche Änderungen", - "WhatsNew": "Was gibt's Neues?", + "WhatsNew": "Was ist neu?", "minutes": "Minuten", "DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?", "AddConnection": "Verbindung hinzufügen", "NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar", "NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}", - "AuthBasic": "Einfach (Browser Popup)", - "AuthForm": "Formular (Login Seite)", - "DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren", + "AuthBasic": "Basis (Browser-Popup)", + "AuthForm": "Formulare (Anmeldeseite)", + "DisabledForLocalAddresses": "Für lokale Adressen deaktiviert", "None": "Keine", - "ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?", + "ResetAPIKeyMessageText": "Sind Sie sicher, dass Sie Ihren API-Schlüssel zurücksetzen möchten?", "AddCustomFilter": "Eigenen Filter hinzufügen", "AddApplication": "Application hinzufügen", "AddCategory": "Kategorie hinzufügen", @@ -532,5 +532,9 @@ "AuthenticationRequiredUsernameHelpTextWarning": "Gib einen neuen Benutzernamen ein", "AuthenticationMethodHelpTextWarning": "Bitte wähle eine gültige Authentifizierungsmethode aus", "AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein", - "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen" + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen", + "DefaultNameCopiedProfile": "{Name} – Kopieren", + "AuthenticationMethod": "Authentifizierungsmethode", + "Clone": "Klonen", + "CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 2f8345c82..d50b685a5 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -28,14 +28,14 @@ "About": "À propos", "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", "DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}", - "SetTags": "Définir des balises", + "SetTags": "Définir des étiquettes", "ReleaseStatus": "Statut de la version", "UpdateCheckUINotWritableMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", "UpdateCheckStartupTranslocationMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' se trouve dans un dossier App Translocation.", "UpdateCheckStartupNotWritableMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", "UnselectAll": "Tout désélectionner", "UISettingsSummary": "Date, langue, et perceptions des couleurs", - "TagsSettingsSummary": "Voir toutes les balises et comment elles sont utilisées. Les balises inutilisées peuvent être supprimées", + "TagsSettingsSummary": "Voir toutes les étiquettes et comment elles sont utilisées. Les étiquettes inutilisées peuvent être supprimées", "Style": "Style", "Status": "État", "Sort": "Trier", @@ -107,7 +107,7 @@ "Reload": "Recharger", "Peers": "Peers", "PageSize": "Pagination", - "Ok": "Ok", + "Ok": "OK", "OAuthPopupMessage": "Les pop-ups sont bloquées par votre navigateur", "Name": "Nom", "Message": "Message", @@ -482,7 +482,7 @@ "Author": "Auteur", "AverageResponseTimesMs": "Temps de réponse moyen des indexeurs (ms)", "IndexerFailureRate": "Taux d'échec de l'indexeur", - "Label": "Label", + "Label": "Libellé", "More": "Plus", "Publisher": "Éditeur", "Season": "Saison", @@ -595,7 +595,7 @@ "AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur", "Clone": "Cloner", "PackSeedTime": "Temps de Seed", - "ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune balise ou qui ont une ou plusieurs balises correspondantes", + "ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes", "OnHealthRestored": "Sur la santé restaurée", "OnHealthRestoredHelpText": "Sur la santé restaurée", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index f74489ced..afce98dec 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -1,7 +1,7 @@ { "About": "Névjegy", "Analytics": "Analitika", - "AddIndexer": "Indexer hozzáadása", + "AddIndexer": "Indexelő hozzáadása", "AddingTag": "Címke hozzáadása", "Error": "Hiba", "DeleteTag": "Címke Törlése", @@ -9,7 +9,7 @@ "EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést", "Enable": "Aktiválás", "EditIndexer": "Indexer Szerkesztése", - "Edit": "Szerkesztés", + "Edit": "szerkeszt", "DownloadClientStatusCheckSingleClientMessage": "Letöltőkliens hiba miatt nem elérhető: {0}", "DownloadClientStatusCheckAllClientMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt", "DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a {appName} felhasználói felület keresésbe történő integráláshoz", @@ -17,8 +17,8 @@ "DownloadClients": "Letöltőkliensek", "DownloadClient": "Letöltési Kliens", "Docker": "Docker", - "Disabled": "Letiltott", - "Details": "Részletek", + "Disabled": "Tiltva", + "Details": "részletek", "DeleteTagMessageText": "Biztosan törlöd a(z) „{0}” címkét?", "DeleteNotificationMessageText": "Biztosan törlöd a(z) „{0}” értesítést?", "DeleteNotification": "Értesítés Törlése", @@ -46,7 +46,7 @@ "ChangeHasNotBeenSavedYet": "A változások még nem lettek elmentve", "CertificateValidationHelpText": "Módosítsa a HTTPS tanúsítás szigorúságát", "CertificateValidation": "Tanúsítvány érvényesítése", - "CancelPendingTask": "Biztosan törlöd ezt a függőben lévő feladatot?", + "CancelPendingTask": "Biztosan törölni szeretné ezt a függőben lévő feladatot?", "Cancel": "Mégse", "BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez", "BranchUpdateMechanism": "A külső frissítési mechanizmus által használt ágazat", @@ -54,13 +54,13 @@ "Branch": "Ágazat", "BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez", "BindAddress": "Kapcsolási Cím", - "BeforeUpdate": "Alkalmazásfrissítés előtt", + "BeforeUpdate": "Frissítés előtt", "Backups": "Biztonsági mentések", - "BackupRetentionHelpText": "A megőrzési időnél régebbi automatikus biztonsági másolatok automatikusan törlésre kerülnek", - "BackupNow": "Biztonsági Mentés Most", - "BackupIntervalHelpText": "Időeltérés a biztonsági mentések között", + "BackupRetentionHelpText": "A megőrzési időszaknál régebbi automatikus biztonsági másolatok automatikusan törlődnek", + "BackupNow": "Biztonsági Mentés", + "BackupIntervalHelpText": "Az automatikus biztonsági mentések közötti időköz", "BackupFolderHelpText": "Az elérési útvonalak a {appName} AppData könyvtárában lesznek", - "Backup": "Biztonsági Mentés", + "Backup": "biztonsági mentés", "AutomaticSearch": "Automatikus keresés", "Automatic": "Automatikus", "AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a {appName} szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely {appName} WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.", @@ -71,12 +71,12 @@ "ApiKey": "API Kulcs", "All": "Összes", "AcceptConfirmationModal": "Változás Megerősítése", - "Apply": "Alkalmazás", + "Apply": "Alkamaz", "AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges anélkül hogy az AppData ne törlődjön", - "AppDataDirectory": "AppData Mappa", + "AppDataDirectory": "AppData Könyvtár", "Added": "Hozzáadva", "Actions": "Teendők", - "History": "Történet", + "History": "Előzmény", "HideAdvanced": "Haladó Elrejtése", "HealthNoIssues": "Nincs hiba a konfigurációval", "Health": "Állapot", @@ -84,11 +84,11 @@ "ForMoreInformationOnTheIndividualDownloadClients": "Ha többet szeretnél megtudni a különböző letöltési kliensekről, kattints az információs gombokra.", "Folder": "Mappa", "FocusSearchBox": "Fókusz Keresőmező", - "Fixed": "Kijavítva", + "Fixed": "Rögzített", "FilterPlaceHolder": "Filmek Keresése", "Filter": "Szűrő", "Files": "Fájl", - "Filename": "Fájlnév", + "Filename": "Fájl név", "Failed": "Sikertelen", "ExistingTag": "Meglévő Címke", "Exception": "Kivétel", @@ -136,7 +136,7 @@ "Save": "Mentés", "RSSIsNotSupportedWithThisIndexer": "Az RSS nem támogatott ezzel az indexerrel", "Retention": "Visszatartás", - "Result": "Eredmények", + "Result": "Eredmény", "RestoreBackup": "Biztonsági mentés visszaállítása", "Restore": "Visszaállítás", "RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez", @@ -177,7 +177,7 @@ "PageSizeHelpText": "Az egyes oldalakon megjelenítendő elemek száma", "PageSize": "Oldal mérete", "PackageVersion": "Csomagverzió", - "Options": "Opciók", + "Options": "Lehetőségek", "OpenThisModal": "Nyissa meg ezt a modált", "OpenBrowserOnStart": "Indításkor nyissa meg a böngészőt", "OnHealthIssueHelpText": "Állapotprobléma", @@ -200,9 +200,9 @@ "MIA": "MIA", "Message": "Üzenet", "Mechanism": "Mechanizmus", - "Manual": "Manuális", + "Manual": "Kézi", "MaintenanceRelease": "Karbantartási frissítés: hibajavítások és egyéb fejlesztések. További részletekért lásd: Github Commit History", - "Logs": "Logok", + "Logs": "Naplók", "LogLevelTraceHelpTextWarning": "A nyomkövetést csak ideiglenesen szabad engedélyezni", "LogLevel": "Log Szint", "Logging": "Loggolás", @@ -332,7 +332,7 @@ "AppProfileSelectHelpText": "Az alkalmazásprofilok az RSS vezérlésére szolgálnak, Automatikus keresés és Interaktív keresés beállításai az alkalmazás szinkronizálásakor", "UnableToAddANewApplicationPleaseTryAgain": "Nem lehet új alkalmazást hozzáadni, próbálkozzon újra.", "UnableToAddANewAppProfilePleaseTryAgain": "Nem lehet új alkalmazásprofilt hozzáadni, próbálkozzon újra.", - "AddDownloadClient": "Letöltőkliens hozzáadása", + "AddDownloadClient": "Letöltési kliens hozzáadása", "Applications": "Alkalmazások", "AppProfileInUse": "Használatban lévő alkalmazásprofil", "Apps": "Appok", @@ -466,9 +466,9 @@ "ApplyChanges": "Változások alkalmazása", "ApplyTagsHelpTextReplace": "Csere: Cserélje ki a címkéket a beírt címkékre (az összes címke törléséhez ne adjon meg címkéket)", "EditSelectedIndexers": "Kiválasztott indexelők szerkesztése", - "ApplyTagsHelpTextAdd": "Hozzáadás: Új címkék hozzáadása a meglévő címkékhez", + "ApplyTagsHelpTextAdd": "Hozzáadás: Adja hozzá a címkéket a meglévő címkék listájához", "ApplyTagsHelpTextHowToApplyApplications": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez", - "ApplyTagsHelpTextHowToApplyIndexers": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez", + "ApplyTagsHelpTextHowToApplyIndexers": "Címkék alkalmazása a kiválasztott indexelőkre", "ApplyTagsHelpTextRemove": "Eltávolítás: Távolítsa el a beírt címkéket", "CountIndexersSelected": "{0} Indexelő(k) kiválasztva", "DeleteSelectedDownloadClients": "Letöltőkliens Törlése", @@ -494,14 +494,27 @@ "WhatsNew": "Mi az újdonság?", "ConnectionLostToBackend": "A Radarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.", "minutes": "percek", - "AddConnection": "Gyűjtemény módosítása", + "AddConnection": "Csatlakozás hozzáadása", "NotificationStatusAllClientHealthCheckMessage": "Összes alkalmazás elérhetetlen hiba miatt", "NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}", - "AuthBasic": "Alap (Böngésző felugró ablak)", - "AuthForm": "Felhasználó (Bejelentkezési oldal)", + "AuthBasic": "Alap (böngésző előugró ablak)", + "AuthForm": "Űrlapok (bejelentkezési oldal)", "DisabledForLocalAddresses": "Letiltva a helyi címeknél", "None": "Nincs", "ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?", "AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót", - "AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet" + "AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet", + "AppUpdated": "{appName} frissítve", + "AddApplication": "Alkalmazás hozzáadása", + "AddCustomFilter": "Egyéni szűrő hozzáadása", + "Clone": "Klón", + "Implementation": "Végrehajtás", + "AddConnectionImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}", + "AddDownloadClientImplementation": "Letöltési kliens hozzáadása – {megvalósítási név}", + "AddIndexerImplementation": "Indexelő hozzáadása - {megvalósítás neve}", + "ActiveApps": "Aktív alkalmazások", + "ActiveIndexers": "Indexerek", + "AuthenticationMethod": "Hitelesítési Módszer", + "AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 25eece3ed..7e00b2e9f 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -452,8 +452,8 @@ "NotificationStatusSingleClientHealthCheckMessage": "Applicaties onbeschikbaar door fouten", "AddConnection": "Voeg connectie toe", "NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten", - "AuthBasic": "Basis (Browser Pop-up)", - "AuthForm": "Formulier (Login Pagina)", + "AuthBasic": "Basic (Browser Pop-up)", + "AuthForm": "Formulier (inlogpagina)", "DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen", "None": "Geen", "ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?", @@ -476,5 +476,10 @@ "EditIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}", "AuthenticationMethod": "Authenticatiemethode", "AuthenticationRequired": "Verificatie vereist", - "AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode" + "AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode", + "AuthenticationRequiredHelpText": "Pas aan welke requests verificatie nodig hebben. Pas niets aan als je de risico's niet begrijpt.", + "AuthenticationRequiredPasswordHelpTextWarning": "Voer een nieuw wachtwoord in", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Bevestig het nieuwe wachtwoord", + "AuthenticationRequiredUsernameHelpTextWarning": "Voeg een nieuwe gebruikersnaam in", + "AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen." } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 163d50328..d4c3a7c7d 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -22,7 +22,7 @@ "Automatic": "Automatyczny", "ApplyTags": "Zastosuj tagi", "BackupIntervalHelpText": "Odstęp czasu między automatycznymi kopiami zapasowymi", - "Close": "Blisko", + "Close": "Zamknij", "CloseCurrentModal": "Zamknij bieżący tryb", "Delete": "Usunąć", "Discord": "Niezgoda", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 00639373d..047faa279 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -120,7 +120,7 @@ "Clear": "Limpar", "Cancel": "Cancelar", "BackupNow": "Criar cópia de segurança", - "Backup": "Cópia de segurança", + "Backup": "Backup", "Apply": "Aplicar", "Analytics": "Análises", "All": "Todos", @@ -181,7 +181,7 @@ "BindAddressHelpText": "Endereço de IP válido, localhost ou \"*\" para todas as interfaces", "BindAddress": "Endereço de vínculo", "Backups": "Cópias de segurança", - "BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do {appName}", + "BackupFolderHelpText": "Caminhos relativos estarão no diretório AppData do {appName}", "BackupIntervalHelpText": "Intervalo entre cópias de segurança automáticas", "BackupRetentionHelpText": "Cópias de segurança automáticas anteriores ao período de retenção serão eliminadas automaticamente", "ClientPriority": "Prioridade do cliente", @@ -472,5 +472,6 @@ "EditSelectedDownloadClients": "Editar Clientes de Transferência Selecionados", "Album": "álbum", "Artist": "artista", - "DefaultNameCopiedProfile": "{name} - Copiar" + "DefaultNameCopiedProfile": "{name} - Copiar", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmar nova senha" } From 1b2106d4f04e2f15e015ed00d4d7772008f5e070 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 31 Dec 2023 05:18:12 +0000 Subject: [PATCH 377/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dimitri Co-authored-by: Fixer Co-authored-by: Koch Norbert Co-authored-by: Pietro Ribeiro Co-authored-by: SunStorm Co-authored-by: Weblate Co-authored-by: chiral-lab Co-authored-by: chrizl Co-authored-by: resi23 Co-authored-by: slammingdeath Co-authored-by: ube Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 6 +++--- src/NzbDrone.Core/Localization/Core/sv.json | 11 ++++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 7b38d709e..42137754b 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -52,7 +52,7 @@ "BindAddressHelpText": "Gültige IP-Adresse, localhost oder „*“ für alle Schnittstellen", "BookSearch": "Buch Suche", "BookSearchTypes": "Buch-Suchtypen", - "Branch": "Git-Branch", + "Branch": "Branch", "BranchUpdate": "Verwendeter Branch zur Aktualisierung von {appName}", "BranchUpdateMechanism": "Git-Branch für den externen Updateablauf", "BypassProxyForLocalAddresses": "Proxy für lokale Adressen umgehen", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index afce98dec..42e9175f8 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -239,13 +239,13 @@ "Title": "Cím", "Time": "Idő", "TestAllClients": "Összes kliens tesztelése", - "TestAll": "Összes tesztelése", + "TestAll": "Összes Tesztelése", "Test": "Teszt", "Tasks": "Feladatok", "TagsSettingsSummary": "Tekintse meg az összes címkét és azok használatát. A használatlan címkék eltávolíthatók", "TagsHelpText": "Legalább egy megfelelő címkével rendelkező filmekre vonatkozik", "Tags": "Címkék", - "TagIsNotUsedAndCanBeDeleted": "A címkét nincs használatban, és törölhető", + "TagIsNotUsedAndCanBeDeleted": "A címke nincs használatban, törölhető", "TagCannotBeDeletedWhileInUse": "Használat közben nem törölhető", "TableOptionsColumnsMessage": "Válasszd ki, mely oszlopok legyenek láthatóak, és milyen sorrendben jelenjenek meg", "SystemTimeCheckMessage": "A rendszeridő több mint 1 napja nem frissült. Előfordulhat, hogy az ütemezett feladatok az idő kijavításáig nem futnak megfelelően", @@ -280,7 +280,7 @@ "UnableToLoadUISettings": "Nem sikerült betölteni a felhasználói felület beállításait", "UnableToLoadTags": "Nem sikerült betölteni a címkéket", "UnableToLoadNotifications": "Nem sikerült betölteni az Értesítéseket", - "TableOptions": "Táblázat beállításai", + "TableOptions": "Táblázat Beállítások", "ShowSearch": "Keresés(ek) megjelenítése", "SetTags": "Címkék beállítása", "NotificationTriggers": "Értesítés(ek) kiváltója", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index a61b5e976..35361f4ad 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -13,10 +13,10 @@ "Filter": "Filter", "Files": "Filer", "Events": "Händelser", - "Edit": "Redigera", + "Edit": "Ändra", "DownloadClientStatusCheckSingleClientMessage": "Otillgängliga nedladdningsklienter på grund av misslyckade anslutningsförsök: {0}", "DownloadClientStatusCheckAllClientMessage": "Samtliga nedladdningsklienter är otillgängliga på grund av misslyckade anslutningsförsök", - "DownloadClients": "Nedladdningsklienter", + "DownloadClients": "Nerladdningsklienter", "Delete": "Radera", "Dates": "Datum", "Date": "Datum", @@ -196,7 +196,7 @@ "IncludeHealthWarningsHelpText": "Inkludera hälsovarningar", "IndexerFlags": "Indexerflaggor", "AddDownloadClient": "Lägg till nedladdningsklient", - "AddIndexer": "Lägg till indexerare", + "AddIndexer": "Lägg till index", "AddingTag": "Lägg till tagg", "Enabled": "Aktiverad", "Exception": "Undantag", @@ -394,7 +394,7 @@ "No": "Nej", "ApplicationLongTermStatusCheckAllClientMessage": "Alla indexerare är inte tillgängliga på grund av fel i mer än 6 timmar", "ApplicationLongTermStatusCheckSingleClientMessage": "Indexatorer är inte tillgängliga på grund av misslyckanden i mer än sex timmar: {0}", - "Duration": "Tid", + "Duration": "Längd", "Ended": "Avslutad", "LastDuration": "lastDuration", "LastExecution": "Senaste avrättningen", @@ -437,5 +437,6 @@ "AuthForm": "Blanketter (inloggningssida)", "DisabledForLocalAddresses": "Inaktiverad för lokala adresser", "None": "Ingen", - "ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?" + "ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?", + "AddCustomFilter": "Lägg till anpassat filter" } From af4e69f8fb5930c1f9a93f55368815aa99bb436b Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 31 Dec 2023 05:18:12 +0000 Subject: [PATCH 378/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dimitri Co-authored-by: Fixer Co-authored-by: Koch Norbert Co-authored-by: Pietro Ribeiro Co-authored-by: SunStorm Co-authored-by: Weblate Co-authored-by: chiral-lab Co-authored-by: chrizl Co-authored-by: resi23 Co-authored-by: slammingdeath Co-authored-by: ube Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/hu.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 42e9175f8..07cef7070 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -509,9 +509,9 @@ "AddCustomFilter": "Egyéni szűrő hozzáadása", "Clone": "Klón", "Implementation": "Végrehajtás", - "AddConnectionImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}", + "AddConnectionImplementation": "Csatlakozás hozzáadása - {implementationName}", "AddDownloadClientImplementation": "Letöltési kliens hozzáadása – {megvalósítási név}", - "AddIndexerImplementation": "Indexelő hozzáadása - {megvalósítás neve}", + "AddIndexerImplementation": "Indexelő hozzáadása - {implementationName}", "ActiveApps": "Aktív alkalmazások", "ActiveIndexers": "Indexerek", "AuthenticationMethod": "Hitelesítési Módszer", From e27a46f5784b4ac81f7a747f4b30756e892802e6 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 31 Dec 2023 13:16:41 -0800 Subject: [PATCH 379/964] Fixed: Disable SSL on start if certificate path is not set (cherry picked from commit 4e19fec123900b8ba1252b640f26f2a4983683ff) --- src/NzbDrone.Core/Configuration/ConfigFileProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index a7b78fd92..3b7da5d89 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -332,8 +332,8 @@ namespace NzbDrone.Core.Configuration return; } - // If SSL is enabled and a cert hash is still in the config file disable SSL - if (EnableSsl && GetValue("SslCertHash", null).IsNotNullOrWhiteSpace()) + // If SSL is enabled and a cert hash is still in the config file or cert path is empty disable SSL + if (EnableSsl && (GetValue("SslCertHash", null).IsNotNullOrWhiteSpace() || SslCertPath.IsNullOrWhiteSpace())) { SetValue("EnableSsl", false); } From bf47380f7b2a7e5614d575a2d520d06d6ba8e7c3 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 1 Jan 2024 11:58:19 +0000 Subject: [PATCH 380/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: Mario Rodriguez Co-authored-by: Norbi Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 13 +++++++------ src/NzbDrone.Core/Localization/Core/pt_BR.json | 4 +++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index c8b36909a..83dcdec89 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -351,7 +351,7 @@ "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API", "InstanceName": "Nombre de Instancia", "InstanceNameHelpText": "Nombre de instancia en pestaña y para nombre de aplicación en Syslog", - "Database": "Base de Datos", + "Database": "Base de datos", "Duration": "Duración", "LastDuration": "Duración", "LastExecution": "Última ejecución", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 07cef7070..81806c233 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -23,9 +23,9 @@ "DeleteNotificationMessageText": "Biztosan törlöd a(z) „{0}” értesítést?", "DeleteNotification": "Értesítés Törlése", "DeleteDownloadClientMessageText": "Biztosan törlöd a(z) „{0}” letöltő klienst?", - "DeleteDownloadClient": "Letöltőkliens Törlése", - "DeleteBackupMessageText": "Biztosan törlöd a(z) „{0}” biztonsági mentést?", - "DeleteBackup": "Biztonsági Mentés Törlése", + "DeleteDownloadClient": "Letöltőkliens törlése", + "DeleteBackupMessageText": "Biztosan törli a '{name}' biztonsági mentést?", + "DeleteBackup": "Biztonsági Mentés törlése", "Delete": "Törlés", "DBMigration": "DB Migráció", "Dates": "Dátumok", @@ -257,7 +257,7 @@ "Indexer": "Indexelő", "IncludeHealthWarningsHelpText": "Tartalmazza a Állapot Figyelmeztetéseket", "IllRestartLater": "Később Újraindítom", - "IgnoredAddresses": "Ignorált Címek", + "IgnoredAddresses": "Ignorált címek", "YesCancel": "Igen, Mégsem", "Warn": "Figyelmeztet", "View": "Nézet", @@ -510,11 +510,12 @@ "Clone": "Klón", "Implementation": "Végrehajtás", "AddConnectionImplementation": "Csatlakozás hozzáadása - {implementationName}", - "AddDownloadClientImplementation": "Letöltési kliens hozzáadása – {megvalósítási név}", + "AddDownloadClientImplementation": "Letöltési kliens hozzáadása – {implementationName}", "AddIndexerImplementation": "Indexelő hozzáadása - {implementationName}", "ActiveApps": "Aktív alkalmazások", "ActiveIndexers": "Indexerek", "AuthenticationMethod": "Hitelesítési Módszer", "AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot", - "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót" + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót", + "DefaultNameCopiedProfile": "{name} - Másolat" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 61ab4112d..6160980f7 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -601,5 +601,7 @@ "NoIndexerCategories": "Nenhuma categoria encontrada para este indexador", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirme a nova senha", "PasswordConfirmation": "Confirmação Da Senha", - "InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações" + "InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Seja para usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)", + "DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo" } From f9c9d4a0e0ddf5fb677d30df6e88df4d323e51ed Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 2 Jan 2024 22:04:16 +0200 Subject: [PATCH 381/964] Fixed: (GGn) Improve title, timezone, MST, min/max size filters Hiding torrents of type link And some minor refactoring around the passkey fetching and parsing. --- .../GazelleGamesTests/GazelleGamesFixture.cs | 15 +- .../Indexers/Definitions/GazelleGames.cs | 302 ++++++++++++------ 2 files changed, 205 insertions(+), 112 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs index 5ff5b5ee9..8db0e9ab8 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Linq; using System.Net; using System.Net.Http; @@ -21,10 +22,10 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests [SetUp] public void Setup() { - Subject.Definition = new IndexerDefinition() + Subject.Definition = new IndexerDefinition { Name = "GazelleGames", - Settings = new GazelleGamesSettings() { Apikey = "somekey" } + Settings = new GazelleGamesSettings { Apikey = "somekey" } }; } @@ -37,20 +38,20 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests .Setup(o => o.ExecuteProxiedAsync(It.Is(v => v.Method == HttpMethod.Get), Subject.Definition)) .Returns((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed))); - var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new int[] { 2000 } })).Releases; + var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases; - releases.Should().HaveCount(1464); + releases.Should().HaveCount(1463); releases.First().Should().BeOfType(); var torrentInfo = releases.First() as TorrentInfo; - torrentInfo.Title.Should().Be("Microsoft_Flight_Simulator-HOODLUM"); + torrentInfo.Title.Should().Be("Microsoft_Flight_Simulator-HOODLUM (2020) [Windows / Multi-Language / Full ISO]"); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); torrentInfo.DownloadUrl.Should().Be("https://gazellegames.net/torrents.php?action=download&id=303216&authkey=prowlarr&torrent_pass="); torrentInfo.InfoUrl.Should().Be("https://gazellegames.net/torrents.php?id=84781&torrentid=303216"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-07-25 6:39:11").ToUniversalTime()); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-07-25 06:39:11", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal)); torrentInfo.Size.Should().Be(80077617780); torrentInfo.InfoHash.Should().Be(null); torrentInfo.MagnetUrl.Should().Be(null); @@ -74,7 +75,7 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests .Setup(o => o.ExecuteProxiedAsync(It.Is(v => v.Method == HttpMethod.Get), Subject.Definition)) .Returns((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed))); - var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new int[] { 2000 } })).Releases; + var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases; releases.Should().HaveCount(0); } diff --git a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs index 4abc47005..115d871e6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs @@ -1,13 +1,16 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using FluentValidation; using FluentValidation.Results; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NLog; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; using NzbDrone.Core.Annotations; @@ -16,6 +19,7 @@ using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -24,7 +28,7 @@ namespace NzbDrone.Core.Indexers.Definitions public class GazelleGames : TorrentIndexerBase { public override string Name => "GazelleGames"; - public override string[] IndexerUrls => new string[] { "https://gazellegames.net/" }; + public override string[] IndexerUrls => new[] { "https://gazellegames.net/" }; public override string Description => "GazelleGames (GGn) is a Private Torrent Tracker for GAMES"; public override string Language => "en-US"; public override Encoding Encoding => Encoding.UTF8; @@ -38,7 +42,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IIndexerRequestGenerator GetRequestGenerator() { - return new GazelleGamesRequestGenerator() { Settings = Settings, Capabilities = Capabilities, HttpClient = _httpClient }; + return new GazelleGamesRequestGenerator(Settings, Capabilities); } public override IParseIndexerResponse GetParser() @@ -48,14 +52,13 @@ namespace NzbDrone.Core.Indexers.Definitions private IndexerCapabilities SetCapabilities() { - var caps = new IndexerCapabilities - { - }; + var caps = new IndexerCapabilities(); // Apple caps.Categories.AddCategoryMapping("Mac", NewznabStandardCategory.ConsoleOther, "Mac"); caps.Categories.AddCategoryMapping("iOS", NewznabStandardCategory.PCMobileiOS, "iOS"); caps.Categories.AddCategoryMapping("Apple Bandai Pippin", NewznabStandardCategory.ConsoleOther, "Apple Bandai Pippin"); + caps.Categories.AddCategoryMapping("Apple II", NewznabStandardCategory.ConsoleOther, "Apple II"); // Google caps.Categories.AddCategoryMapping("Android", NewznabStandardCategory.PCMobileAndroid, "Android"); @@ -78,6 +81,7 @@ namespace NzbDrone.Core.Indexers.Definitions caps.Categories.AddCategoryMapping("Nintendo GameCube", NewznabStandardCategory.ConsoleOther, "Nintendo GameCube"); caps.Categories.AddCategoryMapping("Pokemon Mini", NewznabStandardCategory.ConsoleOther, "Pokemon Mini"); caps.Categories.AddCategoryMapping("SNES", NewznabStandardCategory.ConsoleOther, "SNES"); + caps.Categories.AddCategoryMapping("Switch", NewznabStandardCategory.ConsoleOther, "Switch"); caps.Categories.AddCategoryMapping("Virtual Boy", NewznabStandardCategory.ConsoleOther, "Virtual Boy"); caps.Categories.AddCategoryMapping("Wii", NewznabStandardCategory.ConsoleWii, "Wii"); caps.Categories.AddCategoryMapping("Wii U", NewznabStandardCategory.ConsoleWiiU, "Wii U"); @@ -178,31 +182,62 @@ namespace NzbDrone.Core.Indexers.Definitions caps.Categories.AddCategoryMapping("Retro - Other", NewznabStandardCategory.ConsoleOther, "Retro - Other"); // special categories (real categories/not platforms) - caps.Categories.AddCategoryMapping("OST", NewznabStandardCategory.AudioOther, "OST"); - caps.Categories.AddCategoryMapping("Applications", NewznabStandardCategory.PC0day, "Applications"); - caps.Categories.AddCategoryMapping("E-Books", NewznabStandardCategory.BooksEBook, "E-Books"); + caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.PCGames, "Games"); + caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.PC0day, "Applications"); + caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.BooksEBook, "E-Books"); + caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.AudioOther, "OST"); return caps; } protected override async Task Test(List failures) { - ((GazelleGamesRequestGenerator)GetRequestGenerator()).FetchPasskey(); - await base.Test(failures); + await FetchPasskey().ConfigureAwait(false); + + await base.Test(failures).ConfigureAwait(false); + } + + private async Task FetchPasskey() + { + var request = new HttpRequestBuilder($"{Settings.BaseUrl.Trim().TrimEnd('/')}/api.php") + .Accept(HttpAccept.Json) + .SetHeader("X-API-Key", Settings.Apikey) + .AddQueryParam("request", "quick_user") + .Build(); + + var indexResponse = await _httpClient.ExecuteAsync(request).ConfigureAwait(false); + + var index = Json.Deserialize(indexResponse.Content); + + if (index == null || + string.IsNullOrWhiteSpace(index.Status) || + index.Status != "success" || + string.IsNullOrWhiteSpace(index.Response.PassKey)) + { + throw new IndexerAuthException("Failed to authenticate with GazelleGames."); + } + + // Set passkey on settings so it can be used to generate the download URL + Settings.Passkey = index.Response.PassKey; } } public class GazelleGamesRequestGenerator : IIndexerRequestGenerator { - public GazelleGamesSettings Settings { get; set; } - public IndexerCapabilities Capabilities { get; set; } - public IIndexerHttpClient HttpClient { get; set; } + private readonly GazelleGamesSettings _settings; + private readonly IndexerCapabilities _capabilities; + + public GazelleGamesRequestGenerator(GazelleGamesSettings settings, IndexerCapabilities capabilities) + { + _settings = settings; + _capabilities = capabilities; + } public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories))); + pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria))); return pageableRequests; } @@ -211,7 +246,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories))); + pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria))); return pageableRequests; } @@ -220,7 +255,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories))); + pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria))); return pageableRequests; } @@ -229,7 +264,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories))); + pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria))); return pageableRequests; } @@ -238,61 +273,72 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories))); + pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria))); return pageableRequests; } - public void FetchPasskey() + private IEnumerable GetRequest(List> parameters) { - // GET on index for the passkey - var request = RequestBuilder().Resource("api.php?request=quick_user").Build(); - var indexResponse = HttpClient.Execute(request); - var index = Json.Deserialize(indexResponse.Content); - if (index == null || - string.IsNullOrWhiteSpace(index.Status) || - index.Status != "success" || - string.IsNullOrWhiteSpace(index.Response.PassKey)) - { - throw new Exception("Failed to authenticate with GazelleGames."); - } - - // Set passkey on settings so it can be used to generate the download URL - Settings.Passkey = index.Response.PassKey; - } - - private IEnumerable GetRequest(string parameters) - { - var req = RequestBuilder() - .Resource($"api.php?{parameters}") + var request = RequestBuilder() + .Resource($"/api.php?{parameters.GetQueryString()}") .Build(); - yield return new IndexerRequest(req); + yield return new IndexerRequest(request); } private HttpRequestBuilder RequestBuilder() { - return new HttpRequestBuilder($"{Settings.BaseUrl.Trim().TrimEnd('/')}") + return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}") + .Resource("/api.php") .Accept(HttpAccept.Json) - .SetHeader("X-API-Key", Settings.Apikey); + .SetHeader("X-API-Key", _settings.Apikey); } - private string GetBasicSearchParameters(string searchTerm, int[] categories) + private List> GetBasicSearchParameters(string searchTerm, SearchCriteriaBase searchCriteria) { - var parameters = "request=search&search_type=torrents&empty_groups=filled&order_by=time&order_way=desc"; - - if (!string.IsNullOrWhiteSpace(searchTerm)) + var parameters = new List> { - var searchType = Settings.SearchGroupNames ? "groupname" : "searchstr"; + { "request", "search" }, + { "search_type", "torrents" }, + { "empty_groups", "filled" }, + { "order_by", "time" }, + { "order_way", "desc" } + }; - parameters += string.Format("&{1}={0}", searchTerm.Replace(".", " "), searchType); + if (searchTerm.IsNotNullOrWhiteSpace()) + { + parameters.Add( + _settings.SearchGroupNames ? "groupname" : "searchstr", + searchTerm.Replace(".", " ")); } - if (categories != null) + if (searchCriteria.Categories != null) { - foreach (var cat in Capabilities.Categories.MapTorznabCapsToTrackers(categories)) + var categoryMappings = _capabilities.Categories + .MapTorznabCapsToTrackers(searchCriteria.Categories) + .Distinct() + .Where(x => !x.IsAllDigits()) + .ToList(); + + categoryMappings.ForEach(category => parameters.Add("artistcheck[]", category)); + } + + if (searchCriteria.MinSize is > 0) + { + var minSize = searchCriteria.MinSize.Value / 1024L / 1024L; + if (minSize > 0) { - parameters += string.Format("&artistcheck[]={0}", cat); + parameters.Add("sizesmall", minSize.ToString()); + } + } + + if (searchCriteria.MaxSize is > 0) + { + var maxSize = searchCriteria.MaxSize.Value / 1024L / 1024L; + if (maxSize > 0) + { + parameters.Add("sizeslarge", maxSize.ToString()); } } @@ -329,66 +375,63 @@ namespace NzbDrone.Core.Indexers.Definitions } var jsonResponse = new HttpResponse(indexerResponse.HttpResponse); + if (jsonResponse.Resource.Status != "success" || string.IsNullOrWhiteSpace(jsonResponse.Resource.Status) || - jsonResponse.Resource.Response == null) + jsonResponse.Resource.Response is not JObject response) { return torrentInfos; } - Dictionary response; + var groups = response.ToObject>(JsonSerializer.Create(Json.GetSerializerSettings())); - try + foreach (var group in groups) { - response = ((JObject)jsonResponse.Resource.Response).ToObject>(); - } - catch - { - return torrentInfos; - } - - foreach (var result in response) - { - Dictionary torrents; - - try - { - torrents = ((JObject)result.Value.Torrents).ToObject>(); - } - catch + if (group.Value.Torrents is not JObject groupTorrents) { continue; } - if (result.Value.Torrents != null) + var torrents = groupTorrents + .ToObject>(JsonSerializer.Create(Json.GetSerializerSettings())) + .Where(t => t.Value.TorrentType != "Link") + .ToList(); + + var categories = group.Value.Artists + .SelectMany(a => _categories.MapTrackerCatDescToNewznab(a.Name)) + .Distinct() + .ToArray(); + + foreach (var torrent in torrents) { - var categories = result.Value.Artists.Select(a => a.Name); + var torrentId = torrent.Key; + var infoUrl = GetInfoUrl(group.Key, torrentId); - foreach (var torrent in torrents) + if (categories.Length == 0) { - var id = int.Parse(torrent.Key); - - var infoUrl = GetInfoUrl(result.Key, id); - - var release = new TorrentInfo() - { - Guid = infoUrl, - Title = torrent.Value.ReleaseTitle, - Files = torrent.Value.FileCount, - Grabs = torrent.Value.Snatched, - Size = long.Parse(torrent.Value.Size), - DownloadUrl = GetDownloadUrl(id), - InfoUrl = infoUrl, - Seeders = torrent.Value.Seeders, - Categories = _categories.MapTrackerCatDescToNewznab(categories.FirstOrDefault()), - Peers = torrent.Value.Leechers + torrent.Value.Seeders, - PublishDate = torrent.Value.Time.ToUniversalTime(), - DownloadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.FreeLeech || torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1, - UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1 - }; - - torrentInfos.Add(release); + categories = _categories.MapTrackerCatToNewznab(torrent.Value.CategoryId.ToString()).ToArray(); } + + var release = new TorrentInfo + { + Guid = infoUrl, + InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(torrentId), + Title = GetTitle(group.Value, torrent.Value), + Categories = categories, + Files = torrent.Value.FileCount, + Size = long.Parse(torrent.Value.Size), + Grabs = torrent.Value.Snatched, + Seeders = torrent.Value.Seeders, + Peers = torrent.Value.Leechers + torrent.Value.Seeders, + PublishDate = torrent.Value.Time.ToUniversalTime(), + Scene = torrent.Value.Scene == 1, + DownloadVolumeFactor = torrent.Value.FreeTorrent is GazelleGamesFreeTorrent.FreeLeech or GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1, + UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1, + MinimumSeedTime = 288000 // Minimum of 3 days and 8 hours (80 hours in total) + }; + + torrentInfos.Add(release); } } @@ -399,6 +442,44 @@ namespace NzbDrone.Core.Indexers.Definitions .ToArray(); } + private static string GetTitle(GazelleGamesGroup group, GazelleGamesTorrent torrent) + { + var title = WebUtility.HtmlDecode(torrent.ReleaseTitle); + + if (group.Year is > 0 && !title.Contains(group.Year.ToString())) + { + title += $" ({group.Year})"; + } + + if (torrent.RemasterTitle.IsNotNullOrWhiteSpace()) + { + title += $" [{$"{torrent.RemasterTitle} {torrent.RemasterYear}".Trim()}]"; + } + + var flags = new List + { + $"{torrent.Format} {torrent.Encoding}".Trim() + }; + + if (group.Artists is { Count: > 0 }) + { + flags.AddIfNotNull(group.Artists.Select(a => a.Name).Join(", ")); + } + + flags.AddIfNotNull(torrent.Language); + flags.AddIfNotNull(torrent.Region); + flags.AddIfNotNull(torrent.Miscellaneous); + + flags = flags.Where(x => x.IsNotNullOrWhiteSpace()).ToList(); + + if (flags.Any()) + { + title += $" [{string.Join(" / ", flags)}]"; + } + + return title; + } + private string GetDownloadUrl(int torrentId) { // AuthKey is required but not checked, just pass in a dummy variable @@ -413,7 +494,7 @@ namespace NzbDrone.Core.Indexers.Definitions return url.FullUri; } - private string GetInfoUrl(string groupId, int torrentId) + private string GetInfoUrl(int groupId, int torrentId) { var url = new HttpUri(_settings.BaseUrl) .CombinePath("/torrents.php") @@ -444,7 +525,7 @@ namespace NzbDrone.Core.Indexers.Definitions Passkey = ""; } - [FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings), Must have User Permissions", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", HelpTextWarning = "Must have User and Torrents permissions", Privacy = PrivacyLevel.ApiKey)] public string Apikey { get; set; } [FieldDefinition(3, Label = "Search Group Names", Type = FieldType.Checkbox, HelpText = "Search Group Names Only")] @@ -466,8 +547,9 @@ namespace NzbDrone.Core.Indexers.Definitions public class GazelleGamesGroup { - public List Artists { get; set; } + public ReadOnlyCollection Artists { get; set; } public object Torrents { get; set; } + public int? Year { get; set; } } public class GazelleGamesArtist @@ -478,13 +560,23 @@ namespace NzbDrone.Core.Indexers.Definitions public class GazelleGamesTorrent { + public int CategoryId { get; set; } + public string Format { get; set; } + public string Encoding { get; set; } + public string Language { get; set; } + public string Region { get; set; } + public string RemasterYear { get; set; } + public string RemasterTitle { get; set; } + public string ReleaseTitle { get; set; } + public string Miscellaneous { get; set; } + public int Scene { get; set; } + public DateTime Time { get; set; } + public string TorrentType { get; set; } + public int FileCount { get; set; } public string Size { get; set; } public int? Snatched { get; set; } public int Seeders { get; set; } public int Leechers { get; set; } - public string ReleaseTitle { get; set; } - public DateTime Time { get; set; } - public int FileCount { get; set; } public GazelleGamesFreeTorrent FreeTorrent { get; set; } public bool PersonalFL { get; set; } public bool LowSeedFL { get; set; } @@ -503,9 +595,9 @@ namespace NzbDrone.Core.Indexers.Definitions public enum GazelleGamesFreeTorrent { - Normal, - FreeLeech, - Neutral, - Either + Normal = 0, + FreeLeech = 1, + Neutral = 2, + Either = 3 } } From 4be0715fe3aac11366554aaf5a9bb551aca5ebc3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 3 Jan 2024 11:21:40 +0200 Subject: [PATCH 382/964] New: (MAM) Filter releases by Min/Max size --- .../Indexers/Definitions/MyAnonamouse.cs | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs index b9bb49601..125df15f3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs @@ -244,17 +244,17 @@ namespace NzbDrone.Core.Indexers.Definitions if (Settings.SearchInDescription) { - parameters.Add("tor[srchIn][description]", "true"); + parameters.Set("tor[srchIn][description]", "true"); } if (Settings.SearchInSeries) { - parameters.Add("tor[srchIn][series]", "true"); + parameters.Set("tor[srchIn][series]", "true"); } if (Settings.SearchInFilenames) { - parameters.Add("tor[srchIn][filenames]", "true"); + parameters.Set("tor[srchIn][filenames]", "true"); } var catList = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories); @@ -263,13 +263,28 @@ namespace NzbDrone.Core.Indexers.Definitions var index = 0; foreach (var cat in catList) { - parameters.Add("tor[cat][" + index + "]", cat); + parameters.Set("tor[cat][" + index + "]", cat); index++; } } else { - parameters.Add("tor[cat][]", "0"); + parameters.Set("tor[cat][]", "0"); + } + + if (searchCriteria.MinSize is > 0) + { + parameters.Set("tor[minSize]", searchCriteria.MinSize.Value.ToString()); + } + + if (searchCriteria.MaxSize is > 0) + { + parameters.Set("tor[maxSize]", searchCriteria.MaxSize.Value.ToString()); + } + + if (searchCriteria.MinSize is > 0 || searchCriteria.MaxSize is > 0) + { + parameters.Set("tor[unit]", "1"); } var searchUrl = Settings.BaseUrl + "tor/js/loadSearchJSONbasic.php"; From f4203993ba1c96853ef70108cc3d2096f28ef5ff Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 3 Jan 2024 11:28:51 +0200 Subject: [PATCH 383/964] New: (MAM) Book title and author returned in response --- src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs index 125df15f3..d9b880b6e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs @@ -409,6 +409,8 @@ namespace NzbDrone.Core.Indexers.Definitions release.Title = item.Title; release.Description = item.Description; + release.BookTitle = item.Title; + if (item.AuthorInfo != null) { var authorInfo = JsonConvert.DeserializeObject>(item.AuthorInfo); @@ -417,6 +419,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (author.IsNotNullOrWhiteSpace()) { release.Title += " by " + author; + release.Author = author; } } From 9679e88717abd45d88016a1e0877864d5a3c4ef0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 4 Jan 2024 23:32:37 +0200 Subject: [PATCH 384/964] Update end date for RED freeload event --- src/NzbDrone.Core/Indexers/Definitions/Redacted.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index c2a7a2916..10b0920bb 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -426,7 +426,7 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(3, Label = "Use Freeleech Tokens", Type = FieldType.Checkbox, HelpText = "Use freeleech tokens when available")] public bool UseFreeleechToken { get; set; } - [FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 6 January 2024, 23:59 UTC.")] + [FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 31 January 2024, 23:59 UTC.")] public bool FreeloadOnly { get; set; } public override NzbDroneValidationResult Validate() From 5cee8990b3f82dba40a060681ddea00715f9a839 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 5 Jan 2024 11:28:34 +0000 Subject: [PATCH 385/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Aitzol Garmendia Co-authored-by: Anonymous Co-authored-by: Dani Talens Co-authored-by: HuaBing Co-authored-by: JJonttuu Co-authored-by: Juan Lores Co-authored-by: Oskari Lavinto Co-authored-by: Piotr Komborski Co-authored-by: RicardoVelaC Co-authored-by: Weblate Co-authored-by: boan51204 Co-authored-by: 饶志华 <879467666@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 51 +++- src/NzbDrone.Core/Localization/Core/de.json | 16 +- src/NzbDrone.Core/Localization/Core/es.json | 13 +- src/NzbDrone.Core/Localization/Core/fi.json | 241 ++++++++++-------- src/NzbDrone.Core/Localization/Core/pl.json | 4 +- .../Localization/Core/zh_CN.json | 7 +- .../Localization/Core/zh_TW.json | 6 +- 7 files changed, 207 insertions(+), 131 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index c3c962957..d0d43542a 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -1,5 +1,5 @@ { - "Add": "Afegiu", + "Add": "Afegeix", "Actions": "Accions", "AcceptConfirmationModal": "Accepta el modal de confirmació", "About": "Quant a", @@ -33,7 +33,7 @@ "AddDownloadClient": "Afegeix un client de descàrrega", "Added": "Afegit", "Age": "Edat", - "All": "Tots", + "All": "Tot", "Analytics": "Anàlisi", "ApiKey": "Clau API", "AppDataDirectory": "Directori AppData", @@ -143,7 +143,7 @@ "SettingsShortDateFormat": "Format de data curta", "BindAddress": "Adreça d'enllaç", "Database": "Base de dades", - "Ended": "S'ha acabat", + "Ended": "Acabat", "SettingsTimeFormat": "Format horari", "YesCancel": "Si, cancel·la", "Automatic": "Automàtic", @@ -300,10 +300,10 @@ "View": "Visualitza", "Yesterday": "Ahir", "ApplicationStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}", - "AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.", + "AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió de l'entorn d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.", "HistoryCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament", "UnableToAddANewAppProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.", - "BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del {appName}", + "BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData de {appName}", "AllIndexersHiddenDueToFilter": "Totes les pel·lícules estan ocultes a causa del filtre aplicat.", "EnableRss": "Activa RSS", "Grabs": "Captura", @@ -312,7 +312,7 @@ "Application": "Aplicacions", "Applications": "Aplicacions", "ApplicationStatusCheckAllClientMessage": "Totes les llistes no estan disponibles a causa d'errors", - "AuthenticationMethodHelpText": "Requereix nom d'usuari i contrasenya per accedir al radar", + "AuthenticationMethodHelpText": "Es requereix nom d'usuari i contrasenya per accedir a {appName}", "ApplicationLongTermStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors durant més de 6 hores", "ApplicationLongTermStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors durant més de 6 hores: {0}", "BindAddressHelpText": "Adreça IP vàlida, localhost o '*' per a totes les interfícies", @@ -347,7 +347,7 @@ "ApplicationUrlHelpText": "URL extern d'aquesta aplicació, inclòs http(s)://, port i URL base", "ApplyTagsHelpTextAdd": "Afegeix: afegeix les etiquetes a la llista d'etiquetes existent", "ApplyTagsHelpTextHowToApplyApplications": "Com aplicar etiquetes a les pel·lícules seleccionades", - "ApplyTagsHelpTextHowToApplyIndexers": "Com aplicar etiquetes a les pel·lícules seleccionades", + "ApplyTagsHelpTextHowToApplyIndexers": "Com aplicar etiquetes als indexadors seleccionats", "ApplyTagsHelpTextRemove": "Eliminar: elimina les etiquetes introduïdes", "DeleteSelectedApplicationsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?", "Label": "Etiqueta", @@ -370,12 +370,45 @@ "minutes": "Minuts", "DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}", "NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}", - "AddConnection": "Edita la col·lecció", + "AddConnection": "Afegeix una connexió", "NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors", "AuthBasic": "Basic (finestra emergent del navegador)", "AuthForm": "Formularis (pàgina d'inici de sessió)", "DisabledForLocalAddresses": "Desactivat per a adreces locals", "None": "Cap", "ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?", - "RestartProwlarr": "Reinicia {appName}" + "RestartProwlarr": "Reinicia {appName}", + "AuthenticationRequired": "Autenticació necessària", + "CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)", + "NoDownloadClientsFound": "No s'han trobat clients de baixada", + "AuthenticationRequiredWarning": "Per evitar l'accés remot sense autenticació, ara {appName} requereix que l'autenticació estigui activada. Opcionalment, podeu desactivar l'autenticació des d'adreces locals.", + "AppUpdatedVersion": "{appName} s'ha actualitzat a la versió `{version}`, per tal d'obtenir els darrers canvis, haureu de tornar a carregar {appName}", + "AppUpdated": "{appName} Actualitzada", + "ApplyChanges": "Aplica els canvis", + "Implementation": "Implementació", + "OnHealthRestored": "Al resoldre les incidències", + "ManageDownloadClients": "Gestiona els clients de descàrrega", + "AuthenticationRequiredHelpText": "Canvia per a quines sol·licituds cal autenticar. No canvieu tret que entengueu els riscos.", + "CountIndexersSelected": "S'han seleccionat {count} indexador(s)", + "EditDownloadClientImplementation": "Edita el client de baixada - {implementationName}", + "EditIndexerImplementation": "Edita l'indexador - {implementationName}", + "EditSelectedDownloadClients": "Editeu els clients de descàrrega seleccionats", + "EditSelectedIndexers": "Edita els indexadors seleccionats", + "IndexerDownloadClientHealthCheckMessage": "Indexadors amb clients de baixada no vàlids: {0}.", + "AddCustomFilter": "Afegeix un filtre personalitzat", + "AddDownloadClientImplementation": "Afegeix un client de descàrrega - {implementationName}", + "AddIndexerImplementation": "Afegeix un indexador - {implementationName}", + "AddConnectionImplementation": "Afegeix una connexió - {implementationName}", + "InvalidUILanguage": "La vostra IU està configurada en un idioma no vàlid, corregiu-lo i deseu la configuració", + "NoHistoryFound": "No s'ha trobat cap historial", + "NoIndexersFound": "No s'han trobat indexadors", + "OnHealthRestoredHelpText": "Al resoldre les incidències", + "AuthenticationMethod": "Mètode d'autenticació", + "AuthenticationMethodHelpTextWarning": "Seleccioneu un mètode d'autenticació vàlid", + "AuthenticationRequiredPasswordHelpTextWarning": "Introduïu una contrasenya nova", + "DefaultNameCopiedProfile": "{name} - Còpia", + "DownloadClientQbittorrentSettingsContentLayout": "Disseny de contingut", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si s'utilitza el disseny de contingut de qBittorrent s'utilitza el disseny original del torrent o es crea una subcarpeta (qBittorrent 4.3.2+)", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmeu la nova contrasenya", + "AuthenticationRequiredUsernameHelpTextWarning": "Introduïu un nom d'usuari nou" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 42137754b..eb3c1861a 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -105,7 +105,7 @@ "Discord": "Discord", "Docker": "Docker", "Donations": "Spenden", - "DownloadClient": "", + "DownloadClient": "Download Client", "DownloadClientSettings": "Downloader Einstellungen", "DownloadClientStatusCheckAllClientMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar", "DownloadClientStatusCheckSingleClientMessage": "Download Clients aufgrund von Fehlern nicht verfügbar: {0}", @@ -319,7 +319,7 @@ "Restore": "Wiederherstellen", "RestoreBackup": "Sicherung wiederherstellen", "Result": "Ergebnis", - "Retention": "", + "Retention": "Aufbewahrung ( Retention )", "SSLCertPassword": "SSL Zertifikat Passwort", "SSLCertPasswordHelpText": "Passwort für die PFX Datei", "SSLCertPath": "Pfad zum SSL Zertifikat", @@ -384,8 +384,8 @@ "TableOptions": "Tabellen Optionen", "TableOptionsColumnsMessage": "Wähle aus welche Spalten angezeigt werden und in welcher Reihenfolge", "TagCannotBeDeletedWhileInUse": "Kann während der Benutzung nicht gelöscht werden", - "TagIsNotUsedAndCanBeDeleted": "", - "Tags": "", + "TagIsNotUsedAndCanBeDeleted": "Tag wird nicht benutzt und kann gelöscht werden", + "Tags": "Tags", "TagsHelpText": "Wird auf Filme mit mindestens einem passenden Tag angewandt", "TagsSettingsSummary": "Sehen Sie sich alle Tags und deren Verwendung an. Nicht verwendete Tags können entfernt werden", "Tasks": "Aufgaben", @@ -536,5 +536,11 @@ "DefaultNameCopiedProfile": "{Name} – Kopieren", "AuthenticationMethod": "Authentifizierungsmethode", "Clone": "Klonen", - "CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt" + "CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt", + "EditConnectionImplementation": "Verbindung hinzufügen - {implementationName}", + "EditDownloadClientImplementation": "Download-Client hinzufügen - {implementationName}", + "IndexerTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.", + "EditIndexerImplementation": "Indexer hinzufügen - {implementationName}", + "EditApplicationImplementation": "Anwendung hinzufügen - {implementationName}", + "EditIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 83dcdec89..edb58083d 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -13,7 +13,7 @@ "DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}", "DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores", "DownloadClients": "Gestores de Descargas", - "Delete": "Borrar", + "Delete": "Eliminar", "Dates": "Fechas", "Date": "Fecha", "CustomFilters": "Filtros Personalizados", @@ -137,7 +137,7 @@ "DeleteTag": "Borrar Etiqueta", "DeleteNotification": "Borrar Notificación", "DeleteDownloadClient": "Borrar Gestor de Descargas", - "DeleteBackup": "Borrar Backup", + "DeleteBackup": "Eliminar copia de seguridad", "DBMigration": "Migración de DB", "CloneProfile": "Clonar Perfil", "ClientPriority": "Prioridad del Cliente", @@ -492,5 +492,12 @@ "Id": "Id", "EditCategory": "Editar categoría", "EditSyncProfile": "Editar perfil de sincronización", - "EnableIndexer": "Habilitar indexador" + "EnableIndexer": "Habilitar indexador", + "InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración", + "DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)", + "EnableRssHelpText": "Habilitar feed Rss para indexador", + "days": "días", + "ElapsedTime": "Tiempo transcurrido", + "GrabTitle": "Capturar título" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 19b60958a..81d27c7d4 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -1,11 +1,11 @@ { "IndexerProxyStatusCheckSingleClientMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi: {0}", "Logging": "Kirjaus", - "LogLevel": "Kirjauksen taso", + "LogLevel": "Lokikirjauksen laajuus", "MovieIndexScrollTop": "Elokuvakirjasto: vieritä ylös", "Apply": "Käytä", "ClientPriority": "Lataustyökalun painotus", - "IndexerPriorityHelpText": "Tietolähteen painotus: 1 (korkein) - 50 (matalin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.", + "IndexerPriorityHelpText": "Tietolähteen painotus, 1– 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.", "Manual": "Manuaalinen", "Add": "Lisää", "Reload": "Lataa uudelleen", @@ -27,52 +27,52 @@ "Seeders": "Jakajat", "TestAll": "Testaa kaikki", "AddDownloadClient": "Lisää lataustyökalu", - "CustomFilters": "Mukautetut suodattimet", + "CustomFilters": "Omat suodattimet", "DeleteTag": "Poista tunniste", "EnableRss": "RSS-syöte", - "Filter": "Suodata", + "Filter": "Suodatus", "Fixed": "Korjattu", "FocusSearchBox": "Kohdista hakukenttä", - "ForMoreInformationOnTheIndividualDownloadClients": "Lue lisää lataustyökalusta painamalla 'Lisätietoja'.", - "HideAdvanced": "Piilota edistyneet", + "ForMoreInformationOnTheIndividualDownloadClients": "Saat yksittäisestä lataustyökalusta lisätietoja painamalla sen ohessa olevaa \"Lisätietoja\"-painiketta.", + "HideAdvanced": "Piilota lisäasetukset", "History": "Historia", "MIA": "Puuttuu", - "New": "Uusi", + "New": "Uutta", "PageSizeHelpText": "Sivulla näytettävien kohteiden määrä", "Proxy": "Välityspalvelin", "ProxyBypassFilterHelpText": "Käytä erottimena ',' ja '*.' jokerimerkkinä aliverkkotunnuksille (esim. www.esimerkki.fi,*.esimerkki.fi)", "Reddit": "Reddit", "Refresh": "Päivitä", "RefreshMovie": "Päivitä elokuva", - "ReleaseBranchCheckOfficialBranchMessage": "'{0}' ei ole kelvollinen {appName}-julkaisuhaara, etkä saa päivityksiä sen kautta", - "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.", + "ReleaseBranchCheckOfficialBranchMessage": "\"{0}\" ei ole kelvollinen {appName}-julkaisuhaara ja tämän vuoksi et saa päivityksiä.", + "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen", "Result": "Tulos", "Settings": "Asetukset", "SettingsLongDateFormat": "Pitkän päiväyksen esitys", "SettingsShortDateFormat": "Lyhyen päiväyksen esitys", - "UnselectAll": "Poista kaikkien valinta", + "UnselectAll": "Tyhjennä valinnat", "UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.", - "UpdateCheckUINotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käyttöliittymäkansioon '{0}'.", - "UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.", + "UpdateCheckUINotWritableMessage": "Päivityksen asennus ei onnistu, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käyttöliittymäkansioon \"{0}\".", + "UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.", "Enable": "Käytä", "UI": "Käyttöliittymä", - "UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.", + "UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.", "Usenet": "Usenet", "BackupNow": "Varmuuskopioi nyt", - "NoBackupsAreAvailable": "Varmuuskopioita ei ole saatavilla", - "UpdateCheckStartupNotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käynnistyskansioon '{0}'.", + "NoBackupsAreAvailable": "Varmuuskopioita ei ole käytettävissä", + "UpdateCheckStartupNotWritableMessage": "Päivitystä ei voida asentaa, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käynnistyskansioon \"{0}\".", "Updates": "Päivitykset", "UpdateScriptPathHelpText": "Polku komentosarjaan, joka käsittelee puretun päivitystiedoston ja hoitaa asennuksen loppuosuuden.", "Uptime": "Käyttöaika", "URLBase": "URL-perusta", "UseProxy": "Käytä välityspalvelinta", "Username": "Käyttäjätunnus", - "YesCancel": "Kyllä, peruuta", + "YesCancel": "Kyllä, peru", "NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.", "ApplyTags": "Tunnistetoimenpide", "Authentication": "Todennus", - "AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana {appName}in käyttöön.", - "BindAddressHelpText": "Toimiva IP-osoite, \"localhost\" tai \"*\" (tähti) kaikille verkkoliitännöille.", + "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.", + "BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.", "Close": "Sulje", "DeleteNotification": "Poista kytkentä", "Docker": "Docker", @@ -81,11 +81,11 @@ "Search": "Haku", "Details": "Tiedot", "InteractiveSearch": "Vuorovaikutteinen haku", - "Interval": "Aikaväli", + "Interval": "Ajoitus", "KeyboardShortcuts": "Pikanäppäimet", - "LastWriteTime": "Viimeisin kirjoitusaika", + "LastWriteTime": "Edellinen tallennusaika", "LogFiles": "Lokitiedostot", - "LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulisi käyttää vain väliaikaisesti", + "LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulee käyttää vain tilapäisesti.", "Logs": "Lokitiedot", "Mechanism": "Mekanismi", "Name": "Nimi", @@ -94,14 +94,14 @@ "Presets": "Esiasetukset", "Priority": "Painotus", "Protocol": "Protokolla", - "ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}", + "ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.", "ProxyCheckFailedToTestMessage": "Välityspalvelintesti epäonnistui: {0}", "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.", "ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.", "ProxyType": "Välityspalvelimen tyyppi", "ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.", "Queue": "Jono", - "ReadTheWikiForMoreInformation": "Lue lisätietoja Wikistä", + "ReadTheWikiForMoreInformation": "Wikistä löydät lisää tietoja", "ReleaseStatus": "Julkaisutila", "RemovedFromTaskQueue": "Poistettu tehtäväjonosta", "RemoveFilter": "Poista suodatin", @@ -117,15 +117,15 @@ "Security": "Suojaus", "SuggestTranslationChange": "Ehdota käännösmuutosta", "System": "Järjestelmä", - "SystemTimeCheckMessage": "Järjestelmän aika on pielessä yli vuorokauden. Ajoitetut tehtävät eivät luultavasti toimi oikein ennen sen korjausta.", + "SystemTimeCheckMessage": "Järjestelmän ajassa on ainakin vuorokauden heitto eivätkä ajoitetut tehtävät tämän vuoksi toimi oikein ennen kuin se on korjattu.", "TagCannotBeDeletedWhileInUse": "Tunnistetta ei voi poistaa, koska se on käytössä", "TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.", - "TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa sellaiset tunnisteet, joita ei ole määritetty millekään kohteelle.", + "TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.", "Tasks": "Tehtävät", "Test": "Kokeile", "TestAllClients": "Testaa kaikki lataustyökalut", "Time": "Aika", - "Title": "Nimi", + "Title": "Nimike", "Tomorrow": "Huomenna", "Torrent": "Torrent", "Torrents": "Torrentit", @@ -133,29 +133,29 @@ "UILanguage": "Käyttöliittymän kieli", "UnableToAddANewApplicationPleaseTryAgain": "Uuden sovelluksen lisäys epäonnistui. Yritä uudelleen.", "UnableToAddANewIndexerPleaseTryAgain": "Uuden tietolähteen lisäys epäonnistui. Yritä uudelleen.", - "UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tietolähdevälityspalvelimen lisäys epäonnistui. Yritä uudelleen.", - "UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui.", - "UnableToLoadDownloadClients": "Lataustyökalujen lataus epäonnistui.", + "UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.", + "UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui", + "UnableToLoadDownloadClients": "Lataustyökalujen lataus ei onistu", "UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.", - "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit edelleen asentaa ne myös lähteestä System:Updates.", - "Added": "Lisätty", + "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.", + "Added": "Lisäysaika", "AddIndexer": "Lisää tietolähde", "AddingTag": "Tunniste lisätään", "Age": "Ikä", "All": "Kaikki", "AllIndexersHiddenDueToFilter": "Aktiivinen suodatin on piilottanut kaikki tietolähteet.", "Analytics": "Analytiikka", - "AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja palvelimillemme. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.", + "AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja {appName}in palvelimille. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.", "ApiKey": "API-avain", "AppDataDirectory": "AppData-kansio", "DBMigration": "Tietokannan siirto", "Delete": "Poista", - "DeleteIndexerProxyMessageText": "Haluatko varmasti poistaa välityspalvelimen '{0}'?", - "DeleteNotificationMessageText": "Haluatko varmasti poistaa kytkennän '{0}'?", + "DeleteIndexerProxyMessageText": "Haluatko varmasti poistaa tietolähdevälityspalvelimen \"{name}\"?", + "DeleteNotificationMessageText": "Haluatko varmasti poistaa ilmoituspalvelun \"{name}\"?", "Disabled": "Ei käytössä", "DownloadClients": "Lataustyökalut", "DownloadClientSettings": "Lataustyökalujen asetukset", - "DownloadClientStatusCheckAllClientMessage": "Yhtään lataustyökalua ei ole virheiden vuoksi käytettävissä", + "DownloadClientStatusCheckAllClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä", "Mode": "Tila", "MoreInfo": "Lisätietoja", "SelectAll": "Valitse kaikki", @@ -166,30 +166,30 @@ "ShowSearchHelpText": "Näytä hakupainike osoitettaessa.", "Shutdown": "Sammuta", "Size": "Koko", - "Sort": "Järjestä", + "Sort": "Järjestys", "UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.", - "AppDataLocationHealthCheckMessage": "Päivitystä ei sallita, jotta AppData-kansion poisto päivityksen yhteydessä voidaan estää.", + "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.", "UnableToLoadHistory": "Historian lataus epäonnistui.", "UnableToLoadNotifications": "Kytkentöjen lataus epäonnistui.", - "UnableToLoadTags": "Tunnisteiden lataus epäonnistui.", + "UnableToLoadTags": "Tunnisteiden lataus ei onnistu", "UnableToLoadUISettings": "Käyttöliittymän asetuksien lataus epäonnistui.", "UnsavedChanges": "Tallentamattomia muutoksia", "Yesterday": "Eilen", "ConnectionLost": "Yhteys on katkennut", - "DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun '{0}'?", - "DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen '{0}'?", + "DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun \"{name}\"?", + "DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?", "Discord": "Discord", "Donations": "Lahjoitukset", "Edit": "Muokkaa", "EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai {appName}in toimesta.", "Enabled": "Käytössä", - "EventType": "Tapahtumatyyppi", + "EventType": "Tapahtuman tyyppi", "Exception": "Poikkeus", "FeatureRequests": "Kehitysehdotukset", "Grabbed": "Siepattu", "IgnoredAddresses": "Ohitetut osoitteet", "IllRestartLater": "Käynnistän uudelleen myöhemmin", - "Info": "Tiedot", + "Info": "Informatiivinen", "LaunchBrowserHelpText": " Avaa {appName}in verkkokäyttöliittymä verkkoselaimeen sovelluksen käynnistyksen yhteydessä.", "NoChanges": "Ei muutoksia", "NoLeaveIt": "Ei, anna olla", @@ -198,36 +198,36 @@ "Save": "Tallenna", "SaveChanges": "Tallenna muutokset", "SaveSettings": "Tallenna asetukset", - "Scheduled": "Ajoitettu", - "SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin", + "Scheduled": "Ajoitukset", + "SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin.", "SettingsShowRelativeDates": "Suhteellisten päiväysten esitys", "SettingsShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) absoluuttisten sijaan", "ShowSearch": "Näytä haku", - "Source": "Lähde", + "Source": "Lähdekoodi", "SSLPort": "SSL-portti", "StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta", "StartupDirectory": "Käynnistyskansio", - "TableOptions": "Taulukkoasetukset", + "TableOptions": "Taulukkonäkymän asetukset", "TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys", "TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille tietolähteille. Käytä kaikille jättämällä tyhjäksi.", "UnableToAddANewAppProfilePleaseTryAgain": "Uuden sovellusprofiilin lisäys epäonnistui. Yritä uudelleen.", "UnableToAddANewNotificationPleaseTryAgain": "Kytkennän lisäys epäonnistui. Yritä uudelleen.", "Version": "Versio", - "View": "Näytä", - "Warn": "Varoita", + "View": "Näkymä", + "Warn": "Varoitus", "Wiki": "Wiki", "Port": "Portti", "Automatic": "Automaattinen", "AutomaticSearch": "Automaattihaku", - "Backup": "Varmuuskopio", - "BackupFolderHelpText": "Suhteelliset polut kohdistuvat sovelluksen AppData-kansioon.", - "BackupIntervalHelpText": "Automaattisen varmuuskopioinnin aikaväli", - "BackupRetentionHelpText": "Säilytysjaksoa vanhemmat automaattiset varmuuskopiot poistetaan automaattisesti.", + "Backup": "Varmuuskopiointi", + "BackupFolderHelpText": "Suhteelliset tiedostosijainnit ovat {appName}in AppData-kansiossa.", + "BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.", + "BackupRetentionHelpText": "Säilytysjaksoa vanhemmat varmuuskopiot siivotaan automaattisesti.", "Backups": "Varmuuskopiot", "BeforeUpdate": "Ennen päivitystä", "BindAddress": "Sidososoite", "Branch": "Kehityshaara", - "BranchUpdate": "Sovelluksen versiopäivityksiin käytettävä kehityshaara.", + "BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara.", "BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.", "BypassProxyForLocalAddresses": "Ohjaa paikalliset osoitteet välityspalvelimen ohi", "Cancel": "Peruuta", @@ -244,19 +244,19 @@ "ConnectSettings": "Kytkentöjen asetukset", "CouldNotConnectSignalR": "SignalR-kirjastoa ei tavoitettu, eikä käyttöliittymää päivitetä", "Custom": "Mukautettu", - "DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{0}\"?", + "DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{name}\"?", "DeleteBackup": "Poista varmuuskopio", - "DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion '{0}'?", + "DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion \"{name}\"?", "DeleteDownloadClient": "Poista lataustyökalu", - "DownloadClientStatusCheckSingleClientMessage": "Lataustyökalut eivät ole virheiden vuoksi käytettävissä: {0}", + "DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}", "EditIndexer": "Muokkaa tietolähdettä", - "EnableAutomaticSearch": "Automaattihaku", - "EnableInteractiveSearch": "Vuorovaikutteinen haku", + "EnableAutomaticSearch": "Käytä automaattihakua", + "EnableInteractiveSearch": "Käytä vuorovaikutteista hakua", "EnableInteractiveSearchHelpText": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.", "EnableSSL": "SSL-salaus", - "EnableSslHelpText": " Käyttöönotto edellyttää uudelleenkäynnistystä järjestelmänvalvojan oikeuksilla.", + "EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.", "Error": "Virhe", - "ErrorLoadingContents": "Sisällönlatauksen virhe", + "ErrorLoadingContents": "Virhe ladattaessa sisältöjä", "Events": "Tapahtumat", "ExistingTag": "Olemassa oleva tunniste", "Failed": "Epäonnistui", @@ -267,9 +267,9 @@ "GeneralSettings": "Yleiset asetukset", "GeneralSettingsSummary": "Portti, SSL-salaus, käyttäjänimi ja salasana, välityspalvelin, analytiikka ja päivitykset.", "Grabs": "Sieppaukset", - "Health": "Kunto", + "Health": "Terveys", "Level": "Taso", - "HealthNoIssues": "Kokoonpanossasi ei ole ongelmia.", + "HealthNoIssues": "Kokoonpanossasi ei ole ongelmia", "HomePage": "Verkkosivusto", "Host": "Osoite", "Hostname": "Osoite", @@ -283,7 +283,7 @@ "IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi", "IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi: {0}", "NoChange": "Ei muutosta", - "NoLogFiles": "Ei lokitiedostoja", + "NoLogFiles": "Lokitiedostoja ei ole", "SSLCertPasswordHelpText": "PFX-tiedoston salasana", "SSLCertPath": "SSL-varmenteen sijainti", "SSLCertPathHelpText": "PFX-tiedoston sijainti", @@ -295,28 +295,28 @@ "OnHealthIssueHelpText": "Kuntoon liittyvä ongelma", "OpenBrowserOnStart": "Avaa selain käynnistettäessä", "OpenThisModal": "Avaa tämä ikkuna", - "Options": "Valinnat", - "PackageVersion": "Pakettiversio", + "Options": "Asetukset", + "PackageVersion": "Paketin versio", "PageSize": "Sivun koko", "Password": "Salasana", "PendingChangesDiscardChanges": "Hylkää muutokset ja poistu", - "PortNumber": "Portti", + "PortNumber": "Portin numero", "RestoreBackup": "Palauta varmuuskopio", "Retention": "Säilytys", - "UILanguageHelpText": "Käyttöliittymä näytetään tällä kielellä.", - "UILanguageHelpTextWarning": "Käyttöönotto vaatii selaimen sivupäivityksen.", + "UILanguageHelpText": "{appName}in käyttöliittymän kieli.", + "UILanguageHelpTextWarning": "Selaimen sivupäivitys vaaditaan", "UISettings": "Käyttöliittymän asetukset", - "DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävien lataustyökalujen määritykset.", + "DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävät lataustyökalumääritykset.", "ProwlarrSupportsAnyDownloadClient": "{appName} tukee alla listatuja lataustyökaluja.", "AddDownloadClientToProwlarr": "Lisäämällä lataustyökalun {appName} voi käynnistää lataukset suoraan käyttöliittymästä manuaalisen haun yhteydessä.", - "RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja ohjaa sieppaus suoraan sen sijaan, että se välitettäisiin Prowlarin kautta.", + "RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja välitä sieppaus suoraan {appName}-välityksen sijaan.", "FullSync": "Täysi synkronointi", "SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen tietolähteet täysin synkronoituna. Tietolähteisiin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.", "EnableIndexer": "Tietolähteen tila", "FilterPlaceHolder": "Suodata tietolähteitä", "IndexerHealthCheckNoIndexers": "Yhtään tietolähdettä ei ole käytössä, eikä {appName} tämän vuoksi löydä tuloksia.", - "IndexerObsoleteCheckMessage": "Tietolähteet ovat vanhentuneita tai niitä on päivitetty: {0}. Poista ja/tai lisää ne Prowlariin uudelleen.", - "IndexerProxy": "Tietolähteen välityspalvelin", + "IndexerObsoleteCheckMessage": "Tietolähteet ovat poistuneet tai ne ovat muuttuneet: {0}. Poista ja/tai lisää ne {appName}iin uudelleen.", + "IndexerProxy": "Tiedonhaun välityspalvelin", "IndexerSettingsSummary": "Määritä useita globaaleita tietolähdeasetuksia, kuten välityspalvelimia.", "IndexerVipCheckExpiringClientMessage": "Tietolähteen VIP-edut erääntyvät pian: {0}", "ProwlarrSupportsAnyIndexer": "{appName} tukee Newznab- ja Torznab-yhteensopivien tietolähteiden ohella myös useita muita lähteitä vaihtoehdoilla \"Yleinen Newznab\" (Usenetille) ja 'Yleinen Torznab' (torrenteille).", @@ -324,7 +324,7 @@ "AddIndexerProxy": "Lisää tiedonhaun välityspalvelin", "UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.", "SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja tietolähteiden toiminnasta, mukaanlukien vastaukset", - "IndexerTagsHelpText": "Tunnisteiden avulla voit määrittää tiedonhaun välityspalvelimet, mihin sovelluksiin tietolähteet synkronoidaan tai yksikertaisesti järjestellä tietolähteitäsi.", + "IndexerTagsHelpText": "Tunnisteilla voit kohdistaa tiedonhaun välityspalvelimia ja määrittää mihin sovelluksiin ne synkronoidaan.", "UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui", "AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/vuorovaikutteinen).", "IndexerQuery": "Tietolähteen kysely", @@ -340,7 +340,7 @@ "SyncLevelAddRemove": "Vain lisäys/poisto: Kun {appName}in tietolähteitä lisätään tai poistetaan, päivittyy myös etäsovellus.", "SyncAppIndexers": "Synkronoi tietolähteet", "TestAllApps": "Testaa kaikki sovellukset", - "UnableToLoadIndexerProxies": "Tietolähdevälityspalvelimien lataus epäonnistui", + "UnableToLoadIndexerProxies": "Tiedonhaun välityspalvelimia ei voitu ladata", "AddedToDownloadClient": "Julkaisu lisättiin lataustyökaluun", "AddNewIndexer": "Lisää uusi tietolähde", "AddToDownloadClient": "Lisää julkaisu lataustyökaluun", @@ -356,7 +356,7 @@ "DevelopmentSettings": "Kehittäjäasetukset", "Description": "Kuvaus", "Id": "Tunniste", - "SettingsConsoleLogLevel": "Valvontalokin taso", + "SettingsConsoleLogLevel": "Valvontalokin laajuus", "SettingsFilterSentryEvents": "Suodata analytiikan tapahtumia", "SettingsFilterSentryEventsHelpText": "Suodata tunnetut käyttäjävirheet pois analytiikkalähetyksistä", "Applications": "Sovellukset", @@ -367,10 +367,10 @@ "ClearHistory": "Tyhjennä historia", "ClearHistoryMessageText": "Haluatko varmasti tyhjentää kaiken {appName}-historian?", "Connect": "Kytkennät", - "EnableRssHelpText": "Tietolähde sisällytetään RSS-syötteeseen.", + "EnableRssHelpText": "Käytä tietolähteelle RSS-syötettä.", "DeleteApplication": "Poista sovellus", "DeleteAppProfile": "Poista sovellusprofiili", - "IndexerProxies": "Tietolähteiden välityspalvelimet", + "IndexerProxies": "Tiedonhaun välityspalvelimet", "IndexerAuth": "Tietolähteen todennus", "Notifications": "Kytkennät", "NotificationTriggersHelpText": "Valitse tapahtumat, jotka aiheuttavat ilmoituksen.", @@ -386,7 +386,7 @@ "QueryOptions": "Kyselyasetukset", "TvSearch": "Etsi televisiosarjoja", "Filters": "Suodattimet", - "OnGrab": "Kun elokuva siepataan", + "OnGrab": "Kun julkaisu siepataan", "OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma", "HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi '0'.", "HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.", @@ -435,17 +435,17 @@ "EditSyncProfile": "Muokkaa synkronointiprofiilia", "InstanceName": "Instanssin nimi", "InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa", - "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasu. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.", + "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.", "Duration": "Kesto", "ElapsedTime": "Kulunut aika", "EnabledRedirected": "Kulunut, uudelleenohjattu", - "Ended": "Päättynyt", + "Ended": "Päättyi", "GrabTitle": "Sieppaa nimike", "LastExecution": "Edellinen suoritus", "LastDuration": "Edellinen kesto", "NextExecution": "Seuraava suoritus", "Parameters": "Parametrit", - "Queued": "Jonossa", + "Queued": "Lisätty jonoon", "Started": "Alkoi", "ApplicationLongTermStatusCheckAllClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.", "ApplicationLongTermStatusCheckSingleClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}", @@ -457,26 +457,26 @@ "Remove": "Poista", "Replace": "Korvaa", "TheLatestVersionIsAlreadyInstalled": "{appName}in uusin versio on jo asennettu", - "ApplicationURL": "Sovelluksen URL-osoite", - "ApplicationUrlHelpText": "Sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.", - "Track": "Jäljitys", - "CountIndexersSelected": "{0} valittua tietolähdettä", - "DeleteSelectedDownloadClients": "Poista lataustyökalu", - "DeleteSelectedApplicationsMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?", - "DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?", - "DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?", + "ApplicationURL": "Sovelluksen URL", + "ApplicationUrlHelpText": "Tämän sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.", + "Track": "Valvo", + "CountIndexersSelected": "{count} tietolähde(ttä) on valittu", + "DeleteSelectedDownloadClients": "Poista lataustyökalu(t)", + "DeleteSelectedApplicationsMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) sovellu(sta/ksen)?", + "DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa {count} valit(n/tua) lataustyökalu(n/a)?", + "DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) tietoläh(teen/dettä)?", "Publisher": "Julkasija", - "SelectIndexers": "Etsi tietolähteistä", + "SelectIndexers": "Valitse tietolähteet", "Year": "Vuosi", - "Genre": "Tyylilajit", + "Genre": "Lajityyppi", "More": "Lisää", "Season": "Kausi", - "ApplyTagsHelpTextAdd": "– 'Lisää' syötetyt tunnisteet aiempiin tunnisteisiin", - "ApplyTagsHelpTextHowToApplyApplications": "Tunnistetoimenpiteiden selitykset:", - "ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteisiin kohdistettavat toimenpiteet:", - "ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet.", - "ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi.", - "DownloadClientPriorityHelpText": "Tietolähteen painotus: 1 (korkein) - 50 (matalin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.", + "ApplyTagsHelpTextAdd": "– \"Lisää\" syötetyt tunnisteet aiempiin tunnisteisiin", + "ApplyTagsHelpTextHowToApplyApplications": "Tunnisteiden käyttäminen valituille sovelluksille", + "ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituissa tietolähteissä", + "ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet", + "ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi", + "DownloadClientPriorityHelpText": "Määritä useiden lataustyökalujen painotus. Tasaveroiset lataajat erotetaan Round-Robin-tekniikalla.", "Album": "Albumi", "Artist": "Esittäjä", "Author": "Kirjailija", @@ -485,24 +485,47 @@ "Episode": "Jakso", "Label": "Tunniste", "Theme": "Teema", - "ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai sitä voidaan yrittää manuaalisesti painamalla alta \"Lataa uudelleen\".", - "DeleteAppProfileMessageText": "Haluatko varmasti poistaa laatuprofiilin '{0}'?", - "RecentChanges": "Viimeaikaiset muutokset", - "WhatsNew": "Mikä on uutta?", - "ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja käytettävyyden palauttamiseksi se on ladattava uudelleen.", - "minutes": "Minuuttia", + "ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".", + "DeleteAppProfileMessageText": "Haluatko varmasti poistaa sovellusprofiilin \"{name}\"?", + "RecentChanges": "Viimeisimmät muutokset", + "WhatsNew": "Mitä uutta?", + "ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.", + "minutes": "minuuttia", "AddConnection": "Lisää yhteys", - "NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi", - "NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}", - "AuthBasic": "Perus (selaimen ponnahdus)", + "NotificationStatusAllClientHealthCheckMessage": "Kaikki ilmoitukset eivät ole ongelmien vuoksi käytettävissä", + "NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {0}", + "AuthBasic": "Perus (ponnahdusikkuna)", "AuthForm": "Lomake (kirjautumissivu)", - "DisabledForLocalAddresses": "Ei käytetä paikallisille osoittelle", + "DisabledForLocalAddresses": "Ei käytetä paikallisille osoitteille", "None": "Ei mitään", "ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?", "TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdesieppausten kokonaismäärä", "AppUpdated": "{appName} on päivitetty", - "AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.", + "AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.", "IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu", "AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt todennuksen käyttöönoton. Todennus voidaan poistaa käytöstä paikallisille osoitteille.", - "TotalGrabs": "Sieppausten kokonaismäärä" + "TotalGrabs": "Sieppausten kokonaismäärä", + "AddDownloadClientImplementation": "Lisäätään lataustyökalua - {implementationName}", + "AddIndexerImplementation": "Lisätään tietolähdettä - {implementationName}", + "OnGrabHelpText": "Kun julkaisu siepataan", + "ManageDownloadClients": "Hallitse lataustyökaluja", + "NoDownloadClientsFound": "Lataustyökaluja ei löytynyt", + "CountDownloadClientsSelected": "{count} lataustyökalu(a) on valittu", + "EditSelectedDownloadClients": "Muokkaa valittuja lataustyökaluja", + "IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä lataustyökaluilla: {0}.", + "AddIndexerProxyImplementation": "Lisää tiedonhaun välityspalvelin - {implementationName}", + "EditIndexerProxyImplementation": "Muokkaa tiedonhaun välityspalvelinta - {implementationName}", + "EditDownloadClientImplementation": "Muokataan lataustyökalua - {implementationName}", + "AddCustomFilter": "Lisää oma suodatin", + "ApplyChanges": "Toteuta muutokset", + "EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä", + "NoHistoryFound": "Historiaa ei löytynyt", + "NoIndexersFound": "Tietolähteitä ei löytynyt", + "StopSelecting": "Lopeta valitseminen", + "EditConnectionImplementation": "Muokataan kytköstä - {implementationName}", + "AddConnectionImplementation": "Lisätään kytköstä - {implementationName}", + "DownloadClientQbittorrentSettingsContentLayout": "Sisällön asettelu", + "EditIndexerImplementation": "Muokataan tietolähdettä - {implementationName}", + "AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus", + "DefaultNameCopiedProfile": "{name} - Kopioi" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index d4c3a7c7d..1215eb40c 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -6,7 +6,7 @@ "Analytics": "Analityka", "All": "Wszystkie", "Added": "Dodane", - "Actions": "Aktywności", + "Actions": "Akcje", "About": "O", "Logging": "Logowanie", "EnableSslHelpText": " Wymaga ponownego uruchomienia jako administrator, aby odniosło skutek", @@ -54,7 +54,7 @@ "ApiKey": "Klucz API", "UI": "UI", "AcceptConfirmationModal": "Zaakceptuj tryb potwierdzenia", - "AddIndexer": "Dodaj indeksator", + "AddIndexer": "Dodaj indekser", "AddingTag": "Dodawanie tagu", "Age": "Wiek", "CertificateValidationHelpText": "Zmień ścisłą walidację certyfikatu HTTPS", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index e49741428..59f45acd9 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -495,7 +495,7 @@ "ApplyTagsHelpTextAdd": "添加: 添加标签至已有的标签列表中", "CountDownloadClientsSelected": "已选择 {count} 个下载客户端", "CountIndexersSelected": "已选择 {count} 个索引器", - "DeleteSelectedDownloadClientsMessageText": "您确定要删除{count}选定的下载客户端吗?", + "DeleteSelectedDownloadClientsMessageText": "您确定要删除 {count} 个选定的下载客户端吗?", "DeleteSelectedIndexersMessageText": "您确定要删除{count}选定的索引器吗?", "EditSelectedDownloadClients": "编辑选定的下载客户端", "Implementation": "执行", @@ -600,5 +600,8 @@ "PackSeedTime": "做种时间", "PasswordConfirmation": "确认密码", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "确认新密码", - "InvalidUILanguage": "语言" + "InvalidUILanguage": "您的UI设置为无效语言,请纠正并保存设置", + "NoIndexerCategories": "没有找到此索引器的分类", + "DownloadClientQbittorrentSettingsContentLayout": "内容布局", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局,使用种子的原始布局或始终创建子文件夹(qBittorrent 4.3.2+)" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index 1072856aa..62ece9cf4 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -104,5 +104,9 @@ "AppDataDirectory": "AppData 路徑", "Applications": "應用程式", "AuthBasic": "基礎(瀏覽器彈出視窗)", - "AuthForm": "表單(登入頁面)" + "AuthForm": "表單(登入頁面)", + "AddConnection": "新增連接", + "AddConnectionImplementation": "新增連接 - {implementationName}", + "AddDownloadClientImplementation": "新增下載用戶端 - {implementationName}", + "AddIndexerImplementation": "新增索引 - {implementationName}" } From 56c8c3d6c6cd0eae9b927288ef4f43151939faf6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 7 Jan 2024 11:09:41 +0200 Subject: [PATCH 386/964] Bump version to 1.12.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a180add87..4b58ebf16 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.12.0' + majorVersion: '1.12.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 52a690b41acdc2c12df0c48a39fa704876eac4a4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 7 Jan 2024 19:04:22 +0200 Subject: [PATCH 387/964] Fixed: Filter history by multiple event types --- src/Prowlarr.Api.V1/History/HistoryController.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Prowlarr.Api.V1/History/HistoryController.cs b/src/Prowlarr.Api.V1/History/HistoryController.cs index 73508a47b..d5b2b7545 100644 --- a/src/Prowlarr.Api.V1/History/HistoryController.cs +++ b/src/Prowlarr.Api.V1/History/HistoryController.cs @@ -22,15 +22,15 @@ namespace Prowlarr.Api.V1.History [HttpGet] [Produces("application/json")] - public PagingResource GetHistory([FromQuery] PagingRequestResource paging, int? eventType, bool? successful, string downloadId) + public PagingResource GetHistory([FromQuery] PagingRequestResource paging, [FromQuery(Name = "eventType")] int[] eventTypes, bool? successful, string downloadId) { var pagingResource = new PagingResource(paging); var pagingSpec = pagingResource.MapToPagingSpec("date", SortDirection.Descending); - if (eventType.HasValue) + if (eventTypes != null && eventTypes.Any()) { - var filterValue = (HistoryEventType)eventType.Value; - pagingSpec.FilterExpressions.Add(v => v.EventType == filterValue); + var filterValues = eventTypes.Cast().ToArray(); + pagingSpec.FilterExpressions.Add(v => filterValues.Contains(v.EventType)); } if (successful.HasValue) From 25d94a9286cb6d9c4cff1d9b1895aadc7de40a34 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 8 Jan 2024 00:53:40 +0200 Subject: [PATCH 388/964] New: History custom filters Co-authored-by: Mark McDowall --- frontend/src/App/State/AppSectionState.ts | 5 ++ frontend/src/App/State/HistoryAppState.ts | 8 ++- .../Filter/Builder/FilterBuilderRow.js | 4 ++ .../Builder/FilterBuilderRowValueProps.ts | 16 ++++++ .../HistoryEventTypeFilterBuilderRowValue.tsx | 39 ++++++++++++++ .../Helpers/Props/filterBuilderValueTypes.js | 1 + frontend/src/History/History.js | 8 ++- frontend/src/History/HistoryConnector.js | 5 +- frontend/src/History/HistoryFilterModal.tsx | 54 +++++++++++++++++++ .../createFetchServerSideCollectionHandler.js | 12 +++-- frontend/src/Store/Actions/historyActions.js | 23 +++++++- .../src/Store/Actions/indexerStatsActions.js | 5 +- .../History/HistoryController.cs | 9 +++- 13 files changed, 176 insertions(+), 13 deletions(-) create mode 100644 frontend/src/Components/Filter/Builder/FilterBuilderRowValueProps.ts create mode 100644 frontend/src/Components/Filter/Builder/HistoryEventTypeFilterBuilderRowValue.tsx create mode 100644 frontend/src/History/HistoryFilterModal.tsx diff --git a/frontend/src/App/State/AppSectionState.ts b/frontend/src/App/State/AppSectionState.ts index d511963fc..cabc39b1c 100644 --- a/frontend/src/App/State/AppSectionState.ts +++ b/frontend/src/App/State/AppSectionState.ts @@ -1,4 +1,5 @@ import SortDirection from 'Helpers/Props/SortDirection'; +import { FilterBuilderProp } from './AppState'; export interface Error { responseJSON: { @@ -20,6 +21,10 @@ export interface PagedAppSectionState { pageSize: number; } +export interface AppSectionFilterState { + filterBuilderProps: FilterBuilderProp[]; +} + export interface AppSectionSchemaState { isSchemaFetching: boolean; isSchemaPopulated: boolean; diff --git a/frontend/src/App/State/HistoryAppState.ts b/frontend/src/App/State/HistoryAppState.ts index 357ed29f0..3bb0e85f5 100644 --- a/frontend/src/App/State/HistoryAppState.ts +++ b/frontend/src/App/State/HistoryAppState.ts @@ -1,8 +1,12 @@ -import AppSectionState from 'App/State/AppSectionState'; +import AppSectionState, { + AppSectionFilterState, +} from 'App/State/AppSectionState'; import Column from 'Components/Table/Column'; import History from 'typings/History'; -interface HistoryAppState extends AppSectionState { +interface HistoryAppState + extends AppSectionState, + AppSectionFilterState { pageSize: number; columns: Column[]; } diff --git a/frontend/src/Components/Filter/Builder/FilterBuilderRow.js b/frontend/src/Components/Filter/Builder/FilterBuilderRow.js index ec676f87c..8899eaf5b 100644 --- a/frontend/src/Components/Filter/Builder/FilterBuilderRow.js +++ b/frontend/src/Components/Filter/Builder/FilterBuilderRow.js @@ -7,6 +7,7 @@ import AppProfileFilterBuilderRowValueConnector from './AppProfileFilterBuilderR import BoolFilterBuilderRowValue from './BoolFilterBuilderRowValue'; import DateFilterBuilderRowValue from './DateFilterBuilderRowValue'; import FilterBuilderRowValueConnector from './FilterBuilderRowValueConnector'; +import HistoryEventTypeFilterBuilderRowValue from './HistoryEventTypeFilterBuilderRowValue'; import IndexerFilterBuilderRowValueConnector from './IndexerFilterBuilderRowValueConnector'; import PrivacyFilterBuilderRowValue from './PrivacyFilterBuilderRowValue'; import ProtocolFilterBuilderRowValue from './ProtocolFilterBuilderRowValue'; @@ -58,6 +59,9 @@ function getRowValueConnector(selectedFilterBuilderProp) { case filterBuilderValueTypes.DATE: return DateFilterBuilderRowValue; + case filterBuilderValueTypes.HISTORY_EVENT_TYPE: + return HistoryEventTypeFilterBuilderRowValue; + case filterBuilderValueTypes.INDEXER: return IndexerFilterBuilderRowValueConnector; diff --git a/frontend/src/Components/Filter/Builder/FilterBuilderRowValueProps.ts b/frontend/src/Components/Filter/Builder/FilterBuilderRowValueProps.ts new file mode 100644 index 000000000..5bf9e5785 --- /dev/null +++ b/frontend/src/Components/Filter/Builder/FilterBuilderRowValueProps.ts @@ -0,0 +1,16 @@ +import { FilterBuilderProp } from 'App/State/AppState'; + +interface FilterBuilderRowOnChangeProps { + name: string; + value: unknown[]; +} + +interface FilterBuilderRowValueProps { + filterType?: string; + filterValue: string | number | object | string[] | number[] | object[]; + selectedFilterBuilderProp: FilterBuilderProp; + sectionItem: unknown[]; + onChange: (payload: FilterBuilderRowOnChangeProps) => void; +} + +export default FilterBuilderRowValueProps; diff --git a/frontend/src/Components/Filter/Builder/HistoryEventTypeFilterBuilderRowValue.tsx b/frontend/src/Components/Filter/Builder/HistoryEventTypeFilterBuilderRowValue.tsx new file mode 100644 index 000000000..03c5f7227 --- /dev/null +++ b/frontend/src/Components/Filter/Builder/HistoryEventTypeFilterBuilderRowValue.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import translate from 'Utilities/String/translate'; +import FilterBuilderRowValue from './FilterBuilderRowValue'; +import FilterBuilderRowValueProps from './FilterBuilderRowValueProps'; + +const EVENT_TYPE_OPTIONS = [ + { + id: 1, + get name() { + return translate('Grabbed'); + }, + }, + { + id: 3, + get name() { + return translate('IndexerRss'); + }, + }, + { + id: 2, + get name() { + return translate('IndexerQuery'); + }, + }, + { + id: 4, + get name() { + return translate('IndexerAuth'); + }, + }, +]; + +function HistoryEventTypeFilterBuilderRowValue( + props: FilterBuilderRowValueProps +) { + return ; +} + +export default HistoryEventTypeFilterBuilderRowValue; diff --git a/frontend/src/Helpers/Props/filterBuilderValueTypes.js b/frontend/src/Helpers/Props/filterBuilderValueTypes.js index 7fed535f2..19c8ccd9c 100644 --- a/frontend/src/Helpers/Props/filterBuilderValueTypes.js +++ b/frontend/src/Helpers/Props/filterBuilderValueTypes.js @@ -2,6 +2,7 @@ export const BOOL = 'bool'; export const BYTES = 'bytes'; export const DATE = 'date'; export const DEFAULT = 'default'; +export const HISTORY_EVENT_TYPE = 'historyEventType'; export const INDEXER = 'indexer'; export const PROTOCOL = 'protocol'; export const PRIVACY = 'privacy'; diff --git a/frontend/src/History/History.js b/frontend/src/History/History.js index c26a8e7ae..a8392d95d 100644 --- a/frontend/src/History/History.js +++ b/frontend/src/History/History.js @@ -17,6 +17,7 @@ import { align, icons, kinds } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import HistoryOptionsConnector from './HistoryOptionsConnector'; import HistoryRowConnector from './HistoryRowConnector'; +import HistoryFilterModal from './HistoryFilterModal'; class History extends Component { @@ -63,6 +64,7 @@ class History extends Component { columns, selectedFilterKey, filters, + customFilters, totalRecords, onFilterSelect, onFirstPagePress, @@ -108,7 +110,8 @@ class History extends Component { alignMenu={align.RIGHT} selectedFilterKey={selectedFilterKey} filters={filters} - customFilters={[]} + customFilters={customFilters} + filterModalConnectorComponent={HistoryFilterModal} onFilterSelect={onFilterSelect} /> @@ -193,8 +196,9 @@ History.propTypes = { indexersError: PropTypes.object, items: PropTypes.arrayOf(PropTypes.object).isRequired, columns: PropTypes.arrayOf(PropTypes.object).isRequired, - selectedFilterKey: PropTypes.string.isRequired, + selectedFilterKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, filters: PropTypes.arrayOf(PropTypes.object).isRequired, + customFilters: PropTypes.arrayOf(PropTypes.object).isRequired, totalRecords: PropTypes.number, onFilterSelect: PropTypes.func.isRequired, onFirstPagePress: PropTypes.func.isRequired, diff --git a/frontend/src/History/HistoryConnector.js b/frontend/src/History/HistoryConnector.js index cd634ca11..9b29b7d6e 100644 --- a/frontend/src/History/HistoryConnector.js +++ b/frontend/src/History/HistoryConnector.js @@ -6,6 +6,7 @@ import * as commandNames from 'Commands/commandNames'; import withCurrentPage from 'Components/withCurrentPage'; import { executeCommand } from 'Store/Actions/commandActions'; import * as historyActions from 'Store/Actions/historyActions'; +import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector'; import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector'; import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator'; import History from './History'; @@ -14,13 +15,15 @@ function createMapStateToProps() { return createSelector( (state) => state.history, (state) => state.indexers, + createCustomFiltersSelector('history'), createCommandExecutingSelector(commandNames.CLEAR_HISTORY), - (history, indexers, isHistoryClearing) => { + (history, indexers, customFilters, isHistoryClearing) => { return { isIndexersFetching: indexers.isFetching, isIndexersPopulated: indexers.isPopulated, indexersError: indexers.error, isHistoryClearing, + customFilters, ...history }; } diff --git a/frontend/src/History/HistoryFilterModal.tsx b/frontend/src/History/HistoryFilterModal.tsx new file mode 100644 index 000000000..f4ad2e57c --- /dev/null +++ b/frontend/src/History/HistoryFilterModal.tsx @@ -0,0 +1,54 @@ +import React, { useCallback } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; +import FilterModal from 'Components/Filter/FilterModal'; +import { setHistoryFilter } from 'Store/Actions/historyActions'; + +function createHistorySelector() { + return createSelector( + (state: AppState) => state.history.items, + (queueItems) => { + return queueItems; + } + ); +} + +function createFilterBuilderPropsSelector() { + return createSelector( + (state: AppState) => state.history.filterBuilderProps, + (filterBuilderProps) => { + return filterBuilderProps; + } + ); +} + +interface HistoryFilterModalProps { + isOpen: boolean; +} + +export default function HistoryFilterModal(props: HistoryFilterModalProps) { + const sectionItems = useSelector(createHistorySelector()); + const filterBuilderProps = useSelector(createFilterBuilderPropsSelector()); + const customFilterType = 'history'; + + const dispatch = useDispatch(); + + const dispatchSetFilter = useCallback( + (payload: unknown) => { + dispatch(setHistoryFilter(payload)); + }, + [dispatch] + ); + + return ( + + ); +} diff --git a/frontend/src/Store/Actions/Creators/createFetchServerSideCollectionHandler.js b/frontend/src/Store/Actions/Creators/createFetchServerSideCollectionHandler.js index a80ee1e45..f5ef10a4d 100644 --- a/frontend/src/Store/Actions/Creators/createFetchServerSideCollectionHandler.js +++ b/frontend/src/Store/Actions/Creators/createFetchServerSideCollectionHandler.js @@ -6,6 +6,8 @@ import getSectionState from 'Utilities/State/getSectionState'; import { set, updateServerSideCollection } from '../baseActions'; function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter) { + const [baseSection] = section.split('.'); + return function(getState, payload, dispatch) { dispatch(set({ section, isFetching: true })); @@ -25,10 +27,13 @@ function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter const { selectedFilterKey, - filters, - customFilters + filters } = sectionState; + const customFilters = getState().customFilters.items.filter((customFilter) => { + return customFilter.type === section || customFilter.type === baseSection; + }); + const selectedFilters = findSelectedFilters(selectedFilterKey, filters, customFilters); selectedFilters.forEach((filter) => { @@ -37,7 +42,8 @@ function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter const promise = createAjaxRequest({ url, - data + data, + traditional: true }).request; promise.done((response) => { diff --git a/frontend/src/Store/Actions/historyActions.js b/frontend/src/Store/Actions/historyActions.js index 2e133f61e..95ea992b1 100644 --- a/frontend/src/Store/Actions/historyActions.js +++ b/frontend/src/Store/Actions/historyActions.js @@ -1,5 +1,5 @@ import { createAction } from 'redux-actions'; -import { filterTypes, sortDirections } from 'Helpers/Props'; +import { filterBuilderTypes, filterBuilderValueTypes, filterTypes, sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; @@ -159,6 +159,27 @@ export const defaultState = { } ] } + ], + + filterBuilderProps: [ + { + name: 'eventType', + label: () => translate('EventType'), + type: filterBuilderTypes.EQUAL, + valueType: filterBuilderValueTypes.HISTORY_EVENT_TYPE + }, + { + name: 'indexerIds', + label: () => translate('Indexer'), + type: filterBuilderTypes.EQUAL, + valueType: filterBuilderValueTypes.INDEXER + }, + { + name: 'successful', + label: () => translate('Successful'), + type: filterBuilderTypes.EQUAL, + valueType: filterBuilderValueTypes.BOOL + } ] }; diff --git a/frontend/src/Store/Actions/indexerStatsActions.js b/frontend/src/Store/Actions/indexerStatsActions.js index fe13c6db4..06c9586b5 100644 --- a/frontend/src/Store/Actions/indexerStatsActions.js +++ b/frontend/src/Store/Actions/indexerStatsActions.js @@ -74,8 +74,9 @@ export const defaultState = { valueType: filterBuilderValueTypes.TAG } ], - selectedFilterKey: 'all', - customFilters: [] + + selectedFilterKey: 'all' + }; export const persistState = [ diff --git a/src/Prowlarr.Api.V1/History/HistoryController.cs b/src/Prowlarr.Api.V1/History/HistoryController.cs index d5b2b7545..19c29834b 100644 --- a/src/Prowlarr.Api.V1/History/HistoryController.cs +++ b/src/Prowlarr.Api.V1/History/HistoryController.cs @@ -22,7 +22,7 @@ namespace Prowlarr.Api.V1.History [HttpGet] [Produces("application/json")] - public PagingResource GetHistory([FromQuery] PagingRequestResource paging, [FromQuery(Name = "eventType")] int[] eventTypes, bool? successful, string downloadId) + public PagingResource GetHistory([FromQuery] PagingRequestResource paging, [FromQuery(Name = "eventType")] int[] eventTypes, bool? successful, string downloadId, [FromQuery] int[] indexerIds = null) { var pagingResource = new PagingResource(paging); var pagingSpec = pagingResource.MapToPagingSpec("date", SortDirection.Descending); @@ -44,7 +44,12 @@ namespace Prowlarr.Api.V1.History pagingSpec.FilterExpressions.Add(h => h.DownloadId == downloadId); } - return pagingSpec.ApplyToPage(_historyService.Paged, MapToResource); + if (indexerIds != null && indexerIds.Any()) + { + pagingSpec.FilterExpressions.Add(h => indexerIds.Contains(h.IndexerId)); + } + + return pagingSpec.ApplyToPage(h => _historyService.Paged(pagingSpec), MapToResource); } [HttpGet("since")] From 0f6dfe389c91ab83385820e51dd17da63ac60316 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 8 Jan 2024 01:21:44 +0200 Subject: [PATCH 389/964] Fix CS in History --- frontend/src/History/History.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/History/History.js b/frontend/src/History/History.js index a8392d95d..f637522cd 100644 --- a/frontend/src/History/History.js +++ b/frontend/src/History/History.js @@ -15,9 +15,9 @@ import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptions import TablePager from 'Components/Table/TablePager'; import { align, icons, kinds } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; +import HistoryFilterModal from './HistoryFilterModal'; import HistoryOptionsConnector from './HistoryOptionsConnector'; import HistoryRowConnector from './HistoryRowConnector'; -import HistoryFilterModal from './HistoryFilterModal'; class History extends Component { From ce615a77c2d8db20850d59a4852141b85ac6bc38 Mon Sep 17 00:00:00 2001 From: Servarr Date: Sun, 7 Jan 2024 23:25:49 +0000 Subject: [PATCH 390/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index d75411166..92ab7dedd 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -1468,8 +1468,11 @@ "name": "eventType", "in": "query", "schema": { - "type": "integer", - "format": "int32" + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } } }, { @@ -1485,6 +1488,17 @@ "schema": { "type": "string" } + }, + { + "name": "indexerIds", + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + } } ], "responses": { From c3e40c056474b842a9bc5147c55c4dd2b8dd58c8 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 8 Jan 2024 21:30:27 +0200 Subject: [PATCH 391/964] Log web exceptions in test connection --- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index 6a6b965b3..ed25df68c 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -733,7 +733,7 @@ namespace NzbDrone.Core.Indexers } catch (WebException webException) { - _logger.Warn("Unable to connect to indexer."); + _logger.Warn(webException, "Unable to connect to indexer."); if (webException.Status is WebExceptionStatus.NameResolutionFailure or WebExceptionStatus.ConnectFailure) { From ac97952fd72bbc8d8d867253452b31f27814229f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 8 Jan 2024 22:24:35 +0200 Subject: [PATCH 392/964] Fixed: (HDBits) Strip non-word chars from search query Co-authored-by: Kyle Sanderson --- .../Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs index 0307c19f3..36ddb8e7a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net.Http; +using System.Text.RegularExpressions; using Newtonsoft.Json; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; @@ -26,7 +27,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits if (imdbId == 0 && searchCriteria.SearchTerm.IsNotNullOrWhiteSpace()) { - query.Search = searchCriteria.SanitizedSearchTerm; + query.Search = Regex.Replace(searchCriteria.SanitizedSearchTerm, "[\\W]+", " ").Trim(); } if (imdbId != 0) From 3c0fea8b7cdb092b23e05ff4427b4c176677ed4b Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 9 Jan 2024 18:58:28 +0000 Subject: [PATCH 393/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Aitzol Garmendia Co-authored-by: Anonymous Co-authored-by: Bradley BARBIER Co-authored-by: Dani Talens Co-authored-by: DimitriDR Co-authored-by: Oskari Lavinto Co-authored-by: RicardoVelaC Co-authored-by: reloxx Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/lv/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 37 ++++++--- src/NzbDrone.Core/Localization/Core/cs.json | 3 +- src/NzbDrone.Core/Localization/Core/de.json | 2 +- src/NzbDrone.Core/Localization/Core/es.json | 32 ++++++-- src/NzbDrone.Core/Localization/Core/fi.json | 78 +++++++++++-------- src/NzbDrone.Core/Localization/Core/fr.json | 5 +- src/NzbDrone.Core/Localization/Core/hu.json | 9 ++- src/NzbDrone.Core/Localization/Core/id.json | 5 +- src/NzbDrone.Core/Localization/Core/ja.json | 3 +- src/NzbDrone.Core/Localization/Core/ko.json | 3 +- src/NzbDrone.Core/Localization/Core/lv.json | 13 +++- src/NzbDrone.Core/Localization/Core/nl.json | 3 +- src/NzbDrone.Core/Localization/Core/ru.json | 3 +- src/NzbDrone.Core/Localization/Core/tr.json | 11 ++- src/NzbDrone.Core/Localization/Core/uk.json | 10 ++- .../Localization/Core/zh_TW.json | 15 +++- 16 files changed, 167 insertions(+), 65 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index d0d43542a..c35e2e992 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -170,9 +170,9 @@ "Dates": "Dates", "DBMigration": "Migració de BD", "Delete": "Suprimeix", - "DeleteNotificationMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?", + "DeleteNotificationMessageText": "Esteu segur que voleu suprimir la notificació '{name}'?", "DeleteTag": "Suprimeix l'etiqueta", - "DeleteTagMessageText": "Esteu segur que voleu suprimir l'etiqueta '{0}'?", + "DeleteTagMessageText": "Esteu segur que voleu suprimir l'etiqueta '{label}'?", "Details": "Detalls", "Disabled": "Desactivat", "DownloadClientStatusCheckAllClientMessage": "Tots els clients de descàrrega no estan disponibles a causa d'errors", @@ -260,9 +260,9 @@ "Branch": "Branca", "Connections": "Connexions", "ConnectSettings": "Configuració de connexió", - "DeleteBackupMessageText": "Esteu segur que voleu suprimir la còpia de seguretat '{0}'?", + "DeleteBackupMessageText": "Esteu segur que voleu suprimir la còpia de seguretat '{name}'?", "DeleteDownloadClient": "Suprimeix el client de descàrrega", - "DeleteDownloadClientMessageText": "Esteu segur que voleu suprimir el client de baixada '{0}'?", + "DeleteDownloadClientMessageText": "Esteu segur que voleu suprimir el client de baixada '{name}'?", "Discord": "Discord", "Docker": "Docker", "Donations": "Donacions", @@ -351,11 +351,11 @@ "ApplyTagsHelpTextRemove": "Eliminar: elimina les etiquetes introduïdes", "DeleteSelectedApplicationsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?", "Label": "Etiqueta", - "ApplyTagsHelpTextReplace": "Substituïu: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per esborrar totes les etiquetes)", - "DeleteSelectedDownloadClients": "Suprimeix el client de descàrrega", + "ApplyTagsHelpTextReplace": "Substitució: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per esborrar totes les etiquetes)", + "DeleteSelectedDownloadClients": "Suprimeix el(s) client(s) de baixada", "Genre": "Gèneres", - "DeleteSelectedDownloadClientsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?", - "DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?", + "DeleteSelectedDownloadClientsMessageText": "Esteu segur que voleu suprimir {count} client(s) de baixada seleccionat(s)?", + "DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir {count} indexador(s) seleccionat(s)?", "DownloadClientPriorityHelpText": "Prioritzeu diversos clients de baixada. S'utilitza round-robin per a clients amb la mateixa prioritat.", "More": "Més", "Season": "temporada", @@ -363,15 +363,15 @@ "Track": "Traça", "Year": "Any", "UpdateAvailable": "Nova actualització disponible", - "ConnectionLostReconnect": "Radarr intentarà connectar-se automàticament, o podeu fer clic a recarregar.", - "ConnectionLostToBackend": "Radarr ha perdut la connexió amb el backend i s'haurà de tornar a carregar per restaurar la funcionalitat.", + "ConnectionLostReconnect": "{appName} intentarà connectar-se automàticament, o podeu fer clic a recarregar.", + "ConnectionLostToBackend": "{appName} ha perdut la connexió amb el backend i s'haurà de tornar a carregar per restaurar la funcionalitat.", "RecentChanges": "Canvis recents", "WhatsNew": "Que hi ha de nou?", "minutes": "Minuts", "DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}", "NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}", "AddConnection": "Afegeix una connexió", - "NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors", + "NotificationStatusAllClientHealthCheckMessage": "Totes les notificacions no estan disponibles a causa d'errors", "AuthBasic": "Basic (finestra emergent del navegador)", "AuthForm": "Formularis (pàgina d'inici de sessió)", "DisabledForLocalAddresses": "Desactivat per a adreces locals", @@ -410,5 +410,18 @@ "DownloadClientQbittorrentSettingsContentLayout": "Disseny de contingut", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si s'utilitza el disseny de contingut de qBittorrent s'utilitza el disseny original del torrent o es crea una subcarpeta (qBittorrent 4.3.2+)", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmeu la nova contrasenya", - "AuthenticationRequiredUsernameHelpTextWarning": "Introduïu un nom d'usuari nou" + "AuthenticationRequiredUsernameHelpTextWarning": "Introduïu un nom d'usuari nou", + "Categories": "Categories", + "ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {length} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració", + "Episode": "episodi", + "EditApplicationImplementation": "Edita la notificació - {implementationName}", + "EditConnectionImplementation": "Afegeix una connexió - {implementationName}", + "EditIndexerProxyImplementation": "Edita l'indexador - {implementationName}", + "days": "dies", + "Album": "àlbum", + "Artist": "artista", + "AddApplicationImplementation": "Afegeix una condició - {implementationName}", + "AddIndexerProxyImplementation": "Afegeix un indexador - {implementationName}", + "Category": "Categoria", + "Clone": "Clona" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 995273150..4dfaf9377 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -405,5 +405,6 @@ "AuthenticationRequiredPasswordHelpTextWarning": "Vložte nové heslo", "AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno", "AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování", - "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo" + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo", + "days": "dnů" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index eb3c1861a..453c42e74 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -337,7 +337,7 @@ "SearchTypes": "Suchtyp", "Security": "Sicherheit", "Seeders": "Seeders", - "SelectAll": "Alles auswählen", + "SelectAll": "Alle wählen", "SemiPrivate": "Halbprivat", "SendAnonymousUsageData": "Sende anonyme Nutzungsdaten", "SetTags": "Tags festlegen", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index edb58083d..d4ccb7f46 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -320,7 +320,7 @@ "Filters": "Filtros", "HistoryCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática", "HistoryCleanupDaysHelpTextWarning": "Los archivos en la papelera de reciclaje más antiguos que el número de días seleccionado serán limpiados automáticamente", - "OnGrab": "Al Capturar", + "OnGrab": "Al Capturar lanzamiento", "OnHealthIssue": "En Problema de Salud", "TestAllIndexers": "Comprobar Todos los Indexers", "NotificationTriggersHelpText": "Seleccione qué eventos deben activar esta notificación", @@ -373,7 +373,7 @@ "Label": "Etiqueta", "Theme": "Tema", "ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas", - "DeleteSelectedApplicationsMessageText": "Seguro que quieres eliminar el indexer '{0}'?", + "DeleteSelectedApplicationsMessageText": "¿Estás seguro que quieres eliminar {count} aplicación(es) seleccionada(s)?", "DeleteSelectedDownloadClients": "Borrar Gestor de Descargas", "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", @@ -426,7 +426,7 @@ "EditIndexerProxyImplementation": "Agregar Condición - { implementationName}", "AppUpdated": "{appName} Actualizada", "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}", - "AddApplicationImplementation": "Agregar Condición - { implementationName}", + "AddApplicationImplementation": "Agregar aplicación - { implementationName}", "AddConnectionImplementation": "Añadir Conexión - {implementationName}", "AddIndexerImplementation": "Agregar Condición - { implementationName}", "AddIndexerProxyImplementation": "Agregar Condición - { implementationName}", @@ -460,10 +460,10 @@ "DeleteAppProfile": "Eliminar Perfil de Aplicación", "AddSyncProfile": "Agregar Perfil de Sincronización", "AppSettingsSummary": "Aplicaciones y configuraciones para determinar como {appName} interactúa con sus programas de PVR", - "AddCategory": "Agregar Categoría", + "AddCategory": "Agregar categoría", "AppProfileSelectHelpText": "Los perfiles de la aplicación se usan para controlar la configuración por aplicación de RSS, Búsqueda Automática y Búsqueda Interactiva", - "ActiveApps": "Aplicaciones Activas", - "ActiveIndexers": "Indexadores Activos", + "ActiveApps": "Aplicaciones activas", + "ActiveIndexers": "Indexadores activos", "AudioSearch": "Búsqueda de Música", "Auth": "Autenticación", "BasicSearch": "Búsqueda Básica", @@ -496,8 +496,24 @@ "InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración", "DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)", - "EnableRssHelpText": "Habilitar feed Rss para indexador", + "EnableRssHelpText": "Habilitar feed RSS para el indexador", "days": "días", "ElapsedTime": "Tiempo transcurrido", - "GrabTitle": "Capturar título" + "GrabTitle": "Capturar título", + "SearchAllIndexers": "Buscar en todos los Indexadores", + "Website": "Sitio web", + "Redirect": "Redirección", + "RssQueries": "Consultas RSS", + "SeedRatio": "Ratio de siembra", + "RssFeed": "Feed RSS", + "SearchType": "Tipo de búsqueda", + "RepeatSearch": "Repetir búsqueda", + "SeedRatioHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto", + "SeedTime": "Tiempo de siembra", + "SearchTypes": "Tipos de búsquedas", + "DeleteIndexerProxy": "Eliminar proxy indexador", + "OnGrabHelpText": "Al Capturar lanzamiento", + "SeedTimeHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto", + "IndexerTagsHelpTextWarning": "Las etiquetas deben utilizarse con cuidado, pueden tener efectos involuntarios. Una aplicación con una etiqueta solo sincronizara con Indexadores que tengan la misma etiqueta.", + "TVSearchTypes": "Tipos de búsquedas" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 81d27c7d4..a50042dce 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -5,7 +5,7 @@ "MovieIndexScrollTop": "Elokuvakirjasto: vieritä ylös", "Apply": "Käytä", "ClientPriority": "Lataustyökalun painotus", - "IndexerPriorityHelpText": "Tietolähteen painotus, 1– 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.", + "IndexerPriorityHelpText": "Tietolähteen painotus, 1– 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen kaappauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.", "Manual": "Manuaalinen", "Add": "Lisää", "Reload": "Lataa uudelleen", @@ -38,7 +38,7 @@ "History": "Historia", "MIA": "Puuttuu", "New": "Uutta", - "PageSizeHelpText": "Sivulla näytettävien kohteiden määrä", + "PageSizeHelpText": "Sivukohtainen kohdemäärä.", "Proxy": "Välityspalvelin", "ProxyBypassFilterHelpText": "Käytä erottimena ',' ja '*.' jokerimerkkinä aliverkkotunnuksille (esim. www.esimerkki.fi,*.esimerkki.fi)", "Reddit": "Reddit", @@ -70,17 +70,17 @@ "YesCancel": "Kyllä, peru", "NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.", "ApplyTags": "Tunnistetoimenpide", - "Authentication": "Todennus", + "Authentication": "Tunnistautuminen", "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.", "BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.", "Close": "Sulje", - "DeleteNotification": "Poista kytkentä", + "DeleteNotification": "Poista ilmoitus", "Docker": "Docker", "DownloadClient": "Lataustyökalu", "Language": "Kieli", "Search": "Haku", "Details": "Tiedot", - "InteractiveSearch": "Vuorovaikutteinen haku", + "InteractiveSearch": "Manuaalihaku", "Interval": "Ajoitus", "KeyboardShortcuts": "Pikanäppäimet", "LastWriteTime": "Edellinen tallennusaika", @@ -173,9 +173,9 @@ "UnableToLoadNotifications": "Kytkentöjen lataus epäonnistui.", "UnableToLoadTags": "Tunnisteiden lataus ei onnistu", "UnableToLoadUISettings": "Käyttöliittymän asetuksien lataus epäonnistui.", - "UnsavedChanges": "Tallentamattomia muutoksia", + "UnsavedChanges": "Muutoksia ei ole tallennettu", "Yesterday": "Eilen", - "ConnectionLost": "Yhteys on katkennut", + "ConnectionLost": "Ei yhteyttä", "DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun \"{name}\"?", "DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?", "Discord": "Discord", @@ -186,14 +186,14 @@ "EventType": "Tapahtuman tyyppi", "Exception": "Poikkeus", "FeatureRequests": "Kehitysehdotukset", - "Grabbed": "Siepattu", + "Grabbed": "Kaapattu", "IgnoredAddresses": "Ohitetut osoitteet", "IllRestartLater": "Käynnistän uudelleen myöhemmin", "Info": "Informatiivinen", "LaunchBrowserHelpText": " Avaa {appName}in verkkokäyttöliittymä verkkoselaimeen sovelluksen käynnistyksen yhteydessä.", - "NoChanges": "Ei muutoksia", + "NoChanges": "Muutoksia ei ole", "NoLeaveIt": "Ei, anna olla", - "PendingChangesMessage": "On tallentamattomia muutoksia. Haluatko varmasti poistua sivulta?", + "PendingChangesMessage": "Olet tehnyt muutoksia, joita ei ole vielä tallennettu. Haluatko varmasti poistua sivulta?", "PendingChangesStayReview": "Älä poistu ja tarkista muutokset", "Save": "Tallenna", "SaveChanges": "Tallenna muutokset", @@ -226,7 +226,7 @@ "Backups": "Varmuuskopiot", "BeforeUpdate": "Ennen päivitystä", "BindAddress": "Sidososoite", - "Branch": "Kehityshaara", + "Branch": "Haara", "BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara.", "BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.", "BypassProxyForLocalAddresses": "Ohjaa paikalliset osoitteet välityspalvelimen ohi", @@ -236,12 +236,12 @@ "CertificateValidationHelpText": "Muuta HTTPS-varmennevahvistuksen tarkkuutta. Älä muuta, jollet ymmärrä tähän liittyviä riskejä.", "ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu", "Clear": "Tyhjennä", - "CloneProfile": "Kloonaa profiili", + "CloneProfile": "Monista profiili", "CloseCurrentModal": "Sulje nykyinen ikkuna", "Columns": "Sarakkeet", "Component": "Komponentti", - "Connections": "Kytkennät", - "ConnectSettings": "Kytkentöjen asetukset", + "Connections": "Yhteydet", + "ConnectSettings": "Kytkösasetukset", "CouldNotConnectSignalR": "SignalR-kirjastoa ei tavoitettu, eikä käyttöliittymää päivitetä", "Custom": "Mukautettu", "DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{name}\"?", @@ -251,8 +251,8 @@ "DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}", "EditIndexer": "Muokkaa tietolähdettä", "EnableAutomaticSearch": "Käytä automaattihakua", - "EnableInteractiveSearch": "Käytä vuorovaikutteista hakua", - "EnableInteractiveSearchHelpText": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.", + "EnableInteractiveSearch": "Käytä manuaalihakua", + "EnableInteractiveSearchHelpText": "Profiilia käytetään manuaalihakuun.", "EnableSSL": "SSL-salaus", "EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.", "Error": "Virhe", @@ -266,7 +266,7 @@ "General": "Yleiset", "GeneralSettings": "Yleiset asetukset", "GeneralSettingsSummary": "Portti, SSL-salaus, käyttäjänimi ja salasana, välityspalvelin, analytiikka ja päivitykset.", - "Grabs": "Sieppaukset", + "Grabs": "Kaappaukset", "Health": "Terveys", "Level": "Taso", "HealthNoIssues": "Kokoonpanossasi ei ole ongelmia", @@ -309,7 +309,7 @@ "DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävät lataustyökalumääritykset.", "ProwlarrSupportsAnyDownloadClient": "{appName} tukee alla listatuja lataustyökaluja.", "AddDownloadClientToProwlarr": "Lisäämällä lataustyökalun {appName} voi käynnistää lataukset suoraan käyttöliittymästä manuaalisen haun yhteydessä.", - "RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja välitä sieppaus suoraan {appName}-välityksen sijaan.", + "RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja välitä kaappaus suoraan välittämättä sitä {appName}in välityksellä.", "FullSync": "Täysi synkronointi", "SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen tietolähteet täysin synkronoituna. Tietolähteisiin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.", "EnableIndexer": "Tietolähteen tila", @@ -326,7 +326,7 @@ "SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja tietolähteiden toiminnasta, mukaanlukien vastaukset", "IndexerTagsHelpText": "Tunnisteilla voit kohdistaa tiedonhaun välityspalvelimia ja määrittää mihin sovelluksiin ne synkronoidaan.", "UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui", - "AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/vuorovaikutteinen).", + "AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/manuaali).", "IndexerQuery": "Tietolähteen kysely", "IndexerRss": "Tietolähteen RSS-syöte", "SearchIndexers": "Etsi tietolähteistä", @@ -352,7 +352,7 @@ "SettingsLogRotate": "Lokitiedostojen kierrätys", "SettingsLogSql": "Kirjaa SQL", "SettingsSqlLoggingHelpText": "Kirjaa kaikki {appName}in SQL-kyselyt", - "ConnectSettingsSummary": "Ilmoitukset ja omat komentosarjat.", + "ConnectSettingsSummary": "Ilmoitukset, kuten viestintä mediapalvelimille ja soittimille, sekä omat komentosarjat.", "DevelopmentSettings": "Kehittäjäasetukset", "Description": "Kuvaus", "Id": "Tunniste", @@ -363,7 +363,7 @@ "AppProfileInUse": "Sovellusprofiili on käytössä", "Apps": "Sovellukset", "Auth": "Todennus", - "Category": "Luokitus", + "Category": "Kategoria", "ClearHistory": "Tyhjennä historia", "ClearHistoryMessageText": "Haluatko varmasti tyhjentää kaiken {appName}-historian?", "Connect": "Kytkennät", @@ -386,9 +386,9 @@ "QueryOptions": "Kyselyasetukset", "TvSearch": "Etsi televisiosarjoja", "Filters": "Suodattimet", - "OnGrab": "Kun julkaisu siepataan", + "OnGrab": "Kun julkaisu kaapataan", "OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma", - "HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi '0'.", + "HistoryCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattityhjennyksen käytöstä.", "HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.", "TestAllIndexers": "Testaa tietolähteet", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa", @@ -410,7 +410,7 @@ "Private": "Yksityinen", "QueryResults": "Kyselyn tulokset", "Application": "Sovellus", - "GrabReleases": "Sieppaa julkaisu(t)", + "GrabReleases": "Kaappaa julkaisu(t)", "Link": "Linkki", "SearchTypes": "Mitä etsitään", "UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui", @@ -440,7 +440,7 @@ "ElapsedTime": "Kulunut aika", "EnabledRedirected": "Kulunut, uudelleenohjattu", "Ended": "Päättyi", - "GrabTitle": "Sieppaa nimike", + "GrabTitle": "Kaappaa nimike", "LastExecution": "Edellinen suoritus", "LastDuration": "Edellinen kesto", "NextExecution": "Seuraava suoritus", @@ -453,7 +453,7 @@ "DeleteClientCategory": "Poista lataustyökalukategoria", "DownloadClientCategory": "Lataustyökalukategoria", "MappedCategories": "Kartoitetut kategoriat", - "AuthenticationRequired": "Todennus vaaditaan", + "AuthenticationRequired": "Vaadi tunnistautuminen", "Remove": "Poista", "Replace": "Korvaa", "TheLatestVersionIsAlreadyInstalled": "{appName}in uusin versio on jo asennettu", @@ -499,15 +499,15 @@ "DisabledForLocalAddresses": "Ei käytetä paikallisille osoitteille", "None": "Ei mitään", "ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?", - "TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdesieppausten kokonaismäärä", + "TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdekaappausten kokonaismäärä", "AppUpdated": "{appName} on päivitetty", "AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.", - "IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu", + "IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu.", "AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt todennuksen käyttöönoton. Todennus voidaan poistaa käytöstä paikallisille osoitteille.", - "TotalGrabs": "Sieppausten kokonaismäärä", + "TotalGrabs": "Kaappausten kokonaismäärä", "AddDownloadClientImplementation": "Lisäätään lataustyökalua - {implementationName}", "AddIndexerImplementation": "Lisätään tietolähdettä - {implementationName}", - "OnGrabHelpText": "Kun julkaisu siepataan", + "OnGrabHelpText": "Kun julkaisu kaapataan", "ManageDownloadClients": "Hallitse lataustyökaluja", "NoDownloadClientsFound": "Lataustyökaluja ei löytynyt", "CountDownloadClientsSelected": "{count} lataustyökalu(a) on valittu", @@ -527,5 +527,21 @@ "DownloadClientQbittorrentSettingsContentLayout": "Sisällön asettelu", "EditIndexerImplementation": "Muokataan tietolähdettä - {implementationName}", "AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus", - "DefaultNameCopiedProfile": "{name} - Kopioi" + "DefaultNameCopiedProfile": "{name} - Kopioi", + "AppsMinimumSeedersHelpText": "Sovellusten edellyttämä tietolähteestä kaapattavien kohteiden jakajien (seed) vähimmäismäärä. Jos tyhjä, käytetään synkronointiprofiilin oletusta.", + "TotalHostGrabs": "Isännän kaappausten kokonaismäärä", + "IncludeManualGrabsHelpText": "Sisällytä {appName}in käyttöliittymästä tehdyt manuaalikaappaukset.", + "AuthenticationRequiredHelpText": "Valitse mitkä pyynnöt vaativat tunnistautumisen. Älä muuta, jos et ymmärrä riskejä.", + "TotalUserAgentGrabs": "Käyttäjäagentin kaappausten kokonaismäärä", + "AuthenticationMethodHelpTextWarning": "Valitse sopiva tunnistautumistapa", + "AuthenticationRequiredPasswordHelpTextWarning": "Syötä salasana", + "AuthenticationMethod": "Tunnistautumistapa", + "Clone": "Monista", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Vahvista uusi salasana", + "EditApplicationImplementation": "Muokataan kytköstä - {implementationName}", + "AddApplicationImplementation": "Lisätään kytköstä - {implementationName}", + "InvalidUILanguage": "Käytöliittymän kielivalinta on virheellinen. Korjaa se ja tallenna asetukset.", + "SeedRatio": "Jakosuhde", + "SeedTime": "Jakoaika", + "days": "päivää" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index d50b685a5..0b41c6777 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -12,7 +12,7 @@ "Events": "Événements", "Edit": "Modifier", "DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", - "DownloadClients": "Clients de téléchargement", + "DownloadClients": "Clients de télécharg.", "Dates": "Dates", "Date": "Date", "Delete": "Supprimer", @@ -601,5 +601,6 @@ "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe", "PasswordConfirmation": "Confirmation du mot de passe", "NoIndexerCategories": "Aucune catégorie disponible pour cet indexeur", - "InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres" + "InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres", + "DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 81806c233..61ee1636c 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -517,5 +517,12 @@ "AuthenticationMethod": "Hitelesítési Módszer", "AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót", - "DefaultNameCopiedProfile": "{name} - Másolat" + "DefaultNameCopiedProfile": "{name} - Másolat", + "EditConnectionImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}", + "EditIndexerProxyImplementation": "Indexelő hozzáadása - {megvalósítás neve}", + "AddApplicationImplementation": "Csatlakozás hozzáadása - {implementationName}", + "AddIndexerProxyImplementation": "Indexelő hozzáadása - {implementationName}", + "EditIndexerImplementation": "Indexelő hozzáadása - {megvalósítás neve}", + "EditApplicationImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}", + "EditDownloadClientImplementation": "Letöltési kliens hozzáadása – {megvalósítási név}" } diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index 017e0ba5f..d6793551a 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -78,5 +78,8 @@ "AuthenticationRequiredPasswordHelpTextWarning": "Masukkan sandi baru", "AuthenticationRequiredUsernameHelpTextWarning": "Masukkan nama pengguna baru", "AuthenticationRequiredWarning": "Untuk mencegah akses jarak jauh tanpa autentikasi, {appName} kini mewajibkan pengaktifkan autentikasi. Kamu dapat menonaktifkan autentikasi dari jaringan lokal.", - "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Konfirmasi sandi baru" + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Konfirmasi sandi baru", + "days": "hari", + "minutes": "menit", + "Link": "Tautan" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 448d15e90..0d2ac8a14 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -352,5 +352,6 @@ "AuthForm": "フォーム(ログインページ)", "DisabledForLocalAddresses": "ローカルアドレスでは無効", "None": "なし", - "ResetAPIKeyMessageText": "APIキーをリセットしてもよろしいですか?" + "ResetAPIKeyMessageText": "APIキーをリセットしてもよろしいですか?", + "RestartProwlarr": "{appName}を再起動します" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 4d5589aa5..3f0021c50 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -352,5 +352,6 @@ "DisabledForLocalAddresses": "로컬 주소에 대해 비활성화됨", "None": "없음", "ResetAPIKeyMessageText": "API 키를 재설정하시겠습니까?", - "StopSelecting": "선택 취소" + "StopSelecting": "선택 취소", + "RestartProwlarr": "{appName} 다시 시작" } diff --git a/src/NzbDrone.Core/Localization/Core/lv.json b/src/NzbDrone.Core/Localization/Core/lv.json index 86c6096e2..4fd1aab04 100644 --- a/src/NzbDrone.Core/Localization/Core/lv.json +++ b/src/NzbDrone.Core/Localization/Core/lv.json @@ -5,5 +5,16 @@ "Add": "Pievienot", "AddDownloadClient": "Pievienot Lejupielādes Klientu", "AddConnection": "Pievienot Savienojumu", - "AddConnectionImplementation": "Pievienot Savienojumu - {implementationName}" + "AddConnectionImplementation": "Pievienot Savienojumu - {implementationName}", + "New": "Jauns", + "Connect": "Paziņojumi", + "Notification": "Paziņojumi", + "Notifications": "Paziņojumi", + "EditConnectionImplementation": "Pievienot Savienojumu - {implementationName}", + "EditIndexerImplementation": "Pievienot Nosacījumu - {implementationName}", + "EditApplicationImplementation": "Pievienot Savienojumu - {implementationName}", + "AddIndexerImplementation": "Pievienot Nosacījumu - {implementationName}", + "AddIndexerProxyImplementation": "Pievienot Nosacījumu - {implementationName}", + "AddApplicationImplementation": "Pievienot Savienojumu - {implementationName}", + "EditIndexerProxyImplementation": "Pievienot Nosacījumu - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 7e00b2e9f..f84d9629c 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -481,5 +481,6 @@ "AuthenticationRequiredPasswordHelpTextWarning": "Voer een nieuw wachtwoord in", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Bevestig het nieuwe wachtwoord", "AuthenticationRequiredUsernameHelpTextWarning": "Voeg een nieuwe gebruikersnaam in", - "AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen." + "AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.", + "Episode": "aflevering" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index a8003a615..16bb70085 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -419,5 +419,6 @@ "AuthenticationMethod": "Способ авторизации", "AuthenticationRequiredPasswordHelpTextWarning": "Введите новый пароль", "AuthenticationRequiredUsernameHelpTextWarning": "Введите новое имя пользователя", - "RestartProwlarr": "Перезапустить {appName}" + "RestartProwlarr": "Перезапустить {appName}", + "AuthenticationRequiredWarning": "Чтобы предотвратить удаленный доступ без авторизации, {appName} теперь требует, чтобы авторизация была включена. При желании вы можете отключить авторизацию с локальных адресов." } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 5c5d150de..e70c8bb90 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -360,5 +360,14 @@ "Categories": "Kategoriler", "Application": "Uygulamalar", "Episode": "bölüm", - "AddConnection": "Bağlantı Ekle" + "AddConnection": "Bağlantı Ekle", + "AddApplicationImplementation": "Koşul Ekle - {implementationName}", + "AddIndexerImplementation": "Koşul Ekle - {implementationName}", + "AddIndexerProxyImplementation": "Koşul Ekle - {implementationName}", + "EditConnectionImplementation": "Koşul Ekle - {implementationName}", + "AddConnectionImplementation": "Koşul Ekle - {implementationName}", + "RestartProwlarr": "{appName}'ı yeniden başlatın", + "EditApplicationImplementation": "Koşul Ekle - {implementationName}", + "EditIndexerImplementation": "Koşul Ekle - {implementationName}", + "EditIndexerProxyImplementation": "Koşul Ekle - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 936fa31db..4b16abce8 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -368,5 +368,13 @@ "DisabledForLocalAddresses": "Відключено для локальних адрес", "None": "Жодного", "ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?", - "AddConnection": "Редагувати колекцію" + "AddConnection": "Редагувати колекцію", + "RestartProwlarr": "Перезавантажити {appName}", + "EditApplicationImplementation": "Додати умому", + "EditConnectionImplementation": "Додати умому", + "EditIndexerImplementation": "Додати умому", + "AddConnectionImplementation": "Додати умому", + "AddApplicationImplementation": "Додати умому", + "AddIndexerImplementation": "Додати умому", + "AddIndexerProxyImplementation": "Додати умому" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index 62ece9cf4..688deaa15 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -108,5 +108,18 @@ "AddConnection": "新增連接", "AddConnectionImplementation": "新增連接 - {implementationName}", "AddDownloadClientImplementation": "新增下載用戶端 - {implementationName}", - "AddIndexerImplementation": "新增索引 - {implementationName}" + "AddIndexerImplementation": "新增索引 - {implementationName}", + "UnableToAddANewAppProfilePleaseTryAgain": "無法加入新的條件,請重新嘗試。", + "UnableToAddANewApplicationPleaseTryAgain": "無法加入新的條件,請重新嘗試。", + "UnableToAddANewDownloadClientPleaseTryAgain": "無法加入新的條件,請重新嘗試。", + "UnableToAddANewIndexerPleaseTryAgain": "無法加入新的條件,請重新嘗試。", + "UnableToAddANewIndexerProxyPleaseTryAgain": "無法加入新的條件,請重新嘗試。", + "AddApplicationImplementation": "新增連接 - {implementationName}", + "AddIndexerProxyImplementation": "新增索引 - {implementationName}", + "EditConnectionImplementation": "新增連接 - {implementationName}", + "EditDownloadClientImplementation": "新增下載用戶端 - {implementationName}", + "UnableToAddANewNotificationPleaseTryAgain": "無法加入新的條件,請重新嘗試。", + "EditIndexerImplementation": "新增索引 - {implementationName}", + "EditApplicationImplementation": "新增連接 - {implementationName}", + "EditIndexerProxyImplementation": "新增索引 - {implementationName}" } From 0b0a0cfa5beef48a1bb18baf59582504f3748e68 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 10 Jan 2024 22:39:43 +0200 Subject: [PATCH 394/964] New: (HDBits) Filter by origins --- .../Indexers/Definitions/HDBits/HDBitsApi.cs | 2 +- .../HDBits/HDBitsRequestGenerator.cs | 16 +++++++++++++-- .../Definitions/HDBits/HDBitsSettings.cs | 20 +++++++++++++++---- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs index 4d607beb0..c66c6213e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs @@ -17,7 +17,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits public IEnumerable Category { get; set; } public IEnumerable Codec { get; set; } public IEnumerable Medium { get; set; } - public int? Origin { get; set; } + public IEnumerable Origin { get; set; } [JsonProperty(PropertyName = "imdb")] public ImdbInfo ImdbInfo { get; set; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs index 36ddb8e7a..c94595221 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsRequestGenerator.cs @@ -123,8 +123,20 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits query.Username = Settings.Username; query.Passkey = Settings.ApiKey; - query.Codec = Settings.Codecs.ToArray(); - query.Medium = Settings.Mediums.ToArray(); + if (Settings.Codecs.Any()) + { + query.Codec = Settings.Codecs.ToArray(); + } + + if (Settings.Mediums.Any()) + { + query.Medium = Settings.Mediums.ToArray(); + } + + if (Settings.Origins.Any()) + { + query.Origin = Settings.Origins.ToArray(); + } if (searchCriteria.Categories?.Length > 0) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs index d171a7299..d57702179 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs @@ -24,6 +24,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits { Codecs = Array.Empty(); Mediums = Array.Empty(); + Origins = Array.Empty(); FreeleechOnly = false; UseFilenames = true; } @@ -34,16 +35,19 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [FieldDefinition(3, Label = "API Key", HelpText = "Site API Key", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } - [FieldDefinition(4, Label = "Codecs", Type = FieldType.Select, SelectOptions = typeof(HdBitsCodec), Advanced = true, HelpText = "If unspecified, all options are used.")] + [FieldDefinition(4, Label = "Codecs", Type = FieldType.Select, SelectOptions = typeof(HdBitsCodec), HelpText = "If unspecified, all options are used.", Advanced = true)] public IEnumerable Codecs { get; set; } - [FieldDefinition(5, Label = "Mediums", Type = FieldType.Select, SelectOptions = typeof(HdBitsMedium), Advanced = true, HelpText = "If unspecified, all options are used.")] + [FieldDefinition(5, Label = "Mediums", Type = FieldType.Select, SelectOptions = typeof(HdBitsMedium), HelpText = "If unspecified, all options are used.", Advanced = true)] public IEnumerable Mediums { get; set; } - [FieldDefinition(6, Label = "Freeleech Only", Type = FieldType.Checkbox, Advanced = true, HelpText = "Show freeleech releases only")] + [FieldDefinition(6, Label = "Origins", Type = FieldType.Select, SelectOptions = typeof(HdBitsOrigin), HelpText = "If unspecified, all options are used.", Advanced = true)] + public IEnumerable Origins { get; set; } + + [FieldDefinition(7, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech releases only", Advanced = true)] public bool FreeleechOnly { get; set; } - [FieldDefinition(7, Label = "Use Filenames", Type = FieldType.Checkbox, HelpText = "Check this option if you want to use torrent filenames as release titles")] + [FieldDefinition(8, Label = "Use Filenames", Type = FieldType.Checkbox, HelpText = "Check this option if you want to use torrent filenames as release titles")] public bool UseFilenames { get; set; } public override NzbDroneValidationResult Validate() @@ -79,4 +83,12 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [FieldOption("WEB-DL")] WebDl = 6 } + + public enum HdBitsOrigin + { + [FieldOption("Undefined")] + Undefined = 0, + [FieldOption("Internal")] + Internal = 1 + } } From c9b663247c9bf15fa30983b9fcf09f395f7f6426 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Fri, 12 Jan 2024 03:48:34 +0000 Subject: [PATCH 395/964] Empty Torznab ApiKeyWhiteList --- .../Indexers/Definitions/Torznab/TorznabSettings.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Torznab/TorznabSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/Torznab/TorznabSettings.cs index 31b4cac17..ca461467c 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Torznab/TorznabSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Torznab/TorznabSettings.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using System.Text.RegularExpressions; using FluentValidation; @@ -10,10 +11,7 @@ namespace NzbDrone.Core.Indexers.Torznab { public class TorznabSettingsValidator : AbstractValidator { - private static readonly string[] ApiKeyWhiteList = - { - "hd4free.xyz", - }; + private static readonly string[] ApiKeyWhiteList = Array.Empty(); private static bool ShouldHaveApiKey(TorznabSettings settings) { From 7022054dd721ced228edb4f9a4036f5869228ea8 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 12 Jan 2024 14:58:27 +0200 Subject: [PATCH 396/964] New: Indexer ID as column Fixes #1948 --- .../src/Indexer/Index/Table/IndexerIndexRow.css | 6 ++++++ .../Indexer/Index/Table/IndexerIndexRow.css.d.ts | 1 + .../src/Indexer/Index/Table/IndexerIndexRow.tsx | 16 ++++++++++++++-- .../Index/Table/IndexerIndexTableHeader.css | 6 ++++++ .../Index/Table/IndexerIndexTableHeader.css.d.ts | 1 + frontend/src/Indexer/IndexerTitleLink.tsx | 11 +++-------- .../src/Store/Actions/indexerIndexActions.js | 10 ++++++++-- src/NzbDrone.Core/Localization/Core/en.json | 7 ++++--- 8 files changed, 43 insertions(+), 15 deletions(-) diff --git a/frontend/src/Indexer/Index/Table/IndexerIndexRow.css b/frontend/src/Indexer/Index/Table/IndexerIndexRow.css index a0a0daee4..a09d0218e 100644 --- a/frontend/src/Indexer/Index/Table/IndexerIndexRow.css +++ b/frontend/src/Indexer/Index/Table/IndexerIndexRow.css @@ -11,6 +11,12 @@ flex: 0 0 60px; } +.id { + composes: cell; + + flex: 0 0 60px; +} + .sortName { composes: cell; diff --git a/frontend/src/Indexer/Index/Table/IndexerIndexRow.css.d.ts b/frontend/src/Indexer/Index/Table/IndexerIndexRow.css.d.ts index c5d22cf6d..5feb0c35d 100644 --- a/frontend/src/Indexer/Index/Table/IndexerIndexRow.css.d.ts +++ b/frontend/src/Indexer/Index/Table/IndexerIndexRow.css.d.ts @@ -8,6 +8,7 @@ interface CssExports { 'cell': string; 'checkInput': string; 'externalLink': string; + 'id': string; 'minimumSeeders': string; 'packSeedTime': string; 'priority': string; diff --git a/frontend/src/Indexer/Index/Table/IndexerIndexRow.tsx b/frontend/src/Indexer/Index/Table/IndexerIndexRow.tsx index d406750ac..9e83e9b8d 100644 --- a/frontend/src/Indexer/Index/Table/IndexerIndexRow.tsx +++ b/frontend/src/Indexer/Index/Table/IndexerIndexRow.tsx @@ -34,7 +34,7 @@ function IndexerIndexRow(props: IndexerIndexRowProps) { const { indexerId, columns, isSelectMode, onCloneIndexerPress } = props; const { indexer, appProfile, status, longDateFormat, timeFormat } = - useSelector(createIndexerIndexItemSelector(props.indexerId)); + useSelector(createIndexerIndexItemSelector(indexerId)); const { id, @@ -148,12 +148,24 @@ function IndexerIndexRow(props: IndexerIndexRowProps) { ); } + if (name === 'id') { + return ( + + + + ); + } + if (name === 'sortName') { return ( diff --git a/frontend/src/Indexer/Index/Table/IndexerIndexTableHeader.css b/frontend/src/Indexer/Index/Table/IndexerIndexTableHeader.css index 90ad3b0e9..185ba0ef7 100644 --- a/frontend/src/Indexer/Index/Table/IndexerIndexTableHeader.css +++ b/frontend/src/Indexer/Index/Table/IndexerIndexTableHeader.css @@ -4,6 +4,12 @@ flex: 0 0 60px; } +.id { + composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css'; + + flex: 0 0 60px; +} + .sortName { composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css'; diff --git a/frontend/src/Indexer/Index/Table/IndexerIndexTableHeader.css.d.ts b/frontend/src/Indexer/Index/Table/IndexerIndexTableHeader.css.d.ts index 94d39a9bb..f6a54fa25 100644 --- a/frontend/src/Indexer/Index/Table/IndexerIndexTableHeader.css.d.ts +++ b/frontend/src/Indexer/Index/Table/IndexerIndexTableHeader.css.d.ts @@ -5,6 +5,7 @@ interface CssExports { 'added': string; 'appProfileId': string; 'capabilities': string; + 'id': string; 'minimumSeeders': string; 'packSeedTime': string; 'priority': string; diff --git a/frontend/src/Indexer/IndexerTitleLink.tsx b/frontend/src/Indexer/IndexerTitleLink.tsx index 3c22b87f2..be6e32db3 100644 --- a/frontend/src/Indexer/IndexerTitleLink.tsx +++ b/frontend/src/Indexer/IndexerTitleLink.tsx @@ -1,17 +1,16 @@ -import PropTypes from 'prop-types'; import React, { useCallback, useState } from 'react'; import Link from 'Components/Link/Link'; import IndexerInfoModal from './Info/IndexerInfoModal'; import styles from './IndexerTitleLink.css'; interface IndexerTitleLinkProps { - indexerName: string; indexerId: number; + title: string; onCloneIndexerPress(id: number): void; } function IndexerTitleLink(props: IndexerTitleLinkProps) { - const { indexerName, indexerId, onCloneIndexerPress } = props; + const { title, indexerId, onCloneIndexerPress } = props; const [isIndexerInfoModalOpen, setIsIndexerInfoModalOpen] = useState(false); @@ -26,7 +25,7 @@ function IndexerTitleLink(props: IndexerTitleLinkProps) { return (
- {indexerName} + {title} translate('IndexerId'), + label: () => translate('Id'), + isSortable: true, + isVisible: false + }, { name: 'sortName', label: () => translate('IndexerName'), isSortable: true, - isVisible: true, - isModifiable: false + isVisible: true }, { name: 'protocol', diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 171db1112..b232fd33c 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -200,7 +200,7 @@ "EnableInteractiveSearch": "Enable Interactive Search", "EnableInteractiveSearchHelpText": "Will be used when interactive search is used", "EnableRss": "Enable RSS", - "EnableRssHelpText": "Enable Rss feed for Indexer", + "EnableRssHelpText": "Enable RSS feed for Indexer", "EnableSSL": "Enable SSL", "EnableSslHelpText": " Requires restart running as administrator to take effect", "Enabled": "Enabled", @@ -248,7 +248,7 @@ "HomePage": "Home Page", "Host": "Host", "Hostname": "Hostname", - "Id": "Id", + "Id": "ID", "IgnoredAddresses": "Ignored Addresses", "IllRestartLater": "I'll restart later", "Implementation": "Implementation", @@ -266,6 +266,7 @@ "IndexerFlags": "Indexer Flags", "IndexerHealthCheckNoIndexers": "No indexers enabled, {appName} will not return search results", "IndexerHistoryLoadError": "Error loading indexer history", + "IndexerId": "Indexer ID", "IndexerInfo": "Indexer Info", "IndexerLongTermStatusCheckAllClientMessage": "All indexers are unavailable due to failures for more than 6 hours", "IndexerLongTermStatusCheckSingleClientMessage": "Indexers unavailable due to failures for more than 6 hours: {0}", @@ -279,7 +280,7 @@ "IndexerProxyStatusCheckAllClientMessage": "All proxies are unavailable due to failures", "IndexerProxyStatusCheckSingleClientMessage": "Proxies unavailable due to failures: {0}", "IndexerQuery": "Indexer Query", - "IndexerRss": "Indexer Rss", + "IndexerRss": "Indexer RSS", "IndexerSettingsSummary": "Configure various global Indexer settings including Proxies.", "IndexerSite": "Indexer Site", "IndexerStatus": "Indexer Status", From 6201b42fbda4c49b19f7f411fa7c3424ac355635 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 12 Jan 2024 15:26:32 +0200 Subject: [PATCH 397/964] New: Refresh button for indexer stats --- frontend/src/Indexer/Stats/IndexerStats.tsx | 18 ++++++++++++++++-- frontend/src/Search/SearchIndex.js | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/frontend/src/Indexer/Stats/IndexerStats.tsx b/frontend/src/Indexer/Stats/IndexerStats.tsx index 7d72ca5f1..f7b4a9413 100644 --- a/frontend/src/Indexer/Stats/IndexerStats.tsx +++ b/frontend/src/Indexer/Stats/IndexerStats.tsx @@ -12,8 +12,9 @@ import FilterMenu from 'Components/Menu/FilterMenu'; import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; import PageToolbar from 'Components/Page/Toolbar/PageToolbar'; +import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton'; import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection'; -import { align, kinds } from 'Helpers/Props'; +import { align, icons, kinds } from 'Helpers/Props'; import { fetchIndexerStats, setIndexerStatsFilter, @@ -194,6 +195,10 @@ function IndexerStats() { dispatch(fetchIndexerStats()); }, [dispatch]); + const onRefreshPress = useCallback(() => { + dispatch(fetchIndexerStats()); + }, [dispatch]); + const onFilterSelect = useCallback( (value: string) => { dispatch(setIndexerStatsFilter({ selectedFilterKey: value })); @@ -219,8 +224,17 @@ function IndexerStats() { }, 0) ?? 0; return ( - + + + + + + Date: Fri, 12 Jan 2024 22:11:45 +0200 Subject: [PATCH 398/964] Fixed: Filter history by multiple event types in PG --- src/Prowlarr.Api.V1/History/HistoryController.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Prowlarr.Api.V1/History/HistoryController.cs b/src/Prowlarr.Api.V1/History/HistoryController.cs index 19c29834b..35b9be44d 100644 --- a/src/Prowlarr.Api.V1/History/HistoryController.cs +++ b/src/Prowlarr.Api.V1/History/HistoryController.cs @@ -29,8 +29,7 @@ namespace Prowlarr.Api.V1.History if (eventTypes != null && eventTypes.Any()) { - var filterValues = eventTypes.Cast().ToArray(); - pagingSpec.FilterExpressions.Add(v => filterValues.Contains(v.EventType)); + pagingSpec.FilterExpressions.Add(v => eventTypes.Contains((int)v.EventType)); } if (successful.HasValue) From cff24b3fd4d359ce26b8a2d69d909463fd624582 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 14 Jan 2024 07:13:34 +0200 Subject: [PATCH 399/964] Bump version to 1.12.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4b58ebf16..8fd1e661c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.12.1' + majorVersion: '1.12.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 8bddf753bb0f671ac954a3a0c54985ced18acf07 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 14 Jan 2024 12:59:58 -0600 Subject: [PATCH 400/964] Bump Inno version to 6.2.2 (cherry picked from commit c5992ed944b2d4f2f41a08ac407c0f013da61ea6) Build report can get sent before installer finished (cherry picked from commit 60d9aacac64b39fd22d43e8b1ca4641bd60a9b48) --- azure-pipelines.yml | 3 ++- build.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8fd1e661c..42ace6f3c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -17,7 +17,7 @@ variables: sentryUrl: 'https://sentry.servarr.com' dotnetVersion: '6.0.417' nodeVersion: '16.X' - innoVersion: '6.2.0' + innoVersion: '6.2.2' windowsImage: 'windows-2022' linuxImage: 'ubuntu-20.04' macImage: 'macOS-11' @@ -1206,6 +1206,7 @@ stages: - stage: Report_Out dependsOn: - Analyze + - Installer - Unit_Test - Integration - Automation diff --git a/build.sh b/build.sh index d282db86a..5139dba52 100755 --- a/build.sh +++ b/build.sh @@ -254,7 +254,7 @@ InstallInno() ProgressStart "Installing portable Inno Setup" rm -rf _inno - curl -s --output innosetup.exe "https://files.jrsoftware.org/is/6/innosetup-${INNOVERSION:-6.2.0}.exe" + curl -s --output innosetup.exe "https://files.jrsoftware.org/is/6/innosetup-${INNOVERSION:-6.2.2}.exe" mkdir _inno ./innosetup.exe //portable=1 //silent //currentuser //dir=.\\_inno rm innosetup.exe From 2960fc37d9b04b57b3d8f50b1de2a3d5e40220fc Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 16 Jan 2024 04:57:22 +0200 Subject: [PATCH 401/964] Fixed: (FL) Improve error message for service unavailable --- .../Indexers/Definitions/FileList/FileListApi.cs | 5 +++++ .../Indexers/Definitions/FileList/FileListParser.cs | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs index 6f1fdc12e..8b1e4253a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListApi.cs @@ -38,3 +38,8 @@ public class FileListTorrent [JsonPropertyName("small_description")] public string SmallDescription { get; set; } } + +public class FileListErrorResponse +{ + public string Error { get; set; } +} diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs index 9c43e639f..9fee9dd3b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs @@ -28,9 +28,14 @@ public class FileListParser : IParseIndexerResponse throw new IndexerException(indexerResponse, "Unexpected response status {0} code from indexer request", indexerResponse.HttpResponse.StatusCode); } + if (indexerResponse.Content.StartsWith("{\"error2\"") && STJson.TryDeserialize(indexerResponse.Content, out var errorResponse)) + { + throw new IndexerException(indexerResponse, "Unexpected response from indexer request: {0}", errorResponse.Error); + } + if (!indexerResponse.HttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value)) { - throw new IndexerException(indexerResponse, $"Unexpected response header {indexerResponse.HttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}"); + throw new IndexerException(indexerResponse, "Unexpected response header {0} from indexer request, expected {1}", indexerResponse.HttpResponse.Headers.ContentType, HttpAccept.Json.Value); } var releaseInfos = new List(); From ef8e6d774b02ce5ea80a56cd68dcaf68fd4d04de Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 16 Jan 2024 05:10:20 +0200 Subject: [PATCH 402/964] Fix typo --- .../Indexers/Definitions/FileList/FileListParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs index 9fee9dd3b..2d4fa5230 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs @@ -28,7 +28,7 @@ public class FileListParser : IParseIndexerResponse throw new IndexerException(indexerResponse, "Unexpected response status {0} code from indexer request", indexerResponse.HttpResponse.StatusCode); } - if (indexerResponse.Content.StartsWith("{\"error2\"") && STJson.TryDeserialize(indexerResponse.Content, out var errorResponse)) + if (indexerResponse.Content.StartsWith("{\"error\"") && STJson.TryDeserialize(indexerResponse.Content, out var errorResponse)) { throw new IndexerException(indexerResponse, "Unexpected response from indexer request: {0}", errorResponse.Error); } From 7c7114c87ab5debbe1ae224de88a99b64778ad9e Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 16 Jan 2024 02:59:18 +0000 Subject: [PATCH 403/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dani Talens Co-authored-by: Daniele Prevedello Co-authored-by: DimitriDR Co-authored-by: Havok Dan Co-authored-by: Oskari Lavinto Co-authored-by: Trooper57 Co-authored-by: Watashi Co-authored-by: Weblate Co-authored-by: crayon3shawn Co-authored-by: hansaudun Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 4 +- src/NzbDrone.Core/Localization/Core/fi.json | 113 ++++++++++++++---- src/NzbDrone.Core/Localization/Core/fr.json | 5 +- src/NzbDrone.Core/Localization/Core/it.json | 53 ++++---- .../Localization/Core/nb_NO.json | 2 +- src/NzbDrone.Core/Localization/Core/pt.json | 4 +- .../Localization/Core/pt_BR.json | 7 +- .../Localization/Core/zh_TW.json | 6 +- 8 files changed, 139 insertions(+), 55 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index c35e2e992..82c0a7d75 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -423,5 +423,7 @@ "AddApplicationImplementation": "Afegeix una condició - {implementationName}", "AddIndexerProxyImplementation": "Afegeix un indexador - {implementationName}", "Category": "Categoria", - "Clone": "Clona" + "Clone": "Clona", + "Yes": "Si", + "No": "No" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index a50042dce..855a63dbc 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -1,6 +1,6 @@ { "IndexerProxyStatusCheckSingleClientMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi: {0}", - "Logging": "Kirjaus", + "Logging": "Lokikirjaus", "LogLevel": "Lokikirjauksen laajuus", "MovieIndexScrollTop": "Elokuvakirjasto: vieritä ylös", "Apply": "Käytä", @@ -25,11 +25,11 @@ "SettingsTimeFormat": "Kellonajan esitys", "Message": "Viesti", "Seeders": "Jakajat", - "TestAll": "Testaa kaikki", + "TestAll": "Kaikkien testaus", "AddDownloadClient": "Lisää lataustyökalu", "CustomFilters": "Omat suodattimet", "DeleteTag": "Poista tunniste", - "EnableRss": "RSS-syöte", + "EnableRss": "Käytä RSS-syötettä", "Filter": "Suodatus", "Fixed": "Korjattu", "FocusSearchBox": "Kohdista hakukenttä", @@ -40,12 +40,12 @@ "New": "Uutta", "PageSizeHelpText": "Sivukohtainen kohdemäärä.", "Proxy": "Välityspalvelin", - "ProxyBypassFilterHelpText": "Käytä erottimena ',' ja '*.' jokerimerkkinä aliverkkotunnuksille (esim. www.esimerkki.fi,*.esimerkki.fi)", + "ProxyBypassFilterHelpText": "Käytä aliverkkotunnusten erottimena pilkkua (,) ja jokerimerkkinä tähteä ja pistettä (*.). Esimerkkejä: www.esimerkki.fi,*.esimerkki.fi.", "Reddit": "Reddit", "Refresh": "Päivitä", "RefreshMovie": "Päivitä elokuva", "ReleaseBranchCheckOfficialBranchMessage": "\"{0}\" ei ole kelvollinen {appName}-julkaisuhaara ja tämän vuoksi et saa päivityksiä.", - "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen", + "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", "Result": "Tulos", "Settings": "Asetukset", "SettingsLongDateFormat": "Pitkän päiväyksen esitys", @@ -83,7 +83,7 @@ "InteractiveSearch": "Manuaalihaku", "Interval": "Ajoitus", "KeyboardShortcuts": "Pikanäppäimet", - "LastWriteTime": "Edellinen tallennusaika", + "LastWriteTime": "Viimeksi tallennettu", "LogFiles": "Lokitiedostot", "LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulee käyttää vain tilapäisesti.", "Logs": "Lokitiedot", @@ -97,9 +97,9 @@ "ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.", "ProxyCheckFailedToTestMessage": "Välityspalvelintesti epäonnistui: {0}", "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.", - "ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.", + "ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.", "ProxyType": "Välityspalvelimen tyyppi", - "ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.", + "ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.", "Queue": "Jono", "ReadTheWikiForMoreInformation": "Wikistä löydät lisää tietoja", "ReleaseStatus": "Julkaisutila", @@ -122,8 +122,8 @@ "TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.", "TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.", "Tasks": "Tehtävät", - "Test": "Kokeile", - "TestAllClients": "Testaa kaikki lataustyökalut", + "Test": "Testaa", + "TestAllClients": "Lataustyökalujen testaus", "Time": "Aika", "Title": "Nimike", "Tomorrow": "Huomenna", @@ -258,7 +258,7 @@ "Error": "Virhe", "ErrorLoadingContents": "Virhe ladattaessa sisältöjä", "Events": "Tapahtumat", - "ExistingTag": "Olemassa oleva tunniste", + "ExistingTag": "Tunniste on jo olemassa", "Failed": "Epäonnistui", "Filename": "Tiedostonimi", "Files": "Tiedostot", @@ -292,7 +292,7 @@ "NoUpdatesAreAvailable": "Päivityksiä ei ole saatavilla", "OAuthPopupMessage": "Selaimesi estää ponnahdukset", "Ok": "Ok", - "OnHealthIssueHelpText": "Kuntoon liittyvä ongelma", + "OnHealthIssueHelpText": "Vakausongelmat", "OpenBrowserOnStart": "Avaa selain käynnistettäessä", "OpenThisModal": "Avaa tämä ikkuna", "Options": "Asetukset", @@ -328,11 +328,11 @@ "UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui", "AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/manuaali).", "IndexerQuery": "Tietolähteen kysely", - "IndexerRss": "Tietolähteen RSS-syöte", + "IndexerRss": "Tietolähteen RSS", "SearchIndexers": "Etsi tietolähteistä", "AddRemoveOnly": "Ainoastaan lisää/poista", "IndexerVipCheckExpiredClientMessage": "Tietolähteen VIP-edut ovat erääntyneet: {0}", - "MaintenanceRelease": "Huoltojulkaisu: Korjauksia ja muita parannuksia. Lue lisää Githubin historiasta muutoshistoriasta.", + "MaintenanceRelease": "Huoltojulkaisu: korjauksia ja muita parannuksia. Lue lisää Githubin muutoshistoriasta.", "Query": "Kysely", "Redirect": "Uudelleenohjaus", "RestartProwlarr": "Käynnistä {appName} uudelleen", @@ -355,7 +355,7 @@ "ConnectSettingsSummary": "Ilmoitukset, kuten viestintä mediapalvelimille ja soittimille, sekä omat komentosarjat.", "DevelopmentSettings": "Kehittäjäasetukset", "Description": "Kuvaus", - "Id": "Tunniste", + "Id": "ID", "SettingsConsoleLogLevel": "Valvontalokin laajuus", "SettingsFilterSentryEvents": "Suodata analytiikan tapahtumia", "SettingsFilterSentryEventsHelpText": "Suodata tunnetut käyttäjävirheet pois analytiikkalähetyksistä", @@ -373,7 +373,7 @@ "IndexerProxies": "Tiedonhaun välityspalvelimet", "IndexerAuth": "Tietolähteen todennus", "Notifications": "Kytkennät", - "NotificationTriggersHelpText": "Valitse tapahtumat, jotka aiheuttavat ilmoituksen.", + "NotificationTriggersHelpText": "Valitse tämän ilmoituksen laukaisevat tapahtumat.", "Stats": "Tilastot", "UnableToLoadDevelopmentSettings": "Kehittäjäasetusten lataus epäonnistui", "AppSettingsSummary": "Sovellukset ja asetukset, joilla määritetään miten {appName} viestii PVR-sovellustesi kanssa.", @@ -387,10 +387,10 @@ "TvSearch": "Etsi televisiosarjoja", "Filters": "Suodattimet", "OnGrab": "Kun julkaisu kaapataan", - "OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma", + "OnHealthIssue": "Vakausongelmat", "HistoryCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattityhjennyksen käytöstä.", "HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.", - "TestAllIndexers": "Testaa tietolähteet", + "TestAllIndexers": "Tietolähteiden testaus", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa", "Categories": "Kategoriat", "Database": "Tietokanta", @@ -434,12 +434,12 @@ "AddSyncProfile": "Lisää synkronointiprofiili", "EditSyncProfile": "Muokkaa synkronointiprofiilia", "InstanceName": "Instanssin nimi", - "InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa", + "InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa.", "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.", "Duration": "Kesto", "ElapsedTime": "Kulunut aika", "EnabledRedirected": "Kulunut, uudelleenohjattu", - "Ended": "Päättyi", + "Ended": "Päättynyt", "GrabTitle": "Kaappaa nimike", "LastExecution": "Edellinen suoritus", "LastDuration": "Edellinen kesto", @@ -496,7 +496,7 @@ "NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {0}", "AuthBasic": "Perus (ponnahdusikkuna)", "AuthForm": "Lomake (kirjautumissivu)", - "DisabledForLocalAddresses": "Ei käytetä paikallisille osoitteille", + "DisabledForLocalAddresses": "Ei käytössä paikallisille osoitteille", "None": "Ei mitään", "ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?", "TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdekaappausten kokonaismäärä", @@ -524,7 +524,7 @@ "StopSelecting": "Lopeta valitseminen", "EditConnectionImplementation": "Muokataan kytköstä - {implementationName}", "AddConnectionImplementation": "Lisätään kytköstä - {implementationName}", - "DownloadClientQbittorrentSettingsContentLayout": "Sisällön asettelu", + "DownloadClientQbittorrentSettingsContentLayout": "Sisällön rakenne", "EditIndexerImplementation": "Muokataan tietolähdettä - {implementationName}", "AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus", "DefaultNameCopiedProfile": "{name} - Kopioi", @@ -534,14 +534,75 @@ "AuthenticationRequiredHelpText": "Valitse mitkä pyynnöt vaativat tunnistautumisen. Älä muuta, jos et ymmärrä riskejä.", "TotalUserAgentGrabs": "Käyttäjäagentin kaappausten kokonaismäärä", "AuthenticationMethodHelpTextWarning": "Valitse sopiva tunnistautumistapa", - "AuthenticationRequiredPasswordHelpTextWarning": "Syötä salasana", + "AuthenticationRequiredPasswordHelpTextWarning": "Syötä uusi salasana", "AuthenticationMethod": "Tunnistautumistapa", "Clone": "Monista", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Vahvista uusi salasana", - "EditApplicationImplementation": "Muokataan kytköstä - {implementationName}", - "AddApplicationImplementation": "Lisätään kytköstä - {implementationName}", + "EditApplicationImplementation": "Muokataan sovellusta - {implementationName}", + "AddApplicationImplementation": "Lisätään sovellusta - {implementationName}", "InvalidUILanguage": "Käytöliittymän kielivalinta on virheellinen. Korjaa se ja tallenna asetukset.", "SeedRatio": "Jakosuhde", "SeedTime": "Jakoaika", - "days": "päivää" + "days": "päivää", + "HistoryDetails": "Historiatiedot", + "IndexerDisabled": "Tietolähde ei ole käytössä", + "AdvancedSettingsShownClickToHide": "Lisäasetukset näytetään, piilota painamalla tästä", + "AdvancedSettingsHiddenClickToShow": "Lisäasetukset on piilotettu, näytä painamalla tästä", + "AppsMinimumSeeders": "Sovellusten vähimmäisjakajat", + "BasicSearch": "Perushaku", + "CountApplicationsSelected": "{count} sovellus(ta) on valittu", + "DeleteSelectedApplications": "Poista valitut sovellukset", + "DeleteSelectedIndexer": "Poista valittu tietolähde", + "DeleteSelectedIndexers": "Poista valitut tietolähteet", + "Implementation": "Toteutus", + "IndexerCategories": "Tietolähdekategoriat", + "IndexerStatus": "Tietolähteen tila", + "ManageApplications": "Hallitse sovelluksia", + "NewznabUrl": "Newznab URL", + "PackSeedTime": "Koosteen jakoaika", + "PackSeedTimeHelpText": "Aika, joka koostepaketin (kuten sarjan tuotantokauden tai esittäjän diskografian) sisältävää torrentia tulee jakaa. Käytä sovelluksen oletusta jättämällä tyhjäksi.", + "QueryType": "Kyselyn tyyppi", + "SearchAllIndexers": "Etsi kaikista tietolähteistä", + "SeedRatioHelpText": "Jakosuhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.", + "TorznabUrl": "Torznab URL", + "ApiKeyValidationHealthCheckMessage": "Muuta API-avaimesi ainakin {0} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.", + "OnHealthRestored": "Terveystilan vakautuessa", + "OnHealthRestoredHelpText": "Terveystilan vakautuessa", + "TotalHostQueries": "Isännän kyselyiden kokonaismäärä", + "TotalIndexerQueries": "Tietolähteen kyselyiden kokonaismäärä", + "GoToApplication": "Siirry sovellukseen", + "AreYouSureYouWantToDeleteIndexer": "Haluatko varmasti poistaa tietolähteen \"{name}\" sovelluksesta {appName}?", + "AuthQueries": "Todennuskyselyt", + "ApplicationTagsHelpText": "Sovellukseen synkronoidaan joko tunnisteettomat tietolähteet tai vastaavilla tunnisteilla merkityt tietolähteet.", + "ApplicationTagsHelpTextWarning": "Tunnisteita tulee käyttää harkiten, koska niillä voi olla odottamattomia vaikutuksia. Tunnisteella merkittyyn sovellukseen synkronoidaan vain samalla tunnisteella merkityt tietolähteet.", + "AverageResponseTimesMs": "Tietolähteiden keskimääräiset vasteajat (ms)", + "CountIndexersAvailable": "{count} tietolähde(ttä) on käytettävissä", + "FoundCountReleases": "Löytyi {itemCount} julkaisua", + "IndexerTagsHelpTextWarning": "Tunnisteita tulee käyttää harkiten, koska niillä voi olla odottamattomia vaikutuksia. Tunnisteella merkitty tietolähde synkronoidaan vain samalla tunnisteella merkittyyn sovellukseen.", + "LastFailure": "Edellinen virhe", + "SelectedCountOfCountReleases": "Valittu {selectedCount}/{itemCount} julkaisua", + "TotalQueries": "Kyselyiden kokonaismäärä", + "RssFeed": "RSS-syöte", + "VipExpiration": "VIP-erääntyy", + "DisabledUntil": "Poistettu käytöstä kunnes", + "AddApplication": "Lisää sovellus", + "AddCategory": "Lisää kategoria", + "EditCategory": "Muokkaa kategoriaa", + "IndexerId": "Tietolähteen ID", + "ActiveIndexers": "Aktiiviset tietolähteet", + "NoIndexerCategories": "Tietolähteelle ei löytynyt kategorioita", + "ActiveApps": "Aktiiviset sovellukset", + "NoIndexerHistory": "Tietolähteelle ei löytynyt historiaa", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Määrittää käytetäänkö qBittorrentista määritettyä rakennetta, torrentin alkuperäistä rakennetta vai luodaanko uusi alikansio (qBittorrent 4.3.2+).", + "External": "Ulkoinen", + "IndexerFailureRate": "Tietolähteen virhetaajuus", + "IndexerHistoryLoadError": "Virhe ladattaessa tietolähteen historiaa", + "InitialFailure": "Alkuperäinen virhe", + "PasswordConfirmation": "Salasanan vahvistus", + "RepeatSearch": "Toista haku", + "SearchCountIndexers": "Etsi {count} tietolähteestä", + "SearchQueries": "Hakukyselyt", + "SeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.", + "RssQueries": "RSS-kyselyt", + "TotalUserAgentQueries": "Käyttäjäagentin kyselyiden kokonaismäärä" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 0b41c6777..7fc993916 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -158,7 +158,7 @@ "Enable": "Activer", "DownloadClientSettings": "Télécharger les paramètres client", "Docker": "Docker", - "DeleteTag": "Supprimer le tag", + "DeleteTag": "Supprimer l'étiquette", "DeleteNotification": "Supprimer la notification", "DeleteDownloadClient": "Supprimer le client de téléchargement", "DeleteBackup": "Supprimer la sauvegarde", @@ -602,5 +602,6 @@ "PasswordConfirmation": "Confirmation du mot de passe", "NoIndexerCategories": "Aucune catégorie disponible pour cet indexeur", "InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres", - "DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu" + "DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 91902561c..6296e3e8a 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -17,7 +17,7 @@ "Grabbed": "Preso", "Clear": "Cancella", "AppDataLocationHealthCheckMessage": "L'aggiornamento non sarà possibile per evitare la cancellazione di AppData durante l'aggiornamento", - "Analytics": "Analitica", + "Analytics": "Statistiche", "Added": "Aggiunto", "About": "Info", "Updates": "Aggiornamenti", @@ -76,7 +76,7 @@ "Date": "Data", "CustomFilters": "Filtri Personalizzati", "Connect": "Notifiche", - "Connections": "Collegamenti", + "Connections": "Connessioni", "ConnectSettingsSummary": "Notifiche e script personalizzati", "BackupNow": "Esegui backup ora", "Backup": "Backup", @@ -84,28 +84,28 @@ "Actions": "Azioni", "Age": "Età", "Close": "Chiudi", - "CloneProfile": "Clona il Profilo", - "ClientPriority": "Priorità del Client", + "CloneProfile": "Copia Profilo", + "ClientPriority": "Priorità Client", "ChangeHasNotBeenSavedYet": "Il cambio non è stato ancora salvato", "CertificateValidationHelpText": "Cambia quanto è rigorosa la convalida del certificato HTTPS", "CertificateValidation": "Convalida del Certificato", "Cancel": "Annulla", "BypassProxyForLocalAddresses": "Evita il Proxy per gli Indirizzi Locali", "Branch": "Ramo", - "BindAddressHelpText": "Indirizzo IP valido, localhost o '*' per tutte le interfacce di rete", - "BindAddress": "Indirizzo di Bind", + "BindAddressHelpText": "Indirizzi IP validi, localhost o '*' per tutte le interfacce", + "BindAddress": "Indirizzo di Ascolto", "Backups": "Backups", - "BackupRetentionHelpText": "I backup automatici più vecchi del periodo di conservazione verranno eliminati automaticamente", - "BackupIntervalHelpText": "Intervallo tra i backup automatici", + "BackupRetentionHelpText": "I backup più vecchi del periodo specificato saranno cancellati automaticamente", + "BackupIntervalHelpText": "Intervallo fra i backup automatici", "BackupFolderHelpText": "I percorsi relativi saranno nella cartella AppData di {appName}", "Automatic": "Automatico", - "AuthenticationMethodHelpText": "Richiedi Nome Utente e Password per accedere a {appName}", + "AuthenticationMethodHelpText": "Inserisci Username e Password per accedere a {appName}", "Authentication": "Autenticazione", "ApplyTags": "Applica Etichette", "Apply": "Applica", "AppDataDirectory": "Cartella AppData", "ApiKey": "Chiave API", - "AnalyticsEnabledHelpText": "Invia informazioni anonime sull'uso e sugli errori ai server di {appName}. Questo include informazioni sul tuo browser, quali pagine della WebUI di {appName} utilizzi, la segnalazione di errori così come il sistema operativo e la versione di runtime. Useremo queste informazioni per dare priorità alle funzionalità e alle correzioni dei bug.", + "AnalyticsEnabledHelpText": "Inviare informazioni anonime sull'utilizzo e sugli errori ai server di {appName}. Ciò include informazioni sul tuo browser, quali pagine dell'interfaccia di {appName} usi, la segnalazione di errori così come la versione del sistema operativo e del runtime. Utilizzeremo queste informazioni per dare priorità alle nuove funzioni e alle correzioni di bug.", "Warn": "Attenzione", "Type": "Tipo", "Title": "Titolo", @@ -136,11 +136,11 @@ "DownloadClientSettings": "Impostazioni del Client di Download", "Docker": "Docker", "DeleteTag": "Elimina Etichetta", - "DeleteNotification": "Cancella la Notifica", - "DeleteDownloadClient": "Cancella il Client di Download", + "DeleteNotification": "Cancella Notifica", + "DeleteDownloadClient": "Cancella Client di Download", "DeleteBackup": "Cancella Backup", "DBMigration": "Migrazione DB", - "ConnectSettings": "Impostazioni di Connessione", + "ConnectSettings": "Impostazioni Collegamento", "ConnectionLost": "Connessione Persa", "Component": "Componente", "Columns": "Colonne", @@ -222,7 +222,7 @@ "DeleteTagMessageText": "Sei sicuro di voler eliminare l'etichetta '{0}'?", "DeleteNotificationMessageText": "Sei sicuro di voler eliminare la notifica '{0}'?", "DeleteDownloadClientMessageText": "Sei sicuro di voler eliminare il client di download '{0}'?", - "BeforeUpdate": "Prima di aggiornare", + "BeforeUpdate": "Prima dell'aggiornamento", "Usenet": "Usenet", "Uptime": "Tempo di attività", "YesCancel": "Si, Cancella", @@ -232,7 +232,7 @@ "UrlBaseHelpText": "Per il supporto al reverse proxy, di default è vuoto", "URLBase": "Base Url", "UpdateScriptPathHelpText": "Percorso verso uno script personalizzato che prende un pacchetto di aggiornamento estratto e gestisce il resto del processo di aggiornamento", - "UpdateMechanismHelpText": "Usa l'aggiornamento integrato in {appName} o uno script", + "UpdateMechanismHelpText": "Usa il sistema di aggiornamento interno di {appName} o uno script", "UpdateAutomaticallyHelpText": "Scarica e installa automaticamente gli aggiornamenti. Sarai comunque in grado in installarli da Sistema: Aggiornamenti", "UnsavedChanges": "Modifiche non salvate", "UnableToLoadUISettings": "Impossibile caricare le impostazioni interfaccia", @@ -293,7 +293,7 @@ "EnableIndexer": "Abilita Indicizzatore", "AddNewIndexer": "Aggiungi nuovo Indicizzatore", "IndexerAuth": "Autenticazione dell'Indicizzatore", - "AddDownloadClient": "Aggiungi Downloader", + "AddDownloadClient": "Aggiungi Client di Download", "Category": "Categoria", "ClearHistory": "Cancella cronologia", "ClearHistoryMessageText": "Sei sicuro di voler cancellare tutta la cronologia di {appName}?", @@ -451,8 +451,8 @@ "Started": "Iniziato", "AreYouSureYouWantToDeleteCategory": "Vuoi davvero cancellare la categoria mappata?", "AuthenticationRequired": "Autenticazione richiesta", - "AuthenticationRequiredHelpText": "Cambia a quali richieste l'autenticazione verrà richiesta. Non cambiare se non comprendi i rischi.", - "AuthenticationRequiredWarning": "Per impedire accessi remoti senza autenticazione, {appName} ora richiede che l'autenticazione venga attivata. Puoi disattivare l'autenticazione per indirizzi privati.", + "AuthenticationRequiredHelpText": "Cambia a quali richieste l'autenticazione verrà chiesta. Non cambiare se non comprendi i rischi.", + "AuthenticationRequiredWarning": "Per prevenire accessi remoti non autorizzati, {appName} da ora richiede che l'autenticazione sia abilitata. Opzionalmente puoi disabilitare l'autenticazione per gli indirizzi di rete locali.", "DeleteClientCategory": "Cancella categoria del client di download", "DownloadClientCategory": "Categoria client di download", "MappedCategories": "Categorie mappate", @@ -498,9 +498,22 @@ "AddConnection": "Aggiungi Connessione", "NotificationStatusAllClientHealthCheckMessage": "Tutte le applicazioni non sono disponibili a causa di errori", "NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {0}", - "AuthForm": "Moduli (Pagina di Accesso)", + "AuthForm": "Form (Pagina di Login)", "DisabledForLocalAddresses": "Disabilitato per Indirizzi Locali", "None": "Nessuna", "ResetAPIKeyMessageText": "Sei sicuro di voler reimpostare la tua chiave API?", - "AuthBasic": "Base (Popup del Browser)" + "AuthBasic": "Base (Popup del Browser)", + "EditSelectedDownloadClients": "Modifica i Client di Download Selezionati", + "AppUpdated": "{appName} Aggiornato", + "AddCustomFilter": "Aggiungi Filtro Personalizzato", + "AddConnectionImplementation": "Aggiungi Connessione - {implementationName}", + "AddDownloadClientImplementation": "Aggiungi un Client di Download - {implementationName}", + "AddIndexerImplementation": "Aggiungi indicizzatore - {implementationName}", + "AuthenticationRequiredUsernameHelpTextWarning": "Inserisci username", + "AuthenticationMethod": "Metodo di Autenticazione", + "AuthenticationMethodHelpTextWarning": "Selezione un metodo di autenticazione valido", + "AuthenticationRequiredPasswordHelpTextWarning": "Inserisci la nuova password", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Conferma la nuova password", + "Clone": "Copia", + "DefaultNameCopiedProfile": "{name} - Copia" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index a51be2d64..352b409d1 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -1,5 +1,5 @@ { - "Add": "Legge til", + "Add": "Legg til", "AddDownloadClient": "Legg til nedlastingsklient", "Added": "La til", "AddingTag": "Legger til tag", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 047faa279..d90fbd526 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -473,5 +473,7 @@ "Album": "álbum", "Artist": "artista", "DefaultNameCopiedProfile": "{name} - Copiar", - "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmar nova senha" + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmar nova senha", + "AdvancedSettingsHiddenClickToShow": "Definições avançadas ocultas, clique para mostrar", + "AddCategory": "Adicionar Categoria" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 6160980f7..af2540321 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -110,7 +110,7 @@ "DeleteIndexerProxyMessageText": "Tem certeza de que deseja excluir o proxy do indexador '{name}'?", "DeleteNotification": "Excluir notificação", "DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?", - "DeleteTag": "Excluir tag", + "DeleteTag": "Excluir Etiqueta", "DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?", "Description": "Descrição", "Details": "Detalhes", @@ -139,7 +139,7 @@ "EnableInteractiveSearch": "Ativar pesquisa interativa", "EnableInteractiveSearchHelpText": "Será usado com a pesquisa interativa", "EnableRss": "Habilitar RSS", - "EnableRssHelpText": "Habilitar feed RSS para o indexador", + "EnableRssHelpText": "Habilitar feed RSS para indexador", "EnableSSL": "Habilitar SSL", "EnableSslHelpText": " Requer a reinicialização com a execução como administrador para fazer efeito", "Enabled": "Habilitado", @@ -603,5 +603,6 @@ "PasswordConfirmation": "Confirmação Da Senha", "InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Seja para usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)", - "DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo" + "DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo", + "IndexerId": "ID do Indexador" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index 688deaa15..6d982d380 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -121,5 +121,9 @@ "UnableToAddANewNotificationPleaseTryAgain": "無法加入新的條件,請重新嘗試。", "EditIndexerImplementation": "新增索引 - {implementationName}", "EditApplicationImplementation": "新增連接 - {implementationName}", - "EditIndexerProxyImplementation": "新增索引 - {implementationName}" + "EditIndexerProxyImplementation": "新增索引 - {implementationName}", + "ApplyTagsHelpTextAdd": "加入:將標籤加入已存在的標籤清單", + "AppUpdated": "{appName}已更新", + "AppUpdatedVersion": "重新載入", + "ApplyChanges": "應用" } From 01f39302110bec3ea6787e73321ba6b9206971cc Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Tue, 16 Jan 2024 06:53:21 +0100 Subject: [PATCH 404/964] Sort Custom Filters (cherry picked from commit e4b5d559df2d5f3d55e16aae5922509e84f31e64) --- .../CustomFiltersModalContent.js | 34 ++++++++++--------- .../src/Components/Menu/FilterMenuContent.js | 32 ++++++++++------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/frontend/src/Components/Filter/CustomFilters/CustomFiltersModalContent.js b/frontend/src/Components/Filter/CustomFilters/CustomFiltersModalContent.js index 07660426e..28eb91599 100644 --- a/frontend/src/Components/Filter/CustomFilters/CustomFiltersModalContent.js +++ b/frontend/src/Components/Filter/CustomFilters/CustomFiltersModalContent.js @@ -30,22 +30,24 @@ function CustomFiltersModalContent(props) { { - customFilters.map((customFilter) => { - return ( - - ); - }) + customFilters + .sort((a, b) => a.label.localeCompare(b.label)) + .map((customFilter) => { + return ( + + ); + }) }
diff --git a/frontend/src/Components/Menu/FilterMenuContent.js b/frontend/src/Components/Menu/FilterMenuContent.js index 516fbb648..4ee406224 100644 --- a/frontend/src/Components/Menu/FilterMenuContent.js +++ b/frontend/src/Components/Menu/FilterMenuContent.js @@ -40,18 +40,26 @@ class FilterMenuContent extends Component { } { - customFilters.map((filter) => { - return ( - - {filter.label} - - ); - }) + customFilters.length > 0 ? + : + null + } + + { + customFilters + .sort((a, b) => a.label.localeCompare(b.label)) + .map((filter) => { + return ( + + {filter.label} + + ); + }) } { From 4f28d583d7a47a446de7d27623a10b30b23b9f10 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 17 Jan 2024 07:40:17 +0200 Subject: [PATCH 405/964] Throw download as failed for invalid magnet links --- src/NzbDrone.Core/Download/TorrentClientBase.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Download/TorrentClientBase.cs b/src/NzbDrone.Core/Download/TorrentClientBase.cs index d9d7f7133..26db20b44 100644 --- a/src/NzbDrone.Core/Download/TorrentClientBase.cs +++ b/src/NzbDrone.Core/Download/TorrentClientBase.cs @@ -171,9 +171,7 @@ namespace NzbDrone.Core.Download } catch (FormatException ex) { - _logger.Error(ex, "Failed to parse magnetlink for release '{0}': '{1}'", release.Title, magnetUrl); - - return null; + throw new ReleaseDownloadException("Failed to parse magnetlink for release '{0}': '{1}'", ex, release.Title, magnetUrl); } if (hash != null) From 86124d4319dff6a38d867ae55a70c291c5b18834 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 12 Jan 2024 23:51:35 -0800 Subject: [PATCH 406/964] New: Optional directory setting for Aria2 (cherry picked from commit fd17df0dd03a5feb088c3241a247eac20f0e8c6c) --- .../Http/XmlRpcRequestBuilder.cs | 4 ++++ .../Download/Clients/Aria2/Aria2Proxy.cs | 19 +++++++++++++++++-- .../Download/Clients/Aria2/Aria2Settings.cs | 3 +++ src/NzbDrone.Core/Localization/Core/en.json | 1 + 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common/Http/XmlRpcRequestBuilder.cs b/src/NzbDrone.Common/Http/XmlRpcRequestBuilder.cs index e03161702..e7ab0126d 100644 --- a/src/NzbDrone.Common/Http/XmlRpcRequestBuilder.cs +++ b/src/NzbDrone.Common/Http/XmlRpcRequestBuilder.cs @@ -92,6 +92,10 @@ namespace NzbDrone.Common.Http { data = new XElement("base64", Convert.ToBase64String(bytes)); } + else if (value is Dictionary d) + { + data = new XElement("struct", d.Select(p => new XElement("member", new XElement("name", p.Key), new XElement("value", p.Value)))); + } else { throw new InvalidOperationException($"Unhandled argument type {value.GetType().Name}"); diff --git a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Proxy.cs b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Proxy.cs index 9cc2d9793..74f653f76 100644 --- a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Proxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Proxy.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Xml.Linq; using System.Xml.XPath; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Download.Extensions; @@ -95,8 +96,14 @@ namespace NzbDrone.Core.Download.Clients.Aria2 public string AddUri(Aria2Settings settings, string magnet) { - var response = ExecuteRequest(settings, "aria2.addUri", GetToken(settings), new List { magnet }); + var options = new Dictionary(); + if (settings.Directory.IsNotNullOrWhiteSpace()) + { + options.Add("dir", settings.Directory); + } + + var response = ExecuteRequest(settings, "aria2.addUri", GetToken(settings), new List { magnet }, options); var gid = response.GetStringResponse(); return gid; @@ -104,8 +111,16 @@ namespace NzbDrone.Core.Download.Clients.Aria2 public string AddTorrent(Aria2Settings settings, byte[] torrent) { - var response = ExecuteRequest(settings, "aria2.addTorrent", GetToken(settings), torrent); + // Aria2's second parameter is an array of URIs and needs to be sent if options are provided, this satisfies that requirement. + var emptyListOfUris = new List(); + var options = new Dictionary(); + if (settings.Directory.IsNotNullOrWhiteSpace()) + { + options.Add("dir", settings.Directory); + } + + var response = ExecuteRequest(settings, "aria2.addTorrent", GetToken(settings), torrent, emptyListOfUris, options); var gid = response.GetStringResponse(); return gid; diff --git a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Settings.cs b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Settings.cs index e88bc4cc1..82e4d93ab 100644 --- a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Settings.cs +++ b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Settings.cs @@ -41,6 +41,9 @@ namespace NzbDrone.Core.Download.Clients.Aria2 [FieldDefinition(4, Label = "Secret token", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string SecretToken { get; set; } + [FieldDefinition(5, Label = "Directory", Type = FieldType.Textbox, HelpText = "DownloadClientAriaSettingsDirectoryHelpText")] + public string Directory { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index b232fd33c..579bf9954 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -171,6 +171,7 @@ "Docker": "Docker", "Donations": "Donations", "DownloadClient": "Download Client", + "DownloadClientAriaSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Aria2 location", "DownloadClientCategory": "Download Client Category", "DownloadClientPriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.", "DownloadClientQbittorrentSettingsContentLayout": "Content Layout", From 850315ad1c6e70fe276cd7a748457d6f718b5a70 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 17 Jan 2024 10:44:51 +0200 Subject: [PATCH 407/964] Fixed: (GGn) Improve titles and allow only torrents --- .../Indexers/Definitions/GazelleGames.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs index 115d871e6..da9025a87 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs @@ -394,7 +394,7 @@ namespace NzbDrone.Core.Indexers.Definitions var torrents = groupTorrents .ToObject>(JsonSerializer.Create(Json.GetSerializerSettings())) - .Where(t => t.Value.TorrentType != "Link") + .Where(t => t.Value.TorrentType.ToUpperInvariant() == "TORRENT") .ToList(); var categories = group.Value.Artists @@ -470,6 +470,11 @@ namespace NzbDrone.Core.Indexers.Definitions flags.AddIfNotNull(torrent.Region); flags.AddIfNotNull(torrent.Miscellaneous); + if (torrent.Dupable == 1) + { + flags.Add("Trumpable"); + } + flags = flags.Where(x => x.IsNotNullOrWhiteSpace()).ToList(); if (flags.Any()) @@ -477,6 +482,11 @@ namespace NzbDrone.Core.Indexers.Definitions title += $" [{string.Join(" / ", flags)}]"; } + if (torrent.GameDoxType.IsNotNullOrWhiteSpace()) + { + title += $" [{torrent.GameDoxType.Trim()}]"; + } + return title; } @@ -570,6 +580,7 @@ namespace NzbDrone.Core.Indexers.Definitions public string ReleaseTitle { get; set; } public string Miscellaneous { get; set; } public int Scene { get; set; } + public int Dupable { get; set; } public DateTime Time { get; set; } public string TorrentType { get; set; } public int FileCount { get; set; } @@ -580,6 +591,9 @@ namespace NzbDrone.Core.Indexers.Definitions public GazelleGamesFreeTorrent FreeTorrent { get; set; } public bool PersonalFL { get; set; } public bool LowSeedFL { get; set; } + + [JsonProperty("GameDOXType")] + public string GameDoxType { get; set; } } public class GazelleGamesUserResponse From 49857693c05f5bac902cb5cd211aff7840469770 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 17 Jan 2024 11:14:00 +0200 Subject: [PATCH 408/964] Fix count in GGn fixture after allowing only torrents --- .../IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs index 8db0e9ab8..4bc704ccd 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/GazelleGamesTests/GazelleGamesFixture.cs @@ -40,7 +40,7 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases; - releases.Should().HaveCount(1463); + releases.Should().HaveCount(1462); releases.First().Should().BeOfType(); var torrentInfo = releases.First() as TorrentInfo; From 9668e91b21ac7b664fee1204e2a5d04e7c398e03 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 17 Jan 2024 07:08:46 +0000 Subject: [PATCH 409/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dani Talens Co-authored-by: Deleted User Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 20 ++++++++++---------- src/NzbDrone.Core/Localization/Core/pl.json | 4 +++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 82c0a7d75..31c919d70 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -19,7 +19,7 @@ "ScriptPath": "Camí de l'script", "Search": "Cerca", "Files": "Fitxers", - "SettingsEnableColorImpairedModeHelpText": "Estil alternat per permetre als usuaris amb problemes de color distingir millor la informació codificada per colors", + "SettingsEnableColorImpairedModeHelpText": "Estil alternat per a permetre als usuaris amb problemes de color distingir millor la informació codificada per colors", "TagIsNotUsedAndCanBeDeleted": "L'etiqueta no està en ús i es pot suprimir", "TagsSettingsSummary": "Consulta totes les etiquetes i com s'utilitzen. Les etiquetes no utilitzades es poden eliminar", "Tasks": "Tasques", @@ -37,7 +37,7 @@ "Analytics": "Anàlisi", "ApiKey": "Clau API", "AppDataDirectory": "Directori AppData", - "AppDataLocationHealthCheckMessage": "No es podrà actualitzar per evitar que s'eliminin AppData a l'actualització", + "AppDataLocationHealthCheckMessage": "No es podrà actualitzar per a evitar que s'eliminin AppData a l'actualització", "Authentication": "Autenticació", "Torrents": "Torrents", "Type": "Tipus", @@ -78,7 +78,7 @@ "Reddit": "Reddit", "System": "Sistema", "Username": "Nom d'usuari", - "Duration": "durada", + "Duration": "Durada", "EditIndexer": "Edita l'indexador", "EnableAutomaticSearch": "Activa la cerca automàtica", "Enabled": "Habilitat", @@ -251,7 +251,7 @@ "Level": "Nivell", "LogFiles": "Fitxers de registre", "Logging": "Registre", - "MappedDrivesRunningAsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per obtenir més informació", + "MappedDrivesRunningAsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per a obtenir més informació", "Mechanism": "Mecanisme", "MIA": "MIA", "Wiki": "Wiki", @@ -300,7 +300,7 @@ "View": "Visualitza", "Yesterday": "Ahir", "ApplicationStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}", - "AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió de l'entorn d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.", + "AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió de l'entorn d'execució. Utilitzarem aquesta informació per a prioritzar les funcions i les correccions d'errors.", "HistoryCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament", "UnableToAddANewAppProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.", "BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData de {appName}", @@ -312,11 +312,11 @@ "Application": "Aplicacions", "Applications": "Aplicacions", "ApplicationStatusCheckAllClientMessage": "Totes les llistes no estan disponibles a causa d'errors", - "AuthenticationMethodHelpText": "Es requereix nom d'usuari i contrasenya per accedir a {appName}", + "AuthenticationMethodHelpText": "Es requereix nom d'usuari i contrasenya per a accedir a {appName}", "ApplicationLongTermStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors durant més de 6 hores", "ApplicationLongTermStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors durant més de 6 hores: {0}", "BindAddressHelpText": "Adreça IP vàlida, localhost o '*' per a totes les interfícies", - "BranchUpdate": "Branca que s'utilitza per actualitzar {appName}", + "BranchUpdate": "Branca que s'utilitza per a actualitzar {appName}", "Connect": "Notificacions", "DeleteApplicationMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?", "DeleteIndexerProxyMessageText": "Esteu segur que voleu suprimir la llista '{0}'?", @@ -351,7 +351,7 @@ "ApplyTagsHelpTextRemove": "Eliminar: elimina les etiquetes introduïdes", "DeleteSelectedApplicationsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?", "Label": "Etiqueta", - "ApplyTagsHelpTextReplace": "Substitució: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per esborrar totes les etiquetes)", + "ApplyTagsHelpTextReplace": "Substitució: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per a esborrar totes les etiquetes)", "DeleteSelectedDownloadClients": "Suprimeix el(s) client(s) de baixada", "Genre": "Gèneres", "DeleteSelectedDownloadClientsMessageText": "Esteu segur que voleu suprimir {count} client(s) de baixada seleccionat(s)?", @@ -364,7 +364,7 @@ "Year": "Any", "UpdateAvailable": "Nova actualització disponible", "ConnectionLostReconnect": "{appName} intentarà connectar-se automàticament, o podeu fer clic a recarregar.", - "ConnectionLostToBackend": "{appName} ha perdut la connexió amb el backend i s'haurà de tornar a carregar per restaurar la funcionalitat.", + "ConnectionLostToBackend": "{appName} ha perdut la connexió amb el backend i s'haurà de tornar a carregar per a restaurar la funcionalitat.", "RecentChanges": "Canvis recents", "WhatsNew": "Que hi ha de nou?", "minutes": "Minuts", @@ -381,7 +381,7 @@ "AuthenticationRequired": "Autenticació necessària", "CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)", "NoDownloadClientsFound": "No s'han trobat clients de baixada", - "AuthenticationRequiredWarning": "Per evitar l'accés remot sense autenticació, ara {appName} requereix que l'autenticació estigui activada. Opcionalment, podeu desactivar l'autenticació des d'adreces locals.", + "AuthenticationRequiredWarning": "Per a evitar l'accés remot sense autenticació, ara {appName} requereix que l'autenticació estigui activada. Opcionalment, podeu desactivar l'autenticació des d'adreces locals.", "AppUpdatedVersion": "{appName} s'ha actualitzat a la versió `{version}`, per tal d'obtenir els darrers canvis, haureu de tornar a carregar {appName}", "AppUpdated": "{appName} Actualitzada", "ApplyChanges": "Aplica els canvis", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 1215eb40c..df34ade61 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -375,5 +375,7 @@ "None": "Żaden", "AuthBasic": "Podstawowe (wyskakujące okienko przeglądarki)", "ResetAPIKeyMessageText": "Czy na pewno chcesz zresetować swój klucz API?", - "RestartProwlarr": "Zrestartuj {appName}" + "RestartProwlarr": "Zrestartuj {appName}", + "AddConnectionImplementation": "Dodaj Connection - {implementationName}", + "AddDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}" } From b53f8d4552d42f25a12252ad53c2fbbf2474ff9a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 18 Jan 2024 05:23:29 +0200 Subject: [PATCH 410/964] Bump version to 1.13.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 42ace6f3c..c3ab654c8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.12.2' + majorVersion: '1.13.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 70a5dae2937d0f134c3bff956fb07cf2434da6f7 Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:34:20 -0600 Subject: [PATCH 411/964] Fixed: Don't lowercase UrlBase in ConfigFileProvider UrlBase should honour the case it is given. (cherry picked from commit e1de523c89f7649e64f520b090bbdb2f56cc4b85) (cherry picked from commit 9ccefe00951d2959ef79bdaa5731d95f97162d46) Co-authored-by: Marty Zalega --- src/NzbDrone.Core/Configuration/ConfigFileProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index 3b7da5d89..e2163d524 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -227,7 +227,7 @@ namespace NzbDrone.Core.Configuration return urlBase; } - return "/" + urlBase.Trim('/').ToLower(); + return "/" + urlBase; } } From cfdf88a1e2a8b7a89f2375a9afbad881eaf601c9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 20 Jan 2024 04:46:35 +0200 Subject: [PATCH 412/964] Add exceptions to logs for indexers and apps --- .../Applications/ApplicationService.cs | 16 ++++++++-------- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/NzbDrone.Core/Applications/ApplicationService.cs b/src/NzbDrone.Core/Applications/ApplicationService.cs index 097b701d1..97e627fd9 100644 --- a/src/NzbDrone.Core/Applications/ApplicationService.cs +++ b/src/NzbDrone.Core/Applications/ApplicationService.cs @@ -252,11 +252,11 @@ namespace NzbDrone.Core.Applications if (webException.Message.Contains("502") || webException.Message.Contains("503") || webException.Message.Contains("timed out")) { - _logger.Warn("{0} server is currently unavailable. {1}", this, webException.Message); + _logger.Warn(webException, "{0} server is currently unavailable. {1}", this, webException.Message); } else { - _logger.Warn("{0} {1}", this, webException.Message); + _logger.Warn(webException, "{0} {1}", this, webException.Message); } } catch (TooManyRequestsException ex) @@ -264,12 +264,12 @@ namespace NzbDrone.Core.Applications var minimumBackOff = ex.RetryAfter != TimeSpan.Zero ? ex.RetryAfter : TimeSpan.FromHours(1); _applicationStatusService.RecordFailure(application.Definition.Id, minimumBackOff); - _logger.Warn("API Request Limit reached for {0}", this); + _logger.Warn(ex, "API Request Limit reached for {0}", this); } catch (HttpException ex) { _applicationStatusService.RecordFailure(application.Definition.Id); - _logger.Warn("{0} {1}", this, ex.Message); + _logger.Warn(ex, "{0} {1}", this, ex.Message); } catch (Exception ex) { @@ -301,11 +301,11 @@ namespace NzbDrone.Core.Applications if (webException.Message.Contains("502") || webException.Message.Contains("503") || webException.Message.Contains("timed out")) { - _logger.Warn("{0} server is currently unavailable. {1}", this, webException.Message); + _logger.Warn(webException, "{0} server is currently unavailable. {1}", this, webException.Message); } else { - _logger.Warn("{0} {1}", this, webException.Message); + _logger.Warn(webException, "{0} {1}", this, webException.Message); } } catch (TooManyRequestsException ex) @@ -313,12 +313,12 @@ namespace NzbDrone.Core.Applications var minimumBackOff = ex.RetryAfter != TimeSpan.Zero ? ex.RetryAfter : TimeSpan.FromHours(1); _applicationStatusService.RecordFailure(application.Definition.Id, minimumBackOff); - _logger.Warn("API Request Limit reached for {0}", this); + _logger.Warn(ex, "API Request Limit reached for {0}", this); } catch (HttpException ex) { _applicationStatusService.RecordFailure(application.Definition.Id); - _logger.Warn("{0} {1}", this, ex.Message); + _logger.Warn(ex, "{0} {1}", this, ex.Message); } catch (Exception ex) { diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index ed25df68c..ab921a1a7 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -388,11 +388,11 @@ namespace NzbDrone.Core.Indexers if (webException.Message.Contains("502") || webException.Message.Contains("503") || webException.Message.Contains("504") || webException.Message.Contains("timed out")) { - _logger.Warn("{0} server is currently unavailable. {1} {2}", this, url, webException.Message); + _logger.Warn(webException, "{0} server is currently unavailable. {1} {2}", this, url, webException.Message); } else { - _logger.Warn("{0} {1} {2}", this, url, webException.Message); + _logger.Warn(webException, "{0} {1} {2}", this, url, webException.Message); } } catch (TooManyRequestsException ex) @@ -402,7 +402,7 @@ namespace NzbDrone.Core.Indexers var retryTime = ex.RetryAfter != TimeSpan.Zero ? ex.RetryAfter : minimumBackoff; _indexerStatusService.RecordFailure(Definition.Id, retryTime); - _logger.Warn("Request Limit reached for {0}. Disabled for {1}", this, retryTime); + _logger.Warn(ex, "Request Limit reached for {0}. Disabled for {1}", this, retryTime); } catch (HttpException ex) { @@ -411,18 +411,18 @@ namespace NzbDrone.Core.Indexers if (ex.Response.HasHttpServerError) { - _logger.Warn("Unable to connect to {0} at [{1}]. Indexer's server is unavailable. Try again later. {2}", this, url, ex.Message); + _logger.Warn(ex, "Unable to connect to {0} at [{1}]. Indexer's server is unavailable. Try again later. {2}", this, url, ex.Message); } else { - _logger.Warn("{0} {1}", this, ex.Message); + _logger.Warn(ex, "{0} {1}", this, ex.Message); } } catch (RequestLimitReachedException ex) { result.Queries.Add(new IndexerQueryResult { Response = ex.Response.HttpResponse }); _indexerStatusService.RecordFailure(Definition.Id, minimumBackoff); - _logger.Warn("Request Limit reached for {0}. Disabled for {1}", this, minimumBackoff); + _logger.Warn(ex, "Request Limit reached for {0}. Disabled for {1}", this, minimumBackoff); } catch (IndexerAuthException ex) { From ee969b7a06efa2603d6516ea97b2e49228cc125a Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 20 Jan 2024 13:15:29 -0800 Subject: [PATCH 413/964] New: Log warning if less than 1 GB free space during update (cherry picked from commit e66ba84fc0b5b120dd4e87f6b8ae1b3c038ee72b) --- src/NzbDrone.Core/Update/InstallUpdateService.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Core/Update/InstallUpdateService.cs b/src/NzbDrone.Core/Update/InstallUpdateService.cs index 99744922e..727c1f9f9 100644 --- a/src/NzbDrone.Core/Update/InstallUpdateService.cs +++ b/src/NzbDrone.Core/Update/InstallUpdateService.cs @@ -107,6 +107,11 @@ namespace NzbDrone.Core.Update var updateSandboxFolder = _appFolderInfo.GetUpdateSandboxFolder(); + if (_diskProvider.GetTotalSize(updateSandboxFolder) < 1.Gigabytes()) + { + _logger.Warn("Temporary location '{0}' has less than 1 GB free space, Prowlarr may not be able to update itself.", updateSandboxFolder); + } + var packageDestination = Path.Combine(updateSandboxFolder, updatePackage.FileName); if (_diskProvider.FolderExists(updateSandboxFolder)) From c9434c61e303ed1884c65b45f89ed8147ed574d7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 20 Jan 2024 13:37:25 +0200 Subject: [PATCH 414/964] Transpile logical assignment operators with babel --- frontend/babel.config.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/babel.config.js b/frontend/babel.config.js index 5c0d5ecdc..ade9f24a2 100644 --- a/frontend/babel.config.js +++ b/frontend/babel.config.js @@ -2,6 +2,8 @@ const loose = true; module.exports = { plugins: [ + '@babel/plugin-transform-logical-assignment-operators', + // Stage 1 '@babel/plugin-proposal-export-default-from', ['@babel/plugin-transform-optional-chaining', { loose }], From 0f5eb5d3a34b0545c3cd0637445cda9227b63f5c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Jan 2024 07:47:42 +0200 Subject: [PATCH 415/964] Bump version to 1.13.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c3ab654c8..1ce342be1 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.13.0' + majorVersion: '1.13.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 2bd25fb6f32dae789356da3e8446f03831e53ff3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Jan 2024 07:46:38 +0200 Subject: [PATCH 416/964] Reorder sync fields for App Profiles --- .../App/EditAppProfileModalContent.js | 28 +++++++++---------- .../Profiles/AppSyncProfileService.cs | 2 +- .../Profiles/App/AppProfileResource.cs | 6 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/frontend/src/Settings/Profiles/App/EditAppProfileModalContent.js b/frontend/src/Settings/Profiles/App/EditAppProfileModalContent.js index aace8e039..ac67c77f2 100644 --- a/frontend/src/Settings/Profiles/App/EditAppProfileModalContent.js +++ b/frontend/src/Settings/Profiles/App/EditAppProfileModalContent.js @@ -97,20 +97,6 @@ class EditAppProfileModalContent extends Component { /> - - - {translate('EnableInteractiveSearch')} - - - - - {translate('EnableAutomaticSearch')} @@ -125,6 +111,20 @@ class EditAppProfileModalContent extends Component { /> + + + {translate('EnableInteractiveSearch')} + + + + + {translate('MinimumSeeders')} diff --git a/src/NzbDrone.Core/Profiles/AppSyncProfileService.cs b/src/NzbDrone.Core/Profiles/AppSyncProfileService.cs index 135cd9e2a..095f3abd9 100644 --- a/src/NzbDrone.Core/Profiles/AppSyncProfileService.cs +++ b/src/NzbDrone.Core/Profiles/AppSyncProfileService.cs @@ -86,9 +86,9 @@ namespace NzbDrone.Core.Profiles var qualityProfile = new AppSyncProfile { Name = name, + EnableRss = true, EnableAutomaticSearch = true, EnableInteractiveSearch = true, - EnableRss = true, MinimumSeeders = 1 }; diff --git a/src/Prowlarr.Api.V1/Profiles/App/AppProfileResource.cs b/src/Prowlarr.Api.V1/Profiles/App/AppProfileResource.cs index aa88dfac6..623b6bf65 100644 --- a/src/Prowlarr.Api.V1/Profiles/App/AppProfileResource.cs +++ b/src/Prowlarr.Api.V1/Profiles/App/AppProfileResource.cs @@ -9,8 +9,8 @@ namespace Prowlarr.Api.V1.Profiles.App { public string Name { get; set; } public bool EnableRss { get; set; } - public bool EnableInteractiveSearch { get; set; } public bool EnableAutomaticSearch { get; set; } + public bool EnableInteractiveSearch { get; set; } public int MinimumSeeders { get; set; } } @@ -28,8 +28,8 @@ namespace Prowlarr.Api.V1.Profiles.App Id = model.Id, Name = model.Name, EnableRss = model.EnableRss, - EnableInteractiveSearch = model.EnableInteractiveSearch, EnableAutomaticSearch = model.EnableAutomaticSearch, + EnableInteractiveSearch = model.EnableInteractiveSearch, MinimumSeeders = model.MinimumSeeders }; } @@ -46,8 +46,8 @@ namespace Prowlarr.Api.V1.Profiles.App Id = resource.Id, Name = resource.Name, EnableRss = resource.EnableRss, - EnableInteractiveSearch = resource.EnableInteractiveSearch, EnableAutomaticSearch = resource.EnableAutomaticSearch, + EnableInteractiveSearch = resource.EnableInteractiveSearch, MinimumSeeders = resource.MinimumSeeders }; } From 0b839862556a05437a548b1b747a2e91263c56cd Mon Sep 17 00:00:00 2001 From: Servarr Date: Sun, 21 Jan 2024 05:53:44 +0000 Subject: [PATCH 417/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index 92ab7dedd..1c7852be6 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -4013,10 +4013,10 @@ "enableRss": { "type": "boolean" }, - "enableInteractiveSearch": { + "enableAutomaticSearch": { "type": "boolean" }, - "enableAutomaticSearch": { + "enableInteractiveSearch": { "type": "boolean" }, "minimumSeeders": { From dd5b108ffdcff3ba2d2d4571253f691329e4230c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Jan 2024 17:05:01 +0200 Subject: [PATCH 418/964] Fixed: (BTN) Allow ID-based with text search query --- .../BroadcastheNet/BroadcastheNetRequestGenerator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs index 6705c9773..23e7dac0e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs @@ -50,7 +50,8 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet { parameters.Tvrage = $"{searchCriteria.RId}"; } - else if (searchString.IsNotNullOrWhiteSpace()) + + if (searchString.IsNotNullOrWhiteSpace()) { parameters.Search = searchString.Replace(" ", "%"); } From 34c78c5a9d6f0be4c6aa00a7887c5641138fbd61 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 22 Jan 2024 11:48:32 +0200 Subject: [PATCH 419/964] Fixed: (BTN) Disable ID-based searches for episodes with absolute episode number Release name searches are not supported, so it's better to prevent an useless request. --- .../BroadcastheNetRequestGenerator.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs index 23e7dac0e..781e5527d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs @@ -32,7 +32,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet var parameters = new BroadcastheNetTorrentQuery(); - var searchString = searchCriteria.SearchTerm ?? string.Empty; + var searchTerm = searchCriteria.SearchTerm ?? string.Empty; var btnResults = searchCriteria.Limit.GetValueOrDefault(); if (btnResults == 0) @@ -51,9 +51,9 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet parameters.Tvrage = $"{searchCriteria.RId}"; } - if (searchString.IsNotNullOrWhiteSpace()) + if (searchTerm.IsNotNullOrWhiteSpace()) { - parameters.Search = searchString.Replace(" ", "%"); + parameters.Search = searchTerm.Replace(" ", "%"); } // If only the season/episode is searched for then change format to match expected format @@ -85,6 +85,11 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet parameters.Category = "Episode"; pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset)); } + else if (searchTerm.IsNotNullOrWhiteSpace() && int.TryParse(searchTerm, out _) && (searchCriteria.TvdbId > 0 || searchCriteria.RId > 0)) + { + // Disable ID-based searches for episodes with absolute episode number + return new IndexerPageableRequestChain(); + } else { // Neither a season only search nor daily nor standard, fall back to query @@ -105,7 +110,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet var parameters = new BroadcastheNetTorrentQuery(); - var searchString = searchCriteria.SearchTerm ?? ""; + var searchTerm = searchCriteria.SearchTerm ?? string.Empty; var btnResults = searchCriteria.Limit.GetValueOrDefault(); if (btnResults == 0) @@ -115,9 +120,9 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet var btnOffset = searchCriteria.Offset.GetValueOrDefault(0); - if (searchString.IsNotNullOrWhiteSpace()) + if (searchTerm.IsNotNullOrWhiteSpace()) { - parameters.Search = searchString.Replace(" ", "%"); + parameters.Search = searchTerm.Replace(" ", "%"); } pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset)); From 16c0daf090e6926bb4b4e6375eeabc1a5889fd42 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 22 Jan 2024 13:24:00 +0200 Subject: [PATCH 420/964] Fix value types for EnhancedSelectInputConnector --- frontend/src/Components/Form/EnhancedSelectInputConnector.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Components/Form/EnhancedSelectInputConnector.js b/frontend/src/Components/Form/EnhancedSelectInputConnector.js index 81f792083..3a4d8fdd3 100644 --- a/frontend/src/Components/Form/EnhancedSelectInputConnector.js +++ b/frontend/src/Components/Form/EnhancedSelectInputConnector.js @@ -147,7 +147,7 @@ EnhancedSelectInputConnector.propTypes = { provider: PropTypes.string.isRequired, providerData: PropTypes.object.isRequired, name: PropTypes.string.isRequired, - value: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.number, PropTypes.string])).isRequired, + value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.arrayOf(PropTypes.string), PropTypes.arrayOf(PropTypes.number)]).isRequired, values: PropTypes.arrayOf(PropTypes.object).isRequired, selectOptionsProviderAction: PropTypes.string, onChange: PropTypes.func.isRequired, From ae70a96c10f272d51ab60a2663bccf6d3d4e0931 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 22 Jan 2024 11:02:13 +0000 Subject: [PATCH 421/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dani Talens Co-authored-by: Havok Dan Co-authored-by: Julian Baquero Co-authored-by: MaddionMax Co-authored-by: Magyar Co-authored-by: Weblate Co-authored-by: blabla Co-authored-by: brn Co-authored-by: fordas Co-authored-by: horvi28 Co-authored-by: wilfriedarma Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 10 +- src/NzbDrone.Core/Localization/Core/es.json | 19 +-- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 112 ++++++++++-------- .../Localization/Core/pt_BR.json | 3 +- src/NzbDrone.Core/Localization/Core/tr.json | 2 +- 6 files changed, 81 insertions(+), 67 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 31c919d70..50c486998 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -82,7 +82,7 @@ "EditIndexer": "Edita l'indexador", "EnableAutomaticSearch": "Activa la cerca automàtica", "Enabled": "Habilitat", - "Error": "error", + "Error": "Error", "ErrorLoadingContents": "S'ha produït un error en carregar el contingut", "Events": "Esdeveniments", "ExistingTag": "Etiqueta existent", @@ -358,7 +358,7 @@ "DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir {count} indexador(s) seleccionat(s)?", "DownloadClientPriorityHelpText": "Prioritzeu diversos clients de baixada. S'utilitza round-robin per a clients amb la mateixa prioritat.", "More": "Més", - "Season": "temporada", + "Season": "Temporada", "Theme": "Tema", "Track": "Traça", "Year": "Any", @@ -413,7 +413,7 @@ "AuthenticationRequiredUsernameHelpTextWarning": "Introduïu un nom d'usuari nou", "Categories": "Categories", "ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {length} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració", - "Episode": "episodi", + "Episode": "Episodi", "EditApplicationImplementation": "Edita la notificació - {implementationName}", "EditConnectionImplementation": "Afegeix una connexió - {implementationName}", "EditIndexerProxyImplementation": "Edita l'indexador - {implementationName}", @@ -425,5 +425,7 @@ "Category": "Categoria", "Clone": "Clona", "Yes": "Si", - "No": "No" + "No": "No", + "StopSelecting": "Deixa de seleccionar", + "External": "Extern" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index d4ccb7f46..c33e90126 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -12,7 +12,7 @@ "Edit": "Editar", "DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}", "DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores", - "DownloadClients": "Gestores de Descargas", + "DownloadClients": "Clientes de descarga", "Delete": "Eliminar", "Dates": "Fechas", "Date": "Fecha", @@ -79,7 +79,7 @@ "Failed": "Fallido", "EventType": "Tipo de Evento", "DownloadClientsSettingsSummary": "Configuración del cliente de descargas para la integración en {appName} UI search", - "DownloadClient": "Gestor de Descargas", + "DownloadClient": "Cliente de descarga", "Details": "Detalles", "ConnectSettingsSummary": "Notificaciones y scripts personalizados", "Warn": "Advertencia", @@ -132,11 +132,11 @@ "Fixed": "Arreglado", "EnableSslHelpText": " Requiere reiniciar la aplicación como administrador para que surta efecto", "Enable": "Habilitar", - "DownloadClientSettings": "Ajustes de Gestor de Descargas", + "DownloadClientSettings": "Opciones del cliente de descarga", "Docker": "Docker", - "DeleteTag": "Borrar Etiqueta", - "DeleteNotification": "Borrar Notificación", - "DeleteDownloadClient": "Borrar Gestor de Descargas", + "DeleteTag": "Eliminar Etiqueta", + "DeleteNotification": "Borrar Notificacion", + "DeleteDownloadClient": "Borrar cliente de descarga", "DeleteBackup": "Eliminar copia de seguridad", "DBMigration": "Migración de DB", "CloneProfile": "Clonar Perfil", @@ -374,7 +374,7 @@ "Theme": "Tema", "ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas", "DeleteSelectedApplicationsMessageText": "¿Estás seguro que quieres eliminar {count} aplicación(es) seleccionada(s)?", - "DeleteSelectedDownloadClients": "Borrar Gestor de Descargas", + "DeleteSelectedDownloadClients": "Borrar gestor de descarga(s)", "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", "ApplyTagsHelpTextHowToApplyApplications": "Cómo añadir etiquetas a las películas seleccionadas", @@ -431,7 +431,7 @@ "AddIndexerImplementation": "Agregar Condición - { implementationName}", "AddIndexerProxyImplementation": "Agregar Condición - { implementationName}", "EditApplicationImplementation": "Agregar Condición - { implementationName}", - "EditConnectionImplementation": "Agregar Condición - { implementationName}", + "EditConnectionImplementation": "Editar conexión - {implementationName}", "AddDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", "AuthenticationMethod": "Método de autenticación", "AuthenticationMethodHelpTextWarning": "Por favor selecciona un método válido de autenticación", @@ -515,5 +515,6 @@ "OnGrabHelpText": "Al Capturar lanzamiento", "SeedTimeHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto", "IndexerTagsHelpTextWarning": "Las etiquetas deben utilizarse con cuidado, pueden tener efectos involuntarios. Una aplicación con una etiqueta solo sincronizara con Indexadores que tengan la misma etiqueta.", - "TVSearchTypes": "Tipos de búsquedas" + "TVSearchTypes": "Tipos de búsquedas", + "DownloadClientAriaSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación de Aria2 predeterminada" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 7fc993916..368dea983 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -282,7 +282,7 @@ "CloseCurrentModal": "Fermer cette fenêtre modale", "AddingTag": "Ajout d'une étiquette", "OnHealthIssueHelpText": "Sur un problème de santé", - "AcceptConfirmationModal": "Accepter les modalités d'utilisations", + "AcceptConfirmationModal": "Accepter les modalités d'utilisation", "OpenThisModal": "Ouvrir cette fenêtre modale", "IndexerLongTermStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison de pannes pendant plus de 6 heures : {0}", "IndexerLongTermStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs de plus de 6 heures", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 61ee1636c..84dd67f6f 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -9,13 +9,13 @@ "EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést", "Enable": "Aktiválás", "EditIndexer": "Indexer Szerkesztése", - "Edit": "szerkeszt", + "Edit": "Szerkeszt", "DownloadClientStatusCheckSingleClientMessage": "Letöltőkliens hiba miatt nem elérhető: {0}", "DownloadClientStatusCheckAllClientMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt", "DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a {appName} felhasználói felület keresésbe történő integráláshoz", "DownloadClientSettings": "Letöltőkliens Beállítások", - "DownloadClients": "Letöltőkliensek", - "DownloadClient": "Letöltési Kliens", + "DownloadClients": "Letöltő kliensek", + "DownloadClient": "Letöltési kliens", "Docker": "Docker", "Disabled": "Tiltva", "Details": "részletek", @@ -32,16 +32,16 @@ "Date": "Dátum", "CustomFilters": "Egyéni Szűrők", "ConnectSettingsSummary": "Értesítések és egyéni szkriptek", - "ConnectSettings": "Kapcsolódási Beállítások", + "ConnectSettings": "Csatlakozási beállítások", "Connections": "Kapcsolatok", - "ConnectionLost": "Kapcsolódás Elveszett", + "ConnectionLost": "A kapcsolat megszakadt", "Connect": "Értesítések", - "Component": "Komponens", + "Component": "Összetevő", "Columns": "Oszlopok", "CloseCurrentModal": "Aktuális Mód Bezárása", "Close": "Bezárás", - "CloneProfile": "Profil Klónozása", - "ClientPriority": "Kliens Prioritás", + "CloneProfile": "Profil klónozása", + "ClientPriority": "Kliens prioritás", "Clear": "Törölni", "ChangeHasNotBeenSavedYet": "A változások még nem lettek elmentve", "CertificateValidationHelpText": "Módosítsa a HTTPS tanúsítás szigorúságát", @@ -49,22 +49,22 @@ "CancelPendingTask": "Biztosan törölni szeretné ezt a függőben lévő feladatot?", "Cancel": "Mégse", "BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez", - "BranchUpdateMechanism": "A külső frissítési mechanizmus által használt ágazat", + "BranchUpdateMechanism": "Külső frissítési mechanizmus által használt ág", "BranchUpdate": "Ágazattípus a {appName} frissítéseihez", "Branch": "Ágazat", "BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez", - "BindAddress": "Kapcsolási Cím", + "BindAddress": "Kötési cím", "BeforeUpdate": "Frissítés előtt", "Backups": "Biztonsági mentések", "BackupRetentionHelpText": "A megőrzési időszaknál régebbi automatikus biztonsági másolatok automatikusan törlődnek", "BackupNow": "Biztonsági Mentés", "BackupIntervalHelpText": "Az automatikus biztonsági mentések közötti időköz", "BackupFolderHelpText": "Az elérési útvonalak a {appName} AppData könyvtárában lesznek", - "Backup": "biztonsági mentés", + "Backup": "Biztonsági mentés", "AutomaticSearch": "Automatikus keresés", "Automatic": "Automatikus", - "AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a {appName} szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely {appName} WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.", - "AuthenticationMethodHelpText": "Felhasználónév és Jelszó szükséges a {appName}-hoz való hozzáféréshez", + "AnalyticsEnabledHelpText": "Névtelen használati és hibainformáció küldése {appName} szervereinek. Ez magában foglalja a böngészővel kapcsolatos információkat, a használt {appName} WebUI oldalakat, a hibajelentéseket, valamint az operációs rendszert és a futásidejű verziót. Ezeket az információkat a funkciók és a hibajavítások fontossági sorrendjének meghatározására fogjuk használni.", + "AuthenticationMethodHelpText": "Felhasználónév és jelszó szükséges a(z) {appName} eléréséhez", "Authentication": "Hitelesítés", "ApplyTags": "Címkék alkalmazása", "Age": "Kor", @@ -72,14 +72,14 @@ "All": "Összes", "AcceptConfirmationModal": "Változás Megerősítése", "Apply": "Alkamaz", - "AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges anélkül hogy az AppData ne törlődjön", + "AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges az alkalmazás adatok törlése nélkül", "AppDataDirectory": "AppData Könyvtár", "Added": "Hozzáadva", "Actions": "Teendők", "History": "Előzmény", "HideAdvanced": "Haladó Elrejtése", "HealthNoIssues": "Nincs hiba a konfigurációval", - "Health": "Állapot", + "Health": "Egészség", "GeneralSettingsSummary": "Port, SSL, felhasználónév / jelszó, proxy, elemzések, és frissítések", "ForMoreInformationOnTheIndividualDownloadClients": "Ha többet szeretnél megtudni a különböző letöltési kliensekről, kattints az információs gombokra.", "Folder": "Mappa", @@ -87,10 +87,10 @@ "Fixed": "Rögzített", "FilterPlaceHolder": "Filmek Keresése", "Filter": "Szűrő", - "Files": "Fájl", + "Files": "Fájlok", "Filename": "Fájl név", - "Failed": "Sikertelen", - "ExistingTag": "Meglévő Címke", + "Failed": "Nem sikerült", + "ExistingTag": "Létező címke", "Exception": "Kivétel", "EventType": "Események Típusa", "Events": "Események", @@ -138,11 +138,11 @@ "Retention": "Visszatartás", "Result": "Eredmény", "RestoreBackup": "Biztonsági mentés visszaállítása", - "Restore": "Visszaállítás", + "Restore": "Visszaállít", "RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez", "RestartProwlarr": "{appName} Újraindítása", "RestartNow": "Újraindítás Most", - "Restart": "Újraindítás", + "Restart": "Újrakezd", "ResetAPIKey": "API Kulcs visszaállítása", "Reset": "Visszaállítás", "RemovingTag": "Címke eltávolítása", @@ -183,42 +183,42 @@ "OnHealthIssueHelpText": "Állapotprobléma", "Ok": "Ok", "OAuthPopupMessage": "A böngésződ blokkolja az előugró ablakokat", - "NoUpdatesAreAvailable": "Nincsenek elérhető frissítések", - "NoTagsHaveBeenAddedYet": "Még nem adtál hozzá címkéket", - "NoLogFiles": "Nincsen log fájl", - "NoLeaveIt": "Nem, hagyd így", - "NoChanges": "Nincsenek változások", - "NoChange": "Nincs változtatás", - "NoBackupsAreAvailable": "Nincs elérhető biztonsági mentés", + "NoUpdatesAreAvailable": "Nem érhetők el frissítések", + "NoTagsHaveBeenAddedYet": "Még nem adtak hozzá címkéket", + "NoLogFiles": "Nincsenek naplófájlok", + "NoLeaveIt": "Nem, Hagyd", + "NoChanges": "Nincs változás", + "NoChange": "Nincs változás", + "NoBackupsAreAvailable": "Nincsenek biztonsági mentések", "New": "Új", "NetCore": ".NET", "Name": "Név", "MovieIndexScrollTop": "Film Index: Görgess fel", "MovieIndexScrollBottom": "Film Index: Görgess le", - "MoreInfo": "Több Információ", + "MoreInfo": "Több információ", "Mode": "Mód", "MIA": "MIA", "Message": "Üzenet", - "Mechanism": "Mechanizmus", + "Mechanism": "Gépezet", "Manual": "Kézi", - "MaintenanceRelease": "Karbantartási frissítés: hibajavítások és egyéb fejlesztések. További részletekért lásd: Github Commit History", + "MaintenanceRelease": "Karbantartási kiadás: hibajavítások és egyéb fejlesztések. További részletekért lásd: Github Commit History", "Logs": "Naplók", - "LogLevelTraceHelpTextWarning": "A nyomkövetést csak ideiglenesen szabad engedélyezni", - "LogLevel": "Log Szint", + "LogLevelTraceHelpTextWarning": "A nyomkövetési naplózást csak ideiglenesen szabad engedélyezni", + "LogLevel": "Napló szint", "Logging": "Loggolás", - "LogFiles": "Log Fájlok", + "LogFiles": "Naplófájlok", "Level": "Szint", "LaunchBrowserHelpText": " Nyisson meg egy böngészőt, és az alkalmazás indításakor lépjen a {appName} kezdőlapjára.", "LastWriteTime": "Utolsó írási idő", "Language": "Nyelv", - "KeyboardShortcuts": "Gyorsbillentyűk", + "KeyboardShortcuts": "Gyorsbillentyűket", "Interval": "Intervallum", "InteractiveSearch": "Interaktív Keresés", "Info": "Infó", "IndexerStatusCheckSingleClientMessage": "Indexerek elérhetetlenek a következő hiba miatt: {0}", "Hostname": "Hosztnév", "Host": "Hoszt", - "Grabbed": "Megfogva", + "Grabbed": "Megragadta", "GeneralSettings": "Általános Beállítások", "General": "Általános", "UnableToLoadHistory": "Nem sikerült betölteni az előzményeket", @@ -258,8 +258,8 @@ "IncludeHealthWarningsHelpText": "Tartalmazza a Állapot Figyelmeztetéseket", "IllRestartLater": "Később Újraindítom", "IgnoredAddresses": "Ignorált címek", - "YesCancel": "Igen, Mégsem", - "Warn": "Figyelmeztet", + "YesCancel": "Igen, elvet", + "Warn": "Figyelmeztetés", "View": "Nézet", "Version": "Verzió", "Username": "Felhasználónév", @@ -270,7 +270,7 @@ "Uptime": "Üzemidő", "UpdateScriptPathHelpText": "Keresse meg az egyéni parancsfájl elérési útját, amely kibontott frissítési csomagot vesz fel, és kezeli a frissítési folyamat fennmaradó részét", "Updates": "Frissítések", - "UpdateMechanismHelpText": "Használja a {appName} beépített frissítőjét vagy egy szkriptet", + "UpdateMechanismHelpText": "Használja a {appName} beépített frissítőjét vagy szkriptjét", "UpdateCheckUINotWritableMessage": "Nem lehet telepíteni a frissítést, mert a(z) „{0}” felhasználói felület mappát nem írhatja a „{1}” felhasználó.", "UpdateCheckStartupTranslocationMessage": "Nem lehet telepíteni a frissítést, mert a (z) „{0}” indítási mappa az Alkalmazások Transzlokációs mappájában található.", "UpdateCheckStartupNotWritableMessage": "A frissítés nem telepíthető, mert a (z) „{0}” indítási mappát a „{1}” felhasználó nem írhatja.", @@ -283,7 +283,7 @@ "TableOptions": "Táblázat Beállítások", "ShowSearch": "Keresés(ek) megjelenítése", "SetTags": "Címkék beállítása", - "NotificationTriggers": "Értesítés(ek) kiváltója", + "NotificationTriggers": "Értesítési triggerek", "IndexerLongTermStatusCheckSingleClientMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt: {0}", "IndexerLongTermStatusCheckAllClientMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt", "SettingsLogSql": "SQL naplózás", @@ -327,7 +327,7 @@ "Redirect": "Átirányítás", "Reddit": "Reddit", "HomePage": "Kezdőlap", - "FeatureRequests": "Funkció kérése", + "FeatureRequests": "Funkciókérés", "Discord": "Discord", "AppProfileSelectHelpText": "Az alkalmazásprofilok az RSS vezérlésére szolgálnak, Automatikus keresés és Interaktív keresés beállításai az alkalmazás szinkronizálásakor", "UnableToAddANewApplicationPleaseTryAgain": "Nem lehet új alkalmazást hozzáadni, próbálkozzon újra.", @@ -347,7 +347,7 @@ "Encoding": "Kódolás", "Grabs": "Megfogások", "Id": "Azonosító", - "NotificationTriggersHelpText": "Válaszd ki, hogy mely események indítsák el ezt az értesítést", + "NotificationTriggersHelpText": "Válassza ki, hogy mely események váltsák ki ezt az értesítést", "Presets": "Előbeállítások", "Privacy": "Titkosítás", "Query": "Lekérdezés", @@ -444,8 +444,8 @@ "LastDuration": "Utolsó időtartam", "LastExecution": "Utolsó végrehajtás", "Parameters": "Paraméterek", - "Queued": "Sorba helyezve", - "Started": "Elkezdődött", + "Queued": "Sorban", + "Started": "Elindult", "NextExecution": "Következő végrehajtás", "ApplicationLongTermStatusCheckSingleClientMessage": "Az alkamazások elérhetetlenek több mint 6 órája az alábbi hiba miatt: {0}", "ApplicationLongTermStatusCheckAllClientMessage": "Az összes alkalmazás elérhetetlen több mint 6 órája meghibásodás miatt", @@ -454,13 +454,13 @@ "MappedCategories": "Térképezett kategóriák", "DownloadClientCategory": "Letöltési kliens kategória", "AuthenticationRequired": "Azonosítás szükséges", - "AuthenticationRequiredHelpText": "Módosítsd, hogy mely kérésekhez van szükség hitelesítésre. Ne változtasson, hacsak nem érti a kockázatokat.", - "AuthenticationRequiredWarning": "A hitelesítés nélküli távoli hozzáférés megakadályozása érdekében a {appName}nak mostantól engedélyezni kell a hitelesítést. Konfigurálja a hitelesítési módszert és a hitelesítési adatokat. Opcionálisan letilthatja a helyi címekről történő hitelesítést. További információkért tekintsd meg a GYIK-et.", + "AuthenticationRequiredHelpText": "Módosítsa, hogy mely kérésekhez van szükség hitelesítésre. Ne változtasson, hacsak nem érti a kockázatokat.", + "AuthenticationRequiredWarning": "A hitelesítés nélküli távoli hozzáférés megakadályozása érdekében a(z) {appName} alkalmazásnak engedélyeznie kell a hitelesítést. Opcionálisan letilthatja a helyi címekről történő hitelesítést.", "TheLatestVersionIsAlreadyInstalled": "A {appName} legújabb verziója már telepítva van", "Remove": "Eltávolítás", "Replace": "Kicserél", "ApplicationURL": "Alkalmazás URL", - "ApplicationUrlHelpText": "Az alkalmazás külső URL-címe, beleértve a http(s)://-t, a portot és az URL-alapot", + "ApplicationUrlHelpText": "Ennek az alkalmazásnak a külső URL-címe, beleértve a http-eket", "More": "Több", "Publisher": "Kiadó", "ApplyChanges": "Változások alkalmazása", @@ -495,12 +495,12 @@ "ConnectionLostToBackend": "A Radarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.", "minutes": "percek", "AddConnection": "Csatlakozás hozzáadása", - "NotificationStatusAllClientHealthCheckMessage": "Összes alkalmazás elérhetetlen hiba miatt", + "NotificationStatusAllClientHealthCheckMessage": "Az összes értesítés nem érhető el hibák miatt", "NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}", "AuthBasic": "Alap (böngésző előugró ablak)", "AuthForm": "Űrlapok (bejelentkezési oldal)", "DisabledForLocalAddresses": "Letiltva a helyi címeknél", - "None": "Nincs", + "None": "Egyik sem", "ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?", "AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót", "AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet", @@ -518,11 +518,21 @@ "AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót", "DefaultNameCopiedProfile": "{name} - Másolat", - "EditConnectionImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}", + "EditConnectionImplementation": "Kapcsolat szerkesztése - {implementationName}", "EditIndexerProxyImplementation": "Indexelő hozzáadása - {megvalósítás neve}", "AddApplicationImplementation": "Csatlakozás hozzáadása - {implementationName}", "AddIndexerProxyImplementation": "Indexelő hozzáadása - {implementationName}", - "EditIndexerImplementation": "Indexelő hozzáadása - {megvalósítás neve}", + "EditIndexerImplementation": "Indexelő szerkesztése – {implementationName}", "EditApplicationImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}", - "EditDownloadClientImplementation": "Letöltési kliens hozzáadása – {megvalósítási név}" + "EditDownloadClientImplementation": "Letöltési kliens szerkesztése – {implementationName}", + "NoIndexersFound": "Nem található indexelő", + "NoDownloadClientsFound": "Nem találhatók letöltő kliensek", + "AdvancedSettingsShownClickToHide": "Haladó beállítások megjelenítve, kattints az elrejtéshez", + "AdvancedSettingsHiddenClickToShow": "Haladó beállítások rejtve, kattints a megjelenítéshez", + "AppUpdatedVersion": "{appName} frissítve lett `{version}` verzióra, ahhoz hogy a legutóbbi változtatások életbelépjenek, töltsd újra a {appName}-t", + "AddCategory": "Kategória hozzáadása", + "External": "Külső", + "NoHistoryFound": "Nem található előzmény", + "InvalidUILanguage": "A felhasználói felület érvénytelen nyelvre van állítva, javítsa ki, és mentse el a beállításait", + "ManageDownloadClients": "Letöltési kliensek kezelése" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index af2540321..688867c62 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -604,5 +604,6 @@ "InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Seja para usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)", "DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo", - "IndexerId": "ID do Indexador" + "IndexerId": "ID do Indexador", + "DownloadClientAriaSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do Aria2" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index e70c8bb90..66b9bf0e6 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -21,7 +21,7 @@ "Files": "Dosyalar", "Filename": "Dosya adı", "AppDataLocationHealthCheckMessage": "Güncellemede AppData'nın silinmesini önlemek için güncelleme mümkün olmayacak", - "Actions": "Etkiler", + "Actions": "Eylemler", "About": "Hakkında", "View": "Görünüm", "Updates": "Güncellemeler", From 155cd53dcdc02eda1d2be04e1ad7d6d0ae88e18b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 23 Jan 2024 08:29:59 +0200 Subject: [PATCH 422/964] Fix translations for manage applications and download clients --- .../src/Settings/Applications/Applications/Applications.js | 2 +- .../src/Settings/DownloadClients/DownloadClientSettings.js | 2 +- .../DownloadClients/DownloadClients/DownloadClients.js | 2 +- src/NzbDrone.Core/Localization/Core/ar.json | 2 +- src/NzbDrone.Core/Localization/Core/bg.json | 2 +- src/NzbDrone.Core/Localization/Core/ca.json | 2 +- src/NzbDrone.Core/Localization/Core/cs.json | 2 +- src/NzbDrone.Core/Localization/Core/da.json | 2 +- src/NzbDrone.Core/Localization/Core/de.json | 4 ++-- src/NzbDrone.Core/Localization/Core/el.json | 4 ++-- src/NzbDrone.Core/Localization/Core/en.json | 6 ++++-- src/NzbDrone.Core/Localization/Core/es.json | 2 +- src/NzbDrone.Core/Localization/Core/fi.json | 4 ++-- src/NzbDrone.Core/Localization/Core/fr.json | 4 ++-- src/NzbDrone.Core/Localization/Core/he.json | 2 +- src/NzbDrone.Core/Localization/Core/hi.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 4 ++-- src/NzbDrone.Core/Localization/Core/is.json | 2 +- src/NzbDrone.Core/Localization/Core/it.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ja.json | 2 +- src/NzbDrone.Core/Localization/Core/ko.json | 2 +- src/NzbDrone.Core/Localization/Core/nl.json | 2 +- src/NzbDrone.Core/Localization/Core/pl.json | 2 +- src/NzbDrone.Core/Localization/Core/pt.json | 4 ++-- src/NzbDrone.Core/Localization/Core/pt_BR.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ro.json | 2 +- src/NzbDrone.Core/Localization/Core/ru.json | 2 +- src/NzbDrone.Core/Localization/Core/sv.json | 2 +- src/NzbDrone.Core/Localization/Core/th.json | 2 +- src/NzbDrone.Core/Localization/Core/tr.json | 2 +- src/NzbDrone.Core/Localization/Core/uk.json | 2 +- src/NzbDrone.Core/Localization/Core/vi.json | 2 +- src/NzbDrone.Core/Localization/Core/zh_CN.json | 3 +-- 33 files changed, 44 insertions(+), 43 deletions(-) diff --git a/frontend/src/Settings/Applications/Applications/Applications.js b/frontend/src/Settings/Applications/Applications/Applications.js index c6421c9ec..66d02088e 100644 --- a/frontend/src/Settings/Applications/Applications/Applications.js +++ b/frontend/src/Settings/Applications/Applications/Applications.js @@ -62,7 +62,7 @@ class Applications extends Component { return (
diff --git a/frontend/src/Settings/DownloadClients/DownloadClientSettings.js b/frontend/src/Settings/DownloadClients/DownloadClientSettings.js index 98cf2ef99..5bd284b45 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClientSettings.js +++ b/frontend/src/Settings/DownloadClients/DownloadClientSettings.js @@ -84,7 +84,7 @@ class DownloadClientSettings extends Component { /> diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClients.js b/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClients.js index 640d56a89..2fb887074 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClients.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClients.js @@ -61,7 +61,7 @@ class DownloadClients extends Component { return (
diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 1f6073725..9bab46063 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -257,7 +257,7 @@ "Tags": "العلامات", "TagsHelpText": "ينطبق على الأفلام التي تحتوي على علامة مطابقة واحدة على الأقل", "UISettings": "إعدادات واجهة المستخدم", - "UnableToLoadDownloadClients": "تعذر تحميل عملاء التنزيل", + "DownloadClientsLoadError": "تعذر تحميل عملاء التنزيل", "UnableToLoadTags": "تعذر تحميل العلامات", "UnableToLoadUISettings": "تعذر تحميل إعدادات واجهة المستخدم", "UpdateCheckStartupTranslocationMessage": "لا يمكن تثبيت التحديث لأن مجلد بدء التشغيل \"{0}\" موجود في مجلد App Translocation.", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index acab726cb..6383fc1bc 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -188,7 +188,7 @@ "Priority": "Приоритет", "SettingsLongDateFormat": "Формат с дълга дата", "SettingsShowRelativeDates": "Показване на относителни дати", - "UnableToLoadDownloadClients": "Клиентите за изтегляне не могат да се заредят", + "DownloadClientsLoadError": "Клиентите за изтегляне не могат да се заредят", "Logging": "Регистрация", "Exception": "Изключение", "MovieIndexScrollBottom": "Индекс на филма: Превъртане отдолу", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 50c486998..abf4da7bf 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -44,7 +44,7 @@ "UILanguageHelpTextWarning": "Es requereix una recàrrega del navegador", "UISettings": "Configuració de la interfície", "UnableToLoadBackups": "No es poden carregar còpies de seguretat", - "UnableToLoadDownloadClients": "No es poden carregar els clients de baixada", + "DownloadClientsLoadError": "No es poden carregar els clients de baixada", "UnableToLoadTags": "No es poden carregar les etiquetes", "UnableToLoadUISettings": "No es pot carregar la configuració de la IU", "UnselectAll": "Desseleccioneu-ho tot", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 4dfaf9377..f94e8649e 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -199,7 +199,7 @@ "SSLCertPath": "Cesta certifikátu SSL", "SSLCertPathHelpText": "Cesta k souboru pfx", "UnableToLoadBackups": "Nelze načíst zálohy", - "UnableToLoadDownloadClients": "Nelze načíst klienty pro stahování", + "DownloadClientsLoadError": "Nelze načíst klienty pro stahování", "UnableToLoadGeneralSettings": "Nelze načíst obecná nastavení", "DeleteNotification": "Smazat oznámení", "EnableAutomaticSearch": "Povolit automatické vyhledávání", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 74b19207d..79106522a 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -264,7 +264,7 @@ "SSLPort": "SSL-port", "StartupDirectory": "Startmappe", "Status": "Status", - "UnableToLoadDownloadClients": "Kunne ikke indlæse downloadklienter", + "DownloadClientsLoadError": "Kunne ikke indlæse downloadklienter", "UpdateCheckStartupTranslocationMessage": "Kan ikke installere opdatering, fordi startmappen '{0}' er i en App Translocation-mappe.", "UpdateMechanismHelpText": "Brug den indbyggede opdateringsfunktion eller et script", "View": "Udsigt", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 453c42e74..819b9febf 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -418,10 +418,10 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Der neue Indexer konnte nicht hinzugefügt werden, bitte erneut probieren.", "UnableToAddANewNotificationPleaseTryAgain": "Die neue Benachrichtigung konnte nicht hinzugefügt werden, bitte erneut probieren.", "UnableToLoadAppProfiles": "App-Profile können nicht geladen werden", - "UnableToLoadApplicationList": "Anwendungsliste kann nicht geladen werden", + "ApplicationsLoadError": "Anwendungsliste kann nicht geladen werden", "UnableToLoadBackups": "Sicherungen können nicht geladen werden", "UnableToLoadDevelopmentSettings": "Entwicklereinstellungen konnten nicht geladen werden", - "UnableToLoadDownloadClients": "Downloader konnten nicht geladen werden", + "DownloadClientsLoadError": "Downloader konnten nicht geladen werden", "UnableToLoadGeneralSettings": "Allgemeine Einstellungen konnten nicht geladen werden", "UnableToLoadHistory": "Verlauf konnte nicht geladen werden", "UnableToLoadIndexerProxies": "Indexer-Proxies können nicht geladen werden", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 05c1a5225..d31f95a39 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -235,7 +235,7 @@ "Security": "Ασφάλεια", "Tasks": "Καθήκοντα", "UnableToLoadBackups": "Δεν είναι δυνατή η φόρτωση αντιγράφων ασφαλείας", - "UnableToLoadDownloadClients": "Δεν είναι δυνατή η φόρτωση πελατών λήψης", + "DownloadClientsLoadError": "Δεν είναι δυνατή η φόρτωση πελατών λήψης", "UpdateMechanismHelpText": "Χρησιμοποιήστε το ενσωματωμένο πρόγραμμα ενημέρωσης του {appName} ή ένα script", "AnalyticsEnabledHelpText": "Στείλτε ανώνυμες πληροφορίες χρήσης και σφάλματος στους διακομιστές του {appName}. Αυτό περιλαμβάνει πληροφορίες στο πρόγραμμα περιήγησής σας, ποιες σελίδες {appName} WebUI χρησιμοποιείτε, αναφορά σφαλμάτων καθώς και έκδοση λειτουργικού συστήματος και χρόνου εκτέλεσης. Θα χρησιμοποιήσουμε αυτές τις πληροφορίες για να δώσουμε προτεραιότητα σε λειτουργίες και διορθώσεις σφαλμάτων.", "AppDataDirectory": "Κατάλογος AppData", @@ -363,7 +363,7 @@ "QueryOptions": "Επιλογές ερωτήματος", "SearchIndexers": "Αναζήτηση ευρετηρίων", "SearchType": "Τύπος αναζήτησης", - "UnableToLoadApplicationList": "Δεν είναι δυνατή η φόρτωση της λίστας εφαρμογών", + "ApplicationsLoadError": "Δεν είναι δυνατή η φόρτωση της λίστας εφαρμογών", "AddRemoveOnly": "Μόνο προσθήκη και αφαίρεση", "ProwlarrSupportsAnyDownloadClient": "Το {appName} υποστηρίζει οποιοδήποτε από τα προγράμματα-πελάτες λήψης που αναφέρονται παρακάτω.", "Query": "Ερώτηση", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 579bf9954..0db771579 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -52,6 +52,7 @@ "ApplicationURL": "Application URL", "ApplicationUrlHelpText": "This application's external URL including http(s)://, port and URL base", "Applications": "Applications", + "ApplicationsLoadError": "Unable to load application list", "Apply": "Apply", "ApplyChanges": "Apply Changes", "ApplyTags": "Apply Tags", @@ -180,6 +181,7 @@ "DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures", "DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}", "DownloadClients": "Download Clients", + "DownloadClientsLoadError": "Unable to load download clients", "DownloadClientsSettingsSummary": "Download clients configuration for integration into {appName} UI search", "Duration": "Duration", "Edit": "Edit", @@ -317,6 +319,7 @@ "MIA": "MIA", "MaintenanceRelease": "Maintenance Release: bug fixes and other improvements. See Github Commit History for more details", "ManageApplications": "Manage Applications", + "ManageClients": "Manage Clients", "ManageDownloadClients": "Manage Download Clients", "Manual": "Manual", "MappedCategories": "Mapped Categories", @@ -340,6 +343,7 @@ "NewznabUrl": "Newznab Url", "NextExecution": "Next Execution", "No": "No", + "NoApplicationsFound": "No applications found", "NoBackupsAreAvailable": "No backups are available", "NoChange": "No Change", "NoChanges": "No Changes", @@ -565,10 +569,8 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Unable to add a new indexer proxy, please try again.", "UnableToAddANewNotificationPleaseTryAgain": "Unable to add a new notification, please try again.", "UnableToLoadAppProfiles": "Unable to load app profiles", - "UnableToLoadApplicationList": "Unable to load application list", "UnableToLoadBackups": "Unable to load backups", "UnableToLoadDevelopmentSettings": "Unable to load Development settings", - "UnableToLoadDownloadClients": "Unable to load download clients", "UnableToLoadGeneralSettings": "Unable to load General settings", "UnableToLoadHistory": "Unable to load history", "UnableToLoadIndexerProxies": "Unable to load Indexer Proxies", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index c33e90126..1dd38aa3b 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -171,7 +171,7 @@ "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Se podrán instalar desde Sistema: Actualizaciones también", "UnableToLoadTags": "No se pueden cargar las Etiquetas", "UnableToLoadNotifications": "No se pueden cargar las Notificaciones", - "UnableToLoadDownloadClients": "No se puden cargar los gestores de descargas", + "DownloadClientsLoadError": "No se puden cargar los gestores de descargas", "UISettings": "Ajustes del UI", "Torrents": "Torrents", "TestAllClients": "Comprobar Todos los Gestores", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 855a63dbc..e55cc066c 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -135,7 +135,7 @@ "UnableToAddANewIndexerPleaseTryAgain": "Uuden tietolähteen lisäys epäonnistui. Yritä uudelleen.", "UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.", "UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui", - "UnableToLoadDownloadClients": "Lataustyökalujen lataus ei onistu", + "DownloadClientsLoadError": "Lataustyökalujen lataus ei onistu", "UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.", "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.", "Added": "Lisäysaika", @@ -403,7 +403,7 @@ "Proxies": "Välityspalvelimet", "Public": "Julkinen", "SemiPrivate": "Osittain yksityinen", - "UnableToLoadApplicationList": "Sovelluslistausta ei voitu ladata", + "ApplicationsLoadError": "Sovelluslistausta ei voitu ladata", "Url": "URL", "Website": "Verkkosivusto", "IndexerNoDefCheckMessage": "Tietolähteillä ei ole määritystä, eivätkä ne toimi: {0}. Poista ja/tai lisää {appName}iin uudelleen", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 368dea983..e0f9a1b35 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -213,7 +213,7 @@ "UnableToLoadTags": "Impossible de charger les étiquettes", "UnableToLoadHistory": "Impossible de charger l'historique", "UnableToLoadGeneralSettings": "Impossible de charger les paramètres généraux", - "UnableToLoadDownloadClients": "Impossible de charger les clients de téléchargement", + "DownloadClientsLoadError": "Impossible de charger les clients de téléchargement", "UnableToLoadBackups": "Impossible de charger les sauvegardes", "UnableToAddANewNotificationPleaseTryAgain": "Impossible d'ajouter une nouvelle notification, veuillez réessayer.", "UnableToAddANewIndexerPleaseTryAgain": "Impossible d'ajouter un nouvel indexeur, veuillez réessayer.", @@ -400,7 +400,7 @@ "SearchType": "Type de recherche", "Categories": "Catégories", "MassEditor": "Éditer en masse", - "UnableToLoadApplicationList": "Impossible de charger la liste des applications", + "ApplicationsLoadError": "Impossible de charger la liste des applications", "Website": "Site internet", "AudioSearch": "Recherche de musique", "BookSearch": "Recherche de livres", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 96cd0c06d..286e71f48 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -31,7 +31,7 @@ "SettingsEnableColorImpairedModeHelpText": "סגנון שונה כדי לאפשר למשתמשים לקויי צבע להבחין טוב יותר במידע המקודד בצבע", "SettingsLongDateFormat": "פורמט תאריך ארוך", "SettingsShortDateFormat": "פורמט תאריך קצר", - "UnableToLoadDownloadClients": "לא ניתן לטעון לקוחות הורדות", + "DownloadClientsLoadError": "לא ניתן לטעון לקוחות הורדות", "UnableToAddANewNotificationPleaseTryAgain": "לא ניתן להוסיף התראה חדשה, נסה שוב.", "UnableToLoadGeneralSettings": "לא ניתן לטעון את ההגדרות הכלליות", "About": "אודות", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index d667bc4c3..8eb11ec3f 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -294,7 +294,7 @@ "RestartNow": "अब पुनःचालू करें", "SettingsEnableColorImpairedMode": "रंग-बिगड़ा मोड सक्षम करें", "UnableToAddANewNotificationPleaseTryAgain": "नई अधिसूचना जोड़ने में असमर्थ, कृपया पुनः प्रयास करें।", - "UnableToLoadDownloadClients": "डाउनलोड क्लाइंट लोड करने में असमर्थ", + "DownloadClientsLoadError": "डाउनलोड क्लाइंट लोड करने में असमर्थ", "UnableToLoadGeneralSettings": "सामान्य सेटिंग्स लोड करने में असमर्थ", "UnableToLoadNotifications": "सूचनाएं लोड करने में असमर्थ", "UpdateCheckStartupNotWritableMessage": "अपडेट स्थापित नहीं किया जा सकता क्योंकि स्टार्टअप फ़ोल्डर '{0}' उपयोगकर्ता '{1}' द्वारा लिखने योग्य नहीं है।", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 84dd67f6f..8a7f9c4f1 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -223,7 +223,7 @@ "General": "Általános", "UnableToLoadHistory": "Nem sikerült betölteni az előzményeket", "UnableToLoadGeneralSettings": "Nem sikerült betölteni az általános beállításokat", - "UnableToLoadDownloadClients": "Nem sikerült betölteni a letöltőkliens(eke)t", + "DownloadClientsLoadError": "Nem sikerült betölteni a letöltőkliens(eke)t", "UnableToLoadBackups": "Biztonsági mentés(ek) betöltése sikertelen", "UnableToAddANewNotificationPleaseTryAgain": "Nem lehet új értesítést hozzáadni, próbálkozz újra.", "UnableToAddANewIndexerPleaseTryAgain": "Nem lehet új indexert hozzáadni, próbálkozz újra.", @@ -405,7 +405,7 @@ "QueryResults": "Lekérdezési eredmények", "SemiPrivate": "Fél-Privát", "TestAllIndexers": "Indexerek tesztelése", - "UnableToLoadApplicationList": "Nem sikerült betölteni az alkalmazáslistát", + "ApplicationsLoadError": "Nem sikerült betölteni az alkalmazáslistát", "Url": "URL", "UserAgentProvidedByTheAppThatCalledTheAPI": "Az API-t hívó alkalmazás biztosítja a User-Agent szolgáltatást", "Website": "Weboldal", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 539af123b..784dc6e1a 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -65,7 +65,7 @@ "Type": "Tegund", "UnableToAddANewApplicationPleaseTryAgain": "Ekki er hægt að bæta við nýrri tilkynningu. Reyndu aftur.", "UnableToLoadBackups": "Ekki er hægt að hlaða afrit", - "UnableToLoadDownloadClients": "Ekki er hægt að hlaða niður viðskiptavinum", + "DownloadClientsLoadError": "Ekki er hægt að hlaða niður viðskiptavinum", "UnableToLoadGeneralSettings": "Ekki er hægt að hlaða almennar stillingar", "UnableToLoadHistory": "Ekki er hægt að hlaða sögu", "UnableToLoadNotifications": "Ekki er hægt að hlaða tilkynningar", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 6296e3e8a..04a69f7f7 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -240,7 +240,7 @@ "UnableToLoadNotifications": "Impossibile caricare le Notifiche", "UnableToLoadHistory": "Impossibile caricare la storia", "UnableToLoadGeneralSettings": "Impossibile caricare le impostazioni Generali", - "UnableToLoadDownloadClients": "Impossibile caricare i client di download", + "DownloadClientsLoadError": "Impossibile caricare i client di download", "UnableToLoadBackups": "Impossibile caricare i backup", "UnableToAddANewNotificationPleaseTryAgain": "Impossibile aggiungere una nuova notifica, riprova.", "UnableToAddANewIndexerPleaseTryAgain": "Impossibile aggiungere un nuovo Indicizzatore, riprova.", @@ -374,7 +374,7 @@ "SyncLevel": "Livello Sincronizzazione", "IndexerProxy": "Proxy dell'Indicizzatore", "Proxies": "Proxy", - "UnableToLoadApplicationList": "Impossibile careicare la lista applicazioni", + "ApplicationsLoadError": "Impossibile careicare la lista applicazioni", "Website": "Sito", "Privacy": "Privacy", "SettingsIndexerLogging": "Logging Migliorato dell'Indicizzatore", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 0d2ac8a14..378d56913 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -100,7 +100,7 @@ "TagCannotBeDeletedWhileInUse": "使用中は削除できません", "TagIsNotUsedAndCanBeDeleted": "タグは使用されておらず、削除できます", "TestAll": "すべてテスト", - "UnableToLoadDownloadClients": "ダウンロードクライアントを読み込めません", + "DownloadClientsLoadError": "ダウンロードクライアントを読み込めません", "UnableToLoadGeneralSettings": "一般設定を読み込めません", "UpdateAutomaticallyHelpText": "アップデートを自動的にダウンロードしてインストールします。 System:Updatesから引き続きインストールできます。", "Updates": "更新", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 3f0021c50..73cfaf2ed 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -160,7 +160,7 @@ "Title": "표제", "Today": "오늘", "UILanguageHelpTextWarning": "브라우저 새로 고침 필요", - "UnableToLoadDownloadClients": "다운로드 클라이언트를로드 할 수 없습니다.", + "DownloadClientsLoadError": "다운로드 클라이언트를로드 할 수 없습니다.", "UnableToLoadHistory": "기록을로드 할 수 없습니다.", "UnableToLoadTags": "태그를로드 할 수 없습니다.", "UnableToLoadUISettings": "UI 설정을로드 할 수 없습니다.", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index f84d9629c..ec43b40ed 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -388,7 +388,7 @@ "UnableToLoadAppProfiles": "Kan app-profielen niet laden", "UnableToLoadBackups": "Kon geen veiligheidskopieën laden", "UnableToLoadDevelopmentSettings": "Kan ontwikkelingsinstellingen niet laden", - "UnableToLoadDownloadClients": "Downloaders kunnen niet worden geladen", + "DownloadClientsLoadError": "Downloaders kunnen niet worden geladen", "UnableToLoadGeneralSettings": "Kon Algemene instellingen niet inladen", "UnableToLoadHistory": "Kon geschiedenis niet laden", "UnableToLoadIndexerProxies": "Kan Indexeerder-proxy's niet laden", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index df34ade61..23e3f406c 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -262,7 +262,7 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Nie można dodać nowego indeksatora, spróbuj ponownie.", "UnableToAddANewNotificationPleaseTryAgain": "Nie można dodać nowego powiadomienia, spróbuj ponownie.", "UnableToLoadBackups": "Nie można załadować kopii zapasowych", - "UnableToLoadDownloadClients": "Nie można załadować klientów pobierania", + "DownloadClientsLoadError": "Nie można załadować klientów pobierania", "UnableToLoadGeneralSettings": "Nie można załadować ustawień ogólnych", "UnableToLoadHistory": "Nie można załadować historii", "UnableToLoadTags": "Nie można załadować tagów", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index d90fbd526..1b3220dae 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -268,7 +268,7 @@ "UnableToLoadNotifications": "Não foi possível carregar as notificações", "UnableToLoadHistory": "Não foi possível carregar o histórico", "UnableToLoadGeneralSettings": "Não foi possível carregar as definições gerais", - "UnableToLoadDownloadClients": "Não foi possível carregar os clientes de transferências", + "DownloadClientsLoadError": "Não foi possível carregar os clientes de transferências", "UnableToAddANewDownloadClientPleaseTryAgain": "Não foi possível adicionar um novo cliente de transferências, tenta novamente.", "UnableToLoadBackups": "Não foi possível carregar as cópias de segurança", "UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação, tenta novamente.", @@ -390,7 +390,7 @@ "InstanceName": "Nome da Instancia", "InstanceNameHelpText": "Nome da instância na aba e nome da aplicação para Syslog", "UnableToLoadIndexerProxies": "Incapaz de ler o indexador de proxies", - "UnableToLoadApplicationList": "Não foi possível carregar a lista de aplicações", + "ApplicationsLoadError": "Não foi possível carregar a lista de aplicações", "ApplicationLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a erros á mais de 6 horas", "ApplicationLongTermStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a erros à mais de 6 horas: {0}", "Duration": "Duração", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 688867c62..f6c482ae9 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -461,10 +461,10 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Não foi possível adicionar um novo proxy indexador, tente novamente.", "UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação. Tente novamente.", "UnableToLoadAppProfiles": "Não foi possível carregar os perfis de aplicativos", - "UnableToLoadApplicationList": "Não é possível carregar a lista de aplicativos", + "ApplicationsLoadError": "Não é possível carregar a lista de aplicativos", "UnableToLoadBackups": "Não foi possível carregar os backups", "UnableToLoadDevelopmentSettings": "Não foi possível carregar as configurações de desenvolvimento", - "UnableToLoadDownloadClients": "Não foi possível carregar os clientes de download", + "DownloadClientsLoadError": "Não foi possível carregar os clientes de download", "UnableToLoadGeneralSettings": "Não foi possível carregar as configurações gerais", "UnableToLoadHistory": "Não foi possível carregar o histórico", "UnableToLoadIndexerProxies": "Não foi possível carregar proxies do indexador", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 8b31ccaa2..a7ff607bd 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -179,7 +179,7 @@ "Today": "Astăzi", "UnableToAddANewNotificationPleaseTryAgain": "Imposibil de adăugat o nouă notificare, încercați din nou.", "UnableToLoadBackups": "Imposibil de încărcat copiile de rezervă", - "UnableToLoadDownloadClients": "Nu se pot încărca clienții de descărcare", + "DownloadClientsLoadError": "Nu se pot încărca clienții de descărcare", "URLBase": "Baza URL", "UrlBaseHelpText": "Pentru suport proxy invers, implicit este gol", "Usenet": "Usenet", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 16bb70085..2f768c5fe 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -256,7 +256,7 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Не удалось добавить новый индексатор, повторите попытку.", "UnableToAddANewNotificationPleaseTryAgain": "Невозможно добавить новое уведомление, попробуйте еще раз.", "UnableToLoadBackups": "Невозможно загрузить резервные копии", - "UnableToLoadDownloadClients": "Невозможно загрузить загрузчики", + "DownloadClientsLoadError": "Невозможно загрузить загрузчики", "UnableToLoadGeneralSettings": "Невозможно загрузить общие настройки", "UnableToLoadNotifications": "Невозможно загрузить уведомления", "UnableToLoadUISettings": "Не удалось загрузить настройки пользовательского интерфейса", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 35361f4ad..c307c7d90 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -308,7 +308,7 @@ "ApplicationStatusCheckAllClientMessage": "Samtliga listor otillgängliga på grund av fel", "LogLevel": "Loggnivå", "NoLogFiles": "Inga loggfiler", - "UnableToLoadDownloadClients": "Det gick inte att ladda nedladdningsklienter", + "DownloadClientsLoadError": "Det gick inte att ladda nedladdningsklienter", "UpdateMechanismHelpText": "Använd {appName}s inbyggda uppdaterare eller ett skript", "AddDownloadClientToProwlarr": "Lägg till en nedladdningsklient tillåter {appName} att sända nyutgåvor direkt från UI:t samtidigt som en manuell sökning genomförs.", "UnableToLoadIndexerProxies": "Kunde inte ladda Indexer Proxies", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 42e6c587f..af12a9da3 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -58,7 +58,7 @@ "UILanguageHelpTextWarning": "จำเป็นต้องโหลดเบราว์เซอร์ใหม่", "UnableToAddANewIndexerPleaseTryAgain": "ไม่สามารถเพิ่มตัวสร้างดัชนีใหม่ได้โปรดลองอีกครั้ง", "UnableToAddANewIndexerProxyPleaseTryAgain": "ไม่สามารถเพิ่มตัวสร้างดัชนีใหม่ได้โปรดลองอีกครั้ง", - "UnableToLoadDownloadClients": "ไม่สามารถโหลดไคลเอนต์ดาวน์โหลด", + "DownloadClientsLoadError": "ไม่สามารถโหลดไคลเอนต์ดาวน์โหลด", "UpdateCheckUINotWritableMessage": "ไม่สามารถติดตั้งการอัปเดตเนื่องจากโฟลเดอร์ UI \"{0}\" ไม่สามารถเขียนได้โดยผู้ใช้ \"{1}\"", "Updates": "อัปเดต", "UpdateScriptPathHelpText": "พา ธ ไปยังสคริปต์แบบกำหนดเองที่ใช้แพ็กเกจโปรแกรมปรับปรุงที่แยกออกมาและจัดการส่วนที่เหลือของกระบวนการอัพเดต", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 66b9bf0e6..d9ee3676a 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -301,7 +301,7 @@ "UpdateAutomaticallyHelpText": "Güncellemeleri otomatik olarak indirin ve yükleyin. Yine de Sistem'den yükleyebileceksiniz: Güncellemeler", "UpdateMechanismHelpText": "{appName}'ın yerleşik güncelleyicisini veya bir komut dosyasını kullanın", "ShowSearch": "Aramayı Göster", - "UnableToLoadDownloadClients": "İndirme istemcileri yüklenemiyor", + "DownloadClientsLoadError": "İndirme istemcileri yüklenemiyor", "UnableToLoadGeneralSettings": "Genel ayarlar yüklenemiyor", "Automatic": "Otomatik", "AutomaticSearch": "Otomatik Arama", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 4b16abce8..4b7a9d99d 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -72,7 +72,7 @@ "SSLCertPasswordHelpText": "Пароль для файлу pfx", "TestAll": "Перевірити все", "Type": "Тип", - "UnableToLoadDownloadClients": "Не вдалося завантажити клієнти для завантаження", + "DownloadClientsLoadError": "Не вдалося завантажити клієнти для завантаження", "UnableToLoadGeneralSettings": "Не вдалося завантажити загальні налаштування", "UnableToLoadHistory": "Не вдалося завантажити історію", "UnableToLoadIndexers": "Не вдалося завантажити індексатори", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index 3df1ac935..11e0ab004 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -215,7 +215,7 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Không thể thêm trình chỉ mục mới, vui lòng thử lại.", "UnableToAddANewNotificationPleaseTryAgain": "Không thể thêm thông báo mới, vui lòng thử lại.", "UnableToLoadBackups": "Không thể tải các bản sao lưu", - "UnableToLoadDownloadClients": "Không thể tải ứng dụng khách tải xuống", + "DownloadClientsLoadError": "Không thể tải ứng dụng khách tải xuống", "UnableToLoadGeneralSettings": "Không thể tải Cài đặt chung", "UnableToLoadHistory": "Không thể tải lịch sử", "UnableToLoadNotifications": "Không thể tải thông báo", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 59f45acd9..317307afa 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -451,10 +451,9 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "无法添加搜刮器,请稍后重试。", "UnableToAddANewNotificationPleaseTryAgain": "无法添加新通知,请稍后重试。", "UnableToLoadAppProfiles": "无法加载应用配置", - "UnableToLoadApplicationList": "123", "UnableToLoadBackups": "无法加载备份", "UnableToLoadDevelopmentSettings": "无法加载开发设置", - "UnableToLoadDownloadClients": "无法加载下载客户端", + "DownloadClientsLoadError": "无法加载下载客户端", "UnableToLoadGeneralSettings": "无法加载通用设置", "UnableToLoadHistory": "无法加载历史记录", "UnableToLoadIndexerProxies": "无法加载索引器代理", From 255c6335ae04fd50589dd617f500ac2ed201b000 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Sun, 31 Dec 2023 01:05:59 +0100 Subject: [PATCH 423/964] New: Add sorting to Manage Applications and Download Client modals (cherry picked from commit 91053ca51ded804739f94ee936c1376a755dbe11) --- .../Manage/ManageApplicationsModalContent.tsx | 16 ++++++++++++++++ .../Manage/ManageDownloadClientsModalContent.tsx | 16 ++++++++++++++++ .../src/Store/Actions/Settings/applications.js | 15 ++++++++++++--- .../Store/Actions/Settings/downloadClients.js | 13 +++++++++++-- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx b/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx index 8c45cf8a5..e2c36529c 100644 --- a/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx +++ b/frontend/src/Settings/Applications/Applications/Manage/ManageApplicationsModalContent.tsx @@ -14,9 +14,11 @@ import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import useSelectState from 'Helpers/Hooks/useSelectState'; import { kinds } from 'Helpers/Props'; +import SortDirection from 'Helpers/Props/SortDirection'; import { bulkDeleteApplications, bulkEditApplications, + setManageApplicationsSort, } from 'Store/Actions/settingsActions'; import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector'; import { SelectStateInputProps } from 'typings/props'; @@ -62,6 +64,8 @@ const COLUMNS = [ interface ManageApplicationsModalContentProps { onModalClose(): void; + sortKey?: string; + sortDirection?: SortDirection; } function ManageApplicationsModalContent( @@ -76,6 +80,8 @@ function ManageApplicationsModalContent( isSaving, error, items, + sortKey, + sortDirection, }: ApplicationAppState = useSelector( createClientSideCollectionSelector('settings.applications') ); @@ -96,6 +102,13 @@ function ManageApplicationsModalContent( const selectedCount = selectedIds.length; + const onSortPress = useCallback( + (value: string) => { + dispatch(setManageApplicationsSort({ sortKey: value })); + }, + [dispatch] + ); + const onDeletePress = useCallback(() => { setIsDeleteModalOpen(true); }, [setIsDeleteModalOpen]); @@ -201,6 +214,9 @@ function ManageApplicationsModalContent( allSelected={allSelected} allUnselected={allUnselected} onSelectAllChange={onSelectAllChange} + sortKey={sortKey} + sortDirection={sortDirection} + onSortPress={onSortPress} > {items.map((item) => { diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx index 8e257ae7a..4d459d71d 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx @@ -14,9 +14,11 @@ import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import useSelectState from 'Helpers/Hooks/useSelectState'; import { kinds } from 'Helpers/Props'; +import SortDirection from 'Helpers/Props/SortDirection'; import { bulkDeleteDownloadClients, bulkEditDownloadClients, + setManageDownloadClientsSort, } from 'Store/Actions/settingsActions'; import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector'; import { SelectStateInputProps } from 'typings/props'; @@ -61,6 +63,8 @@ const COLUMNS = [ interface ManageDownloadClientsModalContentProps { onModalClose(): void; + sortKey?: string; + sortDirection?: SortDirection; } function ManageDownloadClientsModalContent( @@ -75,6 +79,8 @@ function ManageDownloadClientsModalContent( isSaving, error, items, + sortKey, + sortDirection, }: DownloadClientAppState = useSelector( createClientSideCollectionSelector('settings.downloadClients') ); @@ -93,6 +99,13 @@ function ManageDownloadClientsModalContent( const selectedCount = selectedIds.length; + const onSortPress = useCallback( + (value: string) => { + dispatch(setManageDownloadClientsSort({ sortKey: value })); + }, + [dispatch] + ); + const onDeletePress = useCallback(() => { setIsDeleteModalOpen(true); }, [setIsDeleteModalOpen]); @@ -174,6 +187,9 @@ function ManageDownloadClientsModalContent( allSelected={allSelected} allUnselected={allUnselected} onSelectAllChange={onSelectAllChange} + sortKey={sortKey} + sortDirection={sortDirection} + onSortPress={onSortPress} > {items.map((item) => { diff --git a/frontend/src/Store/Actions/Settings/applications.js b/frontend/src/Store/Actions/Settings/applications.js index 3db520525..207397469 100644 --- a/frontend/src/Store/Actions/Settings/applications.js +++ b/frontend/src/Store/Actions/Settings/applications.js @@ -1,4 +1,5 @@ import { createAction } from 'redux-actions'; +import { sortDirections } from 'Helpers/Props'; import createBulkEditItemHandler from 'Store/Actions/Creators/createBulkEditItemHandler'; import createBulkRemoveItemHandler from 'Store/Actions/Creators/createBulkRemoveItemHandler'; import createFetchHandler from 'Store/Actions/Creators/createFetchHandler'; @@ -7,6 +8,7 @@ import createRemoveItemHandler from 'Store/Actions/Creators/createRemoveItemHand import createSaveProviderHandler, { createCancelSaveProviderHandler } from 'Store/Actions/Creators/createSaveProviderHandler'; import createTestAllProvidersHandler from 'Store/Actions/Creators/createTestAllProvidersHandler'; import createTestProviderHandler, { createCancelTestProviderHandler } from 'Store/Actions/Creators/createTestProviderHandler'; +import createSetClientSideCollectionSortReducer from 'Store/Actions/Creators/Reducers/createSetClientSideCollectionSortReducer'; import createSetProviderFieldValueReducer from 'Store/Actions/Creators/Reducers/createSetProviderFieldValueReducer'; import createSetSettingValueReducer from 'Store/Actions/Creators/Reducers/createSetSettingValueReducer'; import { createThunk } from 'Store/thunks'; @@ -30,9 +32,10 @@ export const CANCEL_SAVE_APPLICATION = 'settings/applications/cancelSaveApplicat export const DELETE_APPLICATION = 'settings/applications/deleteApplication'; export const TEST_APPLICATION = 'settings/applications/testApplication'; export const CANCEL_TEST_APPLICATION = 'settings/applications/cancelTestApplication'; -export const TEST_ALL_APPLICATIONS = 'indexers/testAllApplications'; +export const TEST_ALL_APPLICATIONS = 'settings/applications/testAllApplications'; export const BULK_EDIT_APPLICATIONS = 'settings/applications/bulkEditApplications'; export const BULK_DELETE_APPLICATIONS = 'settings/applications/bulkDeleteApplications'; +export const SET_MANAGE_APPLICATIONS_SORT = 'settings/applications/setManageApplicationsSort'; // // Action Creators @@ -49,6 +52,7 @@ export const cancelTestApplication = createThunk(CANCEL_TEST_APPLICATION); export const testAllApplications = createThunk(TEST_ALL_APPLICATIONS); export const bulkEditApplications = createThunk(BULK_EDIT_APPLICATIONS); export const bulkDeleteApplications = createThunk(BULK_DELETE_APPLICATIONS); +export const setManageApplicationsSort = createAction(SET_MANAGE_APPLICATIONS_SORT); export const setApplicationValue = createAction(SET_APPLICATION_VALUE, (payload) => { return { @@ -88,7 +92,9 @@ export default { isTesting: false, isTestingAll: false, items: [], - pendingChanges: {} + pendingChanges: {}, + sortKey: 'name', + sortDirection: sortDirections.DESCENDING }, // @@ -121,7 +127,10 @@ export default { return selectedSchema; }); - } + }, + + [SET_MANAGE_APPLICATIONS_SORT]: createSetClientSideCollectionSortReducer(section) + } }; diff --git a/frontend/src/Store/Actions/Settings/downloadClients.js b/frontend/src/Store/Actions/Settings/downloadClients.js index 990b7008e..b3b4d9b6e 100644 --- a/frontend/src/Store/Actions/Settings/downloadClients.js +++ b/frontend/src/Store/Actions/Settings/downloadClients.js @@ -1,4 +1,5 @@ import { createAction } from 'redux-actions'; +import { sortDirections } from 'Helpers/Props'; import createBulkEditItemHandler from 'Store/Actions/Creators/createBulkEditItemHandler'; import createBulkRemoveItemHandler from 'Store/Actions/Creators/createBulkRemoveItemHandler'; import createFetchHandler from 'Store/Actions/Creators/createFetchHandler'; @@ -7,6 +8,7 @@ import createRemoveItemHandler from 'Store/Actions/Creators/createRemoveItemHand import createSaveProviderHandler, { createCancelSaveProviderHandler } from 'Store/Actions/Creators/createSaveProviderHandler'; import createTestAllProvidersHandler from 'Store/Actions/Creators/createTestAllProvidersHandler'; import createTestProviderHandler, { createCancelTestProviderHandler } from 'Store/Actions/Creators/createTestProviderHandler'; +import createSetClientSideCollectionSortReducer from 'Store/Actions/Creators/Reducers/createSetClientSideCollectionSortReducer'; import createSetProviderFieldValueReducer from 'Store/Actions/Creators/Reducers/createSetProviderFieldValueReducer'; import createSetSettingValueReducer from 'Store/Actions/Creators/Reducers/createSetSettingValueReducer'; import { createThunk } from 'Store/thunks'; @@ -34,6 +36,7 @@ export const CANCEL_TEST_DOWNLOAD_CLIENT = 'settings/downloadClients/cancelTestD export const TEST_ALL_DOWNLOAD_CLIENTS = 'settings/downloadClients/testAllDownloadClients'; export const BULK_EDIT_DOWNLOAD_CLIENTS = 'settings/downloadClients/bulkEditDownloadClients'; export const BULK_DELETE_DOWNLOAD_CLIENTS = 'settings/downloadClients/bulkDeleteDownloadClients'; +export const SET_MANAGE_DOWNLOAD_CLIENTS_SORT = 'settings/downloadClients/setManageDownloadClientsSort'; // // Action Creators @@ -50,6 +53,7 @@ export const cancelTestDownloadClient = createThunk(CANCEL_TEST_DOWNLOAD_CLIENT) export const testAllDownloadClients = createThunk(TEST_ALL_DOWNLOAD_CLIENTS); export const bulkEditDownloadClients = createThunk(BULK_EDIT_DOWNLOAD_CLIENTS); export const bulkDeleteDownloadClients = createThunk(BULK_DELETE_DOWNLOAD_CLIENTS); +export const setManageDownloadClientsSort = createAction(SET_MANAGE_DOWNLOAD_CLIENTS_SORT); export const setDownloadClientValue = createAction(SET_DOWNLOAD_CLIENT_VALUE, (payload) => { return { @@ -89,7 +93,9 @@ export default { isTesting: false, isTestingAll: false, items: [], - pendingChanges: {} + pendingChanges: {}, + sortKey: 'name', + sortDirection: sortDirections.DESCENDING }, // @@ -147,7 +153,10 @@ export default { return selectedSchema; }); - } + }, + + [SET_MANAGE_DOWNLOAD_CLIENTS_SORT]: createSetClientSideCollectionSortReducer(section) + } }; From cb8797693ec3f729adc6d6c43fabc9bd9ef20736 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 22 Jan 2024 14:10:24 +0200 Subject: [PATCH 424/964] Fixed: Sorting by name in Manage Applications and Download Client modals --- frontend/src/Store/Actions/Settings/applications.js | 7 ++++++- frontend/src/Store/Actions/Settings/downloadClients.js | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/frontend/src/Store/Actions/Settings/applications.js b/frontend/src/Store/Actions/Settings/applications.js index 207397469..53a008b0c 100644 --- a/frontend/src/Store/Actions/Settings/applications.js +++ b/frontend/src/Store/Actions/Settings/applications.js @@ -94,7 +94,12 @@ export default { items: [], pendingChanges: {}, sortKey: 'name', - sortDirection: sortDirections.DESCENDING + sortDirection: sortDirections.ASCENDING, + sortPredicates: { + name: function(item) { + return item.name.toLowerCase(); + } + } }, // diff --git a/frontend/src/Store/Actions/Settings/downloadClients.js b/frontend/src/Store/Actions/Settings/downloadClients.js index b3b4d9b6e..56784d5d0 100644 --- a/frontend/src/Store/Actions/Settings/downloadClients.js +++ b/frontend/src/Store/Actions/Settings/downloadClients.js @@ -95,7 +95,12 @@ export default { items: [], pendingChanges: {}, sortKey: 'name', - sortDirection: sortDirections.DESCENDING + sortDirection: sortDirections.ASCENDING, + sortPredicates: { + name: function(item) { + return item.name.toLowerCase(); + } + } }, // From ebb66e9086b73d4b4ffb8e3f8552ca31f3bd37ba Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Jan 2024 05:25:21 +0200 Subject: [PATCH 425/964] Update database migration version translation token --- frontend/src/System/Status/About/About.js | 10 +++++----- src/NzbDrone.Core/Localization/Core/ar.json | 2 +- src/NzbDrone.Core/Localization/Core/bg.json | 2 +- src/NzbDrone.Core/Localization/Core/ca.json | 2 +- src/NzbDrone.Core/Localization/Core/cs.json | 2 +- src/NzbDrone.Core/Localization/Core/da.json | 2 +- src/NzbDrone.Core/Localization/Core/de.json | 2 +- src/NzbDrone.Core/Localization/Core/el.json | 2 +- src/NzbDrone.Core/Localization/Core/en.json | 6 +++--- src/NzbDrone.Core/Localization/Core/es.json | 2 +- src/NzbDrone.Core/Localization/Core/fi.json | 2 +- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- src/NzbDrone.Core/Localization/Core/he.json | 2 +- src/NzbDrone.Core/Localization/Core/hi.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 2 +- src/NzbDrone.Core/Localization/Core/is.json | 2 +- src/NzbDrone.Core/Localization/Core/it.json | 2 +- src/NzbDrone.Core/Localization/Core/ja.json | 2 +- src/NzbDrone.Core/Localization/Core/ko.json | 2 +- src/NzbDrone.Core/Localization/Core/nl.json | 2 +- src/NzbDrone.Core/Localization/Core/pl.json | 2 +- src/NzbDrone.Core/Localization/Core/pt.json | 2 +- src/NzbDrone.Core/Localization/Core/pt_BR.json | 2 +- src/NzbDrone.Core/Localization/Core/ro.json | 2 +- src/NzbDrone.Core/Localization/Core/ru.json | 2 +- src/NzbDrone.Core/Localization/Core/sv.json | 2 +- src/NzbDrone.Core/Localization/Core/th.json | 2 +- src/NzbDrone.Core/Localization/Core/tr.json | 2 +- src/NzbDrone.Core/Localization/Core/uk.json | 2 +- src/NzbDrone.Core/Localization/Core/vi.json | 2 +- src/NzbDrone.Core/Localization/Core/zh_CN.json | 2 +- 31 files changed, 37 insertions(+), 37 deletions(-) diff --git a/frontend/src/System/Status/About/About.js b/frontend/src/System/Status/About/About.js index 43b0deb9b..c821d32a4 100644 --- a/frontend/src/System/Status/About/About.js +++ b/frontend/src/System/Status/About/About.js @@ -22,9 +22,9 @@ class About extends Component { isNetCore, isDocker, runtimeVersion, - migrationVersion, databaseVersion, databaseType, + migrationVersion, appData, startupPath, mode, @@ -66,13 +66,13 @@ class About extends Component { } Date: Tue, 23 Jan 2024 07:58:35 +0200 Subject: [PATCH 426/964] New: Category filter for Indexers --- frontend/src/App/State/SettingsAppState.ts | 7 ++++ .../Builder/CategoryFilterBuilderRowValue.tsx | 41 +++++++++++++++++++ .../Filter/Builder/FilterBuilderRow.js | 4 ++ .../Helpers/Props/filterBuilderValueTypes.js | 2 +- frontend/src/Store/Actions/indexerActions.js | 24 ++++++++++- .../src/Store/Actions/indexerIndexActions.js | 6 +++ 6 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 frontend/src/Components/Filter/Builder/CategoryFilterBuilderRowValue.tsx diff --git a/frontend/src/App/State/SettingsAppState.ts b/frontend/src/App/State/SettingsAppState.ts index 9dc6dfa2c..d4152431c 100644 --- a/frontend/src/App/State/SettingsAppState.ts +++ b/frontend/src/App/State/SettingsAppState.ts @@ -3,6 +3,7 @@ import AppSectionState, { AppSectionItemState, AppSectionSaveState, } from 'App/State/AppSectionState'; +import { IndexerCategory } from 'Indexer/Indexer'; import Application from 'typings/Application'; import DownloadClient from 'typings/DownloadClient'; import Notification from 'typings/Notification'; @@ -25,6 +26,11 @@ export interface DownloadClientAppState AppSectionDeleteState, AppSectionSaveState {} +export interface IndexerCategoryAppState + extends AppSectionState, + AppSectionDeleteState, + AppSectionSaveState {} + export interface NotificationAppState extends AppSectionState, AppSectionDeleteState {} @@ -35,6 +41,7 @@ interface SettingsAppState { appProfiles: AppProfileAppState; applications: ApplicationAppState; downloadClients: DownloadClientAppState; + indexerCategories: IndexerCategoryAppState; notifications: NotificationAppState; ui: UiSettingsAppState; } diff --git a/frontend/src/Components/Filter/Builder/CategoryFilterBuilderRowValue.tsx b/frontend/src/Components/Filter/Builder/CategoryFilterBuilderRowValue.tsx new file mode 100644 index 000000000..6a7dddcfc --- /dev/null +++ b/frontend/src/Components/Filter/Builder/CategoryFilterBuilderRowValue.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; +import { IndexerCategory } from 'Indexer/Indexer'; +import FilterBuilderRowValue from './FilterBuilderRowValue'; +import FilterBuilderRowValueProps from './FilterBuilderRowValueProps'; + +const indexerCategoriesSelector = createSelector( + (state: AppState) => state.settings.indexerCategories, + (categories) => categories.items +); + +function CategoryFilterBuilderRowValue(props: FilterBuilderRowValueProps) { + const categories: IndexerCategory[] = useSelector(indexerCategoriesSelector); + + const tagList = categories.reduce( + (acc: { id: number; name: string }[], element) => { + acc.push({ + id: element.id, + name: `${element.name} (${element.id})`, + }); + + if (element.subCategories && element.subCategories.length > 0) { + element.subCategories.forEach((subCat) => { + acc.push({ + id: subCat.id, + name: `${subCat.name} (${subCat.id})`, + }); + }); + } + + return acc; + }, + [] + ); + + return ; +} + +export default CategoryFilterBuilderRowValue; diff --git a/frontend/src/Components/Filter/Builder/FilterBuilderRow.js b/frontend/src/Components/Filter/Builder/FilterBuilderRow.js index 8899eaf5b..51622509b 100644 --- a/frontend/src/Components/Filter/Builder/FilterBuilderRow.js +++ b/frontend/src/Components/Filter/Builder/FilterBuilderRow.js @@ -5,6 +5,7 @@ import IconButton from 'Components/Link/IconButton'; import { filterBuilderTypes, filterBuilderValueTypes, icons } from 'Helpers/Props'; import AppProfileFilterBuilderRowValueConnector from './AppProfileFilterBuilderRowValueConnector'; import BoolFilterBuilderRowValue from './BoolFilterBuilderRowValue'; +import CategoryFilterBuilderRowValue from './CategoryFilterBuilderRowValue'; import DateFilterBuilderRowValue from './DateFilterBuilderRowValue'; import FilterBuilderRowValueConnector from './FilterBuilderRowValueConnector'; import HistoryEventTypeFilterBuilderRowValue from './HistoryEventTypeFilterBuilderRowValue'; @@ -56,6 +57,9 @@ function getRowValueConnector(selectedFilterBuilderProp) { case filterBuilderValueTypes.BOOL: return BoolFilterBuilderRowValue; + case filterBuilderValueTypes.CATEGORY: + return CategoryFilterBuilderRowValue; + case filterBuilderValueTypes.DATE: return DateFilterBuilderRowValue; diff --git a/frontend/src/Helpers/Props/filterBuilderValueTypes.js b/frontend/src/Helpers/Props/filterBuilderValueTypes.js index 19c8ccd9c..73ef41956 100644 --- a/frontend/src/Helpers/Props/filterBuilderValueTypes.js +++ b/frontend/src/Helpers/Props/filterBuilderValueTypes.js @@ -7,5 +7,5 @@ export const INDEXER = 'indexer'; export const PROTOCOL = 'protocol'; export const PRIVACY = 'privacy'; export const APP_PROFILE = 'appProfile'; -export const MOVIE_STATUS = 'movieStatus'; +export const CATEGORY = 'category'; export const TAG = 'tag'; diff --git a/frontend/src/Store/Actions/indexerActions.js b/frontend/src/Store/Actions/indexerActions.js index ff0cfe5d4..5a4261c29 100644 --- a/frontend/src/Store/Actions/indexerActions.js +++ b/frontend/src/Store/Actions/indexerActions.js @@ -1,6 +1,6 @@ import _ from 'lodash'; import { createAction } from 'redux-actions'; -import { sortDirections } from 'Helpers/Props'; +import { filterTypePredicates, sortDirections } from 'Helpers/Props'; import createFetchHandler from 'Store/Actions/Creators/createFetchHandler'; import createRemoveItemHandler from 'Store/Actions/Creators/createRemoveItemHandler'; import createSaveProviderHandler, { createCancelSaveProviderHandler } from 'Store/Actions/Creators/createSaveProviderHandler'; @@ -69,6 +69,28 @@ export const filterPredicates = { item.fields.find((field) => field.name === 'vipExpiration')?.value ?? null; return dateFilterPredicate(vipExpiration, filterValue, type); + }, + + categories: function(item, filterValue, type) { + const predicate = filterTypePredicates[type]; + + const { categories = [] } = item.capabilities || {}; + + const categoryList = categories + .filter((category) => category.id < 100000) + .reduce((acc, element) => { + acc.push(element.id); + + if (element.subCategories && element.subCategories.length > 0) { + element.subCategories.forEach((subCat) => { + acc.push(subCat.id); + }); + } + + return acc; + }, []); + + return predicate(categoryList, filterValue); } }; diff --git a/frontend/src/Store/Actions/indexerIndexActions.js b/frontend/src/Store/Actions/indexerIndexActions.js index a09af6228..fa4bc3a15 100644 --- a/frontend/src/Store/Actions/indexerIndexActions.js +++ b/frontend/src/Store/Actions/indexerIndexActions.js @@ -186,6 +186,12 @@ export const defaultState = { type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.APP_PROFILE }, + { + name: 'categories', + label: () => translate('Categories'), + type: filterBuilderTypes.ARRAY, + valueType: filterBuilderValueTypes.CATEGORY + }, { name: 'tags', label: () => translate('Tags'), From 5d2b80d15a2ccde010a4966efbbaea130c3d92d1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 23 Jan 2024 10:59:59 +0200 Subject: [PATCH 427/964] Fixed: (SubsPlease) Parse release size from magnet links --- .../Indexers/Definitions/SubsPlease.cs | 81 ++++++++++--------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs b/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs index d395e0ba1..5c0aa3c96 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs @@ -6,6 +6,7 @@ using System.Text; using System.Text.RegularExpressions; using Newtonsoft.Json; using NLog; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers.Exceptions; @@ -43,12 +44,12 @@ namespace NzbDrone.Core.Indexers.Definitions public override IIndexerRequestGenerator GetRequestGenerator() { - return new SubsPleaseRequestGenerator { Settings = Settings, Capabilities = Capabilities }; + return new SubsPleaseRequestGenerator(Settings); } public override IParseIndexerResponse GetParser() { - return new SubsPleaseParser(Settings, Capabilities.Categories); + return new SubsPleaseParser(Settings); } private IndexerCapabilities SetCapabilities() @@ -74,12 +75,16 @@ namespace NzbDrone.Core.Indexers.Definitions public class SubsPleaseRequestGenerator : IIndexerRequestGenerator { - public NoAuthTorrentBaseSettings Settings { get; set; } - public IndexerCapabilities Capabilities { get; set; } + private readonly NoAuthTorrentBaseSettings _settings; + + public SubsPleaseRequestGenerator(NoAuthTorrentBaseSettings settings) + { + _settings = settings; + } private IEnumerable GetSearchRequests(string term) { - var searchUrl = $"{Settings.BaseUrl.TrimEnd('/')}/api/?"; + var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/api/?"; var searchTerm = Regex.Replace(term, "\\[?SubsPlease\\]?\\s*", string.Empty, RegexOptions.IgnoreCase).Trim(); @@ -104,7 +109,7 @@ namespace NzbDrone.Core.Indexers.Definitions private IEnumerable GetRssRequest() { - var searchUrl = $"{Settings.BaseUrl.TrimEnd('/')}/api/?"; + var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/api/?"; var queryParameters = new NameValueCollection { @@ -119,16 +124,12 @@ namespace NzbDrone.Core.Indexers.Definitions public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { - var pageableRequests = new IndexerPageableRequestChain(); - - return pageableRequests; + return new IndexerPageableRequestChain(); } public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) { - var pageableRequests = new IndexerPageableRequestChain(); - - return pageableRequests; + return new IndexerPageableRequestChain(); } public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) @@ -166,13 +167,13 @@ namespace NzbDrone.Core.Indexers.Definitions public class SubsPleaseParser : IParseIndexerResponse { - private readonly NoAuthTorrentBaseSettings _settings; - private readonly IndexerCapabilitiesCategories _categories; + private static readonly Regex RegexSize = new (@"\&xl=(?\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public SubsPleaseParser(NoAuthTorrentBaseSettings settings, IndexerCapabilitiesCategories categories) + private readonly NoAuthTorrentBaseSettings _settings; + + public SubsPleaseParser(NoAuthTorrentBaseSettings settings) { _settings = settings; - _categories = categories; } public IList ParseResponse(IndexerResponse indexerResponse) @@ -216,28 +217,11 @@ namespace NzbDrone.Core.Indexers.Definitions } // Ex: [SubsPlease] Shingeki no Kyojin (The Final Season) - 64 (1080p) - release.Title += $"[SubsPlease] {value.Show} - {value.Episode} ({d.Res}p)"; + release.Title += $"[SubsPlease] {value.Show} - {value.Episode} ({d.Resolution}p)"; release.MagnetUrl = d.Magnet; release.DownloadUrl = null; release.Guid = d.Magnet; - - // The API doesn't tell us file size, so give an estimate based on resolution - if (string.Equals(d.Res, "1080")) - { - release.Size = 1395864371; // 1.3GB - } - else if (string.Equals(d.Res, "720")) - { - release.Size = 734003200; // 700MB - } - else if (string.Equals(d.Res, "480")) - { - release.Size = 367001600; // 350MB - } - else - { - release.Size = 1073741824; // 1GB - } + release.Size = GetReleaseSize(d); torrentInfos.Add(release); } @@ -246,6 +230,30 @@ namespace NzbDrone.Core.Indexers.Definitions return torrentInfos.ToArray(); } + private static long GetReleaseSize(SubPleaseDownloadInfo info) + { + if (info.Magnet.IsNotNullOrWhiteSpace()) + { + var sizeMatch = RegexSize.Match(info.Magnet); + + if (sizeMatch.Success && + long.TryParse(sizeMatch.Groups["size"].Value, out var releaseSize) + && releaseSize > 0) + { + return releaseSize; + } + } + + // The API doesn't tell us file size, so give an estimate based on resolution + return info.Resolution switch + { + "1080" => 1.3.Gigabytes(), + "720" => 700.Megabytes(), + "480" => 350.Megabytes(), + _ => 1.Gigabytes() + }; + } + public Action, DateTime?> CookiesUpdater { get; set; } } @@ -265,7 +273,8 @@ namespace NzbDrone.Core.Indexers.Definitions public class SubPleaseDownloadInfo { - public string Res { get; set; } + [JsonProperty("res")] + public string Resolution { get; set; } public string Magnet { get; set; } } } From 16baceb784faf80ae352b9b718db6bbec425a790 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 24 Jan 2024 11:37:01 +0200 Subject: [PATCH 428/964] New: Option to disable Email encryption * New: Option to disable Email encryption (cherry picked from commit 7be5732a3a6679120b0f01bd1eb1207194f57f5e) * Fix possible NullRef in Email Encryption migration (cherry picked from commit 271266b10ac51ee6dd7a7024d346b631bd5397c2) --- .../Migration/039_email_encryptionFixture.cs | 151 ++++++++++++++++++ .../EmailSettingsValidatorFixture.cs | 111 +++++++++++++ .../Migration/039_email_encryption.cs | 50 ++++++ src/NzbDrone.Core/Localization/Core/en.json | 2 + .../Notifications/Email/Email.cs | 63 ++++---- .../Notifications/Email/EmailSettings.cs | 11 +- 6 files changed, 352 insertions(+), 36 deletions(-) create mode 100644 src/NzbDrone.Core.Test/Datastore/Migration/039_email_encryptionFixture.cs create mode 100644 src/NzbDrone.Core.Test/NotificationTests/EmailTests/EmailSettingsValidatorFixture.cs create mode 100644 src/NzbDrone.Core/Datastore/Migration/039_email_encryption.cs diff --git a/src/NzbDrone.Core.Test/Datastore/Migration/039_email_encryptionFixture.cs b/src/NzbDrone.Core.Test/Datastore/Migration/039_email_encryptionFixture.cs new file mode 100644 index 000000000..513095162 --- /dev/null +++ b/src/NzbDrone.Core.Test/Datastore/Migration/039_email_encryptionFixture.cs @@ -0,0 +1,151 @@ +using System.Collections.Generic; +using System.Linq; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Datastore.Migration; +using NzbDrone.Core.Notifications.Email; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.Datastore.Migration +{ + [TestFixture] + public class email_encryptionFixture : MigrationTest + { + [Test] + public void should_convert_do_not_require_encryption_to_auto() + { + var db = WithMigrationTestDb(c => + { + c.Insert.IntoTable("Notifications").Row(new + { + OnGrab = true, + OnHealthIssue = true, + IncludeHealthWarnings = true, + Name = "Mail Prowlarr", + Implementation = "Email", + Tags = "[]", + Settings = new EmailSettings38 + { + Server = "smtp.gmail.com", + Port = 563, + To = new List { "dont@email.me" }, + RequireEncryption = false + }.ToJson(), + ConfigContract = "EmailSettings" + }); + }); + + var items = db.Query("SELECT * FROM \"Notifications\""); + + items.Should().HaveCount(1); + items.First().Implementation.Should().Be("Email"); + items.First().ConfigContract.Should().Be("EmailSettings"); + items.First().Settings.UseEncryption.Should().Be((int)EmailEncryptionType.Preferred); + } + + [Test] + public void should_convert_require_encryption_to_always() + { + var db = WithMigrationTestDb(c => + { + c.Insert.IntoTable("Notifications").Row(new + { + OnGrab = true, + OnHealthIssue = true, + IncludeHealthWarnings = true, + Name = "Mail Prowlarr", + Implementation = "Email", + Tags = "[]", + Settings = new EmailSettings38 + { + Server = "smtp.gmail.com", + Port = 563, + To = new List { "dont@email.me" }, + RequireEncryption = true + }.ToJson(), + ConfigContract = "EmailSettings" + }); + }); + + var items = db.Query("SELECT * FROM \"Notifications\""); + + items.Should().HaveCount(1); + items.First().Implementation.Should().Be("Email"); + items.First().ConfigContract.Should().Be("EmailSettings"); + items.First().Settings.UseEncryption.Should().Be((int)EmailEncryptionType.Always); + } + + [Test] + public void should_use_defaults_when_settings_are_empty() + { + var db = WithMigrationTestDb(c => + { + c.Insert.IntoTable("Notifications").Row(new + { + OnGrab = true, + OnHealthIssue = true, + IncludeHealthWarnings = true, + Name = "Mail Prowlarr", + Implementation = "Email", + Tags = "[]", + Settings = new { }.ToJson(), + ConfigContract = "EmailSettings" + }); + }); + + var items = db.Query("SELECT * FROM \"Notifications\""); + + items.Should().HaveCount(1); + items.First().Implementation.Should().Be("Email"); + items.First().ConfigContract.Should().Be("EmailSettings"); + items.First().Settings.UseEncryption.Should().Be((int)EmailEncryptionType.Preferred); + } + } + + public class NotificationDefinition39 + { + public int Id { get; set; } + public string Implementation { get; set; } + public string ConfigContract { get; set; } + public EmailSettings39 Settings { get; set; } + public string Name { get; set; } + public bool OnGrab { get; set; } + public bool OnHealthIssue { get; set; } + public bool OnHealthRestored { get; set; } + public bool OnApplicationUpdate { get; set; } + public bool SupportsOnGrab { get; set; } + public bool IncludeManualGrabs { get; set; } + public bool SupportsOnHealthIssue { get; set; } + public bool SupportsOnHealthRestored { get; set; } + public bool IncludeHealthWarnings { get; set; } + public bool SupportsOnApplicationUpdate { get; set; } + public List Tags { get; set; } + } + + public class EmailSettings38 + { + public string Server { get; set; } + public int Port { get; set; } + public bool RequireEncryption { get; set; } + public string Username { get; set; } + public string Password { get; set; } + public string From { get; set; } + public IEnumerable To { get; set; } + public IEnumerable Cc { get; set; } + public IEnumerable Bcc { get; set; } + } + + public class EmailSettings39 + { + public string Server { get; set; } + public int Port { get; set; } + public int UseEncryption { get; set; } + public string Username { get; set; } + public string Password { get; set; } + public string From { get; set; } + public IEnumerable To { get; set; } + public IEnumerable Cc { get; set; } + public IEnumerable Bcc { get; set; } + } +} diff --git a/src/NzbDrone.Core.Test/NotificationTests/EmailTests/EmailSettingsValidatorFixture.cs b/src/NzbDrone.Core.Test/NotificationTests/EmailTests/EmailSettingsValidatorFixture.cs new file mode 100644 index 000000000..309169c69 --- /dev/null +++ b/src/NzbDrone.Core.Test/NotificationTests/EmailTests/EmailSettingsValidatorFixture.cs @@ -0,0 +1,111 @@ +using System; +using FizzWare.NBuilder; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Core.Notifications.Email; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.NotificationTests.EmailTests +{ + [TestFixture] + public class EmailSettingsValidatorFixture : CoreTest + { + private EmailSettings _emailSettings; + private TestValidator _validator; + + [SetUp] + public void Setup() + { + _validator = new TestValidator + { + v => v.RuleFor(s => s).SetValidator(Subject) + }; + + _emailSettings = Builder.CreateNew() + .With(s => s.Server = "someserver") + .With(s => s.Port = 567) + .With(s => s.UseEncryption = (int)EmailEncryptionType.Always) + .With(s => s.From = "dont@email.me") + .With(s => s.To = new string[] { "dont@email.me" }) + .Build(); + } + + [Test] + public void should_be_valid_if_all_settings_valid() + { + _validator.Validate(_emailSettings).IsValid.Should().BeTrue(); + } + + [Test] + public void should_not_be_valid_if_port_is_out_of_range() + { + _emailSettings.Port = 900000; + + _validator.Validate(_emailSettings).IsValid.Should().BeFalse(); + } + + [Test] + public void should_not_be_valid_if_server_is_empty() + { + _emailSettings.Server = ""; + + _validator.Validate(_emailSettings).IsValid.Should().BeFalse(); + } + + [Test] + public void should_not_be_valid_if_from_is_empty() + { + _emailSettings.From = ""; + + _validator.Validate(_emailSettings).IsValid.Should().BeFalse(); + } + + [TestCase("prowlarr")] + [TestCase("email.me")] + [Ignore("Allowed coz some email servers allow arbitrary source, we probably need to support 'Name ' syntax")] + public void should_not_be_valid_if_from_is_invalid(string email) + { + _emailSettings.From = email; + + _validator.Validate(_emailSettings).IsValid.Should().BeFalse(); + } + + [TestCase("prowlarr")] + [TestCase("email.me")] + public void should_not_be_valid_if_to_is_invalid(string email) + { + _emailSettings.To = new string[] { email }; + + _validator.Validate(_emailSettings).IsValid.Should().BeFalse(); + } + + [TestCase("prowlarr")] + [TestCase("email.me")] + public void should_not_be_valid_if_cc_is_invalid(string email) + { + _emailSettings.Cc = new string[] { email }; + + _validator.Validate(_emailSettings).IsValid.Should().BeFalse(); + } + + [TestCase("prowlarr")] + [TestCase("email.me")] + public void should_not_be_valid_if_bcc_is_invalid(string email) + { + _emailSettings.Bcc = new string[] { email }; + + _validator.Validate(_emailSettings).IsValid.Should().BeFalse(); + } + + [Test] + public void should_not_be_valid_if_to_bcc_cc_are_all_empty() + { + _emailSettings.To = Array.Empty(); + _emailSettings.Cc = Array.Empty(); + _emailSettings.Bcc = Array.Empty(); + + _validator.Validate(_emailSettings).IsValid.Should().BeFalse(); + } + } +} diff --git a/src/NzbDrone.Core/Datastore/Migration/039_email_encryption.cs b/src/NzbDrone.Core/Datastore/Migration/039_email_encryption.cs new file mode 100644 index 000000000..f275bbd70 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/039_email_encryption.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Data; +using Dapper; +using FluentMigrator; +using Newtonsoft.Json.Linq; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(039)] + public class email_encryption : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.WithConnection(ChangeEncryption); + } + + private void ChangeEncryption(IDbConnection conn, IDbTransaction tran) + { + var updated = new List(); + using (var getEmailCmd = conn.CreateCommand()) + { + getEmailCmd.Transaction = tran; + getEmailCmd.CommandText = "SELECT \"Id\", \"Settings\" FROM \"Notifications\" WHERE \"Implementation\" = 'Email'"; + + using (var reader = getEmailCmd.ExecuteReader()) + { + while (reader.Read()) + { + var id = reader.GetInt32(0); + var settings = Json.Deserialize(reader.GetString(1)); + + settings["useEncryption"] = settings.Value("requireEncryption") ?? false ? 1 : 0; + settings["requireEncryption"] = null; + + updated.Add(new + { + Settings = settings.ToJson(), + Id = id + }); + } + } + } + + var updateSql = "UPDATE \"Notifications\" SET \"Settings\" = @Settings WHERE \"Id\" = @Id"; + conn.Execute(updateSql, updated, transaction: tran); + } + } +} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 40db67dc3..782510f03 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -366,6 +366,8 @@ "NotificationTriggers": "Notification Triggers", "NotificationTriggersHelpText": "Select which events should trigger this notification", "Notifications": "Notifications", + "NotificationsEmailSettingsUseEncryption": "Use Encryption", + "NotificationsEmailSettingsUseEncryptionHelpText": "Whether to prefer using encryption if configured on the server, to always use encryption via SSL (Port 465 only) or StartTLS (any other port) or to never use encryption", "OAuthPopupMessage": "Pop-ups are being blocked by your browser", "Ok": "Ok", "OnApplicationUpdate": "On Application Update", diff --git a/src/NzbDrone.Core/Notifications/Email/Email.cs b/src/NzbDrone.Core/Notifications/Email/Email.cs index 6f09eec92..45719839e 100644 --- a/src/NzbDrone.Core/Notifications/Email/Email.cs +++ b/src/NzbDrone.Core/Notifications/Email/Email.cs @@ -108,47 +108,42 @@ namespace NzbDrone.Core.Notifications.Email private void Send(MimeMessage email, EmailSettings settings) { - using (var client = new SmtpClient()) + using var client = new SmtpClient(); + client.Timeout = 10000; + + var useEncyption = (EmailEncryptionType)settings.UseEncryption; + + var serverOption = useEncyption switch { - client.Timeout = 10000; + EmailEncryptionType.Always => settings.Port == 465 + ? SecureSocketOptions.SslOnConnect + : SecureSocketOptions.StartTls, + EmailEncryptionType.Never => SecureSocketOptions.None, + _ => SecureSocketOptions.Auto + }; - var serverOption = SecureSocketOptions.Auto; + client.ServerCertificateValidationCallback = _certificateValidationService.ShouldByPassValidationError; - if (settings.RequireEncryption) - { - if (settings.Port == 465) - { - serverOption = SecureSocketOptions.SslOnConnect; - } - else - { - serverOption = SecureSocketOptions.StartTls; - } - } + _logger.Debug("Connecting to mail server"); - client.ServerCertificateValidationCallback = _certificateValidationService.ShouldByPassValidationError; + client.Connect(settings.Server, settings.Port, serverOption); - _logger.Debug("Connecting to mail server"); + if (!string.IsNullOrWhiteSpace(settings.Username)) + { + _logger.Debug("Authenticating to mail server"); - client.Connect(settings.Server, settings.Port, serverOption); - - if (!string.IsNullOrWhiteSpace(settings.Username)) - { - _logger.Debug("Authenticating to mail server"); - - client.Authenticate(settings.Username, settings.Password); - } - - _logger.Debug("Sending to mail server"); - - client.Send(email); - - _logger.Debug("Sent to mail server, disconnecting"); - - client.Disconnect(true); - - _logger.Debug("Disconnecting from mail server"); + client.Authenticate(settings.Username, settings.Password); } + + _logger.Debug("Sending to mail server"); + + client.Send(email); + + _logger.Debug("Sent to mail server, disconnecting"); + + client.Disconnect(true); + + _logger.Debug("Disconnecting from mail server"); } private MailboxAddress ParseAddress(string type, string address) diff --git a/src/NzbDrone.Core/Notifications/Email/EmailSettings.cs b/src/NzbDrone.Core/Notifications/Email/EmailSettings.cs index ad386b57a..2ef1d9d0c 100644 --- a/src/NzbDrone.Core/Notifications/Email/EmailSettings.cs +++ b/src/NzbDrone.Core/Notifications/Email/EmailSettings.cs @@ -44,8 +44,8 @@ namespace NzbDrone.Core.Notifications.Email [FieldDefinition(1, Label = "Port")] public int Port { get; set; } - [FieldDefinition(2, Label = "Require Encryption", HelpText = "Require SSL (Port 465 only) or StartTLS (any other port)", Type = FieldType.Checkbox)] - public bool RequireEncryption { get; set; } + [FieldDefinition(2, Label = "NotificationsEmailSettingsUseEncryption", HelpText = "NotificationsEmailSettingsUseEncryptionHelpText", Type = FieldType.Select, SelectOptions = typeof(EmailEncryptionType))] + public int UseEncryption { get; set; } [FieldDefinition(3, Label = "Username", HelpText = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] public string Username { get; set; } @@ -70,4 +70,11 @@ namespace NzbDrone.Core.Notifications.Email return new NzbDroneValidationResult(Validator.Validate(this)); } } + + public enum EmailEncryptionType + { + Preferred = 0, + Always = 1, + Never = 2 + } } From d764e3405d7ee69c52431ebba6e98093954e0bb2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 26 Jan 2024 09:58:22 +0200 Subject: [PATCH 429/964] New: (Torznab) Internal and Scene tags --- .../Indexers/Definitions/Torznab/TorznabRssParser.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Torznab/TorznabRssParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Torznab/TorznabRssParser.cs index 9bd544aad..04c67c376 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Torznab/TorznabRssParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Torznab/TorznabRssParser.cs @@ -277,6 +277,18 @@ namespace NzbDrone.Core.Indexers.Torznab flags.Add(IndexerFlag.FreeLeech); } + var tags = TryGetMultipleTorznabAttributes(item, "tag"); + + if (tags.Any(t => t.EqualsIgnoreCase("internal"))) + { + flags.Add(IndexerFlag.Internal); + } + + if (tags.Any(t => t.EqualsIgnoreCase("scene"))) + { + flags.Add(IndexerFlag.Scene); + } + return flags; } From f7bf21df6880d4ad813eb064a9cd3c3ad774e6ca Mon Sep 17 00:00:00 2001 From: abcasada <40399292+abcasada@users.noreply.github.com> Date: Fri, 26 Jan 2024 11:13:12 -0600 Subject: [PATCH 430/964] Update help text for Tags usage in Applications --- src/NzbDrone.Core/Localization/Core/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 782510f03..51f005ad0 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -47,7 +47,7 @@ "ApplicationLongTermStatusCheckSingleClientMessage": "Applications unavailable due to failures for more than 6 hours: {0}", "ApplicationStatusCheckAllClientMessage": "All applications are unavailable due to failures", "ApplicationStatusCheckSingleClientMessage": "Applications unavailable due to failures: {0}", - "ApplicationTagsHelpText": "Sync Indexers to this application that have no tags or that have 1 or more matching tags", + "ApplicationTagsHelpText": "Sync Indexers to this application that have one or more matching tags. If no tags are listed here, then no indexers will be prevented from syncing due to their tags.", "ApplicationTagsHelpTextWarning": "Tags should be used with caution, they can have unintended effects. An app with a tag will only sync with indexers having the same tag.", "ApplicationURL": "Application URL", "ApplicationUrlHelpText": "This application's external URL including http(s)://, port and URL base", From 71e18b616d502f10a75948e8adbbff4ada9a755f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 28 Jan 2024 09:07:13 +0200 Subject: [PATCH 431/964] Bump version to 1.13.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1ce342be1..490cbffd9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.13.1' + majorVersion: '1.13.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From ed1364b6ffae3d5b29242f490bae40f3b79cf8c7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 28 Jan 2024 09:08:55 +0200 Subject: [PATCH 432/964] Update magnet trackers --- .../Indexers/MagnetLinkBuilder.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs b/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs index 23c0c8dc4..a16949e90 100644 --- a/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs +++ b/src/NzbDrone.Core/Indexers/MagnetLinkBuilder.cs @@ -10,26 +10,26 @@ namespace NzbDrone.Core.Indexers { private static readonly List Trackers = new () { - "udp://tracker.opentrackr.org:1337/announce", - "https://tracker2.ctix.cn:443/announce", - "https://tracker1.520.jp:443/announce", + "http://tracker.opentrackr.org:1337/announce", + "udp://tracker.auctor.tv:6969/announce", "udp://opentracker.i2p.rocks:6969/announce", - "udp://open.tracker.cl:1337/announce", + "https://opentracker.i2p.rocks:443/announce", "udp://open.demonii.com:1337/announce", "udp://tracker.openbittorrent.com:6969/announce", "http://tracker.openbittorrent.com:80/announce", "udp://open.stealth.si:80/announce", - "udp://exodus.desync.com:6969/announce", "udp://tracker.torrent.eu.org:451/announce", - "udp://tracker1.bt.moack.co.kr:80/announce", - "udp://tracker-udp.gbitt.info:80/announce", + "udp://tracker.moeking.me:6969/announce", "udp://explodie.org:6969/announce", - "https://tracker.gbitt.info:443/announce", - "http://tracker.gbitt.info:80/announce", - "http://bt.endpot.com:80/announce", + "udp://exodus.desync.com:6969/announce", + "udp://uploads.gamecoast.net:6969/announce", + "udp://tracker1.bt.moack.co.kr:80/announce", "udp://tracker.tiny-vps.com:6969/announce", - "udp://tracker.auctor.tv:6969/announce", - "udp://tk1.trackerservers.com:8080/announce" + "udp://tracker.theoks.net:6969/announce", + "udp://tracker.skyts.net:6969/announce", + "udp://tracker-udp.gbitt.info:80/announce", + "udp://open.tracker.ink:6969/announce", + "udp://movies.zsw.ca:6969/announce" }; public static string BuildPublicMagnetLink(string infoHash, string releaseTitle) From 5034a211cbe2cdf64f2d2ec58f38639c42277a20 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 23 May 2022 20:41:50 -0700 Subject: [PATCH 433/964] New: Don't return API Keys and Passwords via the API (cherry picked from commit 570be882154e73f8ad1de5b16b957bcb964697fd) Don't replace private values that haven't been set (cherry picked from commit 52760e0908fa9852ed8a770f1916bb582eb8c8b4) --- .../Applications/ApplicationResource.cs | 4 +-- .../DownloadClient/DownloadClientResource.cs | 4 +-- .../IndexerProxies/IndexerProxyResource.cs | 4 +-- .../Indexers/IndexerResource.cs | 4 +-- .../Notifications/NotificationResource.cs | 4 +-- src/Prowlarr.Api.V1/ProviderControllerBase.cs | 3 +- src/Prowlarr.Api.V1/ProviderResource.cs | 4 +-- src/Prowlarr.Http/ClientSchema/Field.cs | 2 +- .../ClientSchema/SchemaBuilder.cs | 31 ++++++++++++++----- 9 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/Prowlarr.Api.V1/Applications/ApplicationResource.cs b/src/Prowlarr.Api.V1/Applications/ApplicationResource.cs index 5c1374ea6..100d9083a 100644 --- a/src/Prowlarr.Api.V1/Applications/ApplicationResource.cs +++ b/src/Prowlarr.Api.V1/Applications/ApplicationResource.cs @@ -24,14 +24,14 @@ namespace Prowlarr.Api.V1.Applications return resource; } - public override ApplicationDefinition ToModel(ApplicationResource resource) + public override ApplicationDefinition ToModel(ApplicationResource resource, ApplicationDefinition existingDefinition) { if (resource == null) { return default; } - var definition = base.ToModel(resource); + var definition = base.ToModel(resource, existingDefinition); definition.SyncLevel = resource.SyncLevel; diff --git a/src/Prowlarr.Api.V1/DownloadClient/DownloadClientResource.cs b/src/Prowlarr.Api.V1/DownloadClient/DownloadClientResource.cs index 7376d6fe4..4ff1e5b53 100644 --- a/src/Prowlarr.Api.V1/DownloadClient/DownloadClientResource.cs +++ b/src/Prowlarr.Api.V1/DownloadClient/DownloadClientResource.cs @@ -33,14 +33,14 @@ namespace Prowlarr.Api.V1.DownloadClient return resource; } - public override DownloadClientDefinition ToModel(DownloadClientResource resource) + public override DownloadClientDefinition ToModel(DownloadClientResource resource, DownloadClientDefinition existingDefinition) { if (resource == null) { return null; } - var definition = base.ToModel(resource); + var definition = base.ToModel(resource, existingDefinition); definition.Enable = resource.Enable; definition.Protocol = resource.Protocol; diff --git a/src/Prowlarr.Api.V1/IndexerProxies/IndexerProxyResource.cs b/src/Prowlarr.Api.V1/IndexerProxies/IndexerProxyResource.cs index 6b8719289..8416464de 100644 --- a/src/Prowlarr.Api.V1/IndexerProxies/IndexerProxyResource.cs +++ b/src/Prowlarr.Api.V1/IndexerProxies/IndexerProxyResource.cs @@ -25,14 +25,14 @@ namespace Prowlarr.Api.V1.IndexerProxies return resource; } - public override IndexerProxyDefinition ToModel(IndexerProxyResource resource) + public override IndexerProxyDefinition ToModel(IndexerProxyResource resource, IndexerProxyDefinition existingDefinition) { if (resource == null) { return default(IndexerProxyDefinition); } - var definition = base.ToModel(resource); + var definition = base.ToModel(resource, existingDefinition); return definition; } diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs b/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs index 832d7f219..e82ad2ab5 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs @@ -104,14 +104,14 @@ namespace Prowlarr.Api.V1.Indexers return resource; } - public override IndexerDefinition ToModel(IndexerResource resource) + public override IndexerDefinition ToModel(IndexerResource resource, IndexerDefinition existingDefinition) { if (resource == null) { return null; } - var definition = base.ToModel(resource); + var definition = base.ToModel(resource, existingDefinition); if (resource.Implementation == nameof(Cardigann)) { diff --git a/src/Prowlarr.Api.V1/Notifications/NotificationResource.cs b/src/Prowlarr.Api.V1/Notifications/NotificationResource.cs index 1951866ac..dcac3f6d4 100644 --- a/src/Prowlarr.Api.V1/Notifications/NotificationResource.cs +++ b/src/Prowlarr.Api.V1/Notifications/NotificationResource.cs @@ -43,14 +43,14 @@ namespace Prowlarr.Api.V1.Notifications return resource; } - public override NotificationDefinition ToModel(NotificationResource resource) + public override NotificationDefinition ToModel(NotificationResource resource, NotificationDefinition existingDefinition) { if (resource == null) { return default(NotificationDefinition); } - var definition = base.ToModel(resource); + var definition = base.ToModel(resource, existingDefinition); definition.OnGrab = resource.OnGrab; definition.SupportsOnGrab = resource.SupportsOnGrab; diff --git a/src/Prowlarr.Api.V1/ProviderControllerBase.cs b/src/Prowlarr.Api.V1/ProviderControllerBase.cs index 809697a06..f65b916bb 100644 --- a/src/Prowlarr.Api.V1/ProviderControllerBase.cs +++ b/src/Prowlarr.Api.V1/ProviderControllerBase.cs @@ -142,7 +142,8 @@ namespace Prowlarr.Api.V1 private TProviderDefinition GetDefinition(TProviderResource providerResource, bool validate, bool includeWarnings, bool forceValidate) { - var definition = _resourceMapper.ToModel(providerResource); + var existingDefinition = providerResource.Id > 0 ? _providerFactory.Find(providerResource.Id) : null; + var definition = _resourceMapper.ToModel(providerResource, existingDefinition); if (validate && (definition.Enable || forceValidate)) { diff --git a/src/Prowlarr.Api.V1/ProviderResource.cs b/src/Prowlarr.Api.V1/ProviderResource.cs index f39294f28..3de6725c7 100644 --- a/src/Prowlarr.Api.V1/ProviderResource.cs +++ b/src/Prowlarr.Api.V1/ProviderResource.cs @@ -45,7 +45,7 @@ namespace Prowlarr.Api.V1 }; } - public virtual TProviderDefinition ToModel(TProviderResource resource) + public virtual TProviderDefinition ToModel(TProviderResource resource, TProviderDefinition existingDefinition) { if (resource == null) { @@ -65,7 +65,7 @@ namespace Prowlarr.Api.V1 }; var configContract = ReflectionExtensions.CoreAssembly.FindTypeByName(definition.ConfigContract); - definition.Settings = (IProviderConfig)SchemaBuilder.ReadFromSchema(resource.Fields, configContract); + definition.Settings = (IProviderConfig)SchemaBuilder.ReadFromSchema(resource.Fields, configContract, existingDefinition?.Settings); return definition; } diff --git a/src/Prowlarr.Http/ClientSchema/Field.cs b/src/Prowlarr.Http/ClientSchema/Field.cs index 7ceed1ae9..1af56b6d0 100644 --- a/src/Prowlarr.Http/ClientSchema/Field.cs +++ b/src/Prowlarr.Http/ClientSchema/Field.cs @@ -16,10 +16,10 @@ namespace Prowlarr.Http.ClientSchema public string Type { get; set; } public bool Advanced { get; set; } public List SelectOptions { get; set; } - public string SelectOptionsProviderAction { get; set; } public string Section { get; set; } public string Hidden { get; set; } + public PrivacyLevel Privacy { get; set; } public string Placeholder { get; set; } public bool IsFloat { get; set; } diff --git a/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs b/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs index ddfbe40f9..c5154335d 100644 --- a/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs +++ b/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs @@ -15,6 +15,7 @@ namespace Prowlarr.Http.ClientSchema { public static class SchemaBuilder { + private const string PRIVATE_VALUE = "********"; private static Dictionary _mappings = new Dictionary(); private static ILocalizationService _localizationService; @@ -36,13 +37,19 @@ namespace Prowlarr.Http.ClientSchema var field = mapping.Field.Clone(); field.Value = mapping.GetterFunc(model); + if (field.Value != null && !field.Value.Equals(string.Empty) && + (field.Privacy == PrivacyLevel.ApiKey || field.Privacy == PrivacyLevel.Password)) + { + field.Value = PRIVATE_VALUE; + } + result.Add(field); } return result.OrderBy(r => r.Order).ToList(); } - public static object ReadFromSchema(List fields, Type targetType) + public static object ReadFromSchema(List fields, Type targetType, object model) { Ensure.That(targetType, () => targetType).IsNotNull(); @@ -57,18 +64,25 @@ namespace Prowlarr.Http.ClientSchema if (field != null) { - mapping.SetterFunc(target, field.Value); + // Use the Privacy property from the mapping's field as Privacy may not be set in the API request (nor is it required) + if ((mapping.Field.Privacy == PrivacyLevel.ApiKey || mapping.Field.Privacy == PrivacyLevel.Password) && + (field.Value?.ToString()?.Equals(PRIVATE_VALUE) ?? false) && + model != null) + { + var existingValue = mapping.GetterFunc(model); + + mapping.SetterFunc(target, existingValue); + } + else + { + mapping.SetterFunc(target, field.Value); + } } } return target; } - public static T ReadFromSchema(List fields) - { - return (T)ReadFromSchema(fields, typeof(T)); - } - // Ideally this function should begin a System.Linq.Expression expression tree since it's faster. // But it's probably not needed till performance issues pop up. public static FieldMapping[] GetFieldMappings(Type type) @@ -127,6 +141,7 @@ namespace Prowlarr.Http.ClientSchema Advanced = fieldAttribute.Advanced, Type = fieldAttribute.Type.ToString().FirstCharToLower(), Section = fieldAttribute.Section, + Privacy = fieldAttribute.Privacy, Placeholder = fieldAttribute.Placeholder }; @@ -159,7 +174,7 @@ namespace Prowlarr.Http.ClientSchema Field = field, PropertyType = propertyInfo.PropertyType, GetterFunc = t => propertyInfo.GetValue(targetSelector(t), null), - SetterFunc = (t, v) => propertyInfo.SetValue(targetSelector(t), valueConverter(v), null) + SetterFunc = (t, v) => propertyInfo.SetValue(targetSelector(t), v?.GetType() == propertyInfo.PropertyType ? v : valueConverter(v), null) }); } else From 47fb886930ca69c03ec71cc97bea37e68eeb525b Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 19 Jan 2024 17:27:29 -0800 Subject: [PATCH 434/964] Don't clone indexer API Key (cherry picked from commit d336aaf3f04136471970155b5a7cc876770c64ff) --- frontend/src/Store/Actions/indexerActions.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/src/Store/Actions/indexerActions.js b/frontend/src/Store/Actions/indexerActions.js index 5a4261c29..2aae11b36 100644 --- a/frontend/src/Store/Actions/indexerActions.js +++ b/frontend/src/Store/Actions/indexerActions.js @@ -225,7 +225,13 @@ export const reducers = createHandleActions({ delete selectedSchema.name; selectedSchema.fields = selectedSchema.fields.map((field) => { - return { ...field }; + const newField = { ...field }; + + if (newField.privacy === 'apiKey' || newField.privacy === 'password') { + newField.value = ''; + } + + return newField; }); newState.selectedSchema = selectedSchema; From 8cf892124cedff4f168d3ba1dfeb0b2c86b9fa2f Mon Sep 17 00:00:00 2001 From: Servarr Date: Sun, 28 Jan 2024 08:05:45 +0000 Subject: [PATCH 435/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index 1c7852be6..a09a4239e 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -4629,6 +4629,9 @@ "type": "string", "nullable": true }, + "privacy": { + "$ref": "#/components/schemas/PrivacyLevel" + }, "placeholder": { "type": "string", "nullable": true @@ -5675,6 +5678,15 @@ }, "additionalProperties": false }, + "PrivacyLevel": { + "enum": [ + "normal", + "password", + "apiKey", + "userName" + ], + "type": "string" + }, "ProviderMessage": { "type": "object", "properties": { From 9eb291f5785dc190c30ea7f9a8df7f699e51389d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 31 Jan 2024 15:26:26 +0200 Subject: [PATCH 436/964] Fixed: Avoid trailing slash in Proxy Url sent to FlareSolverr --- .../FlareSolverr/FlareSolverr.cs | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs index c3edb880e..b309ec06e 100644 --- a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs +++ b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs @@ -115,7 +115,7 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr MaxTimeout = maxTimeout, Proxy = new FlareSolverrProxy { - Url = proxyUrl?.AbsoluteUri + Url = proxyUrl?.OriginalString } }; } @@ -141,7 +141,7 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr MaxTimeout = maxTimeout, Proxy = new FlareSolverrProxy { - Url = proxyUrl?.AbsoluteUri + Url = proxyUrl?.OriginalString } }; } @@ -206,17 +206,13 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr private Uri GetProxyUri(HttpProxySettings proxySettings) { - switch (proxySettings.Type) + return proxySettings.Type switch { - case ProxyType.Http: - return new Uri("http://" + proxySettings.Host + ":" + proxySettings.Port); - case ProxyType.Socks4: - return new Uri("socks4://" + proxySettings.Host + ":" + proxySettings.Port); - case ProxyType.Socks5: - return new Uri("socks5://" + proxySettings.Host + ":" + proxySettings.Port); - default: - return null; - } + ProxyType.Http => new Uri("http://" + proxySettings.Host + ":" + proxySettings.Port), + ProxyType.Socks4 => new Uri("socks4://" + proxySettings.Host + ":" + proxySettings.Port), + ProxyType.Socks5 => new Uri("socks5://" + proxySettings.Host + ":" + proxySettings.Port), + _ => null + }; } private class FlareSolverrRequest From 2bfb83893377aae2649d053ae789b1617ef9d747 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 31 Jan 2024 19:37:05 +0200 Subject: [PATCH 437/964] Bind shortcut for pending changes confirmation only when it's shown --- frontend/src/Settings/PendingChangesModal.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/frontend/src/Settings/PendingChangesModal.js b/frontend/src/Settings/PendingChangesModal.js index 4cb83e8f6..213445c65 100644 --- a/frontend/src/Settings/PendingChangesModal.js +++ b/frontend/src/Settings/PendingChangesModal.js @@ -15,12 +15,17 @@ function PendingChangesModal(props) { isOpen, onConfirm, onCancel, - bindShortcut + bindShortcut, + unbindShortcut } = props; useEffect(() => { - bindShortcut('enter', onConfirm); - }, [bindShortcut, onConfirm]); + if (isOpen) { + bindShortcut('enter', onConfirm); + + return () => unbindShortcut('enter', onConfirm); + } + }, [bindShortcut, unbindShortcut, isOpen, onConfirm]); return ( Date: Sat, 3 Feb 2024 00:13:50 +0200 Subject: [PATCH 438/964] Fixed: (IPTorrents) Include episodes in season search --- src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs index 8e6756020..b5b78d91d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs @@ -255,7 +255,14 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedTvSearchString}", searchCriteria, searchCriteria.FullImdbId)); + var searchTerm = $"{searchCriteria.SanitizedTvSearchString}"; + + if (searchCriteria.Season > 0 && searchCriteria.Episode.IsNullOrWhiteSpace()) + { + searchTerm += "*"; + } + + pageableRequests.Add(GetPagedRequests(searchTerm.Trim(), searchCriteria, searchCriteria.FullImdbId)); return pageableRequests; } From 3496263cd2a9065590789dc91988af0ad3e5700e Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 2 Feb 2024 12:58:30 +0000 Subject: [PATCH 439/964] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Alexander Co-authored-by: Anonymous Co-authored-by: Crocmou Co-authored-by: Havok Dan Co-authored-by: Magyar Co-authored-by: Ole Nørby Co-authored-by: Oskari Lavinto Co-authored-by: Stas Panasiuk Co-authored-by: Weblate Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 5 +- src/NzbDrone.Core/Localization/Core/da.json | 5 +- src/NzbDrone.Core/Localization/Core/es.json | 26 +++++----- src/NzbDrone.Core/Localization/Core/fi.json | 41 ++++++++------- src/NzbDrone.Core/Localization/Core/fr.json | 6 ++- src/NzbDrone.Core/Localization/Core/hu.json | 51 +++++++++++-------- .../Localization/Core/pt_BR.json | 12 +++-- src/NzbDrone.Core/Localization/Core/ru.json | 4 +- src/NzbDrone.Core/Localization/Core/uk.json | 17 ++++--- .../Localization/Core/zh_CN.json | 4 +- .../Localization/Core/zh_TW.json | 5 +- 11 files changed, 105 insertions(+), 71 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 13fdad794..b395abf18 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -427,5 +427,8 @@ "Yes": "Si", "No": "No", "StopSelecting": "Deixa de seleccionar", - "External": "Extern" + "External": "Extern", + "Id": "ID", + "Author": "Autor", + "ManageClients": "Gestiona els clients" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index fbd801a2e..cc409e3e4 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -369,5 +369,8 @@ "ResetAPIKeyMessageText": "Er du sikker på, at du vil nulstille din API-nøgle?", "AuthBasic": "Grundlæggende (pop op-browser)", "None": "Ingen", - "RestartProwlarr": "Genstart {appName}" + "RestartProwlarr": "Genstart {appName}", + "AddCustomFilter": "Tilføj tilpasset filter", + "AddConnectionImplementation": "Tilføj forbindelse - {implementationName}", + "AddConnection": "Tilføj forbindelse" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index c7cbffb40..2daa91f39 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -2,7 +2,7 @@ "Indexers": "Indexadores", "Host": "Host", "History": "Historial", - "HideAdvanced": "Ocultar Avanzado", + "HideAdvanced": "Ocultar avanzado", "Health": "Salud", "General": "General", "Folder": "Carpeta", @@ -75,9 +75,9 @@ "Indexer": "Indexador", "Grabbed": "Añadido", "GeneralSettingsSummary": "Puerto, SSL, nombre de usuario/contraseña , proxy, analíticas, y actualizaciones", - "Filename": "Nombre del archivo", + "Filename": "Nombre de archivo", "Failed": "Fallido", - "EventType": "Tipo de Evento", + "EventType": "Tipo de evento", "DownloadClientsSettingsSummary": "Configuración del cliente de descargas para la integración en {appName} UI search", "DownloadClient": "Cliente de descarga", "Details": "Detalles", @@ -128,7 +128,7 @@ "PendingChangesDiscardChanges": "Descartar cambios y salir", "SettingsEnableColorImpairedModeHelpText": "Estilo modificado para permitir que usuarios con problemas de color distingan mejor la información codificada por colores", "SettingsEnableColorImpairedMode": "Activar Modo De Color Degradado", - "GeneralSettings": "Ajustes Generales", + "GeneralSettings": "Opciones generales", "Fixed": "Arreglado", "EnableSslHelpText": " Requiere reiniciar la aplicación como administrador para que surta efecto", "Enable": "Habilitar", @@ -138,7 +138,7 @@ "DeleteNotification": "Borrar Notificacion", "DeleteDownloadClient": "Borrar cliente de descarga", "DeleteBackup": "Eliminar copia de seguridad", - "DatabaseMigration": "Migración de DB", + "DatabaseMigration": "Migración de la base de datos", "CloneProfile": "Clonar Perfil", "ClientPriority": "Prioridad del Cliente", "ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado", @@ -217,8 +217,8 @@ "IndexerFlags": "Marcas de Indexer", "IncludeHealthWarningsHelpText": "Incluir Alertas de Salud", "IllRestartLater": "Lo reiniciaré más tarde", - "IgnoredAddresses": "Direcciones Ignoradas", - "Hostname": "Nombre del Host", + "IgnoredAddresses": "Ignorar direcciones", + "Hostname": "Nombre de host", "EnableSSL": "Habilitar SSL", "EnableInteractiveSearch": "Habilitar Búsqueda Interactiva", "EnableAutomaticSearch": "Habilitar Búsqueda Automática", @@ -233,9 +233,9 @@ "RemovingTag": "Eliminando etiqueta", "Manual": "Manual", "LogLevelTraceHelpTextWarning": "El registro de seguimiento se ha de habilitar solo temporalmente", - "ExistingTag": "Etiqueta existente", + "ExistingTag": "Etiquetas existentes", "EnableInteractiveSearchHelpText": "Se usará cuando se utilice la búsqueda interactiva", - "EnableAutomaticSearchHelpText": "Se usará cuando las búsquedas automáticas se realicen desde el UI o por {appName}", + "EnableAutomaticSearchHelpText": "Será usado cuando las búsquedas automáticas sean realizadas por la interfaz de usuario o por {appName}", "DeleteTagMessageText": "¿Está seguro de querer eliminar la etiqueta '{label}'?", "DeleteNotificationMessageText": "¿Seguro que quieres eliminar la notificación '{name}'?", "DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{name}'?", @@ -265,14 +265,14 @@ "ForMoreInformationOnTheIndividualDownloadClients": "Para más información individual de los gestores de descarga, haz clic en lls botones de información.", "FilterPlaceHolder": "Buscar películas", "Exception": "Excepción", - "ErrorLoadingContents": "Error al cargar los contenidos", + "ErrorLoadingContents": "Error cargando contenidos", "UILanguageHelpTextWarning": "Recargar el Navegador", "UILanguageHelpText": "Lenguaje que {appName} usara para el UI", "UILanguage": "Lenguaje de UI", "Priority": "Prioridad", "InteractiveSearch": "Búsqueda Interactiva", "IndexerPriorityHelpText": "Prioridad del Indexer de 1 (La más alta) a 50 (La más baja). Por defecto: 25.", - "IndexerPriority": "Prioridad del Indexer", + "IndexerPriority": "Prioridad del indexador", "EditIndexer": "Editar Indexer", "Disabled": "Deshabilitado", "AutomaticSearch": "Búsqueda Automática", @@ -315,7 +315,7 @@ "CouldNotConnectSignalR": "No se pudo conectar a SignalR, la interfaz de usuario no se actualiza", "EnableRss": "Habilitar RSS", "FeatureRequests": "Peticiones de características", - "HomePage": "Página de inicio", + "HomePage": "Página principal", "UnableToAddANewApplicationPleaseTryAgain": "No se ha podido añadir una nueva notificación, prueba otra vez.", "Filters": "Filtros", "HistoryCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática", @@ -358,7 +358,7 @@ "Queued": "Encolado", "ApplicationLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas", "ApplicationLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}", - "Ended": "Terminó", + "Ended": "Finalizado", "NextExecution": "Siguiente ejecución", "Started": "Iniciado", "Remove": "Eliminar", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 46ef0741f..4c7d1a089 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -40,7 +40,7 @@ "New": "Uutta", "PageSizeHelpText": "Sivukohtainen kohdemäärä.", "Proxy": "Välityspalvelin", - "ProxyBypassFilterHelpText": "Käytä aliverkkotunnusten erottimena pilkkua (,) ja jokerimerkkinä tähteä ja pistettä (*.). Esimerkkejä: www.esimerkki.fi,*.esimerkki.fi.", + "ProxyBypassFilterHelpText": "Erota aliverkkotunnukset pilkuilla ja käytä jokerimerkkinä tähteä ja pistettä (*.). Esimerkki: www.esimerkki.fi,*.esimerkki.fi).", "Reddit": "Reddit", "Refresh": "Päivitä", "RefreshMovie": "Päivitä elokuva", @@ -80,7 +80,7 @@ "Language": "Kieli", "Search": "Haku", "Details": "Tiedot", - "InteractiveSearch": "Manuaalihaku", + "InteractiveSearch": "Etsi manuaalisesti", "Interval": "Ajoitus", "KeyboardShortcuts": "Pikanäppäimet", "LastWriteTime": "Viimeksi tallennettu", @@ -170,7 +170,7 @@ "UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.", "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.", "UnableToLoadHistory": "Historian lataus epäonnistui.", - "UnableToLoadNotifications": "Kytkentöjen lataus epäonnistui.", + "UnableToLoadNotifications": "Kytkösten lataus epäonnistui.", "UnableToLoadTags": "Tunnisteiden lataus ei onnistu", "UnableToLoadUISettings": "Käyttöliittymän asetuksien lataus epäonnistui.", "UnsavedChanges": "Muutoksia ei ole tallennettu", @@ -211,7 +211,7 @@ "TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys", "TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille tietolähteille. Käytä kaikille jättämällä tyhjäksi.", "UnableToAddANewAppProfilePleaseTryAgain": "Uuden sovellusprofiilin lisäys epäonnistui. Yritä uudelleen.", - "UnableToAddANewNotificationPleaseTryAgain": "Kytkennän lisäys epäonnistui. Yritä uudelleen.", + "UnableToAddANewNotificationPleaseTryAgain": "Kytköksen lisäys epäonnistui. Yritä uudelleen.", "Version": "Versio", "View": "Näkymä", "Warn": "Varoitus", @@ -251,7 +251,7 @@ "DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}", "EditIndexer": "Muokkaa tietolähdettä", "EnableAutomaticSearch": "Käytä automaattihakua", - "EnableInteractiveSearch": "Käytä manuaalihakua", + "EnableInteractiveSearch": "Käytä manuaalihakuun", "EnableInteractiveSearchHelpText": "Profiilia käytetään manuaalihakuun.", "EnableSSL": "SSL-salaus", "EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.", @@ -288,7 +288,7 @@ "SSLCertPath": "SSL-varmenteen sijainti", "SSLCertPathHelpText": "PFX-tiedoston sijainti", "Status": "Tila", - "NotificationTriggers": "Laukaisijat", + "NotificationTriggers": "Laukaisimet", "NoUpdatesAreAvailable": "Päivityksiä ei ole saatavilla", "OAuthPopupMessage": "Selaimesi estää ponnahdukset", "Ok": "Ok", @@ -366,13 +366,13 @@ "Category": "Kategoria", "ClearHistory": "Tyhjennä historia", "ClearHistoryMessageText": "Haluatko varmasti tyhjentää kaiken {appName}-historian?", - "Connect": "Kytkennät", + "Connect": "Kytkökset", "EnableRssHelpText": "Käytä tietolähteelle RSS-syötettä.", "DeleteApplication": "Poista sovellus", "DeleteAppProfile": "Poista sovellusprofiili", "IndexerProxies": "Tiedonhaun välityspalvelimet", "IndexerAuth": "Tietolähteen todennus", - "Notifications": "Kytkennät", + "Notifications": "Kytkökset", "NotificationTriggersHelpText": "Valitse tämän ilmoituksen laukaisevat tapahtumat.", "Stats": "Tilastot", "UnableToLoadDevelopmentSettings": "Kehittäjäasetusten lataus epäonnistui", @@ -398,8 +398,8 @@ "IndexerAlreadySetup": "Tietolähteestä on määritetty jo ainakin yksi instanssi", "IndexerInfo": "Tietolähteen tiedot", "MassEditor": "Massamuokkaus", - "OnApplicationUpdate": "Sovelluksen päivittyessä", - "OnApplicationUpdateHelpText": "Sovelluksen päivittyessä", + "OnApplicationUpdate": "Kun sovellus päivitetään", + "OnApplicationUpdateHelpText": "Kun sovellus päivitetään", "Proxies": "Välityspalvelimet", "Public": "Julkinen", "SemiPrivate": "Osittain yksityinen", @@ -415,7 +415,7 @@ "SearchTypes": "Mitä etsitään", "UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui", "Yes": "Kyllä", - "MappedDrivesRunningAsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä, kun sovellus suoritetaan Windows-palveluna. Lisätietoja löydät UKK:stä.", + "MappedDrivesRunningAsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja UKK:sta.", "No": "Ei", "BookSearchTypes": "Kirjojen hakutyypit", "IndexerDetails": "Tietolähteen tiedot", @@ -449,10 +449,10 @@ "Started": "Alkoi", "ApplicationLongTermStatusCheckAllClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.", "ApplicationLongTermStatusCheckSingleClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}", - "AreYouSureYouWantToDeleteCategory": "Haluatko varmasti poistaa kartoitetun kategorian?", + "AreYouSureYouWantToDeleteCategory": "Haluatko varmasti poistaa kohdistetun kategorian?", "DeleteClientCategory": "Poista lataustyökalukategoria", "DownloadClientCategory": "Lataustyökalukategoria", - "MappedCategories": "Kartoitetut kategoriat", + "MappedCategories": "Kohdistetut kategoriat", "AuthenticationRequired": "Vaadi tunnistautuminen", "Remove": "Poista", "Replace": "Korvaa", @@ -476,14 +476,14 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituissa tietolähteissä", "ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet", "ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi", - "DownloadClientPriorityHelpText": "Määritä useiden lataustyökalujen painotus. Tasaveroiset lataajat erotetaan Round-Robin-tekniikalla.", + "DownloadClientPriorityHelpText": "Lautaustyökalujen painotus, 1– 50 (korkein-alin). Oletusarvo on 1 ja tasaveroiset erotetaan Round-Robin-tekniikalla.", "Album": "Albumi", "Artist": "Esittäjä", "Author": "Kirjailija", "Book": "Kirja", "UpdateAvailable": "Uusi päivitys on saatavilla", "Episode": "Jakso", - "Label": "Tunniste", + "Label": "Nimi", "Theme": "Teema", "ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".", "DeleteAppProfileMessageText": "Haluatko varmasti poistaa sovellusprofiilin \"{name}\"?", @@ -492,7 +492,7 @@ "ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.", "minutes": "minuuttia", "AddConnection": "Lisää yhteys", - "NotificationStatusAllClientHealthCheckMessage": "Kaikki ilmoitukset eivät ole ongelmien vuoksi käytettävissä", + "NotificationStatusAllClientHealthCheckMessage": "Mikään ilmoituspavelu ei ole ongelmien vuoksi käytettävissä.", "NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {0}", "AuthBasic": "Perus (ponnahdusikkuna)", "AuthForm": "Lomake (kirjautumissivu)", @@ -573,7 +573,7 @@ "GoToApplication": "Siirry sovellukseen", "AreYouSureYouWantToDeleteIndexer": "Haluatko varmasti poistaa tietolähteen \"{name}\" sovelluksesta {appName}?", "AuthQueries": "Todennuskyselyt", - "ApplicationTagsHelpText": "Sovellukseen synkronoidaan joko tunnisteettomat tietolähteet tai vastaavilla tunnisteilla merkityt tietolähteet.", + "ApplicationTagsHelpText": "Sovellukseen synkronoidaan yhdellä tai useammalla vastaavalla tunnisteella merkityt tietolähteet. Jos tässä ei ole tunnisteita, ei tietolähteitä synkronoida niiden tunnisteiden vuoksi.", "ApplicationTagsHelpTextWarning": "Tunnisteita tulee käyttää harkiten, koska niillä voi olla odottamattomia vaikutuksia. Tunnisteella merkittyyn sovellukseen synkronoidaan vain samalla tunnisteella merkityt tietolähteet.", "AverageResponseTimesMs": "Tietolähteiden keskimääräiset vasteajat (ms)", "CountIndexersAvailable": "{count} tietolähde(ttä) on käytettävissä", @@ -604,5 +604,10 @@ "SearchQueries": "Hakukyselyt", "SeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.", "RssQueries": "RSS-kyselyt", - "TotalUserAgentQueries": "Käyttäjäagentin kyselyiden kokonaismäärä" + "TotalUserAgentQueries": "Käyttäjäagentin kyselyiden kokonaismäärä", + "NotificationsEmailSettingsUseEncryption": "Käytä salausta", + "NotificationsEmailSettingsUseEncryptionHelpText": "Määrittää suositaanko salausta, jos se on määritetty palvelimelle, käytetäänkö aina SSL- (vain portti 465) tai StartTLS-salausta (kaikki muut portit), voi käytetäänkö salausta lainkaan.", + "ManageClients": "Hallitse työkaluja", + "NoApplicationsFound": "Sovelluksia ei löytynyt", + "DownloadClientAriaSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi." } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index d688c865f..dd6d5f322 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -223,7 +223,7 @@ "StartTypingOrSelectAPathBelow": "Commencer à écrire ou sélectionner un chemin ci-dessous", "NoTagsHaveBeenAddedYet": "Aucune identification n'a été ajoutée pour l'instant", "IndexerFlags": "Indicateurs d'indexeur", - "DeleteTagMessageText": "Voulez-vous vraiment supprimer l'étiquette « {label} » ?", + "DeleteTagMessageText": "Voulez-vous vraiment supprimer l'étiquette '{label}' ?", "UISettings": "Paramètres UI", "UILanguageHelpTextWarning": "Rechargement du navigateur requis", "UILanguageHelpText": "Langue que {appName} utilisera pour l'interface utilisateur", @@ -603,5 +603,7 @@ "NoIndexerCategories": "Aucune catégorie disponible pour cet indexeur", "InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres", "DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu", - "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)" + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)", + "DownloadClientAriaSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement par défaut Aria2", + "ManageClients": "Gérer les clients" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 6fede952e..ab12541e6 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -19,10 +19,10 @@ "Docker": "Docker", "Disabled": "Tiltva", "Details": "részletek", - "DeleteTagMessageText": "Biztosan törlöd a(z) „{0}” címkét?", - "DeleteNotificationMessageText": "Biztosan törlöd a(z) „{0}” értesítést?", + "DeleteTagMessageText": "Biztosan törli a „{label}” címkét?", + "DeleteNotificationMessageText": "Biztosan törli a(z) „{name}” értesítést?", "DeleteNotification": "Értesítés Törlése", - "DeleteDownloadClientMessageText": "Biztosan törlöd a(z) „{0}” letöltő klienst?", + "DeleteDownloadClientMessageText": "Biztosan törli a(z) \"{name}\" letöltési klienst?", "DeleteDownloadClient": "Letöltőkliens törlése", "DeleteBackupMessageText": "Biztosan törli a '{name}' biztonsági mentést?", "DeleteBackup": "Biztonsági Mentés törlése", @@ -111,10 +111,10 @@ "SSLCertPasswordHelpText": "Jelszó a Pfx fájlhoz", "SSLCertPassword": "SSL Tanúsítvány jelszava", "Source": "Forrás", - "Sort": "Rendezés", + "Sort": "Fajta", "Size": "Méret", - "Shutdown": "Leállítás", - "ShowSearchHelpText": "A kereső gomb megjelenítése az egérrel", + "Shutdown": "Leállitás", + "ShowSearchHelpText": "Keresés gomb megjelenítése az egérrel", "ShowAdvanced": "Haladó nézet", "SettingsTimeFormat": "Időformátum", "SettingsShowRelativeDatesHelpText": "Relatív (Ma / Tegnap / stb.) vagy valós dátumok megjelenítése", @@ -125,7 +125,7 @@ "SettingsEnableColorImpairedMode": "Színtévesztő mód bekapcsolása", "Settings": "Beállítások", "SendAnonymousUsageData": "Névtelen használati adatok küldése", - "SelectAll": "Összes kijelölése", + "SelectAll": "Mindet kiválaszt", "Seeders": "Seederek", "Security": "Biztonság", "Search": "Keresés", @@ -148,12 +148,12 @@ "RemovingTag": "Címke eltávolítása", "RemoveFilter": "Szűrő törlése", "RemovedFromTaskQueue": "Eltávolítva a feladatsorról", - "Reload": "Újratöltés", + "Reload": "Újratölt", "ReleaseStatus": "Kiadás státusza", "ReleaseBranchCheckOfficialBranchMessage": "A(z) {0} nem érvényes {appName} frissítési ágazat, ezért nem kap frissítéseket", "RefreshMovie": "Film frissítése", "Refresh": "Frissítés", - "ReadTheWikiForMoreInformation": "Olvasd el a Wiki-t további információkért", + "ReadTheWikiForMoreInformation": "További információkért olvassa el a Wikit", "ProwlarrSupportsAnyIndexer": "A {appName} számos indexert támogat, minden olyan indexelő mellett, amely a Newznab / Torznab szabványt használja, valamint a 'Generic Newznab' (usenethez) vagy a 'Generic Torznab' (torrentekhez) használatával. Keresés és az alább felsorolt indexelők kiválasztása.", "ProwlarrSupportsAnyDownloadClient": "A {appName} minden olyan letöltési klienst támogat, amely a Newznab szabványt használja, valamint az alább felsorolt letöltési klienseket.", "Queue": "Várakozási sor", @@ -238,11 +238,11 @@ "Torrents": "Torrentek", "Title": "Cím", "Time": "Idő", - "TestAllClients": "Összes kliens tesztelése", + "TestAllClients": "Minden ügyfél tesztelése", "TestAll": "Összes Tesztelése", "Test": "Teszt", "Tasks": "Feladatok", - "TagsSettingsSummary": "Tekintse meg az összes címkét és azok használatát. A használatlan címkék eltávolíthatók", + "TagsSettingsSummary": "Tekintse meg az összes címkét és azok felhasználási módját. A fel nem használt címkék eltávolíthatók", "TagsHelpText": "Legalább egy megfelelő címkével rendelkező filmekre vonatkozik", "Tags": "Címkék", "TagIsNotUsedAndCanBeDeleted": "A címke nincs használatban, törölhető", @@ -281,7 +281,7 @@ "UnableToLoadTags": "Nem sikerült betölteni a címkéket", "UnableToLoadNotifications": "Nem sikerült betölteni az Értesítéseket", "TableOptions": "Táblázat Beállítások", - "ShowSearch": "Keresés(ek) megjelenítése", + "ShowSearch": "Keresés mutatása", "SetTags": "Címkék beállítása", "NotificationTriggers": "Értesítési triggerek", "IndexerLongTermStatusCheckSingleClientMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt: {0}", @@ -404,7 +404,7 @@ "Public": "Publikus", "QueryResults": "Lekérdezési eredmények", "SemiPrivate": "Fél-Privát", - "TestAllIndexers": "Indexerek tesztelése", + "TestAllIndexers": "Tesztelje az összes indexelőt", "ApplicationsLoadError": "Nem sikerült betölteni az alkalmazáslistát", "Url": "URL", "UserAgentProvidedByTheAppThatCalledTheAPI": "Az API-t hívó alkalmazás biztosítja a User-Agent szolgáltatást", @@ -464,16 +464,16 @@ "More": "Több", "Publisher": "Kiadó", "ApplyChanges": "Változások alkalmazása", - "ApplyTagsHelpTextReplace": "Csere: Cserélje ki a címkéket a beírt címkékre (az összes címke törléséhez ne adjon meg címkéket)", + "ApplyTagsHelpTextReplace": "Csere: Cserélje ki a címkéket a megadott címkékkel (az összes címke törléséhez ne írjon be címkéket)", "EditSelectedIndexers": "Kiválasztott indexelők szerkesztése", "ApplyTagsHelpTextAdd": "Hozzáadás: Adja hozzá a címkéket a meglévő címkék listájához", "ApplyTagsHelpTextHowToApplyApplications": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez", "ApplyTagsHelpTextHowToApplyIndexers": "Címkék alkalmazása a kiválasztott indexelőkre", "ApplyTagsHelpTextRemove": "Eltávolítás: Távolítsa el a beírt címkéket", - "CountIndexersSelected": "{0} Indexelő(k) kiválasztva", - "DeleteSelectedDownloadClients": "Letöltőkliens Törlése", + "CountIndexersSelected": "{count} indexelő(k) kiválasztva", + "DeleteSelectedDownloadClients": "Letöltési kliens(ek) törlése", "DownloadClientPriorityHelpText": "Priorizálj több letöltési klienst. A Round-Robint azonos prioritású letöltőkliensek használják.", - "EditSelectedDownloadClients": "Kiválasztott letöltési kliensek szerkesztése", + "EditSelectedDownloadClients": "Kijelölt letöltési kliensek szerkesztése", "Label": "Címke", "SelectIndexers": "Indexelők keresése", "ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {0} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban", @@ -488,18 +488,18 @@ "Album": "Album", "Artist": "Előadó", "Author": "Szerző", - "ConnectionLostReconnect": "A Radarr megpróbál automatikusan csatlakozni, vagy kattints a frissítés gombra.", + "ConnectionLostReconnect": "A(z) {appName} automatikusan megpróbál csatlakozni, vagy kattintson az újratöltés gombra lent.", "DeleteAppProfileMessageText": "Biztosan törli a {0} minőségi profilt?", - "RecentChanges": "Friss változtatások", + "RecentChanges": "Friss változások", "WhatsNew": "Mi az újdonság?", - "ConnectionLostToBackend": "A Radarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.", + "ConnectionLostToBackend": "A(z) {appName} megszakadt a kapcsolat a háttérrendszerrel, ezért újra kell tölteni a működés visszaállításához.", "minutes": "percek", "AddConnection": "Csatlakozás hozzáadása", "NotificationStatusAllClientHealthCheckMessage": "Az összes értesítés nem érhető el hibák miatt", "NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}", "AuthBasic": "Alap (böngésző előugró ablak)", "AuthForm": "Űrlapok (bejelentkezési oldal)", - "DisabledForLocalAddresses": "Letiltva a helyi címeknél", + "DisabledForLocalAddresses": "Helyi címeknél letiltva", "None": "Egyik sem", "ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?", "AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót", @@ -534,5 +534,12 @@ "External": "Külső", "NoHistoryFound": "Nem található előzmény", "InvalidUILanguage": "A felhasználói felület érvénytelen nyelvre van állítva, javítsa ki, és mentse el a beállításait", - "ManageDownloadClients": "Letöltési kliensek kezelése" + "ManageDownloadClients": "Letöltési kliensek kezelése", + "DownloadClientAriaSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához", + "DeleteSelectedIndexersMessageText": "Biztosan törölni szeretne {count} kiválasztott indexelőt?", + "DownloadClientQbittorrentSettingsContentLayout": "Tartalom elrendezése", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Függetlenül attól, hogy a qBittorrent konfigurált tartalomelrendezését használja, az eredeti elrendezést a torrentből, vagy mindig hozzon létre egy almappát (qBittorrent 4.3.2)", + "DeleteSelectedDownloadClientsMessageText": "Biztosan törölni szeretné a kiválasztott {count} letöltési klienst?", + "CountDownloadClientsSelected": "{count} letöltési kliens kiválasztva", + "StopSelecting": "Kiválasztás leállítása" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index fb08ff742..6e275c625 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -93,7 +93,7 @@ "CouldNotConnectSignalR": "Não é possível conectar ao SignalR, a interface não atualizará", "Custom": "Personalizado", "CustomFilters": "Filtros personalizados", - "DatabaseMigration": "Migração de banco de dados", + "DatabaseMigration": "Migração de Banco de Dados", "Database": "Banco de dados", "Date": "Data", "Dates": "Datas", @@ -401,7 +401,7 @@ "Source": "Origem", "StartTypingOrSelectAPathBelow": "Comece a digitar ou selecione um caminho abaixo", "Started": "Iniciado", - "StartupDirectory": "Diretório de inicialização", + "StartupDirectory": "Diretório de Inicialização", "Stats": "Estatísticas", "Status": "Status", "StopSelecting": "Parar Seleção", @@ -595,7 +595,7 @@ "NoIndexerHistory": "Nenhum histórico encontrado para este indexador", "TotalGrabs": "Total de Capturas", "TotalQueries": "Total de Consultas", - "ApplicationTagsHelpText": "Sincronize indexadores com este aplicativo que não possuem tags ou que possuem 1 ou mais tags correspondentes", + "ApplicationTagsHelpText": "Sincronize indexadores com este aplicativo que possuem uma ou mais etiquetas correspondentes. Se nenhuma etiqueta estiver listada aqui, nenhum indexador será impedido de sincronizar devido às suas etiquetas.", "ApplicationTagsHelpTextWarning": "As tags devem ser usadas com cautela, pois podem ter efeitos indesejados. Um aplicativo com uma tag só será sincronizado com indexadores que tenham a mesma tag.", "IndexerTagsHelpTextWarning": "As tags devem ser usadas com cautela, pois podem ter efeitos indesejados. Um indexador com uma tag sincronizará apenas com aplicativos com a mesma tag.", "NoIndexerCategories": "Nenhuma categoria encontrada para este indexador", @@ -605,5 +605,9 @@ "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Seja para usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)", "DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo", "IndexerId": "ID do Indexador", - "DownloadClientAriaSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do Aria2" + "DownloadClientAriaSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do Aria2", + "ManageClients": "Gerenciar Clientes", + "NoApplicationsFound": "Nenhum aplicativo encontrado", + "NotificationsEmailSettingsUseEncryptionHelpText": "Se preferir usar criptografia se configurado no servidor, usar sempre criptografia via SSL (somente porta 465) ou StartTLS (qualquer outra porta) ou nunca usar criptografia", + "NotificationsEmailSettingsUseEncryption": "Usar Criptografia" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index cc3834688..3cef8cd90 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -420,5 +420,7 @@ "AuthenticationRequiredPasswordHelpTextWarning": "Введите новый пароль", "AuthenticationRequiredUsernameHelpTextWarning": "Введите новое имя пользователя", "RestartProwlarr": "Перезапустить {appName}", - "AuthenticationRequiredWarning": "Чтобы предотвратить удаленный доступ без авторизации, {appName} теперь требует, чтобы авторизация была включена. При желании вы можете отключить авторизацию с локальных адресов." + "AuthenticationRequiredWarning": "Чтобы предотвратить удаленный доступ без авторизации, {appName} теперь требует, чтобы авторизация была включена. При желании вы можете отключить авторизацию с локальных адресов.", + "Id": "ID", + "ManageClients": "Управление клиентами" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 7448bbd83..ad3277345 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -1,7 +1,7 @@ { "BranchUpdateMechanism": "Гілка, що використовується зовнішнім механізмом оновлення", "CancelPendingTask": "Ви впевнені, що хочете скасувати це незавершене завдання?", - "About": "Деталі", + "About": "Про нас", "AcceptConfirmationModal": "Вікно підтвердження", "Actions": "Дії", "Add": "Додати", @@ -11,7 +11,7 @@ "Analytics": "Аналітика", "ApiKey": "API Ключ", "Added": "Додано", - "AddIndexer": "Додати індексатор", + "AddIndexer": "Додати Індексер", "AddingTag": "Додавання тегу", "AppDataDirectory": "Каталог AppData", "AppDataLocationHealthCheckMessage": "Оновлення буде неможливим, щоб запобігти видаленню AppData під час оновлення", @@ -309,7 +309,7 @@ "MaintenanceRelease": "Випуск для обслуговування: виправлення помилок та інші покращення. Щоб отримати докладнішу інформацію, перегляньте історію фіксації Github", "ThemeHelpText": "Змініть тему інтерфейсу додатка, тема «Авто» використовуватиме вашу тему ОС, щоб установити світлий або темний режим. Натхненний Theme.Park", "UILanguageHelpText": "Мова, яку {appName} використовуватиме для інтерфейсу користувача", - "UpdateMechanismHelpText": "Використовуйте вбудований засіб оновлення {appName} або скрипт", + "UpdateMechanismHelpText": "Використайте вбудоване оновлення {appName}'у або скрипт", "ApplicationStatusCheckSingleClientMessage": "Списки недоступні через помилки: {0}", "ApplicationStatusCheckAllClientMessage": "Усі списки недоступні через помилки", "LaunchBrowserHelpText": " Відкрийте веб-браузер і перейдіть на домашню сторінку {appName} під час запуску програми.", @@ -368,13 +368,16 @@ "DisabledForLocalAddresses": "Відключено для локальних адрес", "None": "Жодного", "ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?", - "AddConnection": "Редагувати колекцію", + "AddConnection": "Додати Підключення", "RestartProwlarr": "Перезавантажити {appName}", "EditApplicationImplementation": "Додати умому", "EditConnectionImplementation": "Додати умому", "EditIndexerImplementation": "Додати умому", - "AddConnectionImplementation": "Додати умому", + "AddConnectionImplementation": "Додати Підключення - {implementationName}", "AddApplicationImplementation": "Додати умому", - "AddIndexerImplementation": "Додати умому", - "AddIndexerProxyImplementation": "Додати умому" + "AddIndexerImplementation": "Додати індексер - {implementationName}", + "AddIndexerProxyImplementation": "Додати умому", + "EditIndexerProxyImplementation": "Додати умому", + "AddCustomFilter": "Додати власний фільтр", + "AddDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 551309d7a..86046d9f0 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -602,5 +602,7 @@ "InvalidUILanguage": "您的UI设置为无效语言,请纠正并保存设置", "NoIndexerCategories": "没有找到此索引器的分类", "DownloadClientQbittorrentSettingsContentLayout": "内容布局", - "DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局,使用种子的原始布局或始终创建子文件夹(qBittorrent 4.3.2+)" + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局,使用种子的原始布局或始终创建子文件夹(qBittorrent 4.3.2+)", + "DownloadClientAriaSettingsDirectoryHelpText": "可选的下载位置,留空使用 Aria2 默认位置", + "ManageClients": "管理客户端" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index 6d982d380..b322838e9 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -125,5 +125,8 @@ "ApplyTagsHelpTextAdd": "加入:將標籤加入已存在的標籤清單", "AppUpdated": "{appName}已更新", "AppUpdatedVersion": "重新載入", - "ApplyChanges": "應用" + "ApplyChanges": "應用", + "ApplyTagsHelpTextHowToApplyApplications": "如何套用標籤在所選擇的輸入清單", + "Artist": "演員", + "Id": "ID" } From 21589fda573f930cb3e175fb0107da766da6daf5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 4 Feb 2024 12:52:25 +0200 Subject: [PATCH 440/964] Bump version to 1.13.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 490cbffd9..5eab4fcc7 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.13.2' + majorVersion: '1.13.3' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 4558f552820b52bb1f9cd97fdabe03654ce9924a Mon Sep 17 00:00:00 2001 From: abcasada <40399292+abcasada@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:07:41 -0600 Subject: [PATCH 441/964] Hints for week column and short dates in UI settings --- frontend/src/Settings/UI/UISettings.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/src/Settings/UI/UISettings.js b/frontend/src/Settings/UI/UISettings.js index caa013db3..d156f4ff3 100644 --- a/frontend/src/Settings/UI/UISettings.js +++ b/frontend/src/Settings/UI/UISettings.js @@ -21,19 +21,19 @@ export const firstDayOfWeekOptions = [ ]; export const weekColumnOptions = [ - { key: 'ddd M/D', value: 'Tue 3/25' }, - { key: 'ddd MM/DD', value: 'Tue 03/25' }, - { key: 'ddd D/M', value: 'Tue 25/3' }, - { key: 'ddd DD/MM', value: 'Tue 25/03' } + { key: 'ddd M/D', value: 'Tue 3/25', hint: 'ddd M/D' }, + { key: 'ddd MM/DD', value: 'Tue 03/25', hint: 'ddd MM/DD' }, + { key: 'ddd D/M', value: 'Tue 25/3', hint: 'ddd D/M' }, + { key: 'ddd DD/MM', value: 'Tue 25/03', hint: 'ddd DD/MM' } ]; const shortDateFormatOptions = [ - { key: 'MMM D YYYY', value: 'Mar 25 2014' }, - { key: 'DD MMM YYYY', value: '25 Mar 2014' }, - { key: 'MM/D/YYYY', value: '03/25/2014' }, - { key: 'MM/DD/YYYY', value: '03/25/2014' }, - { key: 'DD/MM/YYYY', value: '25/03/2014' }, - { key: 'YYYY-MM-DD', value: '2014-03-25' } + { key: 'MMM D YYYY', value: 'Mar 25 2014', hint: 'MMM D YYYY' }, + { key: 'DD MMM YYYY', value: '25 Mar 2014', hint: 'DD MMM YYYY' }, + { key: 'MM/D/YYYY', value: '03/25/2014', hint: 'MM/D/YYYY' }, + { key: 'MM/DD/YYYY', value: '03/25/2014', hint: 'MM/DD/YYYY' }, + { key: 'DD/MM/YYYY', value: '25/03/2014', hint: 'DD/MM/YYYY' }, + { key: 'YYYY-MM-DD', value: '2014-03-25', hint: 'YYYY-MM-DD' } ]; const longDateFormatOptions = [ From cd7d1571db373de08e219a2171d36011d71ba441 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 6 Feb 2024 16:47:20 -0800 Subject: [PATCH 442/964] Fixed: Don't use sub folder to check for free disk space for update (cherry picked from commit f722d49b3a9efefa65bef1b24d90be9332ca62ea) --- src/NzbDrone.Core/Update/InstallUpdateService.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Update/InstallUpdateService.cs b/src/NzbDrone.Core/Update/InstallUpdateService.cs index 727c1f9f9..f1d299c11 100644 --- a/src/NzbDrone.Core/Update/InstallUpdateService.cs +++ b/src/NzbDrone.Core/Update/InstallUpdateService.cs @@ -105,11 +105,12 @@ namespace NzbDrone.Core.Update return false; } + var tempFolder = _appFolderInfo.TempFolder; var updateSandboxFolder = _appFolderInfo.GetUpdateSandboxFolder(); - if (_diskProvider.GetTotalSize(updateSandboxFolder) < 1.Gigabytes()) + if (_diskProvider.GetTotalSize(tempFolder) < 1.Gigabytes()) { - _logger.Warn("Temporary location '{0}' has less than 1 GB free space, Prowlarr may not be able to update itself.", updateSandboxFolder); + _logger.Warn("Temporary location '{0}' has less than 1 GB free space, Prowlarr may not be able to update itself.", tempFolder); } var packageDestination = Path.Combine(updateSandboxFolder, updatePackage.FileName); From 0ce2f96789ddcfc6c9740ca3d8960d8d891c27a4 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 6 Feb 2024 19:58:49 -0800 Subject: [PATCH 443/964] New: Log database engine version on startup (cherry picked from commit 6ab1d8e16b29e98b4d2ebb68e0356f6f2d3a2c10) --- .../000_database_engine_version_check.cs | 69 +++++++++++++++++++ .../Framework/MigrationController.cs | 3 +- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/000_database_engine_version_check.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/000_database_engine_version_check.cs b/src/NzbDrone.Core/Datastore/Migration/000_database_engine_version_check.cs new file mode 100644 index 000000000..93bfc0afc --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/000_database_engine_version_check.cs @@ -0,0 +1,69 @@ +using System.Data; +using System.Text.RegularExpressions; +using FluentMigrator; +using NLog; +using NzbDrone.Common.Instrumentation; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Maintenance(MigrationStage.BeforeAll, TransactionBehavior.None)] + public class DatabaseEngineVersionCheck : FluentMigrator.Migration + { + protected readonly Logger _logger; + + public DatabaseEngineVersionCheck() + { + _logger = NzbDroneLogger.GetLogger(this); + } + + public override void Up() + { + IfDatabase("sqlite").Execute.WithConnection(LogSqliteVersion); + IfDatabase("postgres").Execute.WithConnection(LogPostgresVersion); + } + + public override void Down() + { + // No-op + } + + private void LogSqliteVersion(IDbConnection conn, IDbTransaction tran) + { + using (var versionCmd = conn.CreateCommand()) + { + versionCmd.Transaction = tran; + versionCmd.CommandText = "SELECT sqlite_version();"; + + using (var reader = versionCmd.ExecuteReader()) + { + while (reader.Read()) + { + var version = reader.GetString(0); + + _logger.Info("SQLite {0}", version); + } + } + } + } + + private void LogPostgresVersion(IDbConnection conn, IDbTransaction tran) + { + using (var versionCmd = conn.CreateCommand()) + { + versionCmd.Transaction = tran; + versionCmd.CommandText = "SHOW server_version"; + + using (var reader = versionCmd.ExecuteReader()) + { + while (reader.Read()) + { + var version = reader.GetString(0); + var cleanVersion = Regex.Replace(version, @"\(.*?\)", ""); + + _logger.Info("Postgres {0}", cleanVersion); + } + } + } + } + } +} diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs index 7a045864d..74151de7d 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs @@ -42,12 +42,13 @@ namespace NzbDrone.Core.Datastore.Migration.Framework serviceProvider = new ServiceCollection() .AddLogging(b => b.AddNLog()) .AddFluentMigratorCore() + .Configure(cfg => cfg.IncludeUntaggedMaintenances = true) .ConfigureRunner( builder => builder .AddPostgres() .AddNzbDroneSQLite() .WithGlobalConnectionString(connectionString) - .WithMigrationsIn(Assembly.GetExecutingAssembly())) + .ScanIn(Assembly.GetExecutingAssembly()).For.All()) .Configure(opt => opt.Namespace = "NzbDrone.Core.Datastore.Migration") .Configure(opt => { From 629c6a88910612aa6a4e063440a06b85263bf7c1 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 1 Feb 2024 20:19:26 -0800 Subject: [PATCH 444/964] Fixed: Redirecting after login with urlbase (cherry picked from commit 745b92daf4bf4b9562ffe52dad84a12a5561add5) --- .../Authentication/AuthenticationController.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Prowlarr.Http/Authentication/AuthenticationController.cs b/src/Prowlarr.Http/Authentication/AuthenticationController.cs index 1d2de1d89..8bfec4318 100644 --- a/src/Prowlarr.Http/Authentication/AuthenticationController.cs +++ b/src/Prowlarr.Http/Authentication/AuthenticationController.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Authentication; using NzbDrone.Core.Configuration; @@ -46,7 +47,17 @@ namespace Prowlarr.Http.Authentication await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties); - return Redirect(_configFileProvider.UrlBase + "/"); + if (returnUrl.IsNullOrWhiteSpace()) + { + return Redirect(_configFileProvider.UrlBase + "/"); + } + + if (_configFileProvider.UrlBase.IsNullOrWhiteSpace() || returnUrl.StartsWith(_configFileProvider.UrlBase)) + { + return Redirect(returnUrl); + } + + return Redirect(_configFileProvider.UrlBase + returnUrl); } [HttpGet("logout")] From 264ff8f8855fbc41676eef810d4d733fd3e1fe30 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 7 Feb 2024 18:29:11 +0200 Subject: [PATCH 445/964] Revert "Enable browser navigation buttons for PWA" This reverts commit 1b3695187912ebbc66c1fb8b2d458481ac8bf1f5. --- frontend/src/Content/Images/Icons/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Content/Images/Icons/manifest.json b/frontend/src/Content/Images/Icons/manifest.json index abb5b4647..f53279dd3 100644 --- a/frontend/src/Content/Images/Icons/manifest.json +++ b/frontend/src/Content/Images/Icons/manifest.json @@ -15,5 +15,5 @@ "start_url": "../../../../", "theme_color": "#3a3f51", "background_color": "#3a3f51", - "display": "minimal-ui" + "display": "standalone" } From dd2567a85fde79e417e76a4f3c0410a583451c14 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 7 Feb 2024 23:20:25 +0200 Subject: [PATCH 446/964] Fixed: Refresh tags state to clear removed tags by housekeeping --- frontend/src/Settings/Tags/TagsConnector.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/Settings/Tags/TagsConnector.js b/frontend/src/Settings/Tags/TagsConnector.js index 4f311e984..b53e2fc0f 100644 --- a/frontend/src/Settings/Tags/TagsConnector.js +++ b/frontend/src/Settings/Tags/TagsConnector.js @@ -3,7 +3,7 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { fetchApplications, fetchIndexerProxies, fetchNotifications } from 'Store/Actions/settingsActions'; -import { fetchTagDetails } from 'Store/Actions/tagActions'; +import { fetchTagDetails, fetchTags } from 'Store/Actions/tagActions'; import Tags from './Tags'; function createMapStateToProps() { @@ -25,6 +25,7 @@ function createMapStateToProps() { } const mapDispatchToProps = { + dispatchFetchTags: fetchTags, dispatchFetchTagDetails: fetchTagDetails, dispatchFetchNotifications: fetchNotifications, dispatchFetchIndexerProxies: fetchIndexerProxies, @@ -38,12 +39,14 @@ class MetadatasConnector extends Component { componentDidMount() { const { + dispatchFetchTags, dispatchFetchTagDetails, dispatchFetchNotifications, dispatchFetchIndexerProxies, dispatchFetchApplications } = this.props; + dispatchFetchTags(); dispatchFetchTagDetails(); dispatchFetchNotifications(); dispatchFetchIndexerProxies(); @@ -63,6 +66,7 @@ class MetadatasConnector extends Component { } MetadatasConnector.propTypes = { + dispatchFetchTags: PropTypes.func.isRequired, dispatchFetchTagDetails: PropTypes.func.isRequired, dispatchFetchNotifications: PropTypes.func.isRequired, dispatchFetchIndexerProxies: PropTypes.func.isRequired, From 33b7ba8725ff2e21bd241d8d25f4e40cbb7f5169 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 9 Feb 2024 13:33:52 +0000 Subject: [PATCH 447/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: Hicabi Erdem Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: aghus Co-authored-by: savin-msk Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 3 +- src/NzbDrone.Core/Localization/Core/da.json | 5 +- src/NzbDrone.Core/Localization/Core/el.json | 3 +- src/NzbDrone.Core/Localization/Core/es.json | 174 +++++++++++++----- src/NzbDrone.Core/Localization/Core/fi.json | 36 ++-- src/NzbDrone.Core/Localization/Core/pt.json | 3 +- .../Localization/Core/pt_BR.json | 6 +- src/NzbDrone.Core/Localization/Core/ru.json | 7 +- src/NzbDrone.Core/Localization/Core/tr.json | 6 +- src/NzbDrone.Core/Localization/Core/uk.json | 7 +- 10 files changed, 178 insertions(+), 72 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index b395abf18..554af8c96 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -430,5 +430,6 @@ "External": "Extern", "Id": "ID", "Author": "Autor", - "ManageClients": "Gestiona els clients" + "ManageClients": "Gestiona els clients", + "CountApplicationsSelected": "{count} Col·lecció(ns) seleccionades" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index cc409e3e4..c20864d20 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -372,5 +372,8 @@ "RestartProwlarr": "Genstart {appName}", "AddCustomFilter": "Tilføj tilpasset filter", "AddConnectionImplementation": "Tilføj forbindelse - {implementationName}", - "AddConnection": "Tilføj forbindelse" + "AddConnection": "Tilføj forbindelse", + "EditConnectionImplementation": "Tilføj forbindelse - {implementationName}", + "AddApplicationImplementation": "Tilføj forbindelse - {implementationName}", + "AddIndexerImplementation": "Tilføj betingelse - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index b7fcb414b..b11de3c0e 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -517,5 +517,6 @@ "AddApplicationImplementation": "Προσθήκη", "AddConnectionImplementation": "Προσθήκη", "AddIndexerImplementation": "Προσθήκη", - "EditIndexerProxyImplementation": "Προσθήκη" + "EditIndexerProxyImplementation": "Προσθήκη", + "CountApplicationsSelected": "Επιλέχθηκαν {0} συλλογές" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 2daa91f39..c26f549a1 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -62,7 +62,7 @@ "Logging": "Registro de eventos", "LogFiles": "Archivos de Registro", "Language": "Idioma", - "IndexerStatusCheckAllClientMessage": "Los indexers no están disponibles debido a errores", + "IndexerStatusCheckAllClientMessage": "Todos los indexadores no están disponibles debido a errores", "Added": "Añadido", "Actions": "Acciones", "UISettingsSummary": "Fecha, idioma, y opciones de color deteriorado", @@ -71,7 +71,7 @@ "ReleaseStatus": "Estado del Estreno", "Protocol": "Protocolo", "LastWriteTime": "Última Fecha de Escritura", - "IndexerStatusCheckSingleClientMessage": "Indexers no disponibles debido a errores: {0}", + "IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {indexerNames}", "Indexer": "Indexador", "Grabbed": "Añadido", "GeneralSettingsSummary": "Puerto, SSL, nombre de usuario/contraseña , proxy, analíticas, y actualizaciones", @@ -177,7 +177,7 @@ "TestAllClients": "Comprobar Todos los Gestores", "TagsHelpText": "Se aplica a películas con al menos una etiqueta coincidente", "SuggestTranslationChange": "Sugerir un cambio en la traducción", - "StartupDirectory": "Directorio de arranque", + "StartupDirectory": "Directorio de Arranque", "SSLPort": "Puerto SSL", "SSLCertPath": "Ruta del Certificado SSL", "SSLCertPassword": "Contraseña del Certificado SSL", @@ -340,8 +340,8 @@ "Categories": "Categorías", "AddIndexerProxy": "Añadir proxy del indexador", "Encoding": "Codificación", - "GrabReleases": "Capturar Estreno", - "Link": "Enlaces", + "GrabReleases": "Capturar Lanzamiento(s)", + "Link": "Enlace", "MappedDrivesRunningAsService": "Las unidades de red asignadas no están disponibles cuando se ejecutan como un servicio de Windows. Consulte las preguntas frecuentes para obtener más información", "No": "No", "Notification": "Notificaciones", @@ -353,12 +353,12 @@ "InstanceNameHelpText": "Nombre de instancia en pestaña y para nombre de aplicación en Syslog", "Database": "Base de datos", "Duration": "Duración", - "LastDuration": "Duración", - "LastExecution": "Última ejecución", + "LastDuration": "Última Duración", + "LastExecution": "Última Ejecución", "Queued": "Encolado", - "ApplicationLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas", - "ApplicationLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}", - "Ended": "Finalizado", + "ApplicationLongTermStatusCheckAllClientMessage": "Todas las aplicaciones no están disponibles debido a fallos por más de 6 horas", + "ApplicationLongTermStatusCheckSingleClientMessage": "Aplicaciones no disponibles por fallos por más de 6 horas: {0}", + "Ended": "Terminado", "NextExecution": "Siguiente ejecución", "Started": "Iniciado", "Remove": "Eliminar", @@ -372,24 +372,24 @@ "ApplicationUrlHelpText": "La URL externa de la aplicación incluyendo http(s)://, puerto y URL base", "Label": "Etiqueta", "Theme": "Tema", - "ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas", + "ApplyTagsHelpTextAdd": "Añadir: Añade las etiquetas a la lista de etiquetas existente", "DeleteSelectedApplicationsMessageText": "¿Estás seguro que quieres eliminar {count} aplicación(es) seleccionada(s)?", - "DeleteSelectedDownloadClients": "Borrar gestor de descarga(s)", + "DeleteSelectedDownloadClients": "Borrar Cliente de Descarga(s)", "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", - "ApplyTagsHelpTextHowToApplyApplications": "Cómo añadir etiquetas a las películas seleccionadas", + "ApplyTagsHelpTextHowToApplyApplications": "Cómo aplicar etiquetas a las aplicaciones seleccionadas", "SelectIndexers": "Buscar películas", - "ApplyTagsHelpTextHowToApplyIndexers": "Cómo añadir etiquetas a los indexadores seleccionados", - "ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas", - "ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)", + "ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados", + "ApplyTagsHelpTextRemove": "Eliminar: Elimina las etiquetas introducidas", + "ApplyTagsHelpTextReplace": "Reemplazar: Sustituye las etiquetas por las introducidas (introduce \"no tags\" para borrar todas las etiquetas)", "ThemeHelpText": "Cambia el tema de la interfaz de usuario de la aplicación. El tema \"automático\" utilizará el tema de tu sistema operativo para establecer el modo claro u oscuro. Inspirado por {inspiredBy}.", - "DownloadClientPriorityHelpText": "Priorizar múltiples Gestores de Descargas. Se usa Round-Robin para gestores con la misma prioridad.", + "DownloadClientPriorityHelpText": "Priorizar varios Clientes de Descarga. Round-Robin se utiliza para clientes con la misma prioridad.", "Season": "Temporada", "More": "Más", "Track": "Rastro", "Year": "Año", "UpdateAvailable": "La nueva actualización está disponible", - "Genre": "Géneros", + "Genre": "Género", "Publisher": "Editor", "AuthenticationRequired": "Autenticación requerida", "ApplyChanges": "Aplicar Cambios", @@ -402,36 +402,36 @@ "ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {0} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración", "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.", "Episode": "Episodio", - "ConnectionLostReconnect": "Radarr intentará conectarse automáticamente, o haz clic en el botón de recarga abajo.", - "ConnectionLostToBackend": "Radarr ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", + "ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.", + "ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", "RecentChanges": "Cambios recientes", "WhatsNew": "Que es lo nuevo?", "minutes": "Minutos", - "Album": "álbum", - "Artist": "artista", - "DeleteAppProfileMessageText": "Seguro que quieres eliminar el perfil de calidad {0}", + "Album": "Álbum", + "Artist": "Artista", + "DeleteAppProfileMessageText": "¿Estás seguro de que quieres eliminar el perfil de la aplicación '{name}'?", "AddConnection": "Añadir Conexión", "NotificationStatusAllClientHealthCheckMessage": "Las listas no están disponibles debido a errores", "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}", - "EditIndexerImplementation": "Editar indexador - {implementationName}", + "EditIndexerImplementation": "Editar Indexador - {implementationName}", "AuthBasic": "Básico (ventana emergente del navegador)", - "AuthForm": "Formularios (página de inicio de sesión)", + "AuthForm": "Formularios (Página de inicio de sesión)", "Author": "Autor", "Book": "Libro", "Clone": "Clonar", - "DisabledForLocalAddresses": "Deshabilitado para direcciones locales", + "DisabledForLocalAddresses": "Deshabilitado para Direcciones Locales", "External": "Externo", "None": "Ninguna", "ResetAPIKeyMessageText": "¿Está seguro de que desea restablecer su clave API?", - "EditIndexerProxyImplementation": "Agregar Condición - { implementationName}", - "AppUpdated": "{appName} Actualizada", - "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}", + "EditIndexerProxyImplementation": "Editar Proxy de Indexador - { implementationName}", + "AppUpdated": "{appName} Actualizado", + "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName}", "AddApplicationImplementation": "Agregar aplicación - { implementationName}", "AddConnectionImplementation": "Añadir Conexión - {implementationName}", - "AddIndexerImplementation": "Agregar Condición - { implementationName}", - "AddIndexerProxyImplementation": "Agregar Condición - { implementationName}", - "EditApplicationImplementation": "Agregar Condición - { implementationName}", - "EditConnectionImplementation": "Editar conexión - {implementationName}", + "AddIndexerImplementation": "Agregar Indexador - {implementationName}", + "AddIndexerProxyImplementation": "Agregar Proxy de Indexador - { implementationName}", + "EditApplicationImplementation": "Editar Aplicación - { implementationName}", + "EditConnectionImplementation": "Editar Conexión - {implementationName}", "AddDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", "AuthenticationMethod": "Método de autenticación", "AuthenticationMethodHelpTextWarning": "Por favor selecciona un método válido de autenticación", @@ -439,7 +439,7 @@ "AuthenticationRequiredPasswordHelpTextWarning": "Introduzca una nueva contraseña", "AuthenticationRequiredUsernameHelpTextWarning": "Introduzca un nuevo nombre de usuario", "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.", - "EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", + "EditDownloadClientImplementation": "Editar Cliente de Descarga - {implementationName}", "DefaultNameCopiedProfile": "{name} - Copia", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña", "NoHistoryFound": "No se encontró historial", @@ -452,7 +452,7 @@ "ClearHistory": "Borrar Historial", "AreYouSureYouWantToDeleteIndexer": "Esta seguro que desea eliminar '{name}' de {appName}?", "AuthQueries": "Consultas de Autorización", - "ApplicationTagsHelpText": "Sincronizar los Indexadores a esta aplicación que no tengan etiquetas o que tengan al menos una etiqueta coincidente", + "ApplicationTagsHelpText": "Sincronizar indexadores con esta aplicación que tengan una o más etiquetas coincidentes. Si no aparece ninguna etiqueta, no se impedirá la sincronización de ningún indexador debido a sus etiquetas.", "ApplicationTagsHelpTextWarning": "Las etiquetas deben utilizarse con cuidado, pueden tener efectos involuntarios. Una aplicación con una etiqueta solo sincronizara con Indexadores que tengan la misma etiqueta.", "AppsMinimumSeedersHelpText": "Cantidad mínima de semillas requerida por las Aplicaciones para que el Indexador capture, vacío aplica la configuración por defecto del perfil", "AverageResponseTimesMs": "Tiempo promedio de respuesta del Indexador (ms)", @@ -489,14 +489,14 @@ "DisabledUntil": "Deshabilitado hasta", "DownloadClientCategory": "Categoría de cliente de descarga", "HistoryCleanup": "Limpieza de historial", - "Id": "Id", + "Id": "ID", "EditCategory": "Editar categoría", "EditSyncProfile": "Editar perfil de sincronización", "EnableIndexer": "Habilitar indexador", "InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración", "DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)", - "EnableRssHelpText": "Habilitar feed RSS para el indexador", + "EnableRssHelpText": "Habilitar feed RSS para el Indexador", "days": "días", "ElapsedTime": "Tiempo transcurrido", "GrabTitle": "Capturar título", @@ -504,17 +504,109 @@ "Website": "Sitio web", "Redirect": "Redirección", "RssQueries": "Consultas RSS", - "SeedRatio": "Ratio de siembra", + "SeedRatio": "Proporción de Semillado", "RssFeed": "Feed RSS", "SearchType": "Tipo de búsqueda", "RepeatSearch": "Repetir búsqueda", "SeedRatioHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto", - "SeedTime": "Tiempo de siembra", + "SeedTime": "Tiempo de Semillado", "SearchTypes": "Tipos de búsquedas", "DeleteIndexerProxy": "Eliminar proxy indexador", "OnGrabHelpText": "Al Capturar lanzamiento", "SeedTimeHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto", - "IndexerTagsHelpTextWarning": "Las etiquetas deben utilizarse con cuidado, pueden tener efectos involuntarios. Una aplicación con una etiqueta solo sincronizara con Indexadores que tengan la misma etiqueta.", + "IndexerTagsHelpTextWarning": "Las etiquetas deben utilizarse con precaución, ya que pueden tener efectos no deseados. Un indexador con una etiqueta solo se sincronizará con aplicaciones que tengan la misma etiqueta.", "TVSearchTypes": "Tipos de búsquedas", - "DownloadClientAriaSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación de Aria2 predeterminada" + "DownloadClientAriaSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación de Aria2 predeterminada", + "IndexerNoDefCheckMessage": "Los indexadores no tienen definición y no funcionarán: {0}. Por favor elimínelos y (o) vuelva a añadirlos a {appName}", + "IndexerProxy": "Proxy del Indexador", + "IndexerObsoleteCheckMessage": "Los indexadores están obsoletos o se han actualizado: {0}. Por favor elimínelos y (o) vuelva a añadirlos a {appName}", + "IncludeManualGrabsHelpText": "Incluir las Capturas Manuales realizadas en {appName}", + "IndexerRss": "RSS del Indexador", + "IndexerSettingsSummary": "Configurar varios ajustes globales del Indexador, incluyendo Proxies.", + "IndexerName": "Nombre del Indexador", + "IndexerVipCheckExpiringClientMessage": "Las ventajas VIP de los indexadores expiran pronto: {0}", + "IndexerProxies": "Proxies del Indexador", + "IndexerHistoryLoadError": "Error al cargar el historial del Indexador", + "IndexerVipCheckExpiredClientMessage": "Las ventajas VIP del Indexador han caducado: {0}", + "IndexerQuery": "Consulta dedl Indexador", + "IndexerSite": "Sitio del Indexador", + "IndexerStatus": "Estado del indexador", + "LastFailure": "Último Fallo", + "InitialFailure": "Fallo Inicial", + "MappedCategories": "Categorías Mapeadas", + "IndexerTagsHelpText": "Utilice etiquetas para especificar los Proxies del Indexador o las aplicaciones con las que se sincroniza el indexador.", + "MassEditor": "Editor Masivo", + "ApplicationsLoadError": "No se puede cargar la lista de aplicaciones", + "ManageClients": "Gestionar Clientes", + "ManageApplications": "Gestionar Aplicaciones", + "IndexerId": "ID del Indexador", + "IndexerInfo": "Información del Indexador", + "SyncProfiles": "Sincronizar Perfiles", + "TestAllApps": "Comprobar Todas las Aplicaciones", + "Query": "Consulta", + "SettingsIndexerLogging": "Registro mejorado del Indexador", + "Private": "Privado", + "QueryOptions": "Opciones de Consulta", + "NewznabUrl": "Url Newznab", + "QueryType": "Tipo de Consulta", + "SearchCountIndexers": "Buscar {count} indexador(es)", + "SelectedCountOfCountReleases": "Seleccionados {selectedCount} de {itemCount} lanzamientos", + "SyncLevel": "Nivel de Sincronización", + "StopSelecting": "Detener la Selección", + "MinimumSeeders": "Semillas mínimas", + "QueryResults": "Resultados de la Consulta", + "SyncAppIndexers": "Sincronizar Indexadores de Aplicación", + "NotificationsEmailSettingsUseEncryption": "Usar Cifrado", + "OnHealthRestoredHelpText": "Al resolver las incidencias", + "OnHealthRestored": "Al resolver las incidencias", + "PackSeedTime": "Tiempo de Semillado del Pack", + "SearchCapabilities": "Capacidades de Búsqueda", + "SearchQueries": "Consultas de búsqueda", + "SettingsLogRotateHelpText": "Número máximo de archivos de registro que se guardan en la carpeta de registros", + "Stats": "Estadísticas", + "SyncLevelAddRemove": "Sólo Añadir y Eliminar: Cuando se añadan o eliminen indexadores de {appName}, se actualizará esta aplicación remota.", + "Public": "Publico", + "NotSupported": "No soportado", + "Proxies": "Proxies", + "SettingsConsoleLogLevel": "Nivel de Registro de la Consola", + "SettingsFilterSentryEvents": "Filtrar Eventos Analíticos", + "Parameters": "Parámetros", + "RedirectHelpText": "Redirigir la solicitud de descarga entrante para el indexador y pasar la captura directamente en lugar de delegar la solicitud a través de {appName}", + "SyncProfile": "Sincronizar Perfil", + "TorznabUrl": "Url Torznab", + "MovieSearchTypes": "Tipos de Búsqueda de Películas", + "NoDownloadClientsFound": "No se han encontrado clientes de descarga", + "NoIndexerHistory": "No se ha encontrado ningún historial para este indexador", + "PackSeedTimeHelpText": "El tiempo que un pack (temporada o discografía) debe ser sembrado antes de que se detenga, el valor vacío es el valor por defecto de la aplicación", + "SettingsLogSql": "Registrar Sql", + "SettingsSqlLoggingHelpText": "Registrar todas las consultas SQL de {appName}", + "SettingsLogRotate": "Rotación de Registros", + "TotalGrabs": "Capturas Totales", + "SettingsIndexerLoggingHelpText": "Registrar datos adicionales del Indexador, incluida la respuesta", + "MusicSearchTypes": "Tipos de Búsqueda de Música", + "TotalIndexerQueries": "Consultas Totales por Indexador", + "SyncLevelFull": "Sincronización completa: Se mantendrán los indexadores de esta aplicación totalmente sincronizados. Los cambios realizados en los indexadores de {appName} se sincronizarán con esta aplicación. Cualquier cambio realizado en los indexadores de forma remota dentro de esta aplicación será anulado por {appName} en la siguiente sincronización.", + "NoApplicationsFound": "No se han encontrado aplicaciones", + "RawSearchSupported": "Búsqueda en crudo soportada", + "SemiPrivate": "Semi-Privado", + "NoIndexerCategories": "No se han encontrado categorías para este indexador", + "MovieSearch": "Búsqueda de Películas", + "MinimumSeedersHelpText": "Mínimo de semillas requeridas por la Aplicación para que el Indexador coja la descarga", + "NoIndexersFound": "No se han encontrado indexadores", + "Privacy": "Privacidad", + "TotalHostQueries": "Consultas Totales por Host", + "PasswordConfirmation": "Confirmación de Contraseña", + "SettingsFilterSentryEventsHelpText": "Filtrar eventos de error de usuario conocidos para que no se envíen como Análisis", + "TotalHostGrabs": "Capturas Totales por Host", + "NoSearchResultsFound": "No se han encontrado resultados de búsqueda, intente realizar una nueva búsqueda abajo.", + "TotalUserAgentGrabs": "Capturas Totales Por Agente de Usuario", + "UnableToLoadIndexerProxies": "No se pueden cargar los Proxies de Indexador", + "UnableToLoadAppProfiles": "No se pueden cargar los perfiles de las aplicaciones", + "TotalUserAgentQueries": "Consultas Totales Por Agente de Usuario", + "TvSearch": "Buscar series de TV", + "UnableToLoadDevelopmentSettings": "No se pueden cargar los ajustes de Desarrollo", + "TotalQueries": "Consultas Totales", + "Url": "Url", + "VipExpiration": "Expiración VIP", + "TotalIndexerSuccessfulGrabs": "Capturas con Éxito Totales por Indexador" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 4c7d1a089..3749dee10 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -51,7 +51,7 @@ "SettingsLongDateFormat": "Pitkän päiväyksen esitys", "SettingsShortDateFormat": "Lyhyen päiväyksen esitys", "UnselectAll": "Tyhjennä valinnat", - "UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.", + "UpdateCheckStartupTranslocationMessage": "Päivitystä ei voida asentaa, koska käynnistyskansio \"{0}\" sijaitsee \"App Translocation\" -kansiossa.", "UpdateCheckUINotWritableMessage": "Päivityksen asennus ei onnistu, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käyttöliittymäkansioon \"{0}\".", "UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.", "Enable": "Käytä", @@ -83,7 +83,7 @@ "InteractiveSearch": "Etsi manuaalisesti", "Interval": "Ajoitus", "KeyboardShortcuts": "Pikanäppäimet", - "LastWriteTime": "Viimeksi tallennettu", + "LastWriteTime": "Edellinen tallennus", "LogFiles": "Lokitiedostot", "LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulee käyttää vain tilapäisesti.", "Logs": "Lokitiedot", @@ -107,7 +107,7 @@ "RemoveFilter": "Poista suodatin", "RemovingTag": "Tunniste poistetaan", "Reset": "Uudista", - "ResetAPIKey": "Uudista API-avain", + "ResetAPIKey": "Korvaa rajapinnan avain", "Restart": "Käynnistä uudelleen", "RestartNow": "Käynnistä uudelleen nyt", "Restore": "Palauta", @@ -136,7 +136,7 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.", "UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui", "DownloadClientsLoadError": "Lataustyökalujen lataus ei onistu", - "UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.", + "UnableToLoadGeneralSettings": "Virhe ladattaessa yleisiä asetuksia", "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.", "Added": "Lisäysaika", "AddIndexer": "Lisää tietolähde", @@ -146,7 +146,7 @@ "AllIndexersHiddenDueToFilter": "Aktiivinen suodatin on piilottanut kaikki tietolähteet.", "Analytics": "Analytiikka", "AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja {appName}in palvelimille. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.", - "ApiKey": "API-avain", + "ApiKey": "Rajapinnan avain", "AppDataDirectory": "AppData-kansio", "DatabaseMigration": "Tietokannan siirto", "Delete": "Poista", @@ -170,9 +170,9 @@ "UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.", "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.", "UnableToLoadHistory": "Historian lataus epäonnistui.", - "UnableToLoadNotifications": "Kytkösten lataus epäonnistui.", + "UnableToLoadNotifications": "Virhe ladattaessa kytköksiä", "UnableToLoadTags": "Tunnisteiden lataus ei onnistu", - "UnableToLoadUISettings": "Käyttöliittymän asetuksien lataus epäonnistui.", + "UnableToLoadUISettings": "Virhe ladattaesssa käyttöliittymän asetuksia", "UnsavedChanges": "Muutoksia ei ole tallennettu", "Yesterday": "Eilen", "ConnectionLost": "Ei yhteyttä", @@ -201,7 +201,7 @@ "Scheduled": "Ajoitukset", "SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin.", "SettingsShowRelativeDates": "Suhteellisten päiväysten esitys", - "SettingsShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) absoluuttisten sijaan", + "SettingsShowRelativeDatesHelpText": "Korvaa absoluuttiset päiväykset suhteellisilla päiväyksillä (tänään/eilen/yms.).", "ShowSearch": "Näytä haku", "Source": "Lähdekoodi", "SSLPort": "SSL-portti", @@ -388,16 +388,16 @@ "Filters": "Suodattimet", "OnGrab": "Kun julkaisu kaapataan", "OnHealthIssue": "Vakausongelmat", - "HistoryCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattityhjennyksen käytöstä.", + "HistoryCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattisen tyhjennyksen käytöstä.", "HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.", "TestAllIndexers": "Tietolähteiden testaus", - "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa", + "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti rajapinnan kanssa viestinyt sovellus.", "Categories": "Kategoriat", "Database": "Tietokanta", "HistoryCleanup": "Historian siivous", "IndexerAlreadySetup": "Tietolähteestä on määritetty jo ainakin yksi instanssi", "IndexerInfo": "Tietolähteen tiedot", - "MassEditor": "Massamuokkaus", + "MassEditor": "Joukkoeditori", "OnApplicationUpdate": "Kun sovellus päivitetään", "OnApplicationUpdateHelpText": "Kun sovellus päivitetään", "Proxies": "Välityspalvelimet", @@ -435,7 +435,7 @@ "EditSyncProfile": "Muokkaa synkronointiprofiilia", "InstanceName": "Instanssin nimi", "InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa.", - "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.", + "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä käyttöjärjestelmän teeman mukaan. Innoittanut Theme.Park.", "Duration": "Kesto", "ElapsedTime": "Kulunut aika", "EnabledRedirected": "Kulunut, uudelleenohjattu", @@ -487,8 +487,8 @@ "Theme": "Teema", "ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".", "DeleteAppProfileMessageText": "Haluatko varmasti poistaa sovellusprofiilin \"{name}\"?", - "RecentChanges": "Viimeisimmät muutokset", - "WhatsNew": "Mitä uutta?", + "RecentChanges": "Uusimmat muutokset", + "WhatsNew": "Mikä on uutta?", "ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.", "minutes": "minuuttia", "AddConnection": "Lisää yhteys", @@ -498,7 +498,7 @@ "AuthForm": "Lomake (kirjautumissivu)", "DisabledForLocalAddresses": "Ei käytössä paikallisille osoitteille", "None": "Ei mitään", - "ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?", + "ResetAPIKeyMessageText": "Haluatko varmasti korvata rajapinnan avaimen uudella?", "TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdekaappausten kokonaismäärä", "AppUpdated": "{appName} on päivitetty", "AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.", @@ -546,8 +546,8 @@ "days": "päivää", "HistoryDetails": "Historiatiedot", "IndexerDisabled": "Tietolähde ei ole käytössä", - "AdvancedSettingsShownClickToHide": "Lisäasetukset näytetään, piilota painamalla tästä", - "AdvancedSettingsHiddenClickToShow": "Lisäasetukset on piilotettu, näytä painamalla tästä", + "AdvancedSettingsShownClickToHide": "Lisäasetukset näytetään, piilota painamalla tästä.", + "AdvancedSettingsHiddenClickToShow": "Lisäasetukset on piilotettu, näytä painamalla tästä.", "AppsMinimumSeeders": "Sovellusten vähimmäisjakajat", "BasicSearch": "Perushaku", "CountApplicationsSelected": "{count} sovellus(ta) on valittu", @@ -565,7 +565,7 @@ "SearchAllIndexers": "Etsi kaikista tietolähteistä", "SeedRatioHelpText": "Jakosuhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.", "TorznabUrl": "Torznab URL", - "ApiKeyValidationHealthCheckMessage": "Muuta API-avaimesi ainakin {0} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.", + "ApiKeyValidationHealthCheckMessage": "Muuta rajapinnan (API) avain ainakin {0} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.", "OnHealthRestored": "Terveystilan vakautuessa", "OnHealthRestoredHelpText": "Terveystilan vakautuessa", "TotalHostQueries": "Isännän kyselyiden kokonaismäärä", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index ab5b5ff74..12266b63b 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -475,5 +475,6 @@ "DefaultNameCopiedProfile": "{name} - Copiar", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmar nova senha", "AdvancedSettingsHiddenClickToShow": "Definições avançadas ocultas, clique para mostrar", - "AddCategory": "Adicionar Categoria" + "AddCategory": "Adicionar Categoria", + "CountApplicationsSelected": "{count} Coleções Selecionadas" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 6e275c625..d56b3b4f6 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -51,7 +51,7 @@ "AuthenticationRequiredWarning": "Para evitar o acesso remoto sem autenticação, {appName} agora exige que a autenticação esteja habilitada. Opcionalmente, você pode desabilitar a autenticação de endereços locais.", "Author": "Autor", "Automatic": "Automático", - "AutomaticSearch": "Pesquisa automática", + "AutomaticSearch": "Pesquisa Automática", "AverageResponseTimesMs": "Tempos Médios de Resposta do Indexador (ms)", "Backup": "Backup", "BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do {appName}", @@ -225,7 +225,7 @@ "InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog", "InteractiveSearch": "Pesquisa interativa", "Interval": "Intervalo", - "KeyboardShortcuts": "Atalhos de teclado", + "KeyboardShortcuts": "Atalhos do Teclado", "Label": "Rótulo", "Language": "Idioma", "LastDuration": "Última Duração", @@ -422,7 +422,7 @@ "TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída", "Tags": "Etiquetas", "TagsHelpText": "Aplica-se a indexadores com pelo menos uma tag correspondente", - "TagsSettingsSummary": "Veja todas as tags e como elas são usadas. Tags não utilizadas podem ser removidas", + "TagsSettingsSummary": "Veja todas as etiquetas e como elas são usadas. Etiquetas não utilizadas podem ser removidas", "Tasks": "Tarefas", "Test": "Testar", "TestAll": "Testar tudo", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 3cef8cd90..01be8fd12 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -91,7 +91,7 @@ "IndexerStatusCheckSingleClientMessage": "Индексаторы недоступны из-за ошибок: {0}", "NoTagsHaveBeenAddedYet": "Теги еще не добавлены", "UnableToLoadTags": "Невозможно загрузить теги", - "AnalyticsEnabledHelpText": "Отправлять в {appName} информацию о использовании и ошибках. Анонимная статистика включает в себя информацию о браузере, какие страницы загружены, сообщения об ошибках, а так же операционной системе. Мы используем эту информацию для выявления ошибок, а так же для разработки нового функционала.", + "AnalyticsEnabledHelpText": "Отправлять в {appName} анонимную информацию об использовании и ошибках. Анонимная статистика включает в себя информацию о браузере, какие страницы веб-интерфейса {appName} загружены, сообщения об ошибках, а также операционной системе. Мы используем эту информацию для выявления ошибок, а также для разработки нового функционала.", "AuthenticationMethodHelpText": "Необходим логин и пароль для доступа в {appName}", "BackupFolderHelpText": "Относительные пути будут в каталоге AppData {appName}", "BeforeUpdate": "До обновления", @@ -298,7 +298,7 @@ "Age": "Возраст", "All": "Все", "AllIndexersHiddenDueToFilter": "Все фильмы спрятаны в соответствии с фильтром.", - "AppDataDirectory": "AppData директория", + "AppDataDirectory": "Директория AppData", "Reddit": "Reddit", "System": "Система", "TableOptions": "Опции таблицы", @@ -422,5 +422,6 @@ "RestartProwlarr": "Перезапустить {appName}", "AuthenticationRequiredWarning": "Чтобы предотвратить удаленный доступ без авторизации, {appName} теперь требует, чтобы авторизация была включена. При желании вы можете отключить авторизацию с локальных адресов.", "Id": "ID", - "ManageClients": "Управление клиентами" + "ManageClients": "Управление клиентами", + "CountApplicationsSelected": "{count} коллекция(ий) выбрано" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 9bce4f152..9a7349479 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -362,12 +362,14 @@ "Episode": "bölüm", "AddConnection": "Bağlantı Ekle", "AddApplicationImplementation": "Koşul Ekle - {implementationName}", - "AddIndexerImplementation": "Koşul Ekle - {implementationName}", + "AddIndexerImplementation": "Yeni Dizin Ekle - {implementationName}", "AddIndexerProxyImplementation": "Koşul Ekle - {implementationName}", "EditConnectionImplementation": "Koşul Ekle - {implementationName}", "AddConnectionImplementation": "Koşul Ekle - {implementationName}", "RestartProwlarr": "{appName}'ı yeniden başlatın", "EditApplicationImplementation": "Koşul Ekle - {implementationName}", "EditIndexerImplementation": "Koşul Ekle - {implementationName}", - "EditIndexerProxyImplementation": "Koşul Ekle - {implementationName}" + "EditIndexerProxyImplementation": "Koşul Ekle - {implementationName}", + "AddCustomFilter": "Özel Filtre Ekleyin", + "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index ad3277345..60f70fc96 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -379,5 +379,10 @@ "AddIndexerProxyImplementation": "Додати умому", "EditIndexerProxyImplementation": "Додати умому", "AddCustomFilter": "Додати власний фільтр", - "AddDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}" + "AddDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}", + "Application": "Додатки", + "CountApplicationsSelected": "Вибрано колекцій: {0}", + "Applications": "Додатки", + "Categories": "Категорії", + "EditDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}" } From ae870fd46a7a9d2b3db08e6c993478778b4836b7 Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Fri, 9 Feb 2024 13:31:15 -0600 Subject: [PATCH 448/964] Improve HDBits Settings Helptext --- src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs | 2 +- src/NzbDrone.Core/Localization/Core/en.json | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs index d57702179..9c4abab77 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs @@ -32,7 +32,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [FieldDefinition(2, Label = "Username", HelpText = "Site Username", Privacy = PrivacyLevel.UserName)] public string Username { get; set; } - [FieldDefinition(3, Label = "API Key", HelpText = "Site API Key", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(3, Label = "IndexerSettingsPasskey", HelpText = "IndexerHDBitsSettingsPasskeyHelpText", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } [FieldDefinition(4, Label = "Codecs", Type = FieldType.Select, SelectOptions = typeof(HdBitsCodec), HelpText = "If unspecified, all options are used.", Advanced = true)] diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 51f005ad0..32bfb7c04 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -267,6 +267,7 @@ "IndexerDownloadClientHelpText": "Specify which download client is used for grabs made within {appName} from this indexer", "IndexerFailureRate": "Indexer Failure Rate", "IndexerFlags": "Indexer Flags", + "IndexerHDBitsSettingsPasskeyHelpText": "Passkey from User Details", "IndexerHealthCheckNoIndexers": "No indexers enabled, {appName} will not return search results", "IndexerHistoryLoadError": "Error loading indexer history", "IndexerId": "Indexer ID", @@ -285,6 +286,7 @@ "IndexerQuery": "Indexer Query", "IndexerRss": "Indexer RSS", "IndexerSettingsSummary": "Configure various global Indexer settings including Proxies.", + "IndexerSettingsPasskey": "Pass Key", "IndexerSite": "Indexer Site", "IndexerStatus": "Indexer Status", "IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures", From 83e7e30e4ff2eef769c69320a3e520542a39c674 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 10 Feb 2024 17:48:33 +0000 Subject: [PATCH 449/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Aitzol Garmendia Co-authored-by: Anonymous Co-authored-by: Havok Dan Co-authored-by: Magyar Co-authored-by: Weblate Co-authored-by: aghus Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/cs.json | 4 ++- src/NzbDrone.Core/Localization/Core/de.json | 5 +++- src/NzbDrone.Core/Localization/Core/es.json | 27 ++++++++++--------- src/NzbDrone.Core/Localization/Core/hu.json | 18 ++++++++----- src/NzbDrone.Core/Localization/Core/it.json | 11 +++++++- .../Localization/Core/nb_NO.json | 4 ++- src/NzbDrone.Core/Localization/Core/nl.json | 3 ++- src/NzbDrone.Core/Localization/Core/pl.json | 11 +++++++- .../Localization/Core/pt_BR.json | 4 ++- src/NzbDrone.Core/Localization/Core/sk.json | 4 ++- src/NzbDrone.Core/Localization/Core/tr.json | 3 ++- 11 files changed, 66 insertions(+), 28 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 91b866507..68beb6d99 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -406,5 +406,7 @@ "AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno", "AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo", - "days": "dnů" + "days": "dnů", + "Id": "ID", + "CountApplicationsSelected": "Vybráno {0} kolekcí" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 5d6970970..1712ef767 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -542,5 +542,8 @@ "IndexerTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.", "EditIndexerImplementation": "Indexer hinzufügen - {implementationName}", "EditApplicationImplementation": "Anwendung hinzufügen - {implementationName}", - "EditIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}" + "EditIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}", + "CountApplicationsSelected": "{count} Ausgewählte Sammlung(en)", + "DownloadClientAriaSettingsDirectoryHelpText": "Optionaler Speicherort für Downloads. Lassen Sie das Feld leer, um den standardmäßigen rTorrent-Speicherort zu verwenden", + "ManageClients": "Verwalte Clienten" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index c26f549a1..8506e66db 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -232,7 +232,7 @@ "RSSIsNotSupportedWithThisIndexer": "RSS no son soportadas por este indexer", "RemovingTag": "Eliminando etiqueta", "Manual": "Manual", - "LogLevelTraceHelpTextWarning": "El registro de seguimiento se ha de habilitar solo temporalmente", + "LogLevelTraceHelpTextWarning": "El registro de seguimiento sólo debe activarse temporalmente", "ExistingTag": "Etiquetas existentes", "EnableInteractiveSearchHelpText": "Se usará cuando se utilice la búsqueda interactiva", "EnableAutomaticSearchHelpText": "Será usado cuando las búsquedas automáticas sean realizadas por la interfaz de usuario o por {appName}", @@ -277,13 +277,13 @@ "Disabled": "Deshabilitado", "AutomaticSearch": "Búsqueda Automática", "AddIndexer": "Añadir Indexador", - "FocusSearchBox": "Enfocar Cuadro de búsqueda", - "SaveSettings": "Grabar Ajustes", - "OpenThisModal": "Abrir este Modal", + "FocusSearchBox": "Enfocar Campo de Búsqueda", + "SaveSettings": "Guardar ajustes", + "OpenThisModal": "Abrir esta Ventana Modal", "MovieIndexScrollTop": "Indice de Películas: Desplazar hacia arriba", "MovieIndexScrollBottom": "Indice de Películas: Desplazar hacia abajo", - "CloseCurrentModal": "Cerrar Modal Actual", - "AcceptConfirmationModal": "Aceptar la confirmación modal", + "CloseCurrentModal": "Cerrar esta Ventana Modal", + "AcceptConfirmationModal": "Aceptar Confirmación de esta Ventana Modal", "IndexerLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}", "IndexerLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas", "Reddit": "Reddit", @@ -346,11 +346,11 @@ "No": "No", "Notification": "Notificaciones", "Notifications": "Notificaciones", - "UnableToLoadIndexers": "No se pueden cargar los indexers", + "UnableToLoadIndexers": "No se pueden cargar los indexadores", "Yes": "Sí", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API", - "InstanceName": "Nombre de Instancia", - "InstanceNameHelpText": "Nombre de instancia en pestaña y para nombre de aplicación en Syslog", + "InstanceName": "Nombre de la Instancia", + "InstanceNameHelpText": "Nombre de la instancia en la pestaña y para la aplicación Syslog", "Database": "Base de datos", "Duration": "Duración", "LastDuration": "Última Duración", @@ -366,14 +366,14 @@ "TheLatestVersionIsAlreadyInstalled": "La última versión de {appName} ya está instalada", "Apps": "Aplicaciones", "AddApplication": "Añadir aplicación", - "AddCustomFilter": "Añadir filtro personalizado", + "AddCustomFilter": "Añadir Filtro Personalizado", "Description": "Descripción", "ApplicationURL": "URL de la aplicación", "ApplicationUrlHelpText": "La URL externa de la aplicación incluyendo http(s)://, puerto y URL base", "Label": "Etiqueta", "Theme": "Tema", "ApplyTagsHelpTextAdd": "Añadir: Añade las etiquetas a la lista de etiquetas existente", - "DeleteSelectedApplicationsMessageText": "¿Estás seguro que quieres eliminar {count} aplicación(es) seleccionada(s)?", + "DeleteSelectedApplicationsMessageText": "¿Está seguro de querer eliminar {count} aplicación(es) de seleccionada(s)?", "DeleteSelectedDownloadClients": "Borrar Cliente de Descarga(s)", "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", @@ -608,5 +608,8 @@ "TotalQueries": "Consultas Totales", "Url": "Url", "VipExpiration": "Expiración VIP", - "TotalIndexerSuccessfulGrabs": "Capturas con Éxito Totales por Indexador" + "TotalIndexerSuccessfulGrabs": "Capturas con Éxito Totales por Indexador", + "NotificationsEmailSettingsUseEncryptionHelpText": "Si prefiere utilizar el cifrado si está configurado en el servidor, utilizar siempre el cifrado mediante SSL (sólo puerto 465) o StartTLS (cualquier otro puerto) o no utilizar nunca el cifrado", + "IndexerHDBitsSettingsPasskeyHelpText": "Clave de acceso desde los Detalles de Usuario", + "IndexerSettingsPasskey": "Clave de Acceso" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index ab12541e6..1e90bb198 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -4,7 +4,7 @@ "AddIndexer": "Indexelő hozzáadása", "AddingTag": "Címke hozzáadása", "Error": "Hiba", - "DeleteTag": "Címke Törlése", + "DeleteTag": "Címke törlése", "EnableAutomaticSearchHelpText": "Akkor kerül felhasználásra, ha az automatikus kereséseket a kezelőfelületen vagy a {appName}-on keresztül hajtják végre", "EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést", "Enable": "Aktiválás", @@ -21,16 +21,16 @@ "Details": "részletek", "DeleteTagMessageText": "Biztosan törli a „{label}” címkét?", "DeleteNotificationMessageText": "Biztosan törli a(z) „{name}” értesítést?", - "DeleteNotification": "Értesítés Törlése", + "DeleteNotification": "Értesítés törlése", "DeleteDownloadClientMessageText": "Biztosan törli a(z) \"{name}\" letöltési klienst?", "DeleteDownloadClient": "Letöltőkliens törlése", "DeleteBackupMessageText": "Biztosan törli a '{name}' biztonsági mentést?", "DeleteBackup": "Biztonsági Mentés törlése", "Delete": "Törlés", - "DatabaseMigration": "DB Migráció", + "DatabaseMigration": "Adatbázis-migráció", "Dates": "Dátumok", "Date": "Dátum", - "CustomFilters": "Egyéni Szűrők", + "CustomFilters": "Egyedi Szűrők", "ConnectSettingsSummary": "Értesítések és egyéni szkriptek", "ConnectSettings": "Csatlakozási beállítások", "Connections": "Kapcsolatok", @@ -50,7 +50,7 @@ "Cancel": "Mégse", "BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez", "BranchUpdateMechanism": "Külső frissítési mechanizmus által használt ág", - "BranchUpdate": "Ágazattípus a {appName} frissítéseihez", + "BranchUpdate": "A(z) {appName} frissítéséhez használt fiók", "Branch": "Ágazat", "BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez", "BindAddress": "Kötési cím", @@ -59,7 +59,7 @@ "BackupRetentionHelpText": "A megőrzési időszaknál régebbi automatikus biztonsági másolatok automatikusan törlődnek", "BackupNow": "Biztonsági Mentés", "BackupIntervalHelpText": "Az automatikus biztonsági mentések közötti időköz", - "BackupFolderHelpText": "Az elérési útvonalak a {appName} AppData könyvtárában lesznek", + "BackupFolderHelpText": "A relatív elérési utak a(z) {appName} AppData könyvtárában találhatók", "Backup": "Biztonsági mentés", "AutomaticSearch": "Automatikus keresés", "Automatic": "Automatikus", @@ -541,5 +541,9 @@ "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Függetlenül attól, hogy a qBittorrent konfigurált tartalomelrendezését használja, az eredeti elrendezést a torrentből, vagy mindig hozzon létre egy almappát (qBittorrent 4.3.2)", "DeleteSelectedDownloadClientsMessageText": "Biztosan törölni szeretné a kiválasztott {count} letöltési klienst?", "CountDownloadClientsSelected": "{count} letöltési kliens kiválasztva", - "StopSelecting": "Kiválasztás leállítása" + "StopSelecting": "Kiválasztás leállítása", + "days": "napok", + "DeleteSelectedApplicationsMessageText": "Biztosan törölni szeretne {count} kiválasztott importlistát?", + "CountApplicationsSelected": "{count} Gyűjtemény(ek) kiválasztva", + "ManageClients": "Ügyfelek kezelése" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index de144b506..ba9b1dc39 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -515,5 +515,14 @@ "AuthenticationRequiredPasswordHelpTextWarning": "Inserisci la nuova password", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Conferma la nuova password", "Clone": "Copia", - "DefaultNameCopiedProfile": "{name} - Copia" + "DefaultNameCopiedProfile": "{name} - Copia", + "AppUpdatedVersion": "{appName} è stato aggiornato alla versione `{version}`, per vedere le modifiche devi ricaricare {appName}", + "AddApplicationImplementation": "Aggiungi Connessione - {implementationName}", + "AddIndexerProxyImplementation": "Aggiungi indicizzatore - {implementationName}", + "EditApplicationImplementation": "Aggiungi Condizione - {implementationName}", + "CountApplicationsSelected": "{count} Collezione(i) Selezionate", + "EditConnectionImplementation": "Aggiungi Connessione - {implementationName}", + "EditDownloadClientImplementation": "Aggiungi un Client di Download - {implementationName}", + "EditIndexerImplementation": "Aggiungi indicizzatore - {implementationName}", + "EditIndexerProxyImplementation": "Aggiungi indicizzatore - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 352b409d1..2f0982884 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -135,5 +135,7 @@ "AuthBasic": "Grunnleggende (nettleser -popup)", "AuthForm": "Skjemaer (påloggingsside)", "DisabledForLocalAddresses": "Deaktivert for lokale adresser", - "ResetAPIKeyMessageText": "Er du sikker på at du vil tilbakestille API -nøkkelen din?" + "ResetAPIKeyMessageText": "Er du sikker på at du vil tilbakestille API -nøkkelen din?", + "CountApplicationsSelected": "{count} samling(er) valgt", + "Id": "ID" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index e002875ce..1073faa83 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -482,5 +482,6 @@ "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Bevestig het nieuwe wachtwoord", "AuthenticationRequiredUsernameHelpTextWarning": "Voeg een nieuwe gebruikersnaam in", "AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.", - "Episode": "aflevering" + "Episode": "aflevering", + "CountApplicationsSelected": "{count} Collectie(s) geselecteerd" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 72c27768b..8142e1ae1 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -377,5 +377,14 @@ "ResetAPIKeyMessageText": "Czy na pewno chcesz zresetować swój klucz API?", "RestartProwlarr": "Zrestartuj {appName}", "AddConnectionImplementation": "Dodaj Connection - {implementationName}", - "AddDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}" + "AddDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}", + "CountApplicationsSelected": "Wybrane kolekcje: {0}", + "EditDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}", + "Id": "Identyfikator", + "AddApplicationImplementation": "Dodaj Connection - {implementationName}", + "AddIndexerImplementation": "Dodaj condition - {implementationName}", + "AddIndexerProxyImplementation": "Dodaj condition - {implementationName}", + "EditConnectionImplementation": "Dodaj Connection - {implementationName}", + "EditApplicationImplementation": "Dodaj Connection - {implementationName}", + "EditIndexerImplementation": "Dodaj condition - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index d56b3b4f6..ca2780e0a 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -609,5 +609,7 @@ "ManageClients": "Gerenciar Clientes", "NoApplicationsFound": "Nenhum aplicativo encontrado", "NotificationsEmailSettingsUseEncryptionHelpText": "Se preferir usar criptografia se configurado no servidor, usar sempre criptografia via SSL (somente porta 465) ou StartTLS (qualquer outra porta) ou nunca usar criptografia", - "NotificationsEmailSettingsUseEncryption": "Usar Criptografia" + "NotificationsEmailSettingsUseEncryption": "Usar Criptografia", + "IndexerHDBitsSettingsPasskeyHelpText": "Chave de Acesso dos Detalhes do Usuário", + "IndexerSettingsPasskey": "Chave de Acesso" } diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index 926f6ada0..1af330dc7 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -117,5 +117,7 @@ "AuthBasic": "Základné (vyskakovacie okno prehliadača)", "AuthForm": "Formuláre (prihlasovacia stránka)", "DisabledForLocalAddresses": "Zakázané pre miestne adresy", - "ResetAPIKeyMessageText": "Naozaj chcete obnoviť kľúč API?" + "ResetAPIKeyMessageText": "Naozaj chcete obnoviť kľúč API?", + "CountApplicationsSelected": "{count} Označených kolekcií", + "Id": "ID" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 9a7349479..61b317ae8 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -371,5 +371,6 @@ "EditIndexerImplementation": "Koşul Ekle - {implementationName}", "EditIndexerProxyImplementation": "Koşul Ekle - {implementationName}", "AddCustomFilter": "Özel Filtre Ekleyin", - "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}" + "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", + "EditDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}" } From 02bc40b9b6406767967b4c1413baaed2d5bbbf27 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 10 Feb 2024 15:05:42 +0200 Subject: [PATCH 450/964] Translations for indexer settings --- .../Indexer/Edit/EditIndexerModalContent.js | 2 +- .../src/Settings/Profiles/App/AppProfile.js | 2 +- .../Indexers/Definitions/AlphaRatio.cs | 4 +- .../Indexers/Definitions/BeyondHD.cs | 14 ++-- .../BroadcastheNet/BroadcastheNetSettings.cs | 2 +- .../Definitions/FileList/FileListSettings.cs | 6 +- .../Indexers/Definitions/GazelleGames.cs | 4 +- .../Definitions/HDBits/HDBitsSettings.cs | 12 +-- .../Indexers/Definitions/IPTorrents.cs | 4 +- .../Indexers/Definitions/Nebulance.cs | 2 +- .../Definitions/Newznab/NewznabSettings.cs | 9 ++- .../Indexers/Definitions/NzbIndex.cs | 4 +- .../Indexers/Definitions/Orpheus.cs | 2 +- .../PassThePopcorn/PassThePopcornSettings.cs | 6 +- .../Indexers/Definitions/Redacted.cs | 2 +- .../Definitions/SpeedApp/SpeedAppBase.cs | 2 +- .../Indexers/Definitions/TorrentSyndikat.cs | 2 +- .../Definitions/UNIT3D/Unit3dSettings.cs | 2 +- .../Indexers/IndexerBaseSettings.cs | 6 +- .../Indexers/IndexerTorrentBaseSettings.cs | 8 +- .../Settings/CookieTorrentBaseSettings.cs | 2 +- .../Settings/NoAuthTorrentBaseSettings.cs | 2 +- src/NzbDrone.Core/Localization/Core/ar.json | 4 +- src/NzbDrone.Core/Localization/Core/bg.json | 4 +- src/NzbDrone.Core/Localization/Core/ca.json | 4 +- src/NzbDrone.Core/Localization/Core/cs.json | 4 +- src/NzbDrone.Core/Localization/Core/da.json | 4 +- src/NzbDrone.Core/Localization/Core/de.json | 4 +- src/NzbDrone.Core/Localization/Core/el.json | 4 +- src/NzbDrone.Core/Localization/Core/en.json | 76 ++++++++++++++++++- src/NzbDrone.Core/Localization/Core/es.json | 4 +- src/NzbDrone.Core/Localization/Core/fi.json | 4 +- src/NzbDrone.Core/Localization/Core/fr.json | 4 +- src/NzbDrone.Core/Localization/Core/he.json | 4 +- src/NzbDrone.Core/Localization/Core/hi.json | 4 +- src/NzbDrone.Core/Localization/Core/hr.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 4 +- src/NzbDrone.Core/Localization/Core/is.json | 4 +- src/NzbDrone.Core/Localization/Core/it.json | 4 +- src/NzbDrone.Core/Localization/Core/ja.json | 4 +- src/NzbDrone.Core/Localization/Core/ko.json | 4 +- .../Localization/Core/nb_NO.json | 2 +- src/NzbDrone.Core/Localization/Core/nl.json | 4 +- src/NzbDrone.Core/Localization/Core/pl.json | 4 +- src/NzbDrone.Core/Localization/Core/pt.json | 4 +- .../Localization/Core/pt_BR.json | 4 +- src/NzbDrone.Core/Localization/Core/ro.json | 4 +- src/NzbDrone.Core/Localization/Core/ru.json | 4 +- src/NzbDrone.Core/Localization/Core/sk.json | 2 +- src/NzbDrone.Core/Localization/Core/sv.json | 4 +- src/NzbDrone.Core/Localization/Core/th.json | 4 +- src/NzbDrone.Core/Localization/Core/tr.json | 4 +- src/NzbDrone.Core/Localization/Core/uk.json | 4 +- src/NzbDrone.Core/Localization/Core/vi.json | 4 +- .../Localization/Core/zh_CN.json | 4 +- .../Localization/Core/zh_TW.json | 2 +- 56 files changed, 185 insertions(+), 114 deletions(-) diff --git a/frontend/src/Indexer/Edit/EditIndexerModalContent.js b/frontend/src/Indexer/Edit/EditIndexerModalContent.js index b09b9e656..709c3ff74 100644 --- a/frontend/src/Indexer/Edit/EditIndexerModalContent.js +++ b/frontend/src/Indexer/Edit/EditIndexerModalContent.js @@ -97,7 +97,7 @@ function EditIndexerModalContent(props) { diff --git a/frontend/src/Settings/Profiles/App/AppProfile.js b/frontend/src/Settings/Profiles/App/AppProfile.js index db123d006..8d428ec48 100644 --- a/frontend/src/Settings/Profiles/App/AppProfile.js +++ b/frontend/src/Settings/Profiles/App/AppProfile.js @@ -96,7 +96,7 @@ class AppProfile extends Component { kind={enableRss ? kinds.SUCCESS : kinds.DISABLED} outline={!enableRss} > - {translate('RSS')} + {translate('Rss')} } diff --git a/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs b/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs index 03123bb7a..d40710da9 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AlphaRatio.cs @@ -154,9 +154,9 @@ public class AlphaRatioParser : GazelleParser public class AlphaRatioSettings : GazelleSettings { - [FieldDefinition(6, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Search freeleech torrents only")] + [FieldDefinition(6, Label = "IndexerSettingsFreeleechOnly", Type = FieldType.Checkbox, HelpText = "IndexerAlphaRatioSettingsFreeleechOnlyHelpText")] public bool FreeleechOnly { get; set; } - [FieldDefinition(7, Label = "Exclude Scene", Type = FieldType.Checkbox, HelpText = "Exclude Scene torrents from results")] + [FieldDefinition(7, Label = "IndexerAlphaRatioSettingsExcludeScene", Type = FieldType.Checkbox, HelpText = "IndexerAlphaRatioSettingsExcludeSceneHelpText")] public bool ExcludeScene { get; set; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index 8277a5da7..c18465d25 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -334,25 +334,25 @@ namespace NzbDrone.Core.Indexers.Definitions SearchTypes = Array.Empty(); } - [FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in My Security => API Key)", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(2, Label = "ApiKey", HelpText = "IndexerBeyondHDSettingsApiKeyHelpText", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } - [FieldDefinition(3, Label = "RSS Key", HelpText = "RSS Key from the Site (Found in My Security => RSS Key)", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(3, Label = "IndexerSettingsRssKey", HelpText = "IndexerBeyondHDSettingsRssKeyHelpText", Privacy = PrivacyLevel.ApiKey)] public string RssKey { get; set; } - [FieldDefinition(4, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Search freeleech only")] + [FieldDefinition(4, Label = "IndexerSettingsFreeleechOnly", Type = FieldType.Checkbox, HelpText = "IndexerBeyondHDSettingsFreeleechOnlyHelpText")] public bool FreeleechOnly { get; set; } - [FieldDefinition(5, Label = "Limited Only", Type = FieldType.Checkbox, HelpText = "Search freeleech only (Limited UL)")] + [FieldDefinition(5, Label = "IndexerBeyondHDSettingsLimitedOnly", Type = FieldType.Checkbox, HelpText = "IndexerBeyondHDSettingsLimitedOnlyHelpText")] public bool LimitedOnly { get; set; } - [FieldDefinition(6, Label = "Refund Only", Type = FieldType.Checkbox, HelpText = "Search refund only")] + [FieldDefinition(6, Label = "IndexerBeyondHDSettingsRefundOnly", Type = FieldType.Checkbox, HelpText = "IndexerBeyondHDSettingsRefundOnlyHelpText")] public bool RefundOnly { get; set; } - [FieldDefinition(7, Label = "Rewind Only", Type = FieldType.Checkbox, HelpText = "Search rewind only")] + [FieldDefinition(7, Label = "IndexerBeyondHDSettingsRewindOnly", Type = FieldType.Checkbox, HelpText = "IndexerBeyondHDSettingsRewindOnlyHelpText")] public bool RewindOnly { get; set; } - [FieldDefinition(8, Label = "Search Types", Type = FieldType.TagSelect, SelectOptions = typeof(BeyondHDSearchType), Advanced = true, HelpText = "Select the types of releases that you are interested in. If none selected, all options are used.")] + [FieldDefinition(8, Label = "IndexerBeyondHDSettingsSearchTypes", Type = FieldType.TagSelect, SelectOptions = typeof(BeyondHDSearchType), HelpText = "IndexerBeyondHDSettingsSearchTypesHelpText", Advanced = true)] public IEnumerable SearchTypes { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetSettings.cs index e52b96888..968f623a8 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetSettings.cs @@ -23,7 +23,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet BaseSettings.LimitsUnit = (int)IndexerLimitsUnit.Hour; } - [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(2, Label = "ApiKey", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListSettings.cs index 5fdcc4744..4183bc8c9 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListSettings.cs @@ -24,13 +24,13 @@ public class FileListSettings : NoAuthTorrentBaseSettings BaseSettings.LimitsUnit = (int)IndexerLimitsUnit.Hour; } - [FieldDefinition(2, Label = "Username", HelpText = "Site Username", Privacy = PrivacyLevel.UserName)] + [FieldDefinition(2, Label = "Username", HelpText = "IndexerFileListSettingsUsernameHelpText", Privacy = PrivacyLevel.UserName)] public string Username { get; set; } - [FieldDefinition(3, Label = "Passkey", HelpText = "Site Passkey (This is the alphanumeric string in the tracker url shown in your download client)", Privacy = PrivacyLevel.Password, Type = FieldType.Password)] + [FieldDefinition(3, Label = "IndexerSettingsPasskey", HelpText = "IndexerFileListSettingsPasskeyHelpText", Privacy = PrivacyLevel.Password, Type = FieldType.Password)] public string Passkey { get; set; } - [FieldDefinition(4, Label = "Freeleech Only", HelpText = "Search Freeleech torrents only", Type = FieldType.Checkbox)] + [FieldDefinition(4, Label = "IndexerSettingsFreeleechOnly", HelpText = "IndexerFileListSettingsFreeleechOnlyHelpText", Type = FieldType.Checkbox)] public bool FreeleechOnly { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs index da9025a87..e012472bb 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs @@ -535,10 +535,10 @@ namespace NzbDrone.Core.Indexers.Definitions Passkey = ""; } - [FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", HelpTextWarning = "Must have User and Torrents permissions", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(2, Label = "ApiKey", HelpText = "IndexerGazelleGamesSettingsApiKeyHelpText", HelpTextWarning = "IndexerGazelleGamesSettingsApiKeyHelpTextWarning", Privacy = PrivacyLevel.ApiKey)] public string Apikey { get; set; } - [FieldDefinition(3, Label = "Search Group Names", Type = FieldType.Checkbox, HelpText = "Search Group Names Only")] + [FieldDefinition(3, Label = "IndexerGazelleGamesSettingsSearchGroupNames", Type = FieldType.Checkbox, HelpText = "IndexerGazelleGamesSettingsSearchGroupNamesHelpText")] public bool SearchGroupNames { get; set; } public string Passkey { get; set; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs index 9c4abab77..48f65413e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsSettings.cs @@ -29,25 +29,25 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits UseFilenames = true; } - [FieldDefinition(2, Label = "Username", HelpText = "Site Username", Privacy = PrivacyLevel.UserName)] + [FieldDefinition(2, Label = "Username", HelpText = "IndexerHDBitsSettingsUsernameHelpText", Privacy = PrivacyLevel.UserName)] public string Username { get; set; } [FieldDefinition(3, Label = "IndexerSettingsPasskey", HelpText = "IndexerHDBitsSettingsPasskeyHelpText", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } - [FieldDefinition(4, Label = "Codecs", Type = FieldType.Select, SelectOptions = typeof(HdBitsCodec), HelpText = "If unspecified, all options are used.", Advanced = true)] + [FieldDefinition(4, Label = "IndexerHDBitsSettingsCodecs", Type = FieldType.Select, SelectOptions = typeof(HdBitsCodec), HelpText = "IndexerHDBitsSettingsCodecsHelpText", Advanced = true)] public IEnumerable Codecs { get; set; } - [FieldDefinition(5, Label = "Mediums", Type = FieldType.Select, SelectOptions = typeof(HdBitsMedium), HelpText = "If unspecified, all options are used.", Advanced = true)] + [FieldDefinition(5, Label = "IndexerHDBitsSettingsMediums", Type = FieldType.Select, SelectOptions = typeof(HdBitsMedium), HelpText = "IndexerHDBitsSettingsMediumsHelpText", Advanced = true)] public IEnumerable Mediums { get; set; } - [FieldDefinition(6, Label = "Origins", Type = FieldType.Select, SelectOptions = typeof(HdBitsOrigin), HelpText = "If unspecified, all options are used.", Advanced = true)] + [FieldDefinition(6, Label = "IndexerHDBitsSettingsOrigins", Type = FieldType.Select, SelectOptions = typeof(HdBitsOrigin), HelpText = "IndexerHDBitsSettingsOriginsHelpText", Advanced = true)] public IEnumerable Origins { get; set; } - [FieldDefinition(7, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech releases only", Advanced = true)] + [FieldDefinition(7, Label = "IndexerSettingsFreeleechOnly", Type = FieldType.Checkbox, HelpText = "IndexerHDBitsSettingsFreeleechOnlyHelpText", Advanced = true)] public bool FreeleechOnly { get; set; } - [FieldDefinition(8, Label = "Use Filenames", Type = FieldType.Checkbox, HelpText = "Check this option if you want to use torrent filenames as release titles")] + [FieldDefinition(8, Label = "IndexerHDBitsSettingsUseFilenames", Type = FieldType.Checkbox, HelpText = "IndexerHDBitsSettingsUseFilenamesHelpText")] public bool UseFilenames { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs index b5b78d91d..1156b56e3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs @@ -420,10 +420,10 @@ namespace NzbDrone.Core.Indexers.Definitions { private static readonly IPTorrentsValidator Validator = new (); - [FieldDefinition(3, Label = "Cookie User-Agent", Type = FieldType.Textbox, HelpText = "User-Agent associated with cookie used from Browser")] + [FieldDefinition(3, Label = "IndexerIPTorrentsSettingsCookieUserAgent", Type = FieldType.Textbox, HelpText = "IndexerIPTorrentsSettingsCookieUserAgentHelpText")] public string UserAgent { get; set; } - [FieldDefinition(4, Label = "FreeLeech Only", Type = FieldType.Checkbox, HelpText = "Search FreeLeech torrents only")] + [FieldDefinition(4, Label = "IndexerSettingsFreeleechOnly", Type = FieldType.Checkbox, HelpText = "IndexerIPTorrentsSettingsFreeleechOnlyHelpText")] public bool FreeLeechOnly { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index 45810a1c2..36247522f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -293,7 +293,7 @@ namespace NzbDrone.Core.Indexers.Definitions ApiKey = ""; } - [FieldDefinition(4, Label = "API Key", HelpText = "API Key from User Settings > Api Keys. Key must have List and Download permissions")] + [FieldDefinition(4, Label = "ApiKey", HelpText = "IndexerNebulanceSettingsApiKeyHelpText")] public string ApiKey { get; set; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabSettings.cs index 5717d978b..b517c5894 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabSettings.cs @@ -60,16 +60,17 @@ namespace NzbDrone.Core.Indexers.Newznab [FieldDefinition(0, Label = "URL")] public string BaseUrl { get; set; } - [FieldDefinition(1, Label = "API Path", HelpText = "Path to the api, usually /api", Advanced = true)] + [FieldDefinition(1, Label = "IndexerSettingsApiPath", HelpText = "IndexerSettingsApiPathHelpText", Advanced = true)] + [FieldToken(TokenField.HelpText, "IndexerSettingsApiPath", "url", "/api")] public string ApiPath { get; set; } - [FieldDefinition(2, Label = "API Key", HelpText = "Site API Key", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(2, Label = "ApiKey", HelpText = "IndexerNewznabSettingsApiKeyHelpText", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } - [FieldDefinition(5, Label = "Additional Parameters", HelpText = "Additional Newznab parameters", Advanced = true)] + [FieldDefinition(5, Label = "IndexerSettingsAdditionalParameters", HelpText = "IndexerNewznabSettingsAdditionalParametersHelpText", Advanced = true)] public string AdditionalParameters { get; set; } - [FieldDefinition(6, Label = "VIP Expiration", HelpText = "Enter date (yyyy-mm-dd) for VIP Expiration or blank, Prowlarr will notify 1 week from expiration of VIP")] + [FieldDefinition(6, Label = "IndexerSettingsVipExpiration", HelpText = "IndexerNewznabSettingsVipExpirationHelpText")] public string VipExpiration { get; set; } [FieldDefinition(7)] diff --git a/src/NzbDrone.Core/Indexers/Definitions/NzbIndex.cs b/src/NzbDrone.Core/Indexers/Definitions/NzbIndex.cs index bf57c1ca3..8fe5f4d04 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NzbIndex.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NzbIndex.cs @@ -1187,10 +1187,10 @@ namespace NzbDrone.Core.Indexers.Definitions ApiKey = ""; } - [FieldDefinition(1, Label = "Base Url", HelpText = "Select which baseurl Prowlarr will use for requests to the site", Type = FieldType.Select, SelectOptionsProviderAction = "getUrls")] + [FieldDefinition(1, Label = "IndexerSettingsBaseUrl", HelpText = "IndexerSettingsBaseUrlHelpText", Type = FieldType.Select, SelectOptionsProviderAction = "getUrls")] public string BaseUrl { get; set; } - [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "Site API Key")] + [FieldDefinition(2, Label = "ApiKey", HelpText = "IndexerNzbIndexSettingsApiKeyHelpText", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } [FieldDefinition(3)] diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index ab7237196..c5131907f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -438,7 +438,7 @@ namespace NzbDrone.Core.Indexers.Definitions UseFreeleechToken = false; } - [FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(2, Label = "ApiKey", HelpText = "IndexerOrpheusSettingsApiKeyHelpText", Privacy = PrivacyLevel.ApiKey)] public string Apikey { get; set; } [FieldDefinition(3, Label = "Use Freeleech Tokens", HelpText = "Use freeleech tokens when available", Type = FieldType.Checkbox)] diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornSettings.cs index 475dfa73b..08ae2284c 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornSettings.cs @@ -18,13 +18,13 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { private static readonly PassThePopcornSettingsValidator Validator = new (); - [FieldDefinition(2, Label = "API User", HelpText = "These settings are found in your PassThePopcorn security settings (Edit Profile > Security).", Privacy = PrivacyLevel.UserName)] + [FieldDefinition(2, Label = "IndexerSettingsApiUser", HelpText = "IndexerPassThePopcornSettingsApiUserHelpText", Privacy = PrivacyLevel.UserName)] public string APIUser { get; set; } - [FieldDefinition(3, Label = "API Key", HelpText = "Site API Key", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(3, Label = "ApiKey", HelpText = "IndexerPassThePopcornSettingsApiKeyHelpText", Privacy = PrivacyLevel.ApiKey)] public string APIKey { get; set; } - [FieldDefinition(4, Label = "Freeleech Only", HelpText = "Return only freeleech torrents", Type = FieldType.Checkbox)] + [FieldDefinition(4, Label = "IndexerSettingsFreeleechOnly", HelpText = "IndexerPassThePopcornSettingsFreeleechOnlyHelpText", Type = FieldType.Checkbox)] public bool FreeleechOnly { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index 10b0920bb..68133a087 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -420,7 +420,7 @@ namespace NzbDrone.Core.Indexers.Definitions UseFreeleechToken = false; } - [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "API Key from the Site (Found in Settings => Access Settings)")] + [FieldDefinition(2, Label = "ApiKey", Privacy = PrivacyLevel.ApiKey, HelpText = "IndexerRedactedSettingsApiKeyHelpText")] public string Apikey { get; set; } [FieldDefinition(3, Label = "Use Freeleech Tokens", Type = FieldType.Checkbox, HelpText = "Use freeleech tokens when available")] diff --git a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs index 22e44f515..f0170d868 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs @@ -316,7 +316,7 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(3, Label = "Password", HelpText = "Site Password", Privacy = PrivacyLevel.Password, Type = FieldType.Password)] public string Password { get; set; } - [FieldDefinition(4, Label = "API Key", Hidden = HiddenType.Hidden)] + [FieldDefinition(4, Label = "ApiKey", Hidden = HiddenType.Hidden)] public string ApiKey { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentSyndikat.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentSyndikat.cs index 6cd9dc8ae..53be8ec86 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentSyndikat.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentSyndikat.cs @@ -336,7 +336,7 @@ namespace NzbDrone.Core.Indexers.Definitions ReleaseTypes = new List(); } - [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "Site API Key")] + [FieldDefinition(2, Label = "ApiKey", Privacy = PrivacyLevel.ApiKey, HelpText = "IndexerTorrentSyndikatSettingsApiKeyHelpText")] public string ApiKey { get; set; } [FieldDefinition(3, Label = "Products Only", Type = FieldType.Checkbox, HelpText = "Limit search to torrents linked to a product")] diff --git a/src/NzbDrone.Core/Indexers/Definitions/UNIT3D/Unit3dSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/UNIT3D/Unit3dSettings.cs index eac5ccf22..57fd7d070 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/UNIT3D/Unit3dSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/UNIT3D/Unit3dSettings.cs @@ -17,7 +17,7 @@ namespace NzbDrone.Core.Indexers.Definitions.UNIT3D { private static readonly Unit3dSettingsValidator Validator = new (); - [FieldDefinition(2, Label = "API Key", HelpText = "Site API Key generated in My Security", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(2, Label = "ApiKey", HelpText = "Site API Key generated in My Security", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/IndexerBaseSettings.cs b/src/NzbDrone.Core/Indexers/IndexerBaseSettings.cs index 0992cbacf..5bada9b42 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBaseSettings.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBaseSettings.cs @@ -21,13 +21,13 @@ namespace NzbDrone.Core.Indexers public class IndexerBaseSettings { - [FieldDefinition(1, Type = FieldType.Number, Label = "Query Limit", HelpText = "The number of max queries as specified by the respective unit that Prowlarr will allow to the site", Advanced = true)] + [FieldDefinition(1, Type = FieldType.Number, Label = "IndexerSettingsQueryLimit", HelpText = "IndexerSettingsQueryLimitHelpText", Advanced = true)] public int? QueryLimit { get; set; } - [FieldDefinition(2, Type = FieldType.Number, Label = "Grab Limit", HelpText = "The number of max grabs as specified by the respective unit that Prowlarr will allow to the site", Advanced = true)] + [FieldDefinition(2, Type = FieldType.Number, Label = "IndexerSettingsGrabLimit", HelpText = "IndexerSettingsGrabLimitHelpText", Advanced = true)] public int? GrabLimit { get; set; } - [FieldDefinition(3, Type = FieldType.Select, SelectOptions = typeof(IndexerLimitsUnit), Label = "Limits Unit", HelpText = "The unit of time for counting limits per indexer", Advanced = true)] + [FieldDefinition(3, Type = FieldType.Select, Label = "IndexerSettingsLimitsUnit", SelectOptions = typeof(IndexerLimitsUnit), HelpText = "IndexerSettingsLimitsUnitHelpText", Advanced = true)] public int LimitsUnit { get; set; } = (int)IndexerLimitsUnit.Day; } diff --git a/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs b/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs index bae3f889e..fd5d4c813 100644 --- a/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs +++ b/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs @@ -52,16 +52,16 @@ namespace NzbDrone.Core.Indexers public class IndexerTorrentBaseSettings { - [FieldDefinition(1, Type = FieldType.Number, Label = "Apps Minimum Seeders", HelpText = "Minimum seeders required by the Applications for the indexer to grab, empty is Sync profile's default", Advanced = true)] + [FieldDefinition(1, Type = FieldType.Number, Label = "IndexerSettingsAppsMinimumSeeders", HelpText = "IndexerSettingsAppsMinimumSeedersHelpText", Advanced = true)] public int? AppMinimumSeeders { get; set; } - [FieldDefinition(2, Type = FieldType.Textbox, Label = "Seed Ratio", HelpText = "The ratio a torrent should reach before stopping, empty is app's default", Advanced = true)] + [FieldDefinition(2, Type = FieldType.Textbox, Label = "IndexerSettingsSeedRatio", HelpText = "IndexerSettingsSeedRatioHelpText")] public double? SeedRatio { get; set; } - [FieldDefinition(3, Type = FieldType.Number, Label = "Seed Time", HelpText = "The time a torrent should be seeded before stopping, empty is app's default", Unit = "minutes", Advanced = true)] + [FieldDefinition(3, Type = FieldType.Number, Label = "IndexerSettingsSeedTime", Unit = "minutes", HelpText = "IndexerSettingsSeedTimeHelpText", Advanced = true)] public int? SeedTime { get; set; } - [FieldDefinition(4, Type = FieldType.Number, Label = "Pack Seed Time", HelpText = "The time a pack (season or discography) torrent should be seeded before stopping, empty is app's default", Unit = "minutes", Advanced = true)] + [FieldDefinition(4, Type = FieldType.Number, Label = "IndexerSettingsPackSeedTime", HelpText = "IndexerSettingsPackSeedTimeIndexerHelpText", Unit = "minutes", Advanced = true)] public int? PackSeedTime { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Settings/CookieTorrentBaseSettings.cs b/src/NzbDrone.Core/Indexers/Settings/CookieTorrentBaseSettings.cs index 4198550d1..6122acfa7 100644 --- a/src/NzbDrone.Core/Indexers/Settings/CookieTorrentBaseSettings.cs +++ b/src/NzbDrone.Core/Indexers/Settings/CookieTorrentBaseSettings.cs @@ -22,7 +22,7 @@ namespace NzbDrone.Core.Indexers.Settings Cookie = ""; } - [FieldDefinition(2, Label = "Cookie", HelpText = "Site Cookie", HelpLink = "https://wiki.servarr.com/useful-tools#finding-cookies", Privacy = PrivacyLevel.Password)] + [FieldDefinition(2, Label = "IndexerSettingsCookie", HelpText = "IndexerSettingsCookieHelpText", HelpLink = "https://wiki.servarr.com/useful-tools#finding-cookies", Privacy = PrivacyLevel.Password)] public string Cookie { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Indexers/Settings/NoAuthTorrentBaseSettings.cs b/src/NzbDrone.Core/Indexers/Settings/NoAuthTorrentBaseSettings.cs index 5c9a8bea9..42f800dc8 100644 --- a/src/NzbDrone.Core/Indexers/Settings/NoAuthTorrentBaseSettings.cs +++ b/src/NzbDrone.Core/Indexers/Settings/NoAuthTorrentBaseSettings.cs @@ -18,7 +18,7 @@ namespace NzbDrone.Core.Indexers.Settings { private static readonly NoAuthSettingsValidator Validator = new (); - [FieldDefinition(1, Label = "Base Url", Type = FieldType.Select, SelectOptionsProviderAction = "getUrls", HelpText = "Select which baseurl Prowlarr will use for requests to the site")] + [FieldDefinition(1, Label = "IndexerSettingsBaseUrl", Type = FieldType.Select, SelectOptionsProviderAction = "getUrls", HelpText = "IndexerSettingsBaseUrlHelpText")] public string BaseUrl { get; set; } [FieldDefinition(20)] diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index c57ad3f27..5f4c17098 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -150,7 +150,7 @@ "RemovingTag": "إزالة العلامة", "Reset": "إعادة تعيين", "ResetAPIKey": "إعادة تعيين مفتاح API", - "RSSIsNotSupportedWithThisIndexer": "لا يتم دعم RSS مع هذا المفهرس", + "RssIsNotSupportedWithThisIndexer": "لا يتم دعم RSS مع هذا المفهرس", "Save": "حفظ", "ScriptPath": "مسار البرنامج النصي", "SettingsEnableColorImpairedMode": "تفعيل وضع ضعف الألوان", @@ -251,7 +251,7 @@ "NoChanges": "لا تغيرات", "NoLeaveIt": "لا ، اتركها", "PendingChangesDiscardChanges": "تجاهل التغييرات واترك", - "RSS": "RSS", + "Rss": "RSS", "System": "النظام", "TagIsNotUsedAndCanBeDeleted": "العلامة غير مستخدمة ويمكن حذفها", "Tags": "العلامات", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 05001beac..825368ade 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -170,7 +170,7 @@ "RemovingTag": "Премахване на етикет", "Reset": "Нулиране", "Retention": "Задържане", - "RSS": "RSS", + "Rss": "RSS", "Warn": "Предупреждавайте", "NoTagsHaveBeenAddedYet": "Все още не са добавени етикети", "NotificationTriggers": "Задействания за уведомяване", @@ -296,7 +296,7 @@ "Restart": "Рестартирам", "RestartNow": "Рестартирай сега", "Restore": "Възстанови", - "RSSIsNotSupportedWithThisIndexer": "RSS не се поддържа с този индексатор", + "RssIsNotSupportedWithThisIndexer": "RSS не се поддържа с този индексатор", "Wiki": "Wiki", "PageSizeHelpText": "Брой елементи за показване на всяка страница", "Password": "Парола", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 554af8c96..99776bef6 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -205,7 +205,7 @@ "RestartRequiredHelpTextWarning": "Cal reiniciar perquè tingui efecte", "Restore": "Restaura", "RestoreBackup": "Restaura còpia de seguretat", - "RSS": "RSS", + "Rss": "RSS", "Save": "Desa", "SaveChanges": "Desa els canvis", "Security": "Seguretat", @@ -274,7 +274,7 @@ "Hostname": "Nom d'amfitrió", "IgnoredAddresses": "Adreces ignorades", "ProxyUsernameHelpText": "Només cal que introduïu un nom d'usuari i una contrasenya si cal. Deixeu-los en blanc en cas contrari.", - "RSSIsNotSupportedWithThisIndexer": "RSS no és compatible amb aquest indexador", + "RssIsNotSupportedWithThisIndexer": "RSS no és compatible amb aquest indexador", "SaveSettings": "Desa la configuració", "Seeders": "Llavors", "SelectAll": "Selecciona-ho tot", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 68beb6d99..be75e0f71 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -193,7 +193,7 @@ "Restart": "Restartujte", "RestartNow": "Restartovat nyní", "RestoreBackup": "Obnovit zálohu", - "RSSIsNotSupportedWithThisIndexer": "RSS není u tohoto indexeru podporováno", + "RssIsNotSupportedWithThisIndexer": "RSS není u tohoto indexeru podporováno", "Save": "Uložit", "SSLCertPasswordHelpText": "Heslo pro soubor pfx", "SSLCertPath": "Cesta certifikátu SSL", @@ -288,7 +288,7 @@ "PortNumber": "Číslo portu", "Result": "Výsledek", "Retention": "Zadržení", - "RSS": "RSS", + "Rss": "RSS", "TagsSettingsSummary": "Podívejte se na všechny značky a na to, jak se používají. Nepoužité značky lze odstranit", "TestAll": "Vyzkoušet vše", "TestAllClients": "Vyzkoušejte všechny klienty", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index c20864d20..088743963 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -254,8 +254,8 @@ "ReleaseStatus": "Frigør status", "Restore": "Gendan", "RestoreBackup": "Gendan sikkerhedskopi", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "RSS understøttes ikke med denne indekseringsenhed", + "Rss": "RSS", + "RssIsNotSupportedWithThisIndexer": "RSS understøttes ikke med denne indekseringsenhed", "Save": "Gemme", "Scheduled": "Planlagt", "ScriptPath": "Script sti", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 1712ef767..63d138579 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -293,8 +293,8 @@ "QueryResults": "Abfrageergebnisse", "Queue": "Warteschlange", "Queued": "In Warteschlange", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "RSS wird von diesem Indexer nicht unterstützt", + "Rss": "RSS", + "RssIsNotSupportedWithThisIndexer": "RSS wird von diesem Indexer nicht unterstützt", "RawSearchSupported": "Raw-Suche unterstützt", "ReadTheWikiForMoreInformation": "Lesen Sie das Wiki für weitere Informationen", "Reddit": "Reddit", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index b11de3c0e..1557ff105 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -60,8 +60,8 @@ "Reddit": "Reddit", "Result": "Αποτέλεσμα", "Retention": "Κράτηση", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "Το RSS δεν υποστηρίζεται με αυτό το ευρετήριο", + "Rss": "RSS", + "RssIsNotSupportedWithThisIndexer": "Το RSS δεν υποστηρίζεται με αυτό το ευρετήριο", "Save": "Σώσει", "SaveChanges": "Αποθήκευσε τις αλλαγές", "SettingsEnableColorImpairedModeHelpText": "Τροποποιημένο στυλ για να επιτρέπεται στους χρήστες με προβλήματα χρώματος να διακρίνουν καλύτερα τις πληροφορίες με χρωματική κωδικοποίηση", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 32bfb7c04..dc143ef7c 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -258,25 +258,68 @@ "IncludeHealthWarningsHelpText": "Include Health Warnings", "IncludeManualGrabsHelpText": "Include Manual Grabs made within {appName}", "Indexer": "Indexer", + "IndexerAlphaRatioSettingsExcludeScene": "Exclude SCENE", + "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Exclude SCENE releases from results", + "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Search freeleech releases only", "IndexerAlreadySetup": "At least one instance of indexer is already setup", "IndexerAuth": "Indexer Auth", + "IndexerBeyondHDSettingsApiKeyHelpText": "API Key from the Site (Found in My Security => API Key)", + "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Search freeleech releases only", + "IndexerBeyondHDSettingsLimitedOnly": "Limited Only", + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Search freeleech only (Limited UL)", + "IndexerBeyondHDSettingsRefundOnly": "Refund Only", + "IndexerBeyondHDSettingsRefundOnlyHelpText": "Search refund only", + "IndexerBeyondHDSettingsRewindOnly": "Rewind Only", + "IndexerBeyondHDSettingsRewindOnlyHelpText": "Search rewind only", + "IndexerBeyondHDSettingsRssKeyHelpText": "RSS Key from the Site (Found in My Security => RSS Key)", + "IndexerBeyondHDSettingsSearchTypes": "Search Types", + "IndexerBeyondHDSettingsSearchTypesHelpText": "Select the types of releases that you are interested in. If none selected, all options are used.", "IndexerCategories": "Indexer Categories", "IndexerDetails": "Indexer Details", "IndexerDisabled": "Indexer Disabled", "IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {0}.", "IndexerDownloadClientHelpText": "Specify which download client is used for grabs made within {appName} from this indexer", "IndexerFailureRate": "Indexer Failure Rate", + "IndexerFileListSettingsFreeleechOnlyHelpText": "Search freeleech releases only", + "IndexerFileListSettingsPasskeyHelpText": "Site Passkey (This is the alphanumeric string in the tracker url shown in your download client)", + "IndexerFileListSettingsUsernameHelpText": "Site Username", "IndexerFlags": "Indexer Flags", + "IndexerGazelleGamesSettingsApiKeyHelpText": "API Key from the Site (Found in Settings => Access Settings)", + "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Must have User and Torrents permissions", + "IndexerGazelleGamesSettingsSearchGroupNames": "Search Group Names", + "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Search releases by group names", + "IndexerHDBitsSettingsCodecs": "Codecs", + "IndexerHDBitsSettingsCodecsHelpText": "If unspecified, all options are used.", + "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Show freeleech releases only", + "IndexerHDBitsSettingsMediums": "Mediums", + "IndexerHDBitsSettingsMediumsHelpText": "If unspecified, all options are used.", + "IndexerHDBitsSettingsOrigins": "Origins", + "IndexerHDBitsSettingsOriginsHelpText": "If unspecified, all options are used.", "IndexerHDBitsSettingsPasskeyHelpText": "Passkey from User Details", + "IndexerHDBitsSettingsUseFilenames": "Use Filenames", + "IndexerHDBitsSettingsUseFilenamesHelpText": "Check this option if you want to use torrent filenames as release titles", + "IndexerHDBitsSettingsUsernameHelpText": "Site Username", "IndexerHealthCheckNoIndexers": "No indexers enabled, {appName} will not return search results", "IndexerHistoryLoadError": "Error loading indexer history", + "IndexerIPTorrentsSettingsCookieUserAgent": "Cookie User-Agent", + "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent associated with cookie used from Browser", + "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Search freeleech releases only", "IndexerId": "Indexer ID", "IndexerInfo": "Indexer Info", "IndexerLongTermStatusCheckAllClientMessage": "All indexers are unavailable due to failures for more than 6 hours", "IndexerLongTermStatusCheckSingleClientMessage": "Indexers unavailable due to failures for more than 6 hours: {0}", "IndexerName": "Indexer Name", + "IndexerNebulanceSettingsApiKeyHelpText": "API Key from User Settings > Api Keys. Key must have List and Download permissions", + "IndexerNewznabSettingsAdditionalParametersHelpText": "Additional Newznab parameters", + "IndexerNewznabSettingsApiKeyHelpText": "Site API Key", + "IndexerNewznabSettingsVipExpirationHelpText": "Enter date (yyyy-mm-dd) for VIP Expiration or blank, {appName} will notify 1 week from expiration of VIP", "IndexerNoDefCheckMessage": "Indexers have no definition and will not work: {0}. Please remove and (or) re-add to {appName}", + "IndexerNzbIndexSettingsApiKeyHelpText": "Site API Key", "IndexerObsoleteCheckMessage": "Indexers are obsolete or have been updated: {0}. Please remove and (or) re-add to {appName}", + "IndexerOrpheusSettingsApiKeyHelpText": "API Key from the Site (Found in Settings => Access Settings)", + "IndexerPassThePopcornSettingsApiKeyHelpText": "Site API Key", + "IndexerPassThePopcornSettingsApiUserHelpText": "These settings are found in your PassThePopcorn security settings (Edit Profile > Security).", + "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Search freeleech releases only", "IndexerPriority": "Indexer Priority", "IndexerPriorityHelpText": "Indexer Priority from 1 (Highest) to 50 (Lowest). Default: 25.", "IndexerProxies": "Indexer Proxies", @@ -284,15 +327,42 @@ "IndexerProxyStatusCheckAllClientMessage": "All proxies are unavailable due to failures", "IndexerProxyStatusCheckSingleClientMessage": "Proxies unavailable due to failures: {0}", "IndexerQuery": "Indexer Query", + "IndexerRedactedSettingsApiKeyHelpText": "API Key from the Site (Found in Settings => Access Settings)", "IndexerRss": "Indexer RSS", - "IndexerSettingsSummary": "Configure various global Indexer settings including Proxies.", + "IndexerSettingsAdditionalParameters": "Additional Parameters", + "IndexerSettingsApiPath": "API Path", + "IndexerSettingsApiPathHelpText": "Path to the api, usually {url}", + "IndexerSettingsApiUser": "API User", + "IndexerSettingsAppsMinimumSeeders": "Apps Minimum Seeders", + "IndexerSettingsAppsMinimumSeedersHelpText": "Minimum seeders required by the Applications for the indexer to grab, empty is Sync profile's default", + "IndexerSettingsBaseUrl": "Base Url", + "IndexerSettingsBaseUrlHelpText": "Select which base url {appName} will use for requests to the site", + "IndexerSettingsCookie": "Cookie", + "IndexerSettingsCookieHelpText": "Site Cookie", + "IndexerSettingsFreeleechOnly": "Freeleech Only", + "IndexerSettingsGrabLimit": "Grab Limit", + "IndexerSettingsGrabLimitHelpText": "The number of max grabs as specified by the respective unit that {appName} will allow to the site", + "IndexerSettingsLimitsUnit": "Limits Unit", + "IndexerSettingsLimitsUnitHelpText": "The unit of time for counting limits per indexer", + "IndexerSettingsPackSeedTime": "Pack Seed Time", + "IndexerSettingsPackSeedTimeIndexerHelpText": "The time a pack (season or discography) torrent should be seeded before stopping, empty is app's default", "IndexerSettingsPasskey": "Pass Key", + "IndexerSettingsQueryLimit": "Query Limit", + "IndexerSettingsQueryLimitHelpText": "The number of max queries as specified by the respective unit that {appName} will allow to the site", + "IndexerSettingsRssKey": "RSS Key", + "IndexerSettingsSeedRatio": "Seed Ratio", + "IndexerSettingsSeedRatioHelpText": "The ratio a torrent should reach before stopping, empty uses the download client's default. Ratio should be at least 1.0 and follow the indexers rules", + "IndexerSettingsSeedTime": "Seed Time", + "IndexerSettingsSeedTimeHelpText": "The time a torrent should be seeded before stopping, empty uses the download client's default", + "IndexerSettingsSummary": "Configure various global Indexer settings including Proxies.", + "IndexerSettingsVipExpiration": "VIP Expiration", "IndexerSite": "Indexer Site", "IndexerStatus": "Indexer Status", "IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures", "IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}", "IndexerTagsHelpText": "Use tags to specify Indexer Proxies or which apps the indexer is synced to.", "IndexerTagsHelpTextWarning": "Tags should be used with caution, they can have unintended effects. An indexer with a tag will only sync to apps with the same tag.", + "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Site API Key", "IndexerVipCheckExpiredClientMessage": "Indexer VIP benefits have expired: {0}", "IndexerVipCheckExpiringClientMessage": "Indexer VIP benefits expiring soon: {0}", "Indexers": "Indexers", @@ -421,8 +491,6 @@ "QueryType": "Query Type", "Queue": "Queue", "Queued": "Queued", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "RSS is not supported with this indexer", "RawSearchSupported": "Raw Search Supported", "ReadTheWikiForMoreInformation": "Read the Wiki for more information", "RecentChanges": "Recent Changes", @@ -451,7 +519,9 @@ "RestoreBackup": "Restore Backup", "Result": "Result", "Retention": "Retention", + "Rss": "RSS", "RssFeed": "RSS Feed", + "RssIsNotSupportedWithThisIndexer": "RSS is not supported with this indexer", "RssQueries": "RSS Queries", "SSLCertPassword": "SSL Cert Password", "SSLCertPasswordHelpText": "Password for pfx file", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 8506e66db..246ef9287 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -229,7 +229,7 @@ "TagCannotBeDeletedWhileInUse": "No se puede eliminar estando en uso", "SSLCertPathHelpText": "Ruta al archivo pfx", "SSLCertPasswordHelpText": "Contraseña para el archivo pfx", - "RSSIsNotSupportedWithThisIndexer": "RSS no son soportadas por este indexer", + "RssIsNotSupportedWithThisIndexer": "RSS no son soportadas por este indexer", "RemovingTag": "Eliminando etiqueta", "Manual": "Manual", "LogLevelTraceHelpTextWarning": "El registro de seguimiento sólo debe activarse temporalmente", @@ -297,7 +297,7 @@ "Enabled": "Habilitado", "Grabs": "Capturar", "Presets": "Preajustes", - "RSS": "RSS", + "Rss": "RSS", "Today": "Hoy", "Tomorrow": "mañana", "Torrent": "Torrents", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 3749dee10..9e77be6eb 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -111,8 +111,8 @@ "Restart": "Käynnistä uudelleen", "RestartNow": "Käynnistä uudelleen nyt", "Restore": "Palauta", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "RSS-syötettä ei ole käytettävissä tälle tietolähteelle", + "Rss": "RSS", + "RssIsNotSupportedWithThisIndexer": "RSS-syötettä ei ole käytettävissä tälle tietolähteelle", "ScriptPath": "Komentosarjan sijainti", "Security": "Suojaus", "SuggestTranslationChange": "Ehdota käännösmuutosta", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index dd6d5f322..fba04313e 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -241,7 +241,7 @@ "SendAnonymousUsageData": "Envoyer des données d'utilisation anonymes", "ScriptPath": "Chemin du script", "SaveSettings": "Enregistrer les paramètres", - "RSSIsNotSupportedWithThisIndexer": "RSS n'est pas pris en charge avec cet indexeur", + "RssIsNotSupportedWithThisIndexer": "RSS n'est pas pris en charge avec cet indexeur", "Retention": "Rétention", "Result": "Résultat", "Restore": "Restaurer", @@ -322,7 +322,7 @@ "AddedToDownloadClient": "Release ajoutée au client", "AddNewIndexer": "Ajouter un nouvel indexeur", "Wiki": "Wiki", - "RSS": "RSS", + "Rss": "RSS", "RedirectHelpText": "Rediriger la demande de téléchargement entrante pour l'indexeur et transmettre la capture directement au lieu de transmettre la demande par proxy via {appName}", "Redirect": "Rediriger", "Reddit": "Reddit", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 4b7dabca2..c9bdf6301 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -56,7 +56,7 @@ "Presets": "הגדרות קבועות מראש", "Proxy": "פרוקסי", "ProxyType": "סוג proxy", - "RSSIsNotSupportedWithThisIndexer": "RSS אינו נתמך עם אינדקס זה", + "RssIsNotSupportedWithThisIndexer": "RSS אינו נתמך עם אינדקס זה", "SettingsShowRelativeDatesHelpText": "הצג תאריכים קרובים (היום / אתמול / וכו ') או תאריכים מוחלטים", "TableOptions": "אפשרויות טבלה", "Tasks": "משימות", @@ -111,7 +111,7 @@ "Usenet": "Usenet", "URLBase": "בסיס URL", "Retention": "הַחזָקָה", - "RSS": "RSS", + "Rss": "RSS", "Save": "להציל", "SaveChanges": "שמור שינויים", "SaveSettings": "שמור הגדרות", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 5843d9b1a..d6af6b576 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -37,7 +37,7 @@ "Test": "परीक्षा", "Port": "बंदरगाह", "PortNumber": "पोर्ट संख्या", - "RSSIsNotSupportedWithThisIndexer": "RSS इस अनुक्रमणिका के साथ समर्थित नहीं है", + "RssIsNotSupportedWithThisIndexer": "RSS इस अनुक्रमणिका के साथ समर्थित नहीं है", "SendAnonymousUsageData": "अनाम उपयोग डेटा भेजें", "SetTags": "टैग सेट करें", "About": "के बारे में", @@ -192,7 +192,7 @@ "RestoreBackup": "बैकअप बहाल", "Result": "परिणाम", "Retention": "अवधारण", - "RSS": "आरएसएस", + "Rss": "आरएसएस", "ScriptPath": "पटकथा पथ", "Search": "खोज", "SettingsTimeFormat": "समय प्रारूप", diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index c4113b3d7..438337a51 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -27,7 +27,7 @@ "Remove": "Ukloni", "Replace": "Zamijeni", "Reset": "Resetiraj", - "RSS": "RSS", + "Rss": "RSS", "Scheduled": "Zakazano", "Search": "Traži", "Seeders": "Seederi", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 1e90bb198..4630302bb 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -134,7 +134,7 @@ "SaveSettings": "Beállítások mentése", "SaveChanges": "Változtatások mentése", "Save": "Mentés", - "RSSIsNotSupportedWithThisIndexer": "Az RSS nem támogatott ezzel az indexerrel", + "RssIsNotSupportedWithThisIndexer": "Az RSS nem támogatott ezzel az indexerrel", "Retention": "Visszatartás", "Result": "Eredmény", "RestoreBackup": "Biztonsági mentés visszaállítása", @@ -322,7 +322,7 @@ "EnableRssHelpText": "RSS Engedélyezése az Indexerekhez", "EnableRss": "RSS Engedélyezése", "Wiki": "Wiki", - "RSS": "RSS", + "Rss": "RSS", "RedirectHelpText": "Átirányítja a bejövő letöltési kérelmet az indexelő számára, és közvetlenül adja át a fájlt ahelyett, hogy a kérést a {appName}-en keresztül proxyba tenné", "Redirect": "Átirányítás", "Reddit": "Reddit", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index a1efae0cd..e1572f31f 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -282,8 +282,8 @@ "Restore": "Endurheimta", "RestoreBackup": "Endurheimtu öryggisafrit", "Retention": "Varðveisla", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "RSS er ekki studd með þessum flokkara", + "Rss": "RSS", + "RssIsNotSupportedWithThisIndexer": "RSS er ekki studd með þessum flokkara", "Save": "Vista", "SaveSettings": "Vista stillingar", "Scheduled": "Tímaáætlun", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index ba9b1dc39..3ee024fd4 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -162,7 +162,7 @@ "SettingsEnableColorImpairedMode": "Abilità la Modalità Daltonica", "SendAnonymousUsageData": "Invia dati anonimi sull'uso", "ScriptPath": "Percorso dello script", - "RSSIsNotSupportedWithThisIndexer": "RSS non è supportato con questo Indicizzatore", + "RssIsNotSupportedWithThisIndexer": "RSS non è supportato con questo Indicizzatore", "Retention": "Ritenzione", "Result": "Risultato", "Restore": "Ripristina", @@ -305,7 +305,7 @@ "IndexerHealthCheckNoIndexers": "Nessun Indicizzatore abilitato, {appName} non restituirà risultati di ricerca", "EnableRss": "Abilita RSS", "NoLinks": "Nessun Collegamento", - "RSS": "RSS", + "Rss": "RSS", "Wiki": "Wiki", "AllIndexersHiddenDueToFilter": "Tutti gli Indicizzatori sono nascosti a causa del filtro applicato.", "DeleteApplicationMessageText": "Sei sicuro di voler eliminare l'applicazione '{0}'?", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index a8fd5c405..bfc694859 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -29,7 +29,7 @@ "OnHealthIssueHelpText": "健康問題について", "Priority": "優先", "Restart": "再起動", - "RSSIsNotSupportedWithThisIndexer": "RSSはこのインデクサーではサポートされていません", + "RssIsNotSupportedWithThisIndexer": "RSSはこのインデクサーではサポートされていません", "ShowSearch": "検索を表示", "SSLPort": "SSLポート", "StartupDirectory": "スタートアップディレクトリ", @@ -182,7 +182,7 @@ "RestartNow": "今すぐ再起動", "Result": "結果", "Retention": "保持", - "RSS": "RSS", + "Rss": "RSS", "Save": "保存する", "SaveChanges": "変更内容を保存", "Scheduled": "予定", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 0d3c7f563..2033ae2c3 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -142,7 +142,7 @@ "Restore": "복원", "Result": "결과", "Retention": "보유", - "RSSIsNotSupportedWithThisIndexer": "이 인덱서에서는 RSS가 지원되지 않습니다.", + "RssIsNotSupportedWithThisIndexer": "이 인덱서에서는 RSS가 지원되지 않습니다.", "Scheduled": "예정", "ScriptPath": "스크립트 경로", "Search": "검색", @@ -258,7 +258,7 @@ "ProxyCheckBadRequestMessage": "프록시를 테스트하지 못했습니다. StatusCode : {0}", "ProxyCheckFailedToTestMessage": "프록시 테스트 실패 : {0}", "ReleaseStatus": "출시 상태", - "RSS": "RSS", + "Rss": "RSS", "Sort": "종류", "UnsavedChanges": "저장되지 않은 변경 사항", "UnselectAll": "모두 선택 해제", diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 2f0982884..df9f73900 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -54,7 +54,7 @@ "UI": "Grensesnitt", "ConnectionLost": "Tilkobling mistet", "New": "Ny", - "RSS": "RSS", + "Rss": "RSS", "Applications": "Applikasjoner", "Connections": "Tilkoblinger", "Usenet": "Usenet", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 1073faa83..c9fcc8463 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -272,8 +272,8 @@ "Query": "Vraag", "Queue": "Wachtrij", "Queued": "Afwachtend", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "RSS wordt niet ondersteund door deze indexeerder", + "Rss": "RSS", + "RssIsNotSupportedWithThisIndexer": "RSS wordt niet ondersteund door deze indexeerder", "ReadTheWikiForMoreInformation": "Lees de Wiki voor meer informatie", "Reddit": "Reddit", "Redirect": "Omleiden", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 8142e1ae1..8065cf33d 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -86,7 +86,7 @@ "PageSize": "Rozmiar strony", "PageSizeHelpText": "Liczba elementów do pokazania na każdej stronie", "PendingChangesStayReview": "Zostań i przejrzyj zmiany", - "RSSIsNotSupportedWithThisIndexer": "RSS nie jest obsługiwany przez ten indeksator", + "RssIsNotSupportedWithThisIndexer": "RSS nie jest obsługiwany przez ten indeksator", "Settings": "Ustawienia", "ShowAdvanced": "Pokaż zaawansowane", "Test": "Test", @@ -304,7 +304,7 @@ "Indexers": "Indeksatory", "IndexerStatusCheckAllClientMessage": "Wszystkie indeksatory są niedostępne z powodu błędów", "RestartNow": "Zrestartuj teraz", - "RSS": "RSS", + "Rss": "RSS", "Tasks": "Zadania", "MaintenanceRelease": "Wersja konserwacyjna: poprawki błędów i inne ulepszenia. Aby uzyskać więcej informacji, zobacz historię zatwierdzeń na Github", "HistoryCleanupDaysHelpTextWarning": "Pliki w koszu starsze niż wybrana liczba dni zostaną automatycznie wyczyszczone", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 12266b63b..f5d3cf07f 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -192,7 +192,7 @@ "AddingTag": "A adicionar etiqueta", "AutomaticSearch": "Pesquisa automática", "UnableToAddANewIndexerPleaseTryAgain": "Não foi possível adicionar um novo indexador, tenta novamente.", - "RSSIsNotSupportedWithThisIndexer": "RSS não é suportado por esse indexador", + "RssIsNotSupportedWithThisIndexer": "RSS não é suportado por esse indexador", "ProwlarrSupportsAnyIndexer": "O {appName} suporta vários indexadores, além de qualquer indexador que usa o padrão Newznab/Torznab como \"Newznab genérico\" (para Usenet) e \"Torznab genérico\" (para torrents). Pesquise e selecione os indexadores na listagem abaixo.", "IndexerPriorityHelpText": "Prioridade do indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25.", "IndexerPriority": "Prioridade do indexador", @@ -322,7 +322,7 @@ "SettingsIndexerLoggingHelpText": "Registar dados adicionais do indexador, incluindo resposta", "SettingsIndexerLogging": "Registo em log avançado do indexador", "SettingsFilterSentryEvents": "Filtrar eventos de análise", - "RSS": "RSS", + "Rss": "RSS", "RedirectHelpText": "Redireccionar as solicitações de transferência de entrada para o indexador e obter diretamente, em vez de por proxy usando o {appName}", "Redirect": "Redireccionar", "Reddit": "Reddit", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index ca2780e0a..383c922ca 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -324,8 +324,8 @@ "QueryResults": "Resultados da Consulta", "Queue": "Fila", "Queued": "Na fila", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "O RSS não é compatível com este indexador", + "Rss": "RSS", + "RssIsNotSupportedWithThisIndexer": "O RSS não é compatível com este indexador", "RawSearchSupported": "Pesquisa Bruta Suportada", "ReadTheWikiForMoreInformation": "Leia o Wiki para obter mais informações", "Reddit": "Reddit", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 217b239b5..be167a119 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -122,7 +122,7 @@ "SettingsLongDateFormat": "Format de dată lungă", "SettingsShortDateFormat": "Format scurt de dată", "SettingsTimeFormat": "Format ora", - "RSSIsNotSupportedWithThisIndexer": "RSS nu este suportat de acest indexator", + "RssIsNotSupportedWithThisIndexer": "RSS nu este suportat de acest indexator", "ShowSearchHelpText": "Afișați butonul de căutare pe hover", "UILanguageHelpText": "Limba pe care {appName} o va folosi pentru interfața de utilizare", "UILanguageHelpTextWarning": "Reîncărcare browser necesară", @@ -173,7 +173,7 @@ "Priority": "Prioritate", "Reddit": "Reddit", "Result": "Rezultat", - "RSS": "RSS", + "Rss": "RSS", "SettingsShowRelativeDatesHelpText": "Afișați datele relative (Azi / Ieri / etc) sau absolute", "TestAllClients": "Testați toți clienții", "Today": "Astăzi", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 01be8fd12..3b36cccc8 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -24,7 +24,7 @@ "NoLinks": "Нет ссылок", "Refresh": "Обновить", "RefreshMovie": "Обновить фильм", - "RSS": "RSS", + "Rss": "RSS", "SendAnonymousUsageData": "Отправить анонимные данные об использовании", "UnableToLoadHistory": "Не удалось загрузить историю", "MoreInfo": "Ещё инфо", @@ -199,7 +199,7 @@ "RestoreBackup": "Восстановить из резервной копии", "Result": "Результат", "Retention": "Удержание", - "RSSIsNotSupportedWithThisIndexer": "RSS не поддерживается этим индексатором", + "RssIsNotSupportedWithThisIndexer": "RSS не поддерживается этим индексатором", "Save": "Сохранить", "SaveChanges": "Сохранить изменения", "SaveSettings": "Сохранить настройки", diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index 1af330dc7..99388e163 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -100,7 +100,7 @@ "Indexer": "Indexer", "New": "Nový", "Queued": "Fronta", - "RSS": "RSS", + "Rss": "RSS", "Remove": "Odstrániť", "Replace": "Nahradiť", "ApplicationURL": "URL aplikácie", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 648b627af..4f56bbbd2 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -126,7 +126,7 @@ "RefreshMovie": "Uppdatera filmen", "RemoveFilter": "Ta bort filter", "ResetAPIKey": "Återställa API-nyckel", - "RSS": "RSS", + "Rss": "RSS", "SettingsEnableColorImpairedMode": "Aktivera färgskadat läge", "ClientPriority": "Klient prioritet", "SettingsTimeFormat": "Tidsformat", @@ -155,7 +155,7 @@ "Result": "Resultat", "Retention": "Bibehållande", "CertificateValidation": "Validering av Certifikat", - "RSSIsNotSupportedWithThisIndexer": "RSS stöds inte av denna indexerare", + "RssIsNotSupportedWithThisIndexer": "RSS stöds inte av denna indexerare", "SaveSettings": "Spara inställningar", "ScriptPath": "Skriptsökväg", "CouldNotConnectSignalR": "Kunde inte ansluta till SignalR, UI uppdateras inte", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index d26f798a1..18ce7b21b 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -199,7 +199,7 @@ "Restore": "คืนค่า", "RestoreBackup": "คืนค่าการสำรองข้อมูล", "Retention": "การเก็บรักษา", - "RSS": "RSS", + "Rss": "RSS", "SendAnonymousUsageData": "ส่งข้อมูลการใช้งานแบบไม่ระบุตัวตน", "SetTags": "ตั้งแท็ก", "Settings": "การตั้งค่า", @@ -274,7 +274,7 @@ "ResetAPIKey": "รีเซ็ตคีย์ API", "RestartNow": "เริ่มต้นใหม่เดี๋ยวนี้", "RestartRequiredHelpTextWarning": "ต้องรีสตาร์ทเพื่อให้มีผล", - "RSSIsNotSupportedWithThisIndexer": "RSS ไม่ได้รับการสนับสนุนกับตัวสร้างดัชนีนี้", + "RssIsNotSupportedWithThisIndexer": "RSS ไม่ได้รับการสนับสนุนกับตัวสร้างดัชนีนี้", "Search": "ค้นหา", "Security": "ความปลอดภัย", "SSLCertPassword": "รหัสผ่านใบรับรอง SSL", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 61b317ae8..df5cd765b 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -93,7 +93,7 @@ "Port": "Liman", "PortNumber": "Port numarası", "RestoreBackup": "Yedeği Geri Yükle", - "RSS": "RSS", + "Rss": "RSS", "Save": "Kayıt etmek", "SaveSettings": "Ayarları kaydet", "ScriptPath": "Komut Dosyası Yolu", @@ -145,7 +145,7 @@ "Close": "Kapat", "ApplicationStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", "ApplyTags": "Etiketleri Uygula", - "RSSIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor", + "RssIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor", "Interval": "Aralık", "Logs": "Kütükler", "Authentication": "Doğrulama", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 60f70fc96..3236d97b8 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -161,7 +161,7 @@ "Reload": "Перезавантажити", "RemovedFromTaskQueue": "Видалено з черги завдань", "Restore": "Відновлення", - "RSSIsNotSupportedWithThisIndexer": "Цей індексатор не підтримує RSS", + "RssIsNotSupportedWithThisIndexer": "Цей індексатор не підтримує RSS", "Save": "Зберегти", "SaveChanges": "Зберегти зміни", "SaveSettings": "Зберегти зміни", @@ -297,7 +297,7 @@ "SSLCertPath": "Шлях сертифіката SSL", "UI": "Інтерфейс користувача", "Reddit": "Reddit", - "RSS": "RSS", + "Rss": "RSS", "Seeders": "Сиди", "Wiki": "Wiki", "Grabbed": "Захоплений", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index d84d1d550..bf6ed05da 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -108,7 +108,7 @@ "RestoreBackup": "Khôi phục lại bản sao lưu", "Result": "Kết quả", "Retention": "Giữ lại", - "RSS": "RSS", + "Rss": "RSS", "SendAnonymousUsageData": "Gửi dữ liệu sử dụng ẩn danh", "Settings": "Cài đặt", "SettingsEnableColorImpairedModeHelpText": "Đã thay đổi kiểu để cho phép người dùng khiếm thị phân biệt rõ hơn thông tin mã màu", @@ -143,7 +143,7 @@ "BindAddress": "Địa chỉ ràng buộc", "BranchUpdate": "Nhánh sử dụng để cập nhật {appName}", "CloseCurrentModal": "Đóng phương thức hiện tại", - "RSSIsNotSupportedWithThisIndexer": "RSS không được hỗ trợ với trình chỉ mục này", + "RssIsNotSupportedWithThisIndexer": "RSS không được hỗ trợ với trình chỉ mục này", "SettingsEnableColorImpairedMode": "Bật Chế độ Khuyết màu", "AnalyticsEnabledHelpText": "Gửi thông tin sử dụng và lỗi ẩn danh đến máy chủ của {appName}. Điều này bao gồm thông tin về trình duyệt của bạn, trang WebUI của {appName} mà bạn sử dụng, báo cáo lỗi cũng như hệ điều hành và phiên bản thời gian chạy. Chúng tôi sẽ sử dụng thông tin này để ưu tiên các tính năng và sửa lỗi.", "ApiKey": "Mã API", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 86046d9f0..62fe1053e 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -321,8 +321,8 @@ "QueryResults": "查询结果", "Queue": "队列", "Queued": "队列中", - "RSS": "RSS", - "RSSIsNotSupportedWithThisIndexer": "该搜刮器不支持RSS", + "Rss": "RSS", + "RssIsNotSupportedWithThisIndexer": "该搜刮器不支持RSS", "RawSearchSupported": "‎支持原始‎‎搜索‎", "ReadTheWikiForMoreInformation": "查阅Wiki获得更多信息", "Reddit": "Reddit", diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index b322838e9..d012d6ea4 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -70,7 +70,7 @@ "BranchUpdateMechanism": "外部更新機制使用的分支", "Publisher": "發布者", "Remove": "移除", - "RSS": "RSS", + "Rss": "RSS", "Season": "季", "Theme": "主題", "ApiKeyValidationHealthCheckMessage": "請將您的API金鑰更新為至少{0}個字元長。您可以通過設定或配置文件進行此操作。", From 07adb45d631127ec941ea91ea89f3fab51ff7a91 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 12 Feb 2024 02:22:39 +0200 Subject: [PATCH 451/964] Bump version to 1.14.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5eab4fcc7..b00695cc8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.13.3' + majorVersion: '1.14.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 6153737a78418b56958386fb7143b5923e4b3b18 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 12 Feb 2024 21:12:25 +0200 Subject: [PATCH 452/964] Translations for download client settings Co-authored-by: Stevie Robinson --- .../Download/Clients/Aria2/Aria2Settings.cs | 6 +-- .../Blackhole/TorrentBlackholeSettings.cs | 7 +-- .../Blackhole/UsenetBlackholeSettings.cs | 3 +- .../Download/Clients/Deluge/DelugeSettings.cs | 12 +++-- .../DownloadStationSettings.cs | 7 +-- .../Download/Clients/Flood/FloodSettings.cs | 14 ++--- .../FreeboxDownloadSettings.cs | 25 +++++---- .../Clients/Hadouken/HadoukenSettings.cs | 9 ++-- .../Clients/NzbVortex/NzbVortexSettings.cs | 10 ++-- .../Download/Clients/Nzbget/NzbgetSettings.cs | 13 +++-- .../Clients/Pneumatic/PneumaticSettings.cs | 4 +- .../QBittorrent/QBittorrentSettings.cs | 18 ++++--- .../Clients/Sabnzbd/SabnzbdSettings.cs | 13 +++-- .../Transmission/TransmissionSettings.cs | 16 +++--- .../Clients/rTorrent/RTorrentSettings.cs | 15 +++--- .../Clients/uTorrent/UTorrentSettings.cs | 14 +++-- src/NzbDrone.Core/Localization/Core/en.json | 54 +++++++++++++++++++ 17 files changed, 165 insertions(+), 75 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Settings.cs b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Settings.cs index 82e4d93ab..f90ea6306 100644 --- a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Settings.cs +++ b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2Settings.cs @@ -32,13 +32,13 @@ namespace NzbDrone.Core.Download.Clients.Aria2 [FieldDefinition(1, Label = "Port", Type = FieldType.Number)] public int Port { get; set; } - [FieldDefinition(2, Label = "XML RPC Path", Type = FieldType.Textbox)] + [FieldDefinition(2, Label = "XmlRpcPath", Type = FieldType.Textbox)] public string RpcPath { get; set; } - [FieldDefinition(3, Label = "Use SSL", Type = FieldType.Checkbox)] + [FieldDefinition(3, Label = "UseSsl", Type = FieldType.Checkbox)] public bool UseSsl { get; set; } - [FieldDefinition(4, Label = "Secret token", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] + [FieldDefinition(4, Label = "SecretToken", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string SecretToken { get; set; } [FieldDefinition(5, Label = "Directory", Type = FieldType.Textbox, HelpText = "DownloadClientAriaSettingsDirectoryHelpText")] diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs index a25d0fd4d..81793f947 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs @@ -27,15 +27,16 @@ namespace NzbDrone.Core.Download.Clients.Blackhole private static readonly TorrentBlackholeSettingsValidator Validator = new TorrentBlackholeSettingsValidator(); - [FieldDefinition(0, Label = "Torrent Folder", Type = FieldType.Path, HelpText = "Folder in which Prowlarr will store the .torrent file")] + [FieldDefinition(0, Label = "TorrentBlackholeTorrentFolder", Type = FieldType.Path, HelpText = "BlackholeFolderHelpText")] + [FieldToken(TokenField.HelpText, "TorrentBlackholeTorrentFolder", "extension", ".torrent")] public string TorrentFolder { get; set; } [DefaultValue(false)] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] - [FieldDefinition(1, Label = "Save Magnet Files", Type = FieldType.Checkbox, HelpText = "Save a .magnet file with the magnet link if no .torrent file is available (only useful if the download client supports .magnet files)")] + [FieldDefinition(1, Label = "TorrentBlackholeSaveMagnetFiles", Type = FieldType.Checkbox, HelpText = "TorrentBlackholeSaveMagnetFilesHelpText")] public bool SaveMagnetFiles { get; set; } - [FieldDefinition(2, Label = "Save Magnet Files", Type = FieldType.Textbox, HelpText = "Extension to use for magnet links, defaults to '.magnet'")] + [FieldDefinition(2, Label = "TorrentBlackholeSaveMagnetFilesExtension", Type = FieldType.Textbox, HelpText = "TorrentBlackholeSaveMagnetFilesExtensionHelpText")] public string MagnetFileExtension { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackholeSettings.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackholeSettings.cs index cb53385e5..d4b011d47 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackholeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackholeSettings.cs @@ -18,7 +18,8 @@ namespace NzbDrone.Core.Download.Clients.Blackhole { private static readonly UsenetBlackholeSettingsValidator Validator = new UsenetBlackholeSettingsValidator(); - [FieldDefinition(0, Label = "Nzb Folder", Type = FieldType.Path, HelpText = "Folder in which Prowlarr will store the .nzb file")] + [FieldDefinition(0, Label = "UsenetBlackholeNzbFolder", Type = FieldType.Path, HelpText = "BlackholeFolderHelpText")] + [FieldToken(TokenField.HelpText, "UsenetBlackholeNzbFolder", "extension", ".nzb")] public string NzbFolder { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs index bf463eb81..64ff55a10 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs @@ -34,22 +34,24 @@ namespace NzbDrone.Core.Download.Clients.Deluge [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to Deluge")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "Deluge")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the deluge json url, see http://[host]:[port]/[urlBase]/json")] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientDelugeSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/json")] public string UrlBase { get; set; } [FieldDefinition(4, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(5, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback Category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(5, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(6, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(DelugePriority), HelpText = "Priority to use when grabbing items")] + [FieldDefinition(6, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(DelugePriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } - [FieldDefinition(7, Label = "Add Paused", Type = FieldType.Checkbox)] + [FieldDefinition(7, Label = "DownloadClientSettingsAddPaused", Type = FieldType.Checkbox)] public bool AddPaused { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationSettings.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationSettings.cs index bc3e8ca1c..fea6d8fc6 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/DownloadStationSettings.cs @@ -36,7 +36,8 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to Download Station")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "Download Station")] public bool UseSsl { get; set; } [FieldDefinition(3, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -45,10 +46,10 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation [FieldDefinition(4, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(5, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional. Creates a [category] subdirectory in the output directory.")] + [FieldDefinition(5, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(6, Label = "Directory", Type = FieldType.Textbox, HelpText = "Optional shared folder to put downloads into, leave blank to use the default Download Station location")] + [FieldDefinition(6, Label = "Directory", Type = FieldType.Textbox, HelpText = "DownloadClientDownloadStationSettingsDirectoryHelpText")] public string TvDirectory { get; set; } public DownloadStationSettings() diff --git a/src/NzbDrone.Core/Download/Clients/Flood/FloodSettings.cs b/src/NzbDrone.Core/Download/Clients/Flood/FloodSettings.cs index 46f6f19cb..1026e93e9 100644 --- a/src/NzbDrone.Core/Download/Clients/Flood/FloodSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Flood/FloodSettings.cs @@ -40,10 +40,12 @@ namespace NzbDrone.Core.Download.Clients.Flood [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to Flood")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "Flood")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Base", Type = FieldType.Textbox, HelpText = "Optionally adds a prefix to Flood API, such as [protocol]://[host]:[port]/[urlBase]api")] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, HelpText = "DownloadClientFloodSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "[protocol]://[host]:[port]/[urlBase]/api")] public string UrlBase { get; set; } [FieldDefinition(4, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -52,16 +54,16 @@ namespace NzbDrone.Core.Download.Clients.Flood [FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(6, Label = "Destination", Type = FieldType.Textbox, HelpText = "Manually specifies download destination")] + [FieldDefinition(6, Label = "Destination", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDestinationHelpText")] public string Destination { get; set; } - [FieldDefinition(7, Label = "Tags", Type = FieldType.Tag, HelpText = "Initial tags of a download. To be recognized, a download must have all initial tags. This avoids conflicts with unrelated downloads.")] + [FieldDefinition(7, Label = "Tags", Type = FieldType.Tag, HelpText = "DownloadClientFloodSettingsTagsHelpText")] public IEnumerable Tags { get; set; } - [FieldDefinition(8, Label = "Additional Tags", Type = FieldType.Select, SelectOptions = typeof(AdditionalTags), HelpText = "Adds properties of media as tags. Hints are examples.", Advanced = true)] + [FieldDefinition(8, Label = "DownloadClientFloodSettingsAdditionalTags", Type = FieldType.Select, SelectOptions = typeof(AdditionalTags), HelpText = "DownloadClientFloodSettingsAdditionalTagsHelpText", Advanced = true)] public IEnumerable AdditionalTags { get; set; } - [FieldDefinition(9, Label = "Add Paused", Type = FieldType.Checkbox)] + [FieldDefinition(9, Label = "DownloadClientSettingsAddPaused", Type = FieldType.Checkbox)] public bool AddPaused { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/FreeboxDownloadSettings.cs b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/FreeboxDownloadSettings.cs index ee0fff8e1..effdf37d9 100644 --- a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/FreeboxDownloadSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/FreeboxDownloadSettings.cs @@ -46,34 +46,39 @@ namespace NzbDrone.Core.Download.Clients.FreeboxDownload ApiUrl = "/api/v1/"; } - [FieldDefinition(0, Label = "Host", Type = FieldType.Textbox, HelpText = "Hostname or host IP address of the Freebox, defaults to 'mafreebox.freebox.fr' (will only work if on same network)")] + [FieldDefinition(0, Label = "Host", Type = FieldType.Textbox, HelpText = "DownloadClientFreeboxSettingsHostHelpText")] + [FieldToken(TokenField.HelpText, "Host", "url", "mafreebox.freebox.fr")] public string Host { get; set; } - [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox, HelpText = "Port used to access Freebox interface, defaults to '443'")] + [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox, HelpText = "DownloadClientFreeboxSettingsPortHelpText")] + [FieldToken(TokenField.HelpText, "Port", "port", 443)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secured connection when connecting to Freebox API")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "Freebox API")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "API URL", Type = FieldType.Textbox, Advanced = true, HelpText = "Define Freebox API base URL with API version, eg http://[host]:[port]/[api_base_url]/[api_version]/, defaults to '/api/v1/'")] + [FieldDefinition(3, Label = "DownloadClientFreeboxSettingsApiUrl", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientFreeboxSettingsApiUrlHelpText")] + [FieldToken(TokenField.HelpText, "DownloadClientFreeboxSettingsApiUrl", "url", "http://[host]:[port]/[api_base_url]/[api_version]/")] + [FieldToken(TokenField.HelpText, "DownloadClientFreeboxSettingsApiUrl", "defaultApiUrl", "/api/v1/")] public string ApiUrl { get; set; } - [FieldDefinition(4, Label = "App ID", Type = FieldType.Textbox, HelpText = "App ID given when creating access to Freebox API (ie 'app_id')")] + [FieldDefinition(4, Label = "DownloadClientFreeboxSettingsAppId", Type = FieldType.Textbox, HelpText = "DownloadClientFreeboxSettingsAppIdHelpText")] public string AppId { get; set; } - [FieldDefinition(5, Label = "App Token", Type = FieldType.Password, Privacy = PrivacyLevel.Password, HelpText = "App token retrieved when creating access to Freebox API (ie 'app_token')")] + [FieldDefinition(5, Label = "DownloadClientFreeboxSettingsAppToken", Type = FieldType.Password, Privacy = PrivacyLevel.Password, HelpText = "DownloadClientFreeboxSettingsAppTokenHelpText")] public string AppToken { get; set; } - [FieldDefinition(6, Label = "Destination Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Freebox download location")] + [FieldDefinition(6, Label = "Destination", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsDestinationHelpText")] public string DestinationDirectory { get; set; } - [FieldDefinition(7, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Prowlarr avoids conflicts with unrelated non-Prowlarr downloads (will create a [category] subdirectory in the output directory)")] + [FieldDefinition(7, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(8, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(FreeboxDownloadPriority), HelpText = "Priority to use when grabbing")] + [FieldDefinition(8, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(FreeboxDownloadPriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } - [FieldDefinition(9, Label = "Add Paused", Type = FieldType.Checkbox)] + [FieldDefinition(9, Label = "DownloadClientSettingsAddPaused", Type = FieldType.Checkbox)] public bool AddPaused { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Hadouken/HadoukenSettings.cs b/src/NzbDrone.Core/Download/Clients/Hadouken/HadoukenSettings.cs index c8e6f7763..c26923afb 100644 --- a/src/NzbDrone.Core/Download/Clients/Hadouken/HadoukenSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Hadouken/HadoukenSettings.cs @@ -39,10 +39,13 @@ namespace NzbDrone.Core.Download.Clients.Hadouken [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to Hadouken")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "Hadouken")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the Hadouken url, e.g. http://[host]:[port]/[urlBase]/api")] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "clientName", "Hadouken")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/api")] public string UrlBase { get; set; } [FieldDefinition(4, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -51,7 +54,7 @@ namespace NzbDrone.Core.Download.Clients.Hadouken [FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(6, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release.")] + [FieldDefinition(6, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs index 2dae1ac49..1f276fa25 100644 --- a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs @@ -41,16 +41,18 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the NZBVortex url, e.g. http://[host]:[port]/[urlBase]/api")] + [FieldDefinition(2, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "clientName", "NZBVortex")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/api")] public string UrlBase { get; set; } - [FieldDefinition(3, Label = "API Key", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(3, Label = "ApiKey", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } - [FieldDefinition(4, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(4, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(5, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(NzbVortexPriority), HelpText = "Priority to use when grabbing items")] + [FieldDefinition(5, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(NzbVortexPriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs b/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs index 0e1cbc912..7f968b512 100644 --- a/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs @@ -41,10 +41,13 @@ namespace NzbDrone.Core.Download.Clients.Nzbget [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to NZBGet")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "NZBGet")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the NZBGet url, e.g. http://[host]:[port]/[urlBase]/jsonrpc")] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "clientName", "NZBGet")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/jsonrpc")] public string UrlBase { get; set; } [FieldDefinition(4, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -53,13 +56,13 @@ namespace NzbDrone.Core.Download.Clients.Nzbget [FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(6, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(6, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(7, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(NzbgetPriority), HelpText = "Priority for items added from Prowlarr")] + [FieldDefinition(7, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(NzbgetPriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } - [FieldDefinition(8, Label = "Add Paused", Type = FieldType.Checkbox, HelpText = "This option requires at least NZBGet version 16.0")] + [FieldDefinition(8, Label = "DownloadClientSettingsAddPaused", Type = FieldType.Checkbox, HelpText = "DownloadClientNzbgetSettingsAddPausedHelpText")] public bool AddPaused { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Pneumatic/PneumaticSettings.cs b/src/NzbDrone.Core/Download/Clients/Pneumatic/PneumaticSettings.cs index 741021a3f..6cd8a2b89 100644 --- a/src/NzbDrone.Core/Download/Clients/Pneumatic/PneumaticSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Pneumatic/PneumaticSettings.cs @@ -19,10 +19,10 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic { private static readonly PneumaticSettingsValidator Validator = new PneumaticSettingsValidator(); - [FieldDefinition(0, Label = "Nzb Folder", Type = FieldType.Path, HelpText = "This folder will need to be reachable from XBMC")] + [FieldDefinition(0, Label = "DownloadClientPneumaticSettingsNzbFolder", Type = FieldType.Path, HelpText = "DownloadClientPneumaticSettingsNzbFolderHelpText")] public string NzbFolder { get; set; } - [FieldDefinition(1, Label = "Strm Folder", Type = FieldType.Path, HelpText = ".strm files in this folder will be import by drone")] + [FieldDefinition(1, Label = "DownloadClientPneumaticSettingsStrmFolder", Type = FieldType.Path, HelpText = "DownloadClientPneumaticSettingsStrmFolderHelpText")] public string StrmFolder { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs index fe3b6a4a8..8d157dc30 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs @@ -35,10 +35,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use a secure connection. See Options -> Web UI -> 'Use HTTPS instead of HTTP' in qBittorrent.")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientQbittorrentSettingsUseSslHelpText")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the qBittorrent url, e.g. http://[host]:[port]/[urlBase]/api")] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "clientName", "qBittorrent")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/api")] public string UrlBase { get; set; } [FieldDefinition(4, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -47,22 +49,22 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent [FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(6, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(6, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(7, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(QBittorrentPriority), HelpText = "Priority to use when grabbing items")] + [FieldDefinition(7, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(QBittorrentPriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } - [FieldDefinition(8, Label = "Initial State", Type = FieldType.Select, SelectOptions = typeof(QBittorrentState), HelpText = "Initial state for torrents added to qBittorrent")] + [FieldDefinition(8, Label = "DownloadClientSettingsInitialState", Type = FieldType.Select, SelectOptions = typeof(QBittorrentState), HelpText = "DownloadClientQbittorrentSettingsInitialStateHelpText")] public int InitialState { get; set; } - [FieldDefinition(9, Label = "Sequential Order", Type = FieldType.Checkbox, HelpText = "Download in sequential order (qBittorrent 4.1.0+)")] + [FieldDefinition(9, Label = "DownloadClientQbittorrentSettingsSequentialOrder", Type = FieldType.Checkbox, HelpText = "DownloadClientQbittorrentSettingsSequentialOrderHelpText")] public bool SequentialOrder { get; set; } - [FieldDefinition(10, Label = "First and Last First", Type = FieldType.Checkbox, HelpText = "Download first and last pieces first (qBittorrent 4.1.0+)")] + [FieldDefinition(10, Label = "DownloadClientQbittorrentSettingsFirstAndLastFirst", Type = FieldType.Checkbox, HelpText = "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText")] public bool FirstAndLast { get; set; } - [FieldDefinition(13, Label = "DownloadClientQbittorrentSettingsContentLayout", Type = FieldType.Select, SelectOptions = typeof(QBittorrentContentLayout), HelpText = "DownloadClientQbittorrentSettingsContentLayoutHelpText")] + [FieldDefinition(11, Label = "DownloadClientQbittorrentSettingsContentLayout", Type = FieldType.Select, SelectOptions = typeof(QBittorrentContentLayout), HelpText = "DownloadClientQbittorrentSettingsContentLayoutHelpText")] public int ContentLayout { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs index 37df94bd5..70dba78b1 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs @@ -50,13 +50,16 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to Sabnzbd")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "Sabnzbd")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the Sabnzbd url, e.g. http://[host]:[port]/[urlBase]/api")] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "clientName", "Sabnzbd")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/api")] public string UrlBase { get; set; } - [FieldDefinition(4, Label = "API Key", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(4, Label = "ApiKey", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } [FieldDefinition(5, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -65,10 +68,10 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd [FieldDefinition(6, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(7, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(7, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(8, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(SabnzbdPriority), HelpText = "Priority to use when grabbing items")] + [FieldDefinition(8, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(SabnzbdPriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs index 4d2682ee6..2a510b5e0 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs @@ -41,10 +41,14 @@ namespace NzbDrone.Core.Download.Clients.Transmission [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to Transmission")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "Transmission")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the transmission rpc url, eg http://[host]:[port]/[urlBase]/rpc, defaults to '/transmission/'")] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientTransmissionSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "clientName", "Transmission")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/rpc")] + [FieldToken(TokenField.HelpText, "UrlBase", "defaultUrl", "/transmission/")] public string UrlBase { get; set; } [FieldDefinition(4, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -53,16 +57,16 @@ namespace NzbDrone.Core.Download.Clients.Transmission [FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(6, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional. Creates a [category] subdirectory in the output directory.")] + [FieldDefinition(6, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategorySubFolderHelpText")] public string Category { get; set; } - [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Transmission location")] + [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientTransmissionSettingsDirectoryHelpText")] public string Directory { get; set; } - [FieldDefinition(8, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing items")] + [FieldDefinition(8, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } - [FieldDefinition(9, Label = "Add Paused", Type = FieldType.Checkbox)] + [FieldDefinition(9, Label = "DownloadClientSettingsAddPaused", Type = FieldType.Checkbox)] public bool AddPaused { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs index e2ab37fe2..8e3cd6827 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs @@ -36,10 +36,13 @@ namespace NzbDrone.Core.Download.Clients.RTorrent [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to ruTorrent")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "rTorrent")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Path", Type = FieldType.Textbox, HelpText = "Path to the XMLRPC endpoint, see http(s)://[host]:[port]/[urlPath]. When using ruTorrent this usually is RPC2 or (path to ruTorrent)/plugins/rpc/rpc.php")] + [FieldDefinition(3, Label = "DownloadClientRTorrentSettingsUrlPath", Type = FieldType.Textbox, HelpText = "DownloadClientRTorrentSettingsUrlPathHelpText")] + [FieldToken(TokenField.HelpText, "DownloadClientRTorrentSettingsUrlPath", "url", "http(s)://[host]:[port]/[urlPath]")] + [FieldToken(TokenField.HelpText, "DownloadClientRTorrentSettingsUrlPath", "url2", "/plugins/rpc/rpc.php")] public string UrlBase { get; set; } [FieldDefinition(4, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -48,16 +51,16 @@ namespace NzbDrone.Core.Download.Clients.RTorrent [FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(6, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional.")] + [FieldDefinition(6, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default rTorrent location")] + [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientRTorrentSettingsDirectoryHelpText")] public string Directory { get; set; } - [FieldDefinition(8, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(RTorrentPriority), HelpText = "Priority to use when grabbing items")] + [FieldDefinition(8, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(RTorrentPriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } - [FieldDefinition(9, Label = "Add Stopped", Type = FieldType.Checkbox, HelpText = "Enabling will add torrents and magnets to ruTorrent in a stopped state")] + [FieldDefinition(9, Label = "DownloadClientRTorrentSettingsAddStopped", Type = FieldType.Checkbox, HelpText = "DownloadClientRTorrentSettingsAddStoppedHelpText")] public bool AddStopped { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs index d3b72c04d..573fa2f1d 100644 --- a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs @@ -34,10 +34,13 @@ namespace NzbDrone.Core.Download.Clients.UTorrent [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use secure connection when connecting to uTorrent")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "DownloadClientSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "clientName", "uTorrent")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a prefix to the uTorrent url, e.g. http://[host]:[port]/[urlBase]/api")] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "clientName", "uTorrent")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/api")] public string UrlBase { get; set; } [FieldDefinition(4, Label = "Username", Type = FieldType.Textbox, Privacy = PrivacyLevel.UserName)] @@ -46,13 +49,14 @@ namespace NzbDrone.Core.Download.Clients.UTorrent [FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } - [FieldDefinition(6, Label = "Default Category", Type = FieldType.Textbox, HelpText = "Default fallback category if no mapped category exists for a release. Adding a category specific to Prowlarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(6, Label = "DefaultCategory", Type = FieldType.Textbox, HelpText = "DownloadClientSettingsDefaultCategoryHelpText")] public string Category { get; set; } - [FieldDefinition(7, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(UTorrentPriority), HelpText = "Priority to use when grabbing items")] + [FieldDefinition(7, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(UTorrentPriority), HelpText = "DownloadClientSettingsPriorityItemHelpText")] public int Priority { get; set; } - [FieldDefinition(8, Label = "Initial State", Type = FieldType.Select, SelectOptions = typeof(UTorrentState), HelpText = "Initial state for torrents added to uTorrent")] + [FieldDefinition(8, Label = "DownloadClientSettingsInitialState", Type = FieldType.Select, SelectOptions = typeof(UTorrentState), HelpText = "DownloadClientSettingsInitialStateHelpText")] + [FieldToken(TokenField.HelpText, "DownloadClientSettingsInitialState", "clientName", "uTorrent")] public int IntialState { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index dc143ef7c..3bced14ba 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -96,6 +96,7 @@ "BeforeUpdate": "Before update", "BindAddress": "Bind Address", "BindAddressHelpText": "Valid IP address, localhost or '*' for all interfaces", + "BlackholeFolderHelpText": "Folder in which {appName} will store the {extension} file", "Book": "Book", "BookSearch": "Book Search", "BookSearchTypes": "Book Search Types", @@ -138,6 +139,7 @@ "DatabaseMigration": "Database Migration", "Date": "Date", "Dates": "Dates", + "DefaultCategory": "Default Category", "DefaultNameCopiedProfile": "{name} - Copy", "Delete": "Delete", "DeleteAppProfile": "Delete App Profile", @@ -163,8 +165,10 @@ "DeleteTag": "Delete Tag", "DeleteTagMessageText": "Are you sure you want to delete the tag '{label}'?", "Description": "Description", + "Destination": "Destination", "Details": "Details", "DevelopmentSettings": "Development Settings", + "Directory": "Directory", "Disabled": "Disabled", "DisabledForLocalAddresses": "Disabled for Local Addresses", "DisabledUntil": "Disabled Until", @@ -174,12 +178,53 @@ "DownloadClient": "Download Client", "DownloadClientAriaSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Aria2 location", "DownloadClientCategory": "Download Client Category", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Adds a prefix to the deluge json url, see {url}", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "Optional shared folder to put downloads into, leave blank to use the default Download Station location", + "DownloadClientFloodSettingsAdditionalTags": "Additional Tags", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "Adds properties of media as tags. Hints are examples.", + "DownloadClientFloodSettingsTagsHelpText": "Initial tags of a download. To be recognized, a download must have all initial tags. This avoids conflicts with unrelated downloads.", + "DownloadClientFloodSettingsUrlBaseHelpText": "Adds a prefix to the Flood API, such as {url}", + "DownloadClientFreeboxSettingsApiUrl": "API URL", + "DownloadClientFreeboxSettingsApiUrlHelpText": "Define Freebox API base URL with API version, eg '{url}', defaults to '{defaultApiUrl}'", + "DownloadClientFreeboxSettingsAppId": "App ID", + "DownloadClientFreeboxSettingsAppIdHelpText": "App ID given when creating access to Freebox API (ie 'app_id')", + "DownloadClientFreeboxSettingsAppToken": "App Token", + "DownloadClientFreeboxSettingsAppTokenHelpText": "App token retrieved when creating access to Freebox API (ie 'app_token')", + "DownloadClientFreeboxSettingsHostHelpText": "Hostname or host IP address of the Freebox, defaults to '{url}' (will only work if on same network)", + "DownloadClientFreeboxSettingsPortHelpText": "Port used to access Freebox interface, defaults to '{port}'", + "DownloadClientNzbgetSettingsAddPausedHelpText": "This option requires at least NzbGet version 16.0", + "DownloadClientPneumaticSettingsNzbFolder": "Nzb Folder", + "DownloadClientPneumaticSettingsNzbFolderHelpText": "This folder will need to be reachable from XBMC", + "DownloadClientPneumaticSettingsStrmFolder": "Strm Folder", + "DownloadClientPneumaticSettingsStrmFolderHelpText": ".strm files in this folder will be import by drone", "DownloadClientPriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.", "DownloadClientQbittorrentSettingsContentLayout": "Content Layout", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)", + "DownloadClientQbittorrentSettingsFirstAndLastFirst": "First and Last First", + "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Download first and last pieces first (qBittorrent 4.1.0+)", + "DownloadClientQbittorrentSettingsInitialStateHelpText": "Initial state for torrents added to qBittorrent. Note that Forced Torrents do not abide by seed restrictions", + "DownloadClientQbittorrentSettingsSequentialOrder": "Sequential Order", + "DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Download in sequential order (qBittorrent 4.1.0+)", + "DownloadClientQbittorrentSettingsUseSslHelpText": "Use a secure connection. See Options -> Web UI -> 'Use HTTPS instead of HTTP' in qBittorrent.", + "DownloadClientRTorrentSettingsAddStopped": "Add Stopped", + "DownloadClientRTorrentSettingsAddStoppedHelpText": "Enabling will add torrents and magnets to rTorrent in a stopped state. This may break magnet files.", + "DownloadClientRTorrentSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default rTorrent location", + "DownloadClientRTorrentSettingsUrlPath": "Url Path", + "DownloadClientRTorrentSettingsUrlPathHelpText": "Path to the XMLRPC endpoint, see {url}. This is usually RPC2 or [path to ruTorrent]{url2} when using ruTorrent.", "DownloadClientSettings": "Download Client Settings", + "DownloadClientSettingsAddPaused": "Add Paused", + "DownloadClientSettingsDefaultCategoryHelpText": "Default fallback category if no mapped category exists for a release. Adding a category specific to {appName} avoids conflicts with unrelated non-{appName} downloads. Using a category is optional, but strongly recommended.", + "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Default fallback category if no mapped category exists for a release. Adding a category specific to {appName} avoids conflicts with unrelated non-{appName} downloads. Using a category is optional, but strongly recommended. Creates a [category] subdirectory in the output directory.", + "DownloadClientSettingsDestinationHelpText": "Manually specifies download destination, leave blank to use the default", + "DownloadClientSettingsInitialState": "Initial State", + "DownloadClientSettingsInitialStateHelpText": "Initial state for torrents added to {clientName}", + "DownloadClientSettingsPriorityItemHelpText": "Priority to use when grabbing items", + "DownloadClientSettingsUrlBaseHelpText": "Adds a prefix to the {clientName} url, such as {url}", + "DownloadClientSettingsUseSslHelpText": "Use secure connection when connection to {clientName}", "DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures", "DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}", + "DownloadClientTransmissionSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Transmission location", + "DownloadClientTransmissionSettingsUrlBaseHelpText": "Adds a prefix to the {clientName} rpc url, eg {url}, defaults to '{defaultUrl}'", "DownloadClients": "Download Clients", "DownloadClientsLoadError": "Unable to load download clients", "DownloadClientsSettingsSummary": "Download clients configuration for integration into {appName} UI search", @@ -542,6 +587,7 @@ "SearchType": "Search Type", "SearchTypes": "Search Types", "Season": "Season", + "SecretToken": "Secret Token", "Security": "Security", "SeedRatio": "Seed Ratio", "SeedRatioHelpText": "The ratio a torrent should reach before stopping, empty is app's default", @@ -616,6 +662,11 @@ "Today": "Today", "Tomorrow": "Tomorrow", "Torrent": "Torrent", + "TorrentBlackholeSaveMagnetFiles": "Save Magnet Files", + "TorrentBlackholeSaveMagnetFilesExtension": "Save Magnet Files Extension", + "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extension to use for magnet links, defaults to '.magnet'", + "TorrentBlackholeSaveMagnetFilesHelpText": "Save the magnet link if no .torrent file is available (only useful if the download client supports magnets saved to a file)", + "TorrentBlackholeTorrentFolder": "Torrent Folder", "Torrents": "Torrents", "TorznabUrl": "Torznab Url", "TotalGrabs": "Total Grabs", @@ -666,7 +717,9 @@ "Url": "Url", "UrlBaseHelpText": "For reverse proxy support, default is empty", "UseProxy": "Use Proxy", + "UseSsl": "Use SSL", "Usenet": "Usenet", + "UsenetBlackholeNzbFolder": "Nzb Folder", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent provided by the app that called the API", "Username": "Username", "Version": "Version", @@ -676,6 +729,7 @@ "Website": "Website", "WhatsNew": "What's New?", "Wiki": "Wiki", + "XmlRpcPath": "XML RPC Path", "Year": "Year", "Yes": "Yes", "YesCancel": "Yes, Cancel", From 25821c758f66274bd6941fd2597453762e46b7ca Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 11 Feb 2024 22:58:48 +0000 Subject: [PATCH 453/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Havok Dan Co-authored-by: Magyar Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/hu.json | 13 ++-- .../Localization/Core/pt_BR.json | 72 ++++++++++++++++++- 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 4630302bb..c1f2c8be1 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -5,7 +5,7 @@ "AddingTag": "Címke hozzáadása", "Error": "Hiba", "DeleteTag": "Címke törlése", - "EnableAutomaticSearchHelpText": "Akkor kerül felhasználásra, ha az automatikus kereséseket a kezelőfelületen vagy a {appName}-on keresztül hajtják végre", + "EnableAutomaticSearchHelpText": "Akkor lesz használatos, ha automatikus keresést hajt végre a felhasználói felületen vagy a(z) {appName} alkalmazáson keresztül", "EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést", "Enable": "Aktiválás", "EditIndexer": "Indexer Szerkesztése", @@ -92,12 +92,12 @@ "Failed": "Nem sikerült", "ExistingTag": "Létező címke", "Exception": "Kivétel", - "EventType": "Események Típusa", + "EventType": "Esemény típus", "Events": "Események", - "ErrorLoadingContents": "Hiba történt a tartalom betöltésekor", + "ErrorLoadingContents": "Hiba a tartalom betöltésekor", "EnableSslHelpText": " A hatálybalépéshez újra kell indítani rendszergazdaként", "EnableSSL": "SSL Engedélyezése", - "EnableInteractiveSearchHelpText": "Interaktív keresés esetén használható", + "EnableInteractiveSearchHelpText": "Interaktív keresés esetén lesz használatos", "EnableInteractiveSearch": "Interaktív Keresés Engedélyezése", "System": "Rendszer", "SuggestTranslationChange": "Javasolj fordítási változtatást", @@ -320,7 +320,7 @@ "AddNewIndexer": "Új indexelő hozzáadása", "AddedToDownloadClient": "Kiadás hozzáadva a klienshez", "EnableRssHelpText": "RSS Engedélyezése az Indexerekhez", - "EnableRss": "RSS Engedélyezése", + "EnableRss": "RSS Aktiválás", "Wiki": "Wiki", "Rss": "RSS", "RedirectHelpText": "Átirányítja a bejövő letöltési kérelmet az indexelő számára, és közvetlenül adja át a fájlt ahelyett, hogy a kérést a {appName}-en keresztül proxyba tenné", @@ -545,5 +545,6 @@ "days": "napok", "DeleteSelectedApplicationsMessageText": "Biztosan törölni szeretne {count} kiválasztott importlistát?", "CountApplicationsSelected": "{count} Gyűjtemény(ek) kiválasztva", - "ManageClients": "Ügyfelek kezelése" + "ManageClients": "Ügyfelek kezelése", + "IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltési kliensekkel: {0}." } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 383c922ca..d85b6317f 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -611,5 +611,75 @@ "NotificationsEmailSettingsUseEncryptionHelpText": "Se preferir usar criptografia se configurado no servidor, usar sempre criptografia via SSL (somente porta 465) ou StartTLS (qualquer outra porta) ou nunca usar criptografia", "NotificationsEmailSettingsUseEncryption": "Usar Criptografia", "IndexerHDBitsSettingsPasskeyHelpText": "Chave de Acesso dos Detalhes do Usuário", - "IndexerSettingsPasskey": "Chave de Acesso" + "IndexerSettingsPasskey": "Chave de Acesso", + "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Excluir lançamentos SCENE dos resultados", + "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Pesquisar lançamentos freeleech somente", + "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Pesquisar lançamentos freeleech somente", + "IndexerBeyondHDSettingsLimitedOnly": "Apenas Limitado", + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Pesquisar apenas freeleech (UL limitado)", + "IndexerBeyondHDSettingsRefundOnly": "Só Reembolso", + "IndexerBeyondHDSettingsRefundOnlyHelpText": "Pesquisar só reembolso", + "IndexerBeyondHDSettingsRewindOnly": "Só Retroceder", + "IndexerBeyondHDSettingsRewindOnlyHelpText": "Pesquisar só retroceder", + "IndexerBeyondHDSettingsRssKeyHelpText": "Chave RSS do Site (Encontrada em Minha Segurança = Chave RSS)", + "IndexerBeyondHDSettingsSearchTypes": "Tipos de Pesquisa", + "IndexerFileListSettingsFreeleechOnlyHelpText": "Pesquisar apenas lançamentos freeleech", + "IndexerFileListSettingsPasskeyHelpText": "Chave de acesso do site (esta é a string alfanumérica no URL do rastreador mostrado no seu cliente de download)", + "IndexerFileListSettingsUsernameHelpText": "Nome de Usuário do Site", + "IndexerGazelleGamesSettingsApiKeyHelpText": "Chave API do site (encontrada em Configurações = Configurações de acesso)", + "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Deve ter permissões de usuário e torrents", + "IndexerGazelleGamesSettingsSearchGroupNames": "Pesquisar Nomes de Grupos", + "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Pesquisar lançamentos por nomes de grupos", + "IndexerHDBitsSettingsCodecs": "Codecs", + "IndexerHDBitsSettingsMediumsHelpText": "se não for especificado, todas as opções serão usadas.", + "IndexerHDBitsSettingsOriginsHelpText": "se não for especificado, todas as opções serão usadas.", + "IndexerHDBitsSettingsUseFilenames": "Usar nomes de arquivos", + "IndexerHDBitsSettingsUsernameHelpText": "Nome de Usuário do Site", + "IndexerHDBitsSettingsMediums": "Meios", + "IndexerHDBitsSettingsOrigins": "Origens", + "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Pesquisar apenas lançamentos freeleech", + "IndexerNebulanceSettingsApiKeyHelpText": "Chave de API nas chaves de API das configurações do usuário. A chave deve ter permissões de Lista e Download", + "IndexerNewznabSettingsApiKeyHelpText": "Chave de API do site", + "IndexerNzbIndexSettingsApiKeyHelpText": "Chave de API do site", + "IndexerOrpheusSettingsApiKeyHelpText": "Chave API do site (encontrada em Configurações = Configurações de acesso)", + "IndexerPassThePopcornSettingsApiKeyHelpText": "Chave de API do site", + "IndexerPassThePopcornSettingsApiUserHelpText": "Essas configurações são encontradas nas configurações de segurança do PassThePopcorn (Editar Perfil > Segurança).", + "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Pesquisar apenas lançamentos freeleech", + "IndexerRedactedSettingsApiKeyHelpText": "Chave API do site (encontrada em Configurações = Configurações de acesso)", + "IndexerSettingsAdditionalParameters": "Parâmetros Adicionais", + "IndexerSettingsApiPath": "Caminho da API", + "IndexerSettingsApiPathHelpText": "Caminho para a API, geralmente {url}", + "IndexerSettingsApiUser": "Usuário da API", + "IndexerSettingsBaseUrl": "URL Base", + "IndexerSettingsCookie": "Cookie", + "IndexerSettingsCookieHelpText": "Cookie do Site", + "IndexerSettingsFreeleechOnly": "Só Freeleech", + "IndexerSettingsGrabLimit": "Limite de Captura", + "IndexerSettingsGrabLimitHelpText": "O número máximo de capturas conforme especificado pela respectiva unidade que {appName} permitirá ao site", + "IndexerSettingsLimitsUnit": "Unidade de Limites", + "IndexerSettingsLimitsUnitHelpText": "A unidade de tempo para contagem de limites por indexador", + "IndexerSettingsPackSeedTime": "Tempo de Semeação de Pack", + "IndexerSettingsQueryLimit": "Limite de Consultas", + "IndexerSettingsRssKey": "Chave RSS", + "IndexerSettingsSeedRatio": "Proporção de Semeação", + "IndexerSettingsSeedTime": "Tempo de Semeação", + "IndexerSettingsSeedTimeHelpText": "O tempo que um torrent deve ser semeado antes de parar, vazio usa o padrão do cliente de download", + "IndexerSettingsVipExpiration": "Expiração VIP", + "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Chave de API do site", + "IndexerAlphaRatioSettingsExcludeScene": "Excluir SCENE", + "IndexerBeyondHDSettingsApiKeyHelpText": "Chave de API do site (encontrada em Minha segurança = chave de API)", + "IndexerBeyondHDSettingsSearchTypesHelpText": "Selecione os tipos de lançamentos nos quais você está interessado. Se nenhum for selecionado, todas as opções serão usadas.", + "IndexerHDBitsSettingsCodecsHelpText": "se não for especificado, todas as opções serão usadas.", + "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Mostrar apenas lançamentos freeleech", + "IndexerHDBitsSettingsUseFilenamesHelpText": "Marque esta opção se quiser usar nomes de arquivos torrent como títulos de lançamento", + "IndexerIPTorrentsSettingsCookieUserAgent": "Agente de Usuário para Cookies", + "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "Agente de Usuário associado ao cookie usado no Navegador", + "IndexerNewznabSettingsAdditionalParametersHelpText": "Parâmetros adicionais do Newznab", + "IndexerNewznabSettingsVipExpirationHelpText": "Insira a data (aaaa-mm-dd) para expiração do VIP ou em branco, {appName} notificará 1 semana após a expiração do VIP", + "IndexerSettingsAppsMinimumSeeders": "Semeadores mínimos de aplicativos", + "IndexerSettingsAppsMinimumSeedersHelpText": "Semeadores mínimos exigidos pelos aplicativos para o indexador capturar, vazio é o padrão do perfil de sincronização", + "IndexerSettingsBaseUrlHelpText": "Selecione qual URL base {appName} usará para solicitações ao site", + "IndexerSettingsPackSeedTimeIndexerHelpText": "O tempo que um pack de torrent (temporada ou discografia) deve ser semeado antes de parar, vazio é o padrão do aplicativo", + "IndexerSettingsQueryLimitHelpText": "O número máximo de consultas especificadas pela respectiva unidade que {appName} permitirá ao site", + "IndexerSettingsSeedRatioHelpText": "A proporção que um torrent deve atingir antes de parar, vazio usa o padrão do cliente de download. A proporção deve ser de pelo menos 1,0 e seguir as regras dos indexadores" } From 22cbf40e3c13a1a6be27aa80a0c0a4e14c8f24da Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 13 Feb 2024 15:49:26 +0200 Subject: [PATCH 454/964] Bump label-actions action to v4 --- .github/workflows/label-actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/label-actions.yml b/.github/workflows/label-actions.yml index 8f35f6bd6..77c35366c 100644 --- a/.github/workflows/label-actions.yml +++ b/.github/workflows/label-actions.yml @@ -18,6 +18,6 @@ jobs: action: runs-on: ubuntu-latest steps: - - uses: dessant/label-actions@v3 + - uses: dessant/label-actions@v4 with: process-only: 'issues, prs' From 7d46660583cb967a5538062ce6494c4a37dc39f1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 14 Feb 2024 01:41:14 +0200 Subject: [PATCH 455/964] Fixed: Updated base url for TorrentsCSV --- src/NzbDrone.Core/Indexers/Definitions/TorrentsCSV.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentsCSV.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentsCSV.cs index 2cf09f51e..ddb868ccc 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentsCSV.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentsCSV.cs @@ -19,7 +19,8 @@ namespace NzbDrone.Core.Indexers.Definitions public class TorrentsCSV : TorrentIndexerBase { public override string Name => "TorrentsCSV"; - public override string[] IndexerUrls => new[] { "https://torrents-csv.ml/" }; + public override string[] IndexerUrls => new[] { "https://torrents-csv.com/" }; + public override string[] LegacyUrls => new[] { "https://torrents-csv.ml/" }; public override string Language => "en-US"; public override string Description => "Torrents.csv is a self-hostable open source torrent search engine and database"; public override Encoding Encoding => Encoding.UTF8; From a5ecc2dc9f44bb3821b89625e58232311b2fae27 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 7 Feb 2024 10:05:01 +0200 Subject: [PATCH 456/964] Show download client ID as hint in select options --- .../src/Components/Form/DownloadClientSelectInputConnector.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/Components/Form/DownloadClientSelectInputConnector.js b/frontend/src/Components/Form/DownloadClientSelectInputConnector.js index 162c79885..d5bbe4a2f 100644 --- a/frontend/src/Components/Form/DownloadClientSelectInputConnector.js +++ b/frontend/src/Components/Form/DownloadClientSelectInputConnector.js @@ -24,7 +24,8 @@ function createMapStateToProps() { .sort(sortByName) .map((downloadClient) => ({ key: downloadClient.id, - value: downloadClient.name + value: downloadClient.name, + hint: `(${downloadClient.id})` })); if (includeAny) { From a1a5dd574e781616e1da99d71ced93deb9a2b03e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 14 Feb 2024 22:46:03 +0200 Subject: [PATCH 457/964] Fixed: Using FlareSolverr in the same time with another HTTP/SOCKS proxy --- .../Indexers/IndexerHttpClient.cs | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/IndexerHttpClient.cs b/src/NzbDrone.Core/Indexers/IndexerHttpClient.cs index ca822e25b..3f3705c58 100644 --- a/src/NzbDrone.Core/Indexers/IndexerHttpClient.cs +++ b/src/NzbDrone.Core/Indexers/IndexerHttpClient.cs @@ -1,8 +1,10 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NLog; using NzbDrone.Common.Cache; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Common.Http.Dispatchers; using NzbDrone.Common.TPL; @@ -34,56 +36,63 @@ namespace NzbDrone.Core.Indexers public async Task ExecuteProxiedAsync(HttpRequest request, ProviderDefinition definition) { - var selectedProxy = GetProxy(definition); + var selectedProxies = GetProxies(definition); - request = PreRequest(request, selectedProxy); + request = PreRequest(request, selectedProxies); - return PostResponse(await ExecuteAsync(request), selectedProxy); + return PostResponse(await ExecuteAsync(request), selectedProxies); } public HttpResponse ExecuteProxied(HttpRequest request, ProviderDefinition definition) { - var selectedProxy = GetProxy(definition); + var selectedProxies = GetProxies(definition); - request = PreRequest(request, selectedProxy); + request = PreRequest(request, selectedProxies); - return PostResponse(Execute(request), selectedProxy); + return PostResponse(Execute(request), selectedProxies); } - private IIndexerProxy GetProxy(ProviderDefinition definition) + private IList GetProxies(ProviderDefinition definition) { // Skip DB call if no tags on the indexers if (definition is { Id: > 0 } && definition.Tags.Count == 0) { - return null; + return Array.Empty(); } var proxies = _indexerProxyFactory.GetAvailableProviders(); - var selectedProxy = proxies.FirstOrDefault(proxy => definition.Tags.Intersect(proxy.Definition.Tags).Any()); - if (selectedProxy == null && definition is not { Id: not 0 }) + var selectedProxies = proxies + .Where(proxy => definition.Tags.Intersect(proxy.Definition.Tags).Any()) + .GroupBy(p => p is FlareSolverr) + .Select(g => g.First()) + .OrderBy(p => p is FlareSolverr) + .ToList(); + + if (!selectedProxies.Any() && definition is not { Id: not 0 }) { - selectedProxy = proxies.FirstOrDefault(p => p is FlareSolverr); + selectedProxies = new List(); + selectedProxies.AddIfNotNull(proxies.Find(p => p is FlareSolverr)); } - return selectedProxy; + return selectedProxies; } - private HttpRequest PreRequest(HttpRequest request, IIndexerProxy selectedProxy) + private HttpRequest PreRequest(HttpRequest request, IList selectedProxies) { - if (selectedProxy != null) + if (selectedProxies != null && selectedProxies.Any()) { - request = selectedProxy.PreRequest(request); + request = selectedProxies.Aggregate(request, (current, selectedProxy) => selectedProxy.PreRequest(current)); } return request; } - private HttpResponse PostResponse(HttpResponse response, IIndexerProxy selectedProxy) + private HttpResponse PostResponse(HttpResponse response, IList selectedProxies) { - if (selectedProxy != null) + if (selectedProxies != null && selectedProxies.Any()) { - response = selectedProxy.PostResponse(response); + response = selectedProxies.Aggregate(response, (current, selectedProxy) => selectedProxy.PostResponse(current)); } return response; From 858f16195e3f9d0613543f35501ad7740493bcb7 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 13 Feb 2024 23:41:32 +0000 Subject: [PATCH 458/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: David13467 Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: Steve Hansen Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 3 +- src/NzbDrone.Core/Localization/Core/nl.json | 2 +- .../Localization/Core/pt_BR.json | 56 ++++++++++++++++++- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 246ef9287..4f3e282e1 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -611,5 +611,6 @@ "TotalIndexerSuccessfulGrabs": "Capturas con Éxito Totales por Indexador", "NotificationsEmailSettingsUseEncryptionHelpText": "Si prefiere utilizar el cifrado si está configurado en el servidor, utilizar siempre el cifrado mediante SSL (sólo puerto 465) o StartTLS (cualquier otro puerto) o no utilizar nunca el cifrado", "IndexerHDBitsSettingsPasskeyHelpText": "Clave de acceso desde los Detalles de Usuario", - "IndexerSettingsPasskey": "Clave de Acceso" + "IndexerSettingsPasskey": "Clave de Acceso", + "BlackholeFolderHelpText": "La carpeta en donde {appName} se almacenaran los {extension} file" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index c9fcc8463..5e827be89 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -51,7 +51,7 @@ "BackupRetentionHelpText": "Automatische veiligheidskopieën ouder dan de retentie periode zullen worden opgeruimd", "Backups": "Veiligheidskopieën", "BeforeUpdate": "Voor Update", - "BindAddress": "Aanhaak Adres", + "BindAddress": "Gebonden Adres", "BindAddressHelpText": "Geldig IP-adres, localhost of '*' voor alle interfaces", "Branch": "Branch", "BranchUpdate": "Te gebruiken branch om {appName} bij te werken", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index d85b6317f..c34068e4d 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -681,5 +681,59 @@ "IndexerSettingsBaseUrlHelpText": "Selecione qual URL base {appName} usará para solicitações ao site", "IndexerSettingsPackSeedTimeIndexerHelpText": "O tempo que um pack de torrent (temporada ou discografia) deve ser semeado antes de parar, vazio é o padrão do aplicativo", "IndexerSettingsQueryLimitHelpText": "O número máximo de consultas especificadas pela respectiva unidade que {appName} permitirá ao site", - "IndexerSettingsSeedRatioHelpText": "A proporção que um torrent deve atingir antes de parar, vazio usa o padrão do cliente de download. A proporção deve ser de pelo menos 1,0 e seguir as regras dos indexadores" + "IndexerSettingsSeedRatioHelpText": "A proporção que um torrent deve atingir antes de parar, vazio usa o padrão do cliente de download. A proporção deve ser de pelo menos 1,0 e seguir as regras dos indexadores", + "DefaultCategory": "Categoria Padrão", + "Destination": "Destinação", + "Directory": "Diretório", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL json do deluge, consulte {url}", + "DownloadClientFloodSettingsAdditionalTags": "Etiquetas Adicionais", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "Adiciona propriedades de mídia como etiquetas. As dicas são exemplos.", + "DownloadClientFloodSettingsUrlBaseHelpText": "Adiciona um prefixo à API Flood, como {url}", + "DownloadClientFreeboxSettingsApiUrl": "URL da API", + "DownloadClientFreeboxSettingsApiUrlHelpText": "Defina o URL base da API Freebox com a versão da API, por exemplo, '{url}', o padrão é '{defaultApiUrl}'", + "DownloadClientFreeboxSettingsAppId": "ID do App", + "DownloadClientFreeboxSettingsAppIdHelpText": "ID do aplicativo fornecido ao criar acesso à API Freebox (ou seja, 'app_id')", + "DownloadClientFreeboxSettingsAppToken": "Token do App", + "DownloadClientFreeboxSettingsPortHelpText": "Porta usada para acessar a interface do Freebox, o padrão é '{port}'", + "DownloadClientNzbgetSettingsAddPausedHelpText": "Esta opção requer pelo menos NzbGet versão 16.0", + "DownloadClientPneumaticSettingsStrmFolder": "Pasta Strm", + "DownloadClientPneumaticSettingsStrmFolderHelpText": "Os arquivos .strm nesta pasta serão importados pelo drone", + "DownloadClientQbittorrentSettingsFirstAndLastFirst": "Primeiro e Último Primeiro", + "DownloadClientQbittorrentSettingsSequentialOrder": "Ordem Sequencial", + "DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Baixe em ordem sequencial (qBittorrent 4.1.0+)", + "DownloadClientQbittorrentSettingsUseSslHelpText": "Use uma conexão segura. Consulte Opções - UI da Web - 'Usar HTTPS em vez de HTTP' em qBittorrent.", + "DownloadClientRTorrentSettingsAddStopped": "Adicionar Parado", + "DownloadClientRTorrentSettingsAddStoppedHelpText": "Habilitando, irá adicionar torrents e magnets ao rTorrent em um estado parado. Isso pode quebrar os arquivos magnéticos.", + "DownloadClientRTorrentSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do rTorrent", + "DownloadClientRTorrentSettingsUrlPath": "Caminho da URL", + "DownloadClientSettingsAddPaused": "Adicionar Pausado", + "DownloadClientSettingsInitialState": "Estado Inicial", + "DownloadClientSettingsInitialStateHelpText": "Estado inicial dos torrents adicionados a {clientName}", + "DownloadClientSettingsPriorityItemHelpText": "Prioridade de uso ao pegar itens", + "DownloadClientSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL {clientName}, como {url}", + "DownloadClientSettingsUseSslHelpText": "Use conexão segura ao conectar-se a {clientName}", + "DownloadClientTransmissionSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL rpc {clientName}, por exemplo, {url}, o padrão é '{defaultUrl}'", + "TorrentBlackholeSaveMagnetFilesExtension": "Salvar Arquivos Magnet com Extensão", + "TorrentBlackholeTorrentFolder": "Pasta do Torrent", + "UsenetBlackholeNzbFolder": "Pasta Nzb", + "XmlRpcPath": "Caminho RPC XML", + "BlackholeFolderHelpText": "Pasta na qual {appName} armazenará o arquivo {extension}", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "Pasta compartilhada opcional para colocar downloads, deixe em branco para usar o local padrão do Download Station", + "DownloadClientFloodSettingsTagsHelpText": "Etiquetas iniciais de um download. Para ser reconhecido, um download deve ter todas as etiquetas iniciais. Isso evita conflitos com downloads não relacionados.", + "DownloadClientFreeboxSettingsAppTokenHelpText": "Token do aplicativo recuperado ao criar acesso à API Freebox (ou seja, 'app_token')", + "DownloadClientFreeboxSettingsHostHelpText": "Nome do host ou endereço IP do host do Freebox, o padrão é '{url}' (só funcionará se estiver na mesma rede)", + "DownloadClientPneumaticSettingsNzbFolder": "Pasta Nzb", + "DownloadClientPneumaticSettingsNzbFolderHelpText": "Esta pasta precisará estar acessível no XBMC", + "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Baixe a primeira e a última peças primeiro (qBittorrent 4.1.0+)", + "DownloadClientQbittorrentSettingsInitialStateHelpText": "Estado inicial para torrents adicionados ao qBittorrent. Observe que os Torrents Forçados não obedecem às restrições de semeação", + "DownloadClientRTorrentSettingsUrlPathHelpText": "Caminho para o endpoint XMLRPC, consulte {url}. Geralmente é RPC2 ou [caminho para ruTorrent]{url2} ao usar o ruTorrent.", + "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Categoria de reserva padrão se não existir nenhuma categoria mapeada para um lançamento. Adicionar uma categoria específica para {appName} evita conflitos com downloads não relacionados que não sejam de {appName}. Usar uma categoria é opcional, mas altamente recomendado. Cria um subdiretório [categoria] no diretório de saída.", + "DownloadClientSettingsDefaultCategoryHelpText": "Categoria de reserva padrão se não existir nenhuma categoria mapeada para um lançamento. Adicionar uma categoria específica para {appName} evita conflitos com downloads não relacionados que não sejam de {appName}. Usar uma categoria é opcional, mas altamente recomendado.", + "DownloadClientSettingsDestinationHelpText": "Especifica manualmente o destino do download, deixe em branco para usar o padrão", + "DownloadClientTransmissionSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local de transmissão padrão", + "SecretToken": "Token Secreto", + "TorrentBlackholeSaveMagnetFiles": "Salvar Arquivos Magnets", + "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extensão a ser usada para links magnet, o padrão é '.magnet'", + "TorrentBlackholeSaveMagnetFilesHelpText": "Salve o link magnet se nenhum arquivo .torrent estiver disponível (útil apenas se o cliente de download suportar magnets salvos em um arquivo)", + "UseSsl": "Usar SSL" } From 5d35f1dcc7263b10b60a63c835f6683b9da00bee Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 16 Feb 2024 17:13:20 +0200 Subject: [PATCH 459/964] Fixed: (AvistaZ) Avoid parsing invalid JSON on auth Closes #2030 --- .../Indexers/Definitions/Avistaz/AvistazBase.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs index d4b5d617b..b14bac702 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs @@ -70,7 +70,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz { _logger.Warn(ex, "Failed to authenticate with Avistaz"); - var jsonResponse = STJson.Deserialize(ex.Response.Content); + STJson.TryDeserialize(ex.Response.Content, out var jsonResponse); throw new IndexerAuthException(jsonResponse?.Message ?? "Unauthorized request to indexer"); } } @@ -98,8 +98,8 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz { _logger.Warn(ex, "Unauthorized request to indexer"); - var jsonResponse = new HttpResponse(ex.Response); - return new ValidationFailure(string.Empty, jsonResponse.Resource?.Message ?? "Unauthorized request to indexer"); + STJson.TryDeserialize(ex.Response.Content, out var jsonResponse); + return new ValidationFailure(string.Empty, jsonResponse?.Message ?? "Unauthorized request to indexer"); } _logger.Warn(ex, "Unable to connect to indexer"); @@ -134,7 +134,10 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz var response = await ExecuteAuth(authLoginRequest); - var authResponse = STJson.Deserialize(response.Content); + if (!STJson.TryDeserialize(response.Content, out var authResponse)) + { + throw new Exception("Invalid response from AvistaZ, the response is not valid JSON"); + } return authResponse.Token; } From 9676447c74e7cf13f41a8982e61845990b8a81d3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 18 Feb 2024 23:09:35 +0200 Subject: [PATCH 460/964] Bump version to 1.14.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b00695cc8..ed03905f8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.14.0' + majorVersion: '1.14.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 15c6b3c308a2139eac56adc05674073ce7432a29 Mon Sep 17 00:00:00 2001 From: Ryan S <1808452+swensorm@users.noreply.github.com> Date: Sun, 18 Feb 2024 15:11:05 -0600 Subject: [PATCH 461/964] Fixed: (Shazbat) Added season and episode to search capabilities --- src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs b/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs index 61a5f0182..000475db1 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs @@ -101,7 +101,7 @@ public class Shazbat : TorrentIndexerBase { TvSearchParams = new List { - TvSearchParam.Q + TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep }, Flags = new List { From 8c653b5c09f7cff707554238aea0d8e749cbd4a9 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 19 Feb 2024 01:56:51 +0200 Subject: [PATCH 462/964] Fixed: (GGn) Don't die on invalid FreeTorrent values in the API --- src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs index e012472bb..d85733965 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs @@ -412,6 +412,8 @@ namespace NzbDrone.Core.Indexers.Definitions categories = _categories.MapTrackerCatToNewznab(torrent.Value.CategoryId.ToString()).ToArray(); } + Enum.TryParse(torrent.Value.FreeTorrent, true, out GazelleGamesFreeTorrent freeTorrent); + var release = new TorrentInfo { Guid = infoUrl, @@ -426,8 +428,8 @@ namespace NzbDrone.Core.Indexers.Definitions Peers = torrent.Value.Leechers + torrent.Value.Seeders, PublishDate = torrent.Value.Time.ToUniversalTime(), Scene = torrent.Value.Scene == 1, - DownloadVolumeFactor = torrent.Value.FreeTorrent is GazelleGamesFreeTorrent.FreeLeech or GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1, - UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1, + DownloadVolumeFactor = freeTorrent is GazelleGamesFreeTorrent.FreeLeech or GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1, + UploadVolumeFactor = freeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1, MinimumSeedTime = 288000 // Minimum of 3 days and 8 hours (80 hours in total) }; @@ -588,7 +590,7 @@ namespace NzbDrone.Core.Indexers.Definitions public int? Snatched { get; set; } public int Seeders { get; set; } public int Leechers { get; set; } - public GazelleGamesFreeTorrent FreeTorrent { get; set; } + public string FreeTorrent { get; set; } public bool PersonalFL { get; set; } public bool LowSeedFL { get; set; } From 7287abc77c4cf40d6153c356f9f0f3e2e882ec8a Mon Sep 17 00:00:00 2001 From: Benjamin Harder Date: Mon, 19 Feb 2024 22:29:38 +0100 Subject: [PATCH 463/964] New: Sync Reject Blocklisted Torrent Hashes While Grabbing for torrent indexers to Apps --- .../Indexer/Edit/EditIndexerModalContent.js | 1 + .../Select/Edit/EditIndexerModalContent.tsx | 32 +++++++++++++++++++ .../Applications/Lidarr/Lidarr.cs | 9 ++++-- .../Applications/Lidarr/LidarrIndexer.cs | 6 +++- .../Applications/Radarr/Radarr.cs | 7 +++- .../Applications/Radarr/RadarrIndexer.cs | 6 +++- .../Applications/Readarr/Readarr.cs | 9 ++++-- .../Applications/Readarr/ReadarrIndexer.cs | 6 +++- .../Applications/Sonarr/Sonarr.cs | 7 +++- .../Applications/Sonarr/SonarrIndexer.cs | 6 +++- .../Applications/Whisparr/Whisparr.cs | 5 +++ .../Applications/Whisparr/WhisparrIndexer.cs | 6 +++- .../Indexers/IndexerTorrentBaseSettings.cs | 3 ++ src/NzbDrone.Core/Localization/Core/en.json | 2 ++ .../Indexers/IndexerBulkResource.cs | 2 ++ 15 files changed, 96 insertions(+), 11 deletions(-) diff --git a/frontend/src/Indexer/Edit/EditIndexerModalContent.js b/frontend/src/Indexer/Edit/EditIndexerModalContent.js index 709c3ff74..7dabc50d9 100644 --- a/frontend/src/Indexer/Edit/EditIndexerModalContent.js +++ b/frontend/src/Indexer/Edit/EditIndexerModalContent.js @@ -144,6 +144,7 @@ function EditIndexerModalContent(props) { }) : null } + ( null ); + const [ + rejectBlocklistedTorrentHashesWhileGrabbing, + setRejectBlocklistedTorrentHashesWhileGrabbing, + ] = useState(NO_CHANGE); const save = useCallback(() => { let hasChanges = false; @@ -105,6 +110,12 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { payload.packSeedTime = packSeedTime as number; } + if (rejectBlocklistedTorrentHashesWhileGrabbing !== NO_CHANGE) { + hasChanges = true; + payload.rejectBlocklistedTorrentHashesWhileGrabbing = + rejectBlocklistedTorrentHashesWhileGrabbing === 'true'; + } + if (hasChanges) { onSavePress(payload); } @@ -118,6 +129,7 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { seedRatio, seedTime, packSeedTime, + rejectBlocklistedTorrentHashesWhileGrabbing, onSavePress, onModalClose, ]); @@ -146,6 +158,9 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { case 'packSeedTime': setPackSeedTime(value); break; + case 'rejectBlocklistedTorrentHashesWhileGrabbing': + setRejectBlocklistedTorrentHashesWhileGrabbing(value); + break; default: console.warn(`EditIndexersModalContent Unknown Input: '${name}'`); } @@ -253,6 +268,23 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { onChange={onInputChange} /> + + + + {translate('IndexerSettingsRejectBlocklistedTorrentHashes')} + + + + diff --git a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs index 8a0615156..974813d96 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs @@ -218,7 +218,7 @@ namespace NzbDrone.Core.Applications.Lidarr { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _lidarrV1Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); - var syncFields = new List { "baseUrl", "apiPath", "apiKey", "categories", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime", "seedCriteria.discographySeedTime" }; + var syncFields = new List { "baseUrl", "apiPath", "apiKey", "categories", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime", "seedCriteria.discographySeedTime", "rejectBlocklistedTorrentHashesWhileGrabbing" }; if (id == 0) { @@ -258,10 +258,15 @@ namespace NzbDrone.Core.Applications.Lidarr lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedRatio; lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; - if (lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.discographySeedTime") != null) + if (lidarrIndexer.Fields.Any(x => x.Name == "seedCriteria.discographySeedTime")) { lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.discographySeedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.PackSeedTime ?? ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; } + + if (lidarrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) + { + lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + } } return lidarrIndexer; diff --git a/src/NzbDrone.Core/Applications/Lidarr/LidarrIndexer.cs b/src/NzbDrone.Core/Applications/Lidarr/LidarrIndexer.cs index 45221126e..98c6125ff 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/LidarrIndexer.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/LidarrIndexer.cs @@ -55,6 +55,10 @@ namespace NzbDrone.Core.Applications.Lidarr var otherSeedRatio = other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio")?.Value == null ? null : (double?)Convert.ToDouble(other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value); var seedRatioCompare = seedRatio == otherSeedRatio; + var rejectBlocklistedTorrentHashesWhileGrabbing = Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var otherRejectBlocklistedTorrentHashesWhileGrabbing = other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var rejectBlocklistedTorrentHashesWhileGrabbingCompare = rejectBlocklistedTorrentHashesWhileGrabbing == otherRejectBlocklistedTorrentHashesWhileGrabbing; + return other.EnableRss == EnableRss && other.EnableAutomaticSearch == EnableAutomaticSearch && other.EnableInteractiveSearch == EnableInteractiveSearch && @@ -62,7 +66,7 @@ namespace NzbDrone.Core.Applications.Lidarr other.Implementation == Implementation && other.Priority == Priority && other.Id == Id && - apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && discographySeedTimeCompare; + apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && discographySeedTimeCompare && rejectBlocklistedTorrentHashesWhileGrabbingCompare; } } } diff --git a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs index cdb1ba5ac..5fc796d48 100644 --- a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs +++ b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs @@ -216,7 +216,7 @@ namespace NzbDrone.Core.Applications.Radarr { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _radarrV3Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); - var syncFields = new List { "baseUrl", "apiPath", "apiKey", "categories", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime" }; + var syncFields = new List { "baseUrl", "apiPath", "apiKey", "categories", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime", "rejectBlocklistedTorrentHashesWhileGrabbing" }; if (id == 0) { @@ -255,6 +255,11 @@ namespace NzbDrone.Core.Applications.Radarr radarrIndexer.Fields.FirstOrDefault(x => x.Name == "minimumSeeders").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.AppMinimumSeeders ?? indexer.AppProfile.Value.MinimumSeeders; radarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedRatio; radarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; + + if (radarrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) + { + radarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + } } return radarrIndexer; diff --git a/src/NzbDrone.Core/Applications/Radarr/RadarrIndexer.cs b/src/NzbDrone.Core/Applications/Radarr/RadarrIndexer.cs index d68dda0ad..3ae820f3a 100644 --- a/src/NzbDrone.Core/Applications/Radarr/RadarrIndexer.cs +++ b/src/NzbDrone.Core/Applications/Radarr/RadarrIndexer.cs @@ -51,6 +51,10 @@ namespace NzbDrone.Core.Applications.Radarr var otherSeedRatio = other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio")?.Value == null ? null : (double?)Convert.ToDouble(other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value); var seedRatioCompare = seedRatio == otherSeedRatio; + var rejectBlocklistedTorrentHashesWhileGrabbing = Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var otherRejectBlocklistedTorrentHashesWhileGrabbing = other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var rejectBlocklistedTorrentHashesWhileGrabbingCompare = rejectBlocklistedTorrentHashesWhileGrabbing == otherRejectBlocklistedTorrentHashesWhileGrabbing; + return other.EnableRss == EnableRss && other.EnableAutomaticSearch == EnableAutomaticSearch && other.EnableInteractiveSearch == EnableInteractiveSearch && @@ -58,7 +62,7 @@ namespace NzbDrone.Core.Applications.Radarr other.Implementation == Implementation && other.Priority == Priority && other.Id == Id && - apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare; + apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && rejectBlocklistedTorrentHashesWhileGrabbingCompare; } } } diff --git a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs index e61a86c6f..228a20a10 100644 --- a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs +++ b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs @@ -218,7 +218,7 @@ namespace NzbDrone.Core.Applications.Readarr { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _readarrV1Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); - var syncFields = new[] { "baseUrl", "apiPath", "apiKey", "categories", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime", "seedCriteria.discographySeedTime" }; + var syncFields = new[] { "baseUrl", "apiPath", "apiKey", "categories", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime", "seedCriteria.discographySeedTime", "rejectBlocklistedTorrentHashesWhileGrabbing" }; var newznab = schemas.First(i => i.Implementation == "Newznab"); var torznab = schemas.First(i => i.Implementation == "Torznab"); @@ -252,10 +252,15 @@ namespace NzbDrone.Core.Applications.Readarr readarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedRatio; readarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; - if (readarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.discographySeedTime") != null) + if (readarrIndexer.Fields.Any(x => x.Name == "seedCriteria.discographySeedTime")) { readarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.discographySeedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.PackSeedTime ?? ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; } + + if (readarrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) + { + readarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + } } return readarrIndexer; diff --git a/src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs b/src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs index a6c8ab7aa..b26b50ae0 100644 --- a/src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs +++ b/src/NzbDrone.Core/Applications/Readarr/ReadarrIndexer.cs @@ -55,6 +55,10 @@ namespace NzbDrone.Core.Applications.Readarr var otherSeedRatio = other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio")?.Value == null ? null : (double?)Convert.ToDouble(other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value); var seedRatioCompare = seedRatio == otherSeedRatio; + var rejectBlocklistedTorrentHashesWhileGrabbing = Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var otherRejectBlocklistedTorrentHashesWhileGrabbing = other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var rejectBlocklistedTorrentHashesWhileGrabbingCompare = rejectBlocklistedTorrentHashesWhileGrabbing == otherRejectBlocklistedTorrentHashesWhileGrabbing; + return other.EnableRss == EnableRss && other.EnableAutomaticSearch == EnableAutomaticSearch && other.EnableInteractiveSearch == EnableInteractiveSearch && @@ -62,7 +66,7 @@ namespace NzbDrone.Core.Applications.Readarr other.Implementation == Implementation && other.Priority == Priority && other.Id == Id && - apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && discographySeedTimeCompare; + apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && discographySeedTimeCompare && rejectBlocklistedTorrentHashesWhileGrabbingCompare; } } } diff --git a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs index ec3db29ca..3888f48fe 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs @@ -224,7 +224,7 @@ namespace NzbDrone.Core.Applications.Sonarr { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _sonarrV3Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); - var syncFields = new List { "baseUrl", "apiPath", "apiKey", "categories", "animeCategories", "animeStandardFormatSearch", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime", "seedCriteria.seasonPackSeedTime" }; + var syncFields = new List { "baseUrl", "apiPath", "apiKey", "categories", "animeCategories", "animeStandardFormatSearch", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime", "seedCriteria.seasonPackSeedTime", "rejectBlocklistedTorrentHashesWhileGrabbing" }; if (id == 0) { @@ -270,6 +270,11 @@ namespace NzbDrone.Core.Applications.Sonarr sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedRatio; sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seasonPackSeedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.PackSeedTime ?? ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; + + if (sonarrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) + { + sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + } } return sonarrIndexer; diff --git a/src/NzbDrone.Core/Applications/Sonarr/SonarrIndexer.cs b/src/NzbDrone.Core/Applications/Sonarr/SonarrIndexer.cs index 8b0b6a561..698c7ed6f 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/SonarrIndexer.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/SonarrIndexer.cs @@ -61,6 +61,10 @@ namespace NzbDrone.Core.Applications.Sonarr var otherSeedRatio = other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio")?.Value == null ? null : (double?)Convert.ToDouble(other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value); var seedRatioCompare = seedRatio == otherSeedRatio; + var rejectBlocklistedTorrentHashesWhileGrabbing = Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var otherRejectBlocklistedTorrentHashesWhileGrabbing = other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var rejectBlocklistedTorrentHashesWhileGrabbingCompare = rejectBlocklistedTorrentHashesWhileGrabbing == otherRejectBlocklistedTorrentHashesWhileGrabbing; + return other.EnableRss == EnableRss && other.EnableAutomaticSearch == EnableAutomaticSearch && other.EnableInteractiveSearch == EnableInteractiveSearch && @@ -68,7 +72,7 @@ namespace NzbDrone.Core.Applications.Sonarr other.Implementation == Implementation && other.Priority == Priority && other.Id == Id && - apiKeyCompare && apiPathCompare && baseUrl && cats && animeCats && animeStandardFormatSearchCompare && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && seasonSeedTimeCompare; + apiKeyCompare && apiPathCompare && baseUrl && cats && animeCats && animeStandardFormatSearchCompare && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && seasonSeedTimeCompare && rejectBlocklistedTorrentHashesWhileGrabbingCompare; } } } diff --git a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs index 070cd5332..1c062443b 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs @@ -251,6 +251,11 @@ namespace NzbDrone.Core.Applications.Whisparr whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "minimumSeeders").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.AppMinimumSeeders ?? indexer.AppProfile.Value.MinimumSeeders; whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedRatio; whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; + + if (whisparrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) + { + whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + } } return whisparrIndexer; diff --git a/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs b/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs index 2edb460da..828fe0469 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs @@ -51,6 +51,10 @@ namespace NzbDrone.Core.Applications.Whisparr var otherSeedRatio = other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio")?.Value == null ? null : (double?)Convert.ToDouble(other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value); var seedRatioCompare = seedRatio == otherSeedRatio; + var rejectBlocklistedTorrentHashesWhileGrabbing = Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var otherRejectBlocklistedTorrentHashesWhileGrabbing = other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")?.Value == null ? null : (bool?)Convert.ToBoolean(other.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value); + var rejectBlocklistedTorrentHashesWhileGrabbingCompare = rejectBlocklistedTorrentHashesWhileGrabbing == otherRejectBlocklistedTorrentHashesWhileGrabbing; + return other.EnableRss == EnableRss && other.EnableAutomaticSearch == EnableAutomaticSearch && other.EnableInteractiveSearch == EnableInteractiveSearch && @@ -58,7 +62,7 @@ namespace NzbDrone.Core.Applications.Whisparr other.Implementation == Implementation && other.Priority == Priority && other.Id == Id && - apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare; + apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && rejectBlocklistedTorrentHashesWhileGrabbingCompare; } } } diff --git a/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs b/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs index fd5d4c813..da168f576 100644 --- a/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs +++ b/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs @@ -63,5 +63,8 @@ namespace NzbDrone.Core.Indexers [FieldDefinition(4, Type = FieldType.Number, Label = "IndexerSettingsPackSeedTime", HelpText = "IndexerSettingsPackSeedTimeIndexerHelpText", Unit = "minutes", Advanced = true)] public int? PackSeedTime { get; set; } + + [FieldDefinition(5, Type = FieldType.Checkbox, Label = "IndexerSettingsRejectBlocklistedTorrentHashes", HelpText = "IndexerSettingsRejectBlocklistedTorrentHashesHelpText", Advanced = true)] + public bool RejectBlocklistedTorrentHashesWhileGrabbing { get; set; } } } diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 3bced14ba..10db3c8a6 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -394,6 +394,8 @@ "IndexerSettingsPasskey": "Pass Key", "IndexerSettingsQueryLimit": "Query Limit", "IndexerSettingsQueryLimitHelpText": "The number of max queries as specified by the respective unit that {appName} will allow to the site", + "IndexerSettingsRejectBlocklistedTorrentHashes": "Reject Blocklisted Torrent Hashes While Grabbing", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "If a torrent is blocked by hash it may not properly be rejected during RSS/Search for some indexers, enabling this will allow it to be rejected after the torrent is grabbed, but before it is sent to the client.", "IndexerSettingsRssKey": "RSS Key", "IndexerSettingsSeedRatio": "Seed Ratio", "IndexerSettingsSeedRatioHelpText": "The ratio a torrent should reach before stopping, empty uses the download client's default. Ratio should be at least 1.0 and follow the indexers rules", diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs b/src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs index 7f3d281f0..3cbb0c94a 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs @@ -12,6 +12,7 @@ namespace Prowlarr.Api.V1.Indexers public double? SeedRatio { get; set; } public int? SeedTime { get; set; } public int? PackSeedTime { get; set; } + public bool? RejectBlocklistedTorrentHashesWhileGrabbing { get; set; } } public class IndexerBulkResourceMapper : ProviderBulkResourceMapper @@ -35,6 +36,7 @@ namespace Prowlarr.Api.V1.Indexers ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.SeedRatio = resource.SeedRatio ?? ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.SeedRatio; ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.SeedTime = resource.SeedTime ?? ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.SeedTime; ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.PackSeedTime = resource.PackSeedTime ?? ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.PackSeedTime; + ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing = resource.RejectBlocklistedTorrentHashesWhileGrabbing ?? ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; } }); From ede9879c999850a8e8a059d20ef28f618c5cf943 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 21 Feb 2024 17:12:35 +0200 Subject: [PATCH 464/964] Cleanup obsolete definitions for ANT/ABB/BB/MTV/PTN/TVV --- .../Indexers/Definitions/Anthelion.cs | 280 ---------------- .../Indexers/Definitions/AudioBookBay.cs | 299 ----------------- src/NzbDrone.Core/Indexers/Definitions/BB.cs | 315 ------------------ .../Indexers/Definitions/MoreThanTV.cs | 310 ----------------- .../Indexers/Definitions/PirateTheNet.cs | 292 ---------------- .../Indexers/Definitions/TVVault.cs | 287 ---------------- 6 files changed, 1783 deletions(-) delete mode 100644 src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs delete mode 100644 src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs delete mode 100644 src/NzbDrone.Core/Indexers/Definitions/BB.cs delete mode 100644 src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs delete mode 100644 src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs delete mode 100644 src/NzbDrone.Core/Indexers/Definitions/TVVault.cs diff --git a/src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs b/src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs deleted file mode 100644 index 78465e54b..000000000 --- a/src/NzbDrone.Core/Indexers/Definitions/Anthelion.cs +++ /dev/null @@ -1,280 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using AngleSharp.Html.Parser; -using NLog; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.Indexers.Exceptions; -using NzbDrone.Core.Indexers.Settings; -using NzbDrone.Core.IndexerSearch.Definitions; -using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Parser; -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Definitions -{ - [Obsolete("Moved to YML for Cardigann")] - public class Anthelion : TorrentIndexerBase - { - public override string Name => "Anthelion"; - public override string[] IndexerUrls => new string[] { "https://anthelion.me/" }; - private string LoginUrl => Settings.BaseUrl + "login.php"; - public override string Description => "A movies tracker"; - public override string Language => "en-US"; - public override Encoding Encoding => Encoding.UTF8; - public override IndexerPrivacy Privacy => IndexerPrivacy.Private; - public override IndexerCapabilities Capabilities => SetCapabilities(); - - public Anthelion(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) - : base(httpClient, eventAggregator, indexerStatusService, configService, logger) - { - } - - public override IIndexerRequestGenerator GetRequestGenerator() - { - return new AnthelionRequestGenerator() { Settings = Settings, Capabilities = Capabilities }; - } - - public override IParseIndexerResponse GetParser() - { - return new AnthelionParser(Settings, Capabilities.Categories); - } - - protected override async Task DoLogin() - { - var requestBuilder = new HttpRequestBuilder(LoginUrl) - { - LogResponseContent = true, - AllowAutoRedirect = true, - Method = HttpMethod.Post - }; - - var cookies = Cookies; - Cookies = null; - - var authLoginRequest = requestBuilder - .AddFormParameter("username", Settings.Username) - .AddFormParameter("password", Settings.Password) - .AddFormParameter("keeplogged", "1") - .AddFormParameter("login", "Log+In!") - .SetHeader("Content-Type", "application/x-www-form-urlencoded") - .SetHeader("Referer", LoginUrl) - .Build(); - - var response = await ExecuteAuth(authLoginRequest); - - if (CheckIfLoginNeeded(response)) - { - var parser = new HtmlParser(); - using var dom = parser.ParseDocument(response.Content); - var errorMessage = dom.QuerySelector("form#loginform")?.TextContent.Trim(); - - throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); - } - - cookies = response.GetCookies(); - UpdateCookies(cookies, DateTime.Now.AddDays(30)); - - _logger.Debug("Anthelion authentication succeeded."); - } - - protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) - { - return !httpResponse.Content.Contains("logout.php"); - } - - private IndexerCapabilities SetCapabilities() - { - var caps = new IndexerCapabilities - { - TvSearchParams = new List - { - TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep - }, - MovieSearchParams = new List - { - MovieSearchParam.Q - } - }; - - caps.Categories.AddCategoryMapping("1", NewznabStandardCategory.Movies, "Film/Feature"); - caps.Categories.AddCategoryMapping("2", NewznabStandardCategory.Movies, "Film/Short"); - caps.Categories.AddCategoryMapping("3", NewznabStandardCategory.TV, "TV/Miniseries"); - caps.Categories.AddCategoryMapping("4", NewznabStandardCategory.Other, "Other"); - - return caps; - } - } - - public class AnthelionRequestGenerator : IIndexerRequestGenerator - { - public UserPassTorrentBaseSettings Settings { get; set; } - public IndexerCapabilities Capabilities { get; set; } - - private IEnumerable GetPagedRequests(string term, int[] categories, string imdbId = null) - { - var searchUrl = string.Format("{0}/torrents.php", Settings.BaseUrl.TrimEnd('/')); - - // TODO: IMDB search is available but it requires to parse the details page - var qc = new NameValueCollection - { - { "order_by", "time" }, - { "order_way", "desc" }, - { "action", "basic" }, - { "searchsubmit", "1" }, - { "searchstr", imdbId.IsNotNullOrWhiteSpace() ? imdbId : term.Replace(".", " ") } - }; - - var catList = Capabilities.Categories.MapTorznabCapsToTrackers(categories); - - foreach (var cat in catList) - { - qc.Add($"filter_cat[{cat}]", "1"); - } - - searchUrl = searchUrl + "?" + qc.GetQueryString(); - - var request = new IndexerRequest(searchUrl, HttpAccept.Html); - - yield return request; - } - - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); - - return pageableRequests; - } - - public Func> GetCookies { get; set; } - public Action, DateTime?> CookiesUpdater { get; set; } - } - - public class AnthelionParser : IParseIndexerResponse - { - private readonly UserPassTorrentBaseSettings _settings; - private readonly IndexerCapabilitiesCategories _categories; - - public AnthelionParser(UserPassTorrentBaseSettings settings, IndexerCapabilitiesCategories categories) - { - _settings = settings; - _categories = categories; - } - - public IList ParseResponse(IndexerResponse indexerResponse) - { - var torrentInfos = new List(); - - var parser = new HtmlParser(); - using var doc = parser.ParseDocument(indexerResponse.Content); - var rows = doc.QuerySelectorAll("table.torrent_table > tbody > tr.torrent"); - foreach (var row in rows) - { - var qDetailsLink = row.QuerySelector("a.torrent_name"); - var year = qDetailsLink.NextSibling.TextContent.Replace("[", "").Replace("]", "").Trim(); - var tags = row.QuerySelector("div.torrent_info").FirstChild.TextContent.Replace(" / ", " ").Trim(); - var title = $"{qDetailsLink.TextContent} {year} {tags}"; - var description = row.QuerySelector("div.tags").TextContent.Trim(); - var details = _settings.BaseUrl + qDetailsLink.GetAttribute("href"); - var torrentId = qDetailsLink.GetAttribute("href").Split('=').Last(); - var link = _settings.BaseUrl + "torrents.php?action=download&id=" + torrentId; - var posterStr = qDetailsLink.GetAttribute("data-cover"); - var poster = !string.IsNullOrWhiteSpace(posterStr) ? posterStr : null; - - var files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(3)").TextContent); - var publishDate = DateTimeUtil.FromTimeAgo(row.QuerySelector("td:nth-child(4)").TextContent); - var size = ParseUtil.GetBytes(row.QuerySelector("td:nth-child(5)").FirstChild.TextContent); - var grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(6)").TextContent); - var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(7)").TextContent); - var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(8)").TextContent); - - var dlVolumeFactor = row.QuerySelector("strong.tl_free") != null ? 0 : 1; - - var cat = row.QuerySelector("td.cats_col > div").GetAttribute("class").Replace("tooltip cats_", ""); - var category = new List - { - cat switch - { - "featurefilm" => NewznabStandardCategory.Movies, - "shortfilm" => NewznabStandardCategory.Movies, - "miniseries" => NewznabStandardCategory.TV, - "other" => NewznabStandardCategory.Other, - _ => throw new Exception($"Unknown category: {cat}") - } - }; - - // TODO: TMDb is also available - var qImdb = row.QuerySelector("a[href^=\"https://www.imdb.com\"]"); - var imdb = qImdb != null ? ParseUtil.GetImdbId(qImdb.GetAttribute("href").Split('/').Last()) : null; - - var release = new TorrentInfo - { - MinimumRatio = 1, - MinimumSeedTime = 259200, - Description = description, - Title = title, - PublishDate = publishDate, - Categories = category, - DownloadUrl = link, - InfoUrl = details, - PosterUrl = poster, - Guid = link, - ImdbId = imdb.GetValueOrDefault(), - Seeders = seeders, - Peers = leechers + seeders, - Size = size, - Grabs = grabs, - Files = files, - DownloadVolumeFactor = dlVolumeFactor, - UploadVolumeFactor = 1 - }; - - torrentInfos.Add(release); - } - - return torrentInfos.ToArray(); - } - - public Action, DateTime?> CookiesUpdater { get; set; } - } -} diff --git a/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs b/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs deleted file mode 100644 index 8f08fe857..000000000 --- a/src/NzbDrone.Core/Indexers/Definitions/AudioBookBay.cs +++ /dev/null @@ -1,299 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using AngleSharp.Html.Dom; -using AngleSharp.Html.Parser; -using NLog; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.Indexers.Settings; -using NzbDrone.Core.IndexerSearch.Definitions; -using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Parser; -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Definitions; - -[Obsolete("User Agent blocked")] -public class AudioBookBay : TorrentIndexerBase -{ - public override string Name => "AudioBook Bay"; - public override string[] IndexerUrls => new[] - { - "https://audiobookbay.is/" - }; - public override string[] LegacyUrls => new[] - { - "https://audiobookbay.la/", - "http://audiobookbay.net/", - "https://audiobookbay.unblockit.tv/", - "http://audiobookbay.nl/", - "http://audiobookbay.ws/", - "https://audiobookbay.unblockit.how/", - "https://audiobookbay.unblockit.cam/", - "https://audiobookbay.unblockit.biz/", - "https://audiobookbay.unblockit.day/", - "https://audiobookbay.unblockit.llc/", - "https://audiobookbay.unblockit.blue/", - "https://audiobookbay.unblockit.name/", - "http://audiobookbay.fi/", - "http://audiobookbay.se/", - "http://audiobookbayabb.com/", - "https://audiobookbay.unblockit.ist/", - "https://audiobookbay.unblockit.bet/", - "https://audiobookbay.unblockit.cat/", - "https://audiobookbay.unblockit.nz/", - "https://audiobookbay.fi/", - "https://audiobookbay.unblockit.page/", - "https://audiobookbay.unblockit.pet/", - "https://audiobookbay.unblockit.ink/", - "https://audiobookbay.unblockit.bio/", // error 502 - "https://audiobookbay.li/", - "https://audiobookbay.se/" // redirects to .is but has invalid CA - }; - public override string Description => "AudioBook Bay (ABB) is a public Torrent Tracker for AUDIOBOOKS"; - public override string Language => "en-US"; - public override IndexerPrivacy Privacy => IndexerPrivacy.Public; - public override int PageSize => 15; - public override TimeSpan RateLimit => TimeSpan.FromSeconds(5); - public override IndexerCapabilities Capabilities => SetCapabilities(); - - public AudioBookBay(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) - : base(httpClient, eventAggregator, indexerStatusService, configService, logger) - { - } - - public override IIndexerRequestGenerator GetRequestGenerator() - { - return new AudioBookBayRequestGenerator(Settings); - } - - public override IParseIndexerResponse GetParser() - { - return new AudioBookBayParser(Settings, Capabilities.Categories); - } - - public override async Task Download(Uri link) - { - var request = new HttpRequestBuilder(link.ToString()) - .SetCookies(GetCookies() ?? new Dictionary()) - .Accept(HttpAccept.Html) - .Build(); - - var response = await _httpClient.ExecuteProxiedAsync(request, Definition); - - var parser = new HtmlParser(); - using var dom = parser.ParseDocument(response.Content); - - var hash = dom.QuerySelector("td:contains(\"Info Hash:\") ~ td")?.TextContent.Trim(); - if (hash == null) - { - throw new Exception($"Failed to fetch hash from {link}"); - } - - var title = dom.QuerySelector("div.postTitle h1")?.TextContent.Trim(); - if (title == null) - { - throw new Exception($"Failed to fetch title from {link}"); - } - - title = StringUtil.MakeValidFileName(title, '_', false); - - var magnet = MagnetLinkBuilder.BuildPublicMagnetLink(hash, title); - - return await base.Download(new Uri(magnet)); - } - - private IndexerCapabilities SetCapabilities() - { - var caps = new IndexerCapabilities - { - BookSearchParams = new List - { - BookSearchParam.Q - } - }; - - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.AudioAudiobook); - - return caps; - } -} - -public class AudioBookBayRequestGenerator : IIndexerRequestGenerator -{ - private readonly NoAuthTorrentBaseSettings _settings; - - public AudioBookBayRequestGenerator(NoAuthTorrentBaseSettings settings) - { - _settings = settings; - } - - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) - { - return new IndexerPageableRequestChain(); - } - - public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) - { - return new IndexerPageableRequestChain(); - } - - public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) - { - return new IndexerPageableRequestChain(); - } - - public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}")); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}")); - - return pageableRequests; - } - - private IEnumerable GetPagedRequests(string term) - { - var searchUrl = _settings.BaseUrl; - - var parameters = new NameValueCollection(); - - term = Regex.Replace(term, @"[\W]+", " ").Trim(); - - if (term.IsNotNullOrWhiteSpace()) - { - parameters.Set("s", term); - parameters.Set("tt", "1"); - } - - if (parameters.Count > 0) - { - searchUrl += $"?{parameters.GetQueryString()}"; - } - - yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/" }.Uri.AbsoluteUri, HttpAccept.Html); - } - - public Func> GetCookies { get; set; } - public Action, DateTime?> CookiesUpdater { get; set; } -} - -public class AudioBookBayParser : IParseIndexerResponse -{ - private readonly NoAuthTorrentBaseSettings _settings; - private readonly IndexerCapabilitiesCategories _categories; - - public AudioBookBayParser(NoAuthTorrentBaseSettings settings, IndexerCapabilitiesCategories categories) - { - _settings = settings; - _categories = categories; - } - - public IList ParseResponse(IndexerResponse indexerResponse) - { - var releaseInfos = new List(); - - using var doc = ParseHtmlDocument(indexerResponse.Content); - - var rows = doc.QuerySelectorAll("div.post:has(div[class=\"postTitle\"])"); - foreach (var row in rows) - { - var infoUrl = _settings.BaseUrl + row.QuerySelector("div.postTitle h2 a")?.GetAttribute("href")?.Trim().TrimStart('/'); - - var title = row.QuerySelector("div.postTitle")?.TextContent.Trim(); - - var infoString = row.QuerySelector("div.postContent")?.TextContent.Trim() ?? string.Empty; - - var matchFormat = Regex.Match(infoString, @"Format: (.+) \/", RegexOptions.IgnoreCase); - if (matchFormat.Groups[1].Success && matchFormat.Groups[1].Value.Length > 0 && matchFormat.Groups[1].Value != "?") - { - title += $" [{matchFormat.Groups[1].Value.Trim()}]"; - } - - var matchBitrate = Regex.Match(infoString, @"Bitrate: (.+)File", RegexOptions.IgnoreCase); - if (matchBitrate.Groups[1].Success && matchBitrate.Groups[1].Value.Length > 0 && matchBitrate.Groups[1].Value != "?") - { - title += $" [{matchBitrate.Groups[1].Value.Trim()}]"; - } - - var matchSize = Regex.Match(infoString, @"File Size: (.+?)s?$", RegexOptions.IgnoreCase); - var size = matchSize.Groups[1].Success ? ParseUtil.GetBytes(matchSize.Groups[1].Value) : 0; - - var matchDateAdded = Regex.Match(infoString, @"Posted: (\d{1,2} \D{3} \d{4})", RegexOptions.IgnoreCase); - var publishDate = matchDateAdded.Groups[1].Success && DateTime.TryParseExact(matchDateAdded.Groups[1].Value, "d MMM yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var parsedDate) ? parsedDate : DateTime.Now; - - var postInfo = row.QuerySelector("div.postInfo")?.FirstChild?.TextContent.Trim().Replace("\xA0", ";") ?? string.Empty; - var matchCategory = Regex.Match(postInfo, @"Category: (.+)$", RegexOptions.IgnoreCase); - var genres = matchCategory.Groups[1].Success ? matchCategory.Groups[1].Value.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() : new List(); - - var release = new TorrentInfo - { - Guid = infoUrl, - InfoUrl = infoUrl, - DownloadUrl = infoUrl, - Title = CleanTitle(title), - Categories = new List { NewznabStandardCategory.AudioAudiobook }, - Size = size, - Seeders = 1, - Peers = 1, - PublishDate = publishDate, - DownloadVolumeFactor = 0, - UploadVolumeFactor = 1, - Genres = genres - }; - - var cover = row.QuerySelector("img[src]")?.GetAttribute("src")?.Trim(); - if (!string.IsNullOrEmpty(cover)) - { - release.PosterUrl = cover.StartsWith("http") ? cover : _settings.BaseUrl + cover; - } - - releaseInfos.Add(release); - } - - return releaseInfos; - } - - private static IHtmlDocument ParseHtmlDocument(string response) - { - var parser = new HtmlParser(); - var doc = parser.ParseDocument(response); - - var hidden = doc.QuerySelectorAll("div.post.re-ab"); - foreach (var element in hidden) - { - var body = doc.CreateElement("div"); - body.ClassList.Add("post"); - body.InnerHtml = Encoding.UTF8.GetString(Convert.FromBase64String(element.TextContent)); - element.Parent.ReplaceChild(body, element); - } - - return doc; - } - - private static string CleanTitle(string title) - { - title = Regex.Replace(title, @"[\u0000-\u0008\u000A-\u001F\u0100-\uFFFF]", string.Empty, RegexOptions.Compiled); - title = Regex.Replace(title, @"\s+", " ", RegexOptions.Compiled | RegexOptions.IgnoreCase); - - return title.Trim(); - } - - public Action, DateTime?> CookiesUpdater { get; set; } -} diff --git a/src/NzbDrone.Core/Indexers/Definitions/BB.cs b/src/NzbDrone.Core/Indexers/Definitions/BB.cs deleted file mode 100644 index a2439873f..000000000 --- a/src/NzbDrone.Core/Indexers/Definitions/BB.cs +++ /dev/null @@ -1,315 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Net.Http; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using AngleSharp.Dom; -using AngleSharp.Html.Parser; -using NLog; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.Indexers.Exceptions; -using NzbDrone.Core.Indexers.Settings; -using NzbDrone.Core.IndexerSearch.Definitions; -using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Parser; -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Definitions -{ - [Obsolete("Site has shutdown")] - public class BB : TorrentIndexerBase - { - public override string Name => "BB"; - public override string[] IndexerUrls => new[] { Base64Extensions.FromBase64("aHR0cHM6Ly9iYWNvbmJpdHMub3JnLw==") }; - private string LoginUrl => Settings.BaseUrl + "login.php"; - public override string Description => "BB is a Private Torrent Tracker for 0DAY / GENERAL"; - public override string Language => "en-US"; - public override Encoding Encoding => Encoding.UTF8; - public override IndexerPrivacy Privacy => IndexerPrivacy.Private; - public override IndexerCapabilities Capabilities => SetCapabilities(); - - public BB(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) - : base(httpClient, eventAggregator, indexerStatusService, configService, logger) - { - } - - public override IIndexerRequestGenerator GetRequestGenerator() - { - return new BBRequestGenerator { Settings = Settings, Capabilities = Capabilities }; - } - - public override IParseIndexerResponse GetParser() - { - return new BBParser(Settings, Capabilities.Categories); - } - - protected override async Task DoLogin() - { - var requestBuilder = new HttpRequestBuilder(LoginUrl) - { - LogResponseContent = true, - AllowAutoRedirect = true, - Method = HttpMethod.Post - }; - - var cookies = Cookies; - Cookies = null; - - var authLoginRequest = requestBuilder - .AddFormParameter("username", Settings.Username) - .AddFormParameter("password", Settings.Password) - .AddFormParameter("keeplogged", "1") - .AddFormParameter("login", "Log+In!") - .SetHeader("Content-Type", "application/x-www-form-urlencoded") - .SetHeader("Referer", LoginUrl) - .Build(); - - var response = await ExecuteAuth(authLoginRequest); - - if (CheckIfLoginNeeded(response)) - { - var parser = new HtmlParser(); - using var dom = parser.ParseDocument(response.Content); - var messageEl = dom.QuerySelectorAll("#loginform"); - var messages = new List(); - for (var i = 0; i < 13; i++) - { - var child = messageEl[0].ChildNodes[i]; - messages.Add(child.Text().Trim()); - } - - var message = string.Join(" ", messages); - - throw new IndexerAuthException(message); - } - - cookies = response.GetCookies(); - UpdateCookies(cookies, DateTime.Now.AddDays(30)); - - _logger.Debug("BB authentication succeeded."); - } - - protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) - { - return !httpResponse.Content.Contains("logout.php"); - } - - private IndexerCapabilities SetCapabilities() - { - var caps = new IndexerCapabilities - { - TvSearchParams = new List - { - TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep - }, - MovieSearchParams = new List - { - MovieSearchParam.Q - }, - MusicSearchParams = new List - { - MusicSearchParam.Q - }, - BookSearchParams = new List - { - BookSearchParam.Q - } - }; - - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.Audio); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.AudioMP3); - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.AudioLossless); - caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.PC); - caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.BooksEBook); - caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.AudioAudiobook); - caps.Categories.AddCategoryMapping(5, NewznabStandardCategory.Other); - caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.BooksMags); - caps.Categories.AddCategoryMapping(7, NewznabStandardCategory.BooksComics); - caps.Categories.AddCategoryMapping(8, NewznabStandardCategory.TVAnime); - caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.Movies); - caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.TVHD); - caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.TVSD); - caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.TV); - caps.Categories.AddCategoryMapping(11, NewznabStandardCategory.PCGames); - caps.Categories.AddCategoryMapping(12, NewznabStandardCategory.Console); - caps.Categories.AddCategoryMapping(13, NewznabStandardCategory.Other); - caps.Categories.AddCategoryMapping(14, NewznabStandardCategory.Other); - - return caps; - } - } - - public class BBRequestGenerator : IIndexerRequestGenerator - { - public UserPassTorrentBaseSettings Settings { get; set; } - public IndexerCapabilities Capabilities { get; set; } - - private IEnumerable GetPagedRequests(string term, int[] categories) - { - var searchUrl = string.Format("{0}/torrents.php", Settings.BaseUrl.TrimEnd('/')); - - // TODO: IMDB search is available but it requires to parse the details page - var qc = new NameValueCollection - { - { "order_by", "s3" }, - { "order_way", "desc" }, - { "disablegrouping", "1" }, - { "searchtags", "" }, - { "tags_type", "0" }, - { "action", "basic" }, - { "searchstr", term.Replace(".", " ") } - }; - - var catList = Capabilities.Categories.MapTorznabCapsToTrackers(categories); - - foreach (var cat in catList) - { - qc.Add($"filter_cat[{cat}]", "1"); - } - - searchUrl = searchUrl + "?" + qc.GetQueryString(); - - var request = new IndexerRequest(searchUrl, HttpAccept.Html); - - yield return request; - } - - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); - - return pageableRequests; - } - - public Func> GetCookies { get; set; } - public Action, DateTime?> CookiesUpdater { get; set; } - } - - public class BBParser : IParseIndexerResponse - { - private readonly UserPassTorrentBaseSettings _settings; - private readonly IndexerCapabilitiesCategories _categories; - - public BBParser(UserPassTorrentBaseSettings settings, IndexerCapabilitiesCategories categories) - { - _settings = settings; - _categories = categories; - } - - public IList ParseResponse(IndexerResponse indexerResponse) - { - var torrentInfos = new List(); - - var parser = new HtmlParser(); - using var dom = parser.ParseDocument(indexerResponse.Content); - var rows = dom.QuerySelectorAll("#torrent_table > tbody > tr.torrent"); - - foreach (var row in rows) - { - var release = new TorrentInfo(); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - - var catStr = row.Children[0].FirstElementChild.GetAttribute("href").Split(new[] { '[', ']' })[1]; - release.Categories = _categories.MapTrackerCatToNewznab(catStr); - - var qDetails = row.Children[1].QuerySelector("a[title='View Torrent']"); - release.InfoUrl = _settings.BaseUrl + qDetails.GetAttribute("href"); - release.Guid = release.InfoUrl; - - var qDownload = row.Children[1].QuerySelector("a[title='Download']"); - release.DownloadUrl = _settings.BaseUrl + qDownload.GetAttribute("href"); - - var dateStr = row.Children[3].TextContent.Trim().Replace(" and", ""); - release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); - - var sizeStr = row.Children[4].TextContent; - release.Size = ParseUtil.GetBytes(sizeStr); - - release.Files = ParseUtil.CoerceInt(row.Children[2].TextContent.Trim()); - release.Seeders = ParseUtil.CoerceInt(row.Children[7].TextContent.Trim()); - release.Peers = ParseUtil.CoerceInt(row.Children[8].TextContent.Trim()) + release.Seeders; - - var grabs = row.QuerySelector("td:nth-child(6)").TextContent; - release.Grabs = ParseUtil.CoerceInt(grabs); - - if (row.QuerySelector("strong:contains(\"Freeleech!\")") != null) - { - release.DownloadVolumeFactor = 0; - } - else - { - release.DownloadVolumeFactor = 1; - } - - release.UploadVolumeFactor = 1; - - var title = row.QuerySelector("td:nth-child(2)"); - foreach (var element in title.QuerySelectorAll("span, strong, div, br")) - { - element.Remove(); - } - - release.Title = ParseUtil.NormalizeMultiSpaces(title.TextContent.Replace(" - ]", "]")); - - //change "Season #" to "S##" for TV shows - if (catStr == "10") - { - release.Title = Regex.Replace(release.Title, - @"Season (\d+)", - m => string.Format("S{0:00}", - int.Parse(m.Groups[1].Value))); - } - - torrentInfos.Add(release); - } - - return torrentInfos.ToArray(); - } - - public Action, DateTime?> CookiesUpdater { get; set; } - } -} diff --git a/src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs b/src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs deleted file mode 100644 index 9b4d10fd5..000000000 --- a/src/NzbDrone.Core/Indexers/Definitions/MoreThanTV.cs +++ /dev/null @@ -1,310 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Web; -using AngleSharp.Dom; -using AngleSharp.Html.Dom; -using AngleSharp.Html.Parser; -using NLog; -using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.Indexers.Settings; -using NzbDrone.Core.IndexerSearch.Definitions; -using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Parser; -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Definitions; - -[Obsolete("Converted to Torznab")] -public class MoreThanTV : TorrentIndexerBase -{ - public override string Name => "MoreThanTV"; - public override string[] IndexerUrls => new[] { "https://www.morethantv.me/" }; - public override string Description => "Private torrent tracker for TV / MOVIES"; - public override IndexerPrivacy Privacy => IndexerPrivacy.Private; - public override IndexerCapabilities Capabilities => SetCapabilities(); - public override bool FollowRedirect => true; - - public MoreThanTV(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) - : base(httpClient, eventAggregator, indexerStatusService, configService, logger) - { - } - - public override IIndexerRequestGenerator GetRequestGenerator() - => new MoreThanTVRequestGenerator(Settings, Capabilities); - - public override IParseIndexerResponse GetParser() - => new MoreThanTVParser - { - Settings = Settings - }; - - private IndexerCapabilities SetCapabilities() - { - var caps = new IndexerCapabilities - { - TvSearchParams = new List - { - TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep - }, - MovieSearchParams = new List - { - MovieSearchParam.Q - } - }; - - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.Movies, "Movies"); - caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TV, "TV"); - - return caps; - } - - protected override IDictionary GetCookies() - { - return CookieUtil.CookieHeaderToDictionary(Settings.Cookie); - } -} - -public class MoreThanTVRequestGenerator : IIndexerRequestGenerator -{ - private CookieTorrentBaseSettings Settings { get; } - private IndexerCapabilities Capabilities { get; } - - private NameValueCollection BrowserHeaders { get; } - - public MoreThanTVRequestGenerator(CookieTorrentBaseSettings settings, IndexerCapabilities capabilities) - { - Settings = settings; - Capabilities = capabilities; - BrowserHeaders = new NameValueCollection() - { - { "referer", settings.BaseUrl }, - { "Upgrade-Insecure-Requests", "1" }, - { "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36" } - }; - } - - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) - => PerformRequest(searchCriteria); - - public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) - => PerformRequest(searchCriteria); - - public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) - => PerformRequest(searchCriteria); - - public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) - => PerformRequest(searchCriteria); - - public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) - => PerformRequest(searchCriteria); - - public Func> GetCookies { get; set; } - public Action, DateTime?> CookiesUpdater { get; set; } - - private IndexerPageableRequestChain PerformRequest(SearchCriteriaBase query) - { - var chain = new IndexerPageableRequestChain(); - - var requests = new List { new (new HttpRequest(GetTorrentSearchUrl(query)) { Headers = new HttpHeader(BrowserHeaders), AllowAutoRedirect = true }) }; - - if (query is TvSearchCriteria tvSearchCriteria) - { - // Always search for torrent groups (complete seasons) too - var seasonRegex = new Regex(@".*\s[Ss]{1}\d{2}([Ee]{1}\d{2,3})?$", RegexOptions.Compiled); - var seasonMatch = seasonRegex.Match(query.SanitizedSearchTerm); - if (seasonMatch.Success) - { - var seasonReplaceRegex = new Regex(@"[Ss]{1}\d{2}([Ee]{1}\d{2,3})?", RegexOptions.Compiled); - var newSearchQuery = seasonReplaceRegex.Replace(query.SanitizedSearchTerm, $"Season {tvSearchCriteria.Season}"); - requests.Add(new IndexerRequest(new HttpRequest(GetTorrentSearchUrl(query, newSearchQuery)) { Headers = new HttpHeader(BrowserHeaders), AllowAutoRedirect = true })); - } - } - - chain.Add(requests); - - return chain; - } - - private string GetTorrentSearchUrl(SearchCriteriaBase query, string overrideSearchTerm = null) - { - var qc = new NameValueCollection - { - { "action", "advanced" }, - { "sizetype", "gb" }, - { "sizerange", "0.01" }, - { "title", overrideSearchTerm ?? GetSearchString(query.SanitizedSearchTerm) } - }; - - switch (query) - { - case MovieSearchCriteria: - qc.Add("filter_cat[1]", "1"); // HD Movies - qc.Add("filter_cat[2]", "1"); // SD Movies - break; - case TvSearchCriteria: - qc.Add("filter_cat[3]", "1"); // HD Episode - qc.Add("filter_cat[4]", "1"); // SD Episode - qc.Add("filter_cat[5]", "1"); // HD Season - qc.Add("filter_cat[6]", "1"); // SD Season - break; - } - - return $"{Settings.BaseUrl}torrents/browse?{qc.GetQueryString()}"; - } - - private string GetSearchString(string input) - { - input = input.Replace("Marvels", "Marvel"); // strip 's for better results - var regex = new Regex(@"(S\d{2})$", RegexOptions.Compiled); - return regex.Replace(input, "$1*"); // If we're just seaching for a season (no episode) append an * to include all episodes of that season. - } -} - -public class MoreThanTVParser : IParseIndexerResponse -{ - public CookieTorrentBaseSettings Settings { get; init; } - - public IList ParseResponse(IndexerResponse indexerResponse) - { - var releases = new List(); - - try - { - var parser = new HtmlParser(); - using var document = parser.ParseDocument(indexerResponse.Content); - var torrents = document.QuerySelectorAll("#torrent_table > tbody > tr.torrent"); - var movies = new[] { "movie" }; - var tv = new[] { "season", "episode" }; - - // Loop through all torrents checking for groups - foreach (var torrent in torrents) - { - // Parse required data - var downloadAnchor = torrent.QuerySelector("span a[href^=\"/torrents.php?action=download\"]"); - - if (downloadAnchor == null) - { - continue; - } - - var title = downloadAnchor.ParentElement.ParentElement.ParentElement.QuerySelector("a[class=\"overlay_torrent\"]").TextContent.Trim(); - title = CleanUpTitle(title); - - var category = torrent.QuerySelector(".cats_col div").GetAttribute("title"); - - // default to Other - var indexerCategory = NewznabStandardCategory.Other; - - if (movies.Any(category.Contains)) - { - indexerCategory = NewznabStandardCategory.Movies; - } - else if (tv.Any(category.Contains)) - { - indexerCategory = NewznabStandardCategory.TV; - } - - releases.Add(GetReleaseInfo(torrent, downloadAnchor, title, indexerCategory)); - } - - return releases; - } - catch (Exception ex) - { - throw new Exception("Error while parsing torrent response", ex); - } - } - - /// - /// Gather Release info from torrent table. Target using css - /// - /// - /// - /// - /// - /// - private ReleaseInfo GetReleaseInfo(IElement row, IElement downloadAnchor, string title, IndexerCategory category) - { - // count from bottom - const int FILES_COL = 7; - /*const int COMMENTS_COL = 7;*/ - const int DATE_COL = 6; - const int FILESIZE_COL = 5; - const int SNATCHED_COL = 4; - const int SEEDS_COL = 3; - const int LEECHERS_COL = 2; - /*const int USER_COL = 1;*/ - - var downloadAnchorHref = (downloadAnchor as IHtmlAnchorElement).Href; - var queryParams = HttpUtility.ParseQueryString(downloadAnchorHref, Encoding.UTF8); - var torrentId = queryParams["id"]; - - var qFiles = row.QuerySelector("td:nth-last-child(" + FILES_COL + ")").TextContent; - - var fileCount = ParseUtil.CoerceInt(qFiles); - var qPublishDate = row.QuerySelector("td:nth-last-child(" + DATE_COL + ") .time").Attributes["title"].Value; - var publishDate = DateTime.ParseExact(qPublishDate, "MMM dd yyyy, HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime(); - var qPoster = row.QuerySelector("div.tp-banner img")?.GetAttribute("src"); - var poster = (qPoster != null && !qPoster.Contains("caticons")) ? qPoster : null; - var description = row.QuerySelector("div.tags")?.TextContent.Trim(); - var fileSize = row.QuerySelector("td:nth-last-child(" + FILESIZE_COL + ")").TextContent.Trim(); - var snatched = row.QuerySelector("td:nth-last-child(" + SNATCHED_COL + ")").TextContent.Trim(); - var seeds = row.QuerySelector("td:nth-last-child(" + SEEDS_COL + ")").TextContent.Trim(); - var leechs = row.QuerySelector("td:nth-last-child(" + LEECHERS_COL + ")").TextContent.Trim(); - - if (fileSize.Length <= 0 || snatched.Length <= 0 || seeds.Length <= 0 || leechs.Length <= 0) - { - // Size (xx.xx GB[ (Max)]) Snatches (xx) Seeders (xx) Leechers (xx) - throw new Exception($"We expected 4 torrent datas."); - } - - var detailUrl = $"{Settings.BaseUrl}details.php"; - - var size = ParseUtil.GetBytes(fileSize); - var grabs = int.Parse(snatched, NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - var seeders = int.Parse(seeds, NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - var leechers = int.Parse(leechs, NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - var detailsUrl = $"{detailUrl}?torrentid={torrentId}"; - var downloadUrl = $"{detailUrl}?action=download&id={torrentId}"; - var categories = new List { category }; - - return new TorrentInfo - { - Title = title, - Categories = categories, - DownloadUrl = downloadUrl, - PublishDate = publishDate, - PosterUrl = poster, - Description = description, - Seeders = seeders, - Peers = seeders + leechers, - Files = fileCount, - Size = size, - Grabs = grabs, - Guid = downloadUrl, - InfoUrl = detailsUrl, - DownloadVolumeFactor = 0, // ratioless tracker - UploadVolumeFactor = 1 - }; - } - - /// - /// Clean Up any title stuff - /// - /// - /// - private string CleanUpTitle(string title) - { - return title - .Replace(".", " ") - .Replace("4K", "2160p"); // sonarr cleanup - } - - public Action, DateTime?> CookiesUpdater { get; set; } -} diff --git a/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs b/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs deleted file mode 100644 index 53adf8e30..000000000 --- a/src/NzbDrone.Core/Indexers/Definitions/PirateTheNet.cs +++ /dev/null @@ -1,292 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Globalization; -using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; -using AngleSharp.Html.Parser; -using Newtonsoft.Json; -using NLog; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.Indexers.Exceptions; -using NzbDrone.Core.Indexers.Settings; -using NzbDrone.Core.IndexerSearch.Definitions; -using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Parser; -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Definitions; -[Obsolete("PirateTheNet has shutdown 2023-10-14")] -public class PirateTheNet : TorrentIndexerBase -{ - public override string Name => "PirateTheNet"; - public override string[] IndexerUrls => new[] { "https://piratethenet.org/" }; - public override string[] LegacyUrls => new[] { "http://piratethenet.org/" }; - public override string Description => "PirateTheNet (PTN) is a ratioless movie tracker."; - public override IndexerPrivacy Privacy => IndexerPrivacy.Private; - public override IndexerCapabilities Capabilities => SetCapabilities(); - private string LoginUrl => Settings.BaseUrl + "takelogin.php"; - private string CaptchaUrl => Settings.BaseUrl + "simpleCaptcha.php?numImages=1"; - - public PirateTheNet(IIndexerHttpClient httpClient, - IEventAggregator eventAggregator, - IIndexerStatusService indexerStatusService, - IConfigService configService, - Logger logger) - : base(httpClient, eventAggregator, indexerStatusService, configService, logger) - { - } - - public override IIndexerRequestGenerator GetRequestGenerator() - { - return new PirateTheNetRequestGenerator(Settings, Capabilities); - } - - public override IParseIndexerResponse GetParser() - { - return new PirateTheNetParser(Settings, Capabilities.Categories); - } - - protected override async Task DoLogin() - { - var captchaPage = await ExecuteAuth(new HttpRequest(CaptchaUrl)); - - var captchaResponse = JsonConvert.DeserializeAnonymousType(captchaPage.Content, new - { - images = new[] { new { hash = string.Empty } } - }); - - var requestBuilder = new HttpRequestBuilder(LoginUrl) - { - LogResponseContent = true, - AllowAutoRedirect = true, - Method = HttpMethod.Post - }; - - var authLoginRequest = requestBuilder - .SetCookies(captchaPage.GetCookies()) - .AddFormParameter("username", Settings.Username) - .AddFormParameter("password", Settings.Password) - .AddFormParameter("captchaSelection", captchaResponse.images[0].hash) - .SetHeader("Content-Type", "application/x-www-form-urlencoded") - .SetHeader("Referer", LoginUrl) - .Build(); - - var response = await ExecuteAuth(authLoginRequest); - - if (CheckIfLoginNeeded(response)) - { - throw new IndexerAuthException("Login Failed."); - } - - var cookies = response.GetCookies(); - UpdateCookies(cookies, DateTime.Now.AddDays(30)); - - _logger.Debug("Authentication succeeded."); - } - - protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) - { - return !httpResponse.Content.Contains("logout.php"); - } - - private IndexerCapabilities SetCapabilities() - { - var caps = new IndexerCapabilities - { - MovieSearchParams = new List - { - MovieSearchParam.Q, MovieSearchParam.ImdbId - } - }; - - caps.Categories.AddCategoryMapping("1080P", NewznabStandardCategory.MoviesHD, "1080P"); - caps.Categories.AddCategoryMapping("2160P", NewznabStandardCategory.MoviesHD, "2160P"); - caps.Categories.AddCategoryMapping("720P", NewznabStandardCategory.MoviesHD, "720P"); - caps.Categories.AddCategoryMapping("BDRip", NewznabStandardCategory.MoviesSD, "BDRip"); - caps.Categories.AddCategoryMapping("BluRay", NewznabStandardCategory.MoviesBluRay, "BluRay"); - caps.Categories.AddCategoryMapping("BRRip", NewznabStandardCategory.MoviesSD, "BRRip"); - caps.Categories.AddCategoryMapping("DVDR", NewznabStandardCategory.MoviesDVD, "DVDR"); - caps.Categories.AddCategoryMapping("DVDRip", NewznabStandardCategory.MoviesSD, "DVDRip"); - caps.Categories.AddCategoryMapping("FLAC", NewznabStandardCategory.AudioLossless, "FLAC OST"); - caps.Categories.AddCategoryMapping("MP3", NewznabStandardCategory.AudioMP3, "MP3 OST"); - caps.Categories.AddCategoryMapping("MP4", NewznabStandardCategory.MoviesOther, "MP4"); - caps.Categories.AddCategoryMapping("Packs", NewznabStandardCategory.MoviesOther, "Packs"); - caps.Categories.AddCategoryMapping("R5", NewznabStandardCategory.MoviesDVD, "R5 / SCR"); - caps.Categories.AddCategoryMapping("Remux", NewznabStandardCategory.MoviesOther, "Remux"); - caps.Categories.AddCategoryMapping("TVRip", NewznabStandardCategory.MoviesOther, "TVRip"); - caps.Categories.AddCategoryMapping("WebRip", NewznabStandardCategory.MoviesWEBDL, "WebRip"); - - return caps; - } -} - -public class PirateTheNetRequestGenerator : IIndexerRequestGenerator -{ - private readonly UserPassTorrentBaseSettings _settings; - private readonly IndexerCapabilities _capabilities; - - public PirateTheNetRequestGenerator(UserPassTorrentBaseSettings settings, IndexerCapabilities capabilities) - { - _settings = settings; - _capabilities = capabilities; - } - - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories, searchCriteria.FullImdbId)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) - { - return new IndexerPageableRequestChain(); - } - - public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) - { - return new IndexerPageableRequestChain(); - } - - public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) - { - return new IndexerPageableRequestChain(); - } - - public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories)); - - return pageableRequests; - } - - private IEnumerable GetPagedRequests(string term, int[] categories, string imdbId = null) - { - var parameters = new NameValueCollection - { - { "action", "torrentstable" }, - { "viewtype", "0" }, - { "visiblecategories", "Action,Adventure,Animation,Biography,Comedy,Crime,Documentary,Drama,Family,Fantasy,History,Horror,Kids,Music,Mystery,Packs,Romance,Sci-Fi,Short,Sports,Thriller,War,Western" }, - { "page", "1" }, - { "visibility", "showall" }, - { "compression", "showall" }, - { "sort", "added" }, - { "order", "DESC" }, - { "titleonly", "true" }, - { "packs", "showall" }, - { "bookmarks", "showall" }, - { "subscriptions", "showall" }, - { "skw", "showall" } - }; - - if (imdbId.IsNotNullOrWhiteSpace()) - { - parameters.Set("advancedsearchparameters", $"[imdb={imdbId}]"); - } - else if (term.IsNotNullOrWhiteSpace()) - { - parameters.Set("searchstring", term); - } - - var queryCats = _capabilities.Categories.MapTorznabCapsToTrackers(categories); - if (queryCats.Any()) - { - parameters.Set("hiddenqualities", string.Join(",", queryCats)); - } - - var searchUrl = _settings.BaseUrl + "torrentsutils.php"; - - if (parameters.Count > 0) - { - searchUrl += $"?{parameters.GetQueryString()}"; - } - - var request = new IndexerRequest(searchUrl, HttpAccept.Html); - - yield return request; - } - - public Func> GetCookies { get; set; } - public Action, DateTime?> CookiesUpdater { get; set; } -} - -public class PirateTheNetParser : IParseIndexerResponse -{ - private readonly UserPassTorrentBaseSettings _settings; - private readonly IndexerCapabilitiesCategories _categories; - - public PirateTheNetParser(UserPassTorrentBaseSettings settings, IndexerCapabilitiesCategories categories) - { - _settings = settings; - _categories = categories; - } - - public IList ParseResponse(IndexerResponse indexerResponse) - { - var releaseInfos = new List(); - - var parser = new HtmlParser(); - using var dom = parser.ParseDocument(indexerResponse.Content); - - var rows = dom.QuerySelectorAll("table.main > tbody > tr"); - foreach (var row in rows.Skip(1)) - { - var qDetails = row.QuerySelector("td:nth-of-type(2) > a:nth-of-type(1)"); - var title = qDetails?.GetAttribute("alt")?.Trim(); - - var infoUrl = _settings.BaseUrl + qDetails?.GetAttribute("href")?.TrimStart('/'); - var downloadUrl = _settings.BaseUrl + row.QuerySelector("td > a:has(img[alt=\"Download Torrent\"])")?.GetAttribute("href")?.TrimStart('/'); - - var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(9)")?.TextContent); - var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(10)")?.TextContent); - - var cat = row.QuerySelector("td:nth-of-type(1) > a > img")?.GetAttribute("src")?.Split('/').Last().Split('.').First() ?? "packs"; - - var release = new TorrentInfo - { - Guid = infoUrl, - InfoUrl = infoUrl, - DownloadUrl = downloadUrl, - Title = title, - Categories = _categories.MapTrackerCatToNewznab(cat), - Seeders = seeders, - Peers = seeders + leechers, - Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(7)")?.TextContent.Trim()), - Files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(4)")?.TextContent), - Grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(8)")?.TextContent), - DownloadVolumeFactor = 0, // ratioless - UploadVolumeFactor = 1, - MinimumRatio = 1, - MinimumSeedTime = 259200, // 72 hours - }; - - var added = row.QuerySelector("td:nth-of-type(6) > nobr")?.TextContent.Trim(); - if (added.StartsWith("Today ")) - { - release.PublishDate = DateTime.Now.Date + DateTime.ParseExact(added.Split(" ", 2).Last(), "hh:mm tt", CultureInfo.InvariantCulture).TimeOfDay; - } - else if (added.StartsWith("Yesterday ")) - { - release.PublishDate = DateTime.Now.AddDays(-1).Date + DateTime.ParseExact(added.Split(" ", 2).Last(), "hh:mm tt", CultureInfo.InvariantCulture).TimeOfDay; - } - else - { - release.PublishDate = DateTime.ParseExact(added, "MMM d yyyy hh:mm tt", CultureInfo.InvariantCulture); - } - - releaseInfos.Add(release); - } - - return releaseInfos.ToArray(); - } - - public Action, DateTime?> CookiesUpdater { get; set; } -} diff --git a/src/NzbDrone.Core/Indexers/Definitions/TVVault.cs b/src/NzbDrone.Core/Indexers/Definitions/TVVault.cs deleted file mode 100644 index 4b75923a0..000000000 --- a/src/NzbDrone.Core/Indexers/Definitions/TVVault.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; -using System.Net.Http; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Web; -using AngleSharp.Html.Parser; -using NLog; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.Indexers.Exceptions; -using NzbDrone.Core.Indexers.Settings; -using NzbDrone.Core.IndexerSearch.Definitions; -using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Parser; -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Definitions -{ - [Obsolete("Remove per Site Request Prowlarr Issue 573")] - public class TVVault : TorrentIndexerBase - { - public override string Name => "TVVault"; - public override string[] IndexerUrls => new[] { "https://tv-vault.me/" }; - private string LoginUrl => Settings.BaseUrl + "login.php"; - public override string Description => "TV-Vault is a very unique tracker dedicated for old TV shows, TV movies and documentaries."; - public override string Language => "en-US"; - public override Encoding Encoding => Encoding.UTF8; - public override IndexerPrivacy Privacy => IndexerPrivacy.Private; - public override IndexerCapabilities Capabilities => SetCapabilities(); - public override TimeSpan RateLimit => TimeSpan.FromSeconds(5); - - public TVVault(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) - : base(httpClient, eventAggregator, indexerStatusService, configService, logger) - { - } - - public override IIndexerRequestGenerator GetRequestGenerator() - { - return new TVVaultRequestGenerator { Settings = Settings, Capabilities = Capabilities }; - } - - public override IParseIndexerResponse GetParser() - { - return new TVVaultParser(Settings, Capabilities.Categories); - } - - protected override async Task DoLogin() - { - var requestBuilder = new HttpRequestBuilder(LoginUrl) - { - LogResponseContent = true, - AllowAutoRedirect = true, - Method = HttpMethod.Post - }; - - var cookies = Cookies; - Cookies = null; - - var authLoginRequest = requestBuilder - .AddFormParameter("username", Settings.Username) - .AddFormParameter("password", Settings.Password) - .AddFormParameter("keeplogged", "1") - .AddFormParameter("login", "Log+In!") - .SetHeader("Content-Type", "application/x-www-form-urlencoded") - .SetHeader("Referer", LoginUrl) - .Build(); - - var response = await ExecuteAuth(authLoginRequest); - - if (CheckIfLoginNeeded(response)) - { - var parser = new HtmlParser(); - using var dom = parser.ParseDocument(response.Content); - var errorMessage = dom.QuerySelector("form#loginform")?.TextContent.Trim(); - - throw new IndexerAuthException(errorMessage ?? "Unknown error message, please report."); - } - - cookies = response.GetCookies(); - UpdateCookies(cookies, DateTime.Now.AddDays(30)); - - _logger.Debug("TVVault authentication succeeded."); - } - - protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) - { - return !httpResponse.Content.Contains("logout.php"); - } - - private IndexerCapabilities SetCapabilities() - { - var caps = new IndexerCapabilities - { - TvSearchParams = new List - { - TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.ImdbId - }, - MovieSearchParams = new List - { - MovieSearchParam.Q, MovieSearchParam.ImdbId - }, - Flags = new List - { - IndexerFlag.FreeLeech - } - }; - - caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.TV); - caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.Movies); - caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.TVHD); - caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.TVSD); - - return caps; - } - } - - public class TVVaultRequestGenerator : IIndexerRequestGenerator - { - public UserPassTorrentBaseSettings Settings { get; set; } - public IndexerCapabilities Capabilities { get; set; } - - private IEnumerable GetPagedRequests(string term, int[] categories, string imdbId = null) - { - var searchUrl = string.Format("{0}/torrents.php", Settings.BaseUrl.TrimEnd('/')); - - var qc = new NameValueCollection - { - { "order_by", "s3" }, - { "order_way", "DESC" }, - { "disablegrouping", "1" } - }; - - if (imdbId.IsNotNullOrWhiteSpace()) - { - qc.Add("action", "advanced"); - qc.Add("imdbid", imdbId); - } - else if (!string.IsNullOrWhiteSpace(term)) - { - qc.Add("searchstr", StripSearchString(term)); - } - - var catList = Capabilities.Categories.MapTorznabCapsToTrackers(categories); - - foreach (var cat in catList) - { - qc.Add($"filter_cat[{cat}]", "1"); - } - - searchUrl = searchUrl + "?" + qc.GetQueryString(); - - var request = new IndexerRequest(searchUrl, HttpAccept.Html); - - yield return request; - } - - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) - { - return new IndexerPageableRequestChain(); - } - - public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId)); - - return pageableRequests; - } - - public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) - { - return new IndexerPageableRequestChain(); - } - - public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); - - return pageableRequests; - } - - private string StripSearchString(string term) - { - // Search does not support searching with episode numbers so strip it if we have one - // AND filter the result later to achieve the proper result - term = Regex.Replace(term, @"[S|E]\d\d", string.Empty); - return term.Trim(); - } - - public Func> GetCookies { get; set; } - public Action, DateTime?> CookiesUpdater { get; set; } - } - - public class TVVaultParser : IParseIndexerResponse - { - private readonly UserPassTorrentBaseSettings _settings; - private readonly IndexerCapabilitiesCategories _categories; - - public TVVaultParser(UserPassTorrentBaseSettings settings, IndexerCapabilitiesCategories categories) - { - _settings = settings; - _categories = categories; - } - - public IList ParseResponse(IndexerResponse indexerResponse) - { - var torrentInfos = new List(); - - var parser = new HtmlParser(); - using var doc = parser.ParseDocument(indexerResponse.Content); - - // get params to build download link (user could be banned without those params) - var rssFeedUri = new Uri(_settings.BaseUrl + doc.QuerySelector("link[href^=\"/feeds.php?feed=\"]") - .GetAttribute("href")); - var rssFeedQuery = HttpUtility.ParseQueryString(rssFeedUri.Query); - var downloadLinkExtraParams = "&authkey=" + rssFeedQuery["authkey"] + "&torrent_pass=" + rssFeedQuery["passkey"]; - - var rows = doc.QuerySelectorAll("table.torrent_table > tbody > tr.torrent"); - - foreach (var row in rows) - { - var qDetailsLink = row.QuerySelector("a[href^=\"torrents.php?id=\"]"); - var title = qDetailsLink.TextContent; - - var description = qDetailsLink.NextSibling.TextContent.Trim(); - title += " " + description; - var details = _settings.BaseUrl + qDetailsLink.GetAttribute("href"); - var torrentId = qDetailsLink.GetAttribute("href").Split('=').Last(); - var link = _settings.BaseUrl + "torrents.php?action=download&id=" + torrentId + downloadLinkExtraParams; - - var files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(3)").TextContent); - var publishDate = DateTimeUtil.FromTimeAgo(row.QuerySelector("td:nth-child(4)").TextContent); - var size = ParseUtil.GetBytes(row.QuerySelector("td:nth-child(5)").FirstChild.TextContent); - var grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(6)").TextContent); - var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(7)").TextContent); - var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(8)").TextContent); - - var dlVolumeFactor = row.QuerySelector("strong.freeleech_normal") != null ? 0 : 1; - - var category = new List { TvCategoryFromQualityParser.ParseTvShowQuality(description) }; - - var release = new TorrentInfo - { - MinimumRatio = 1, - MinimumSeedTime = 0, - Description = description, - Title = title, - PublishDate = publishDate, - Categories = category, - DownloadUrl = link, - InfoUrl = details, - Guid = link, - Seeders = seeders, - Peers = leechers + seeders, - Size = size, - Grabs = grabs, - Files = files, - DownloadVolumeFactor = dlVolumeFactor, - UploadVolumeFactor = 1 - }; - - torrentInfos.Add(release); - } - - return torrentInfos.ToArray(); - } - - public Action, DateTime?> CookiesUpdater { get; set; } - } -} From 5f0d6e2fddde77905b5fb5180b549a0f8aae8d96 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 21 Feb 2024 17:34:22 +0200 Subject: [PATCH 465/964] New: Sync Pack Seed Time to Whisparr applications Fixes #2039 --- src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs | 7 ++++++- src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs index 1c062443b..8e894c12d 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs @@ -218,7 +218,7 @@ namespace NzbDrone.Core.Applications.Whisparr { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _whisparrV3Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); - var syncFields = new[] { "baseUrl", "apiPath", "apiKey", "categories", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime" }; + var syncFields = new[] { "baseUrl", "apiPath", "apiKey", "categories", "minimumSeeders", "seedCriteria.seedRatio", "seedCriteria.seedTime", "seedCriteria.seasonPackSeedTime", "rejectBlocklistedTorrentHashesWhileGrabbing" }; var newznab = schemas.First(i => i.Implementation == "Newznab"); var torznab = schemas.First(i => i.Implementation == "Torznab"); @@ -252,6 +252,11 @@ namespace NzbDrone.Core.Applications.Whisparr whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedRatio; whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; + if (whisparrIndexer.Fields.Any(x => x.Name == "seedCriteria.seasonPackSeedTime")) + { + whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seasonPackSeedTime").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.PackSeedTime ?? ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.SeedTime; + } + if (whisparrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) { whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; diff --git a/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs b/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs index 828fe0469..e8e6f8150 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/WhisparrIndexer.cs @@ -47,6 +47,10 @@ namespace NzbDrone.Core.Applications.Whisparr var otherSeedTime = other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedTime")?.Value == null ? null : (int?)Convert.ToInt32(other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedTime").Value); var seedTimeCompare = seedTime == otherSeedTime; + var seasonSeedTime = Fields.FirstOrDefault(x => x.Name == "seedCriteria.seasonPackSeedTime")?.Value == null ? null : (int?)Convert.ToInt32(Fields.FirstOrDefault(x => x.Name == "seedCriteria.seasonPackSeedTime").Value); + var otherSeasonSeedTime = other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seasonPackSeedTime")?.Value == null ? null : (int?)Convert.ToInt32(other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seasonPackSeedTime").Value); + var seasonSeedTimeCompare = seasonSeedTime == otherSeasonSeedTime; + var seedRatio = Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio")?.Value == null ? null : (double?)Convert.ToDouble(Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value); var otherSeedRatio = other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio")?.Value == null ? null : (double?)Convert.ToDouble(other.Fields.FirstOrDefault(x => x.Name == "seedCriteria.seedRatio").Value); var seedRatioCompare = seedRatio == otherSeedRatio; @@ -62,7 +66,7 @@ namespace NzbDrone.Core.Applications.Whisparr other.Implementation == Implementation && other.Priority == Priority && other.Id == Id && - apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && rejectBlocklistedTorrentHashesWhileGrabbingCompare; + apiKeyCompare && apiPathCompare && baseUrl && cats && minimumSeedersCompare && seedRatioCompare && seedTimeCompare && seasonSeedTimeCompare && rejectBlocklistedTorrentHashesWhileGrabbingCompare; } } } From 007601cb195ab380960a14b357825e5356eac725 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 23 Feb 2024 05:30:37 +0200 Subject: [PATCH 466/964] Fixed: Selection of last added custom filter Plus some translations and typos --- .../Filter/Builder/FilterBuilderModalContent.js | 9 +++++---- .../src/Components/Filter/CustomFilters/CustomFilter.js | 4 ++-- src/NzbDrone.Core/Localization/Core/en.json | 2 ++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js b/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js index 033b9a69a..0c4a31657 100644 --- a/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js +++ b/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js @@ -1,3 +1,4 @@ +import { maxBy } from 'lodash'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import FormInputGroup from 'Components/Form/FormInputGroup'; @@ -50,7 +51,7 @@ class FilterBuilderModalContent extends Component { if (id) { dispatchSetFilter({ selectedFilterKey: id }); } else { - const last = customFilters[customFilters.length -1]; + const last = maxBy(customFilters, 'id'); dispatchSetFilter({ selectedFilterKey: last.id }); } @@ -108,7 +109,7 @@ class FilterBuilderModalContent extends Component { this.setState({ labelErrors: [ { - message: 'Label is required' + message: translate('LabelIsRequired') } ] }); @@ -146,13 +147,13 @@ class FilterBuilderModalContent extends Component { return ( - Custom Filter + {translate('CustomFilter')}
- Label + {translate('Label')}
diff --git a/frontend/src/Components/Filter/CustomFilters/CustomFilter.js b/frontend/src/Components/Filter/CustomFilters/CustomFilter.js index 7407f729a..9f378d5a2 100644 --- a/frontend/src/Components/Filter/CustomFilters/CustomFilter.js +++ b/frontend/src/Components/Filter/CustomFilters/CustomFilter.js @@ -37,8 +37,8 @@ class CustomFilter extends Component { dispatchSetFilter } = this.props; - // Assume that delete and then unmounting means the delete was successful. - // Moving this check to a ancestor would be more accurate, but would have + // Assume that delete and then unmounting means the deletion was successful. + // Moving this check to an ancestor would be more accurate, but would have // more boilerplate. if (this.state.isDeleting && id === selectedFilterKey) { dispatchSetFilter({ selectedFilterKey: 'all' }); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 10db3c8a6..8dc2ce311 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -134,6 +134,7 @@ "CountIndexersAvailable": "{count} indexer(s) available", "CountIndexersSelected": "{count} indexer(s) selected", "Custom": "Custom", + "CustomFilter": "Custom Filter", "CustomFilters": "Custom Filters", "Database": "Database", "DatabaseMigration": "Database Migration", @@ -422,6 +423,7 @@ "InvalidUILanguage": "Your UI is set to an invalid language, correct it and save your settings", "KeyboardShortcuts": "Keyboard Shortcuts", "Label": "Label", + "LabelIsRequired": "Label is required", "Language": "Language", "LastDuration": "Last Duration", "LastExecution": "Last Execution", From 45d378a2d908fc0909b777a43320070fe183e064 Mon Sep 17 00:00:00 2001 From: Servarr Date: Fri, 23 Feb 2024 17:52:23 +0000 Subject: [PATCH 467/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index a09a4239e..b6644db13 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -5016,6 +5016,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "rejectBlocklistedTorrentHashesWhileGrabbing": { + "type": "boolean", + "nullable": true } }, "additionalProperties": false From 6c7c37affe8121338c36640e7abbf4525475eb36 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 23 Feb 2024 20:13:02 +0200 Subject: [PATCH 468/964] Bump node to v20.x on builder --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ed03905f8..24b22d3c9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -16,7 +16,7 @@ variables: sentryOrg: 'servarr' sentryUrl: 'https://sentry.servarr.com' dotnetVersion: '6.0.417' - nodeVersion: '16.X' + nodeVersion: '20.X' innoVersion: '6.2.2' windowsImage: 'windows-2022' linuxImage: 'ubuntu-20.04' From ecdc0a51a9ab8355ad9330822d7db9b9c550ae9d Mon Sep 17 00:00:00 2001 From: Chris <1967906+psylenced@users.noreply.github.com> Date: Mon, 17 Oct 2022 02:42:33 +1100 Subject: [PATCH 469/964] Fixed: Cleanse Discord Webhook URLs (cherry picked from commit d1f2a8a9486471f4986da2fa16d5439ccf0426e1) --- .../InstrumentationTests/CleanseLogMessageFixture.cs | 4 ++++ src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs index ea42239e8..0c0a338e1 100644 --- a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs +++ b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs @@ -119,6 +119,10 @@ namespace NzbDrone.Common.Test.InstrumentationTests [TestCase(@"[Info] MigrationController: *** Migrating Database=prowlarr-main;Host=postgres14;Username=mySecret;Password=mySecret;Port=5432;Enlist=False ***")] [TestCase("/readarr/signalr/messages/negotiate?access_token=1234530f422f4aacb6b301233210aaaa&negotiateVersion=1")] [TestCase(@"[Info] MigrationController: *** Migrating Database=prowlarr-main;Host=postgres14;Username=mySecret;Password=mySecret;Port=5432;token=mySecret;Enlist=False&username=mySecret;mypassword=mySecret;mypass=shouldkeep1;test_token=mySecret;password=123%@%_@!#^#@;use_password=mySecret;get_token=shouldkeep2;usetoken=shouldkeep3;passwrd=mySecret;")] + + // Discord + [TestCase(@"https://discord.com/api/webhooks/mySecret")] + [TestCase(@"https://discord.com/api/webhooks/mySecret/01233210")] public void should_clean_message(string message) { var cleansedMessage = CleanseLogMessage.Cleanse(message); diff --git a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs index 38ff304a1..a160d5bff 100644 --- a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs +++ b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs @@ -61,6 +61,9 @@ namespace NzbDrone.Common.Instrumentation // Applications new (@"""name"":""apikey"",""value"":""(?[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase), + + // Discord + new (@"discord.com/api/webhooks/((?[\w-]+)/)?(?[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase) }; private static readonly Regex CleanseRemoteIPRegex = new (@"(?:Auth-\w+(? Date: Thu, 29 Feb 2024 02:37:14 +0200 Subject: [PATCH 470/964] Update caniuse-lite --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e94d1f4c2..6fb3bee57 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2328,9 +2328,9 @@ camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: - version "1.0.30001525" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" - integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== + version "1.0.30001591" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz" + integrity sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ== chalk@^1.1.3: version "1.1.3" From ab0108778a083197037e9dee567f02ed727e43a3 Mon Sep 17 00:00:00 2001 From: Devotee2161 <115710816+Devotee2161@users.noreply.github.com> Date: Tue, 27 Feb 2024 20:03:07 +0100 Subject: [PATCH 471/964] Fixed: (AnimeBytes) Artist and album search improvements --- .../Indexers/Definitions/AnimeBytes.cs | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index 830b0e6f5..7e1020ac4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -113,7 +113,7 @@ namespace NzbDrone.Core.Indexers.Definitions }, MusicSearchParams = new List { - MusicSearchParam.Q + MusicSearchParam.Q, MusicSearchParam.Artist, MusicSearchParam.Album, MusicSearchParam.Year }, BookSearchParams = new List { @@ -209,6 +209,24 @@ namespace NzbDrone.Core.Indexers.Definitions } } + if (searchType == "music" && searchCriteria is MusicSearchCriteria musicSearchCriteria) + { + if (musicSearchCriteria.Artist.IsNotNullOrWhiteSpace() && musicSearchCriteria.Artist != "VA") + { + parameters.Set("artistnames", musicSearchCriteria.Artist); + } + + if (musicSearchCriteria.Album.IsNotNullOrWhiteSpace()) + { + parameters.Set("groupname", musicSearchCriteria.Album); + } + + if (musicSearchCriteria.Year is > 0) + { + parameters.Set("year", musicSearchCriteria.Year.ToString()); + } + } + var queryCats = _capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories); if (queryCats.Any()) From 1283e06f95ddb1f331d3b119ec5e33e62c6d78e4 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 24 Feb 2024 21:43:12 +0000 Subject: [PATCH 472/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Havok Dan Co-authored-by: Magyar Co-authored-by: Weblate Co-authored-by: aghus Co-authored-by: modo24ro Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 8 ++--- src/NzbDrone.Core/Localization/Core/hu.json | 32 ++++++++++--------- .../Localization/Core/pt_BR.json | 8 +++-- src/NzbDrone.Core/Localization/Core/ro.json | 4 ++- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 4f3e282e1..fc6c2184c 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -263,7 +263,7 @@ "NoBackupsAreAvailable": "No hay copias de seguridad disponibles", "MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle", "ForMoreInformationOnTheIndividualDownloadClients": "Para más información individual de los gestores de descarga, haz clic en lls botones de información.", - "FilterPlaceHolder": "Buscar películas", + "FilterPlaceHolder": "Buscar Indexadores", "Exception": "Excepción", "ErrorLoadingContents": "Error cargando contenidos", "UILanguageHelpTextWarning": "Recargar el Navegador", @@ -293,7 +293,7 @@ "Add": "Añadir", "Custom": "Personalizado", "Donations": "Donaciones", - "SearchIndexers": "Buscar películas", + "SearchIndexers": "Buscar Indexadores", "Enabled": "Habilitado", "Grabs": "Capturar", "Presets": "Preajustes", @@ -378,7 +378,7 @@ "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", "ApplyTagsHelpTextHowToApplyApplications": "Cómo aplicar etiquetas a las aplicaciones seleccionadas", - "SelectIndexers": "Buscar películas", + "SelectIndexers": "Seleccionar Indexadores", "ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados", "ApplyTagsHelpTextRemove": "Eliminar: Elimina las etiquetas introducidas", "ApplyTagsHelpTextReplace": "Reemplazar: Sustituye las etiquetas por las introducidas (introduce \"no tags\" para borrar todas las etiquetas)", @@ -549,7 +549,7 @@ "QueryOptions": "Opciones de Consulta", "NewznabUrl": "Url Newznab", "QueryType": "Tipo de Consulta", - "SearchCountIndexers": "Buscar {count} indexador(es)", + "SearchCountIndexers": "Buscar en {count} indexador(es)", "SelectedCountOfCountReleases": "Seleccionados {selectedCount} de {itemCount} lanzamientos", "SyncLevel": "Nivel de Sincronización", "StopSelecting": "Detener la Selección", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index c1f2c8be1..3d221b35e 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -134,20 +134,20 @@ "SaveSettings": "Beállítások mentése", "SaveChanges": "Változtatások mentése", "Save": "Mentés", - "RssIsNotSupportedWithThisIndexer": "Az RSS nem támogatott ezzel az indexerrel", + "RssIsNotSupportedWithThisIndexer": "Ez az indexelő nem támogatja az RSS-t", "Retention": "Visszatartás", "Result": "Eredmény", "RestoreBackup": "Biztonsági mentés visszaállítása", "Restore": "Visszaállít", - "RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez", + "RestartRequiredHelpTextWarning": "Újraindítás szükséges az életbe lépéshez", "RestartProwlarr": "{appName} Újraindítása", - "RestartNow": "Újraindítás Most", + "RestartNow": "Újraindítás most", "Restart": "Újrakezd", - "ResetAPIKey": "API Kulcs visszaállítása", + "ResetAPIKey": "API Kulcs Visszaállítása", "Reset": "Visszaállítás", "RemovingTag": "Címke eltávolítása", - "RemoveFilter": "Szűrő törlése", - "RemovedFromTaskQueue": "Eltávolítva a feladatsorról", + "RemoveFilter": "Szűrő Eltávolítás", + "RemovedFromTaskQueue": "Eltávolítva a feladatsorból", "Reload": "Újratölt", "ReleaseStatus": "Kiadás státusza", "ReleaseBranchCheckOfficialBranchMessage": "A(z) {0} nem érvényes {appName} frissítési ágazat, ezért nem kap frissítéseket", @@ -157,21 +157,21 @@ "ProwlarrSupportsAnyIndexer": "A {appName} számos indexert támogat, minden olyan indexelő mellett, amely a Newznab / Torznab szabványt használja, valamint a 'Generic Newznab' (usenethez) vagy a 'Generic Torznab' (torrentekhez) használatával. Keresés és az alább felsorolt indexelők kiválasztása.", "ProwlarrSupportsAnyDownloadClient": "A {appName} minden olyan letöltési klienst támogat, amely a Newznab szabványt használja, valamint az alább felsorolt letöltési klienseket.", "Queue": "Várakozási sor", - "ProxyUsernameHelpText": "Csak akkor kell megadnod felhasználónevet és jelszót, ha szükséges. Egyébként hagyd üresen.", - "ProxyType": "Proxy Típusa", - "ProxyPasswordHelpText": "Csak akkor kell megadnod felhasználónevet és jelszót, ha szükséges. Egyébként hagyd üresen.", + "ProxyUsernameHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.", + "ProxyType": "Proxy típus", + "ProxyPasswordHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.", "ProxyCheckResolveIpMessage": "Nem sikerült megoldani a konfigurált proxykiszolgáló IP-címét {0}", "ProxyCheckFailedToTestMessage": "Proxy tesztelése sikertelen: {0}", "ProxyCheckBadRequestMessage": "Proxy tesztelése sikertelen. Állapotkód: {0}", - "ProxyBypassFilterHelpText": "Használja elválasztóként a ',' és a '*' karaktereket, az aldomainek helyettesítőjeként", + "ProxyBypassFilterHelpText": "Használja a ',' jelet elválasztóként és a '*' jelet. helyettesítő karakterként az aldomainekhez", "Proxy": "Proxy", "Protocol": "Protokoll", "Priority": "Prioritás", "PortNumber": "Port száma", "Port": "Port", - "PendingChangesStayReview": "Maradj, és tekintsd át a változásokat", - "PendingChangesMessage": "Nem mentett módosításaid vannak, biztosan el akarod hagyni ezt az oldalt?", - "PendingChangesDiscardChanges": "Változtatások törlése és kilépés", + "PendingChangesStayReview": "Maradjon és tekintse át a változtatásokat", + "PendingChangesMessage": "Vannak nem mentett módosításai. Biztosan elhagyja ezt az oldalt?", + "PendingChangesDiscardChanges": "Vesse el a változtatásokat, és lépjen ki", "Peers": "Peerek", "Password": "Jelszó", "PageSizeHelpText": "Az egyes oldalakon megjelenítendő elemek száma", @@ -501,7 +501,7 @@ "AuthForm": "Űrlapok (bejelentkezési oldal)", "DisabledForLocalAddresses": "Helyi címeknél letiltva", "None": "Egyik sem", - "ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?", + "ResetAPIKeyMessageText": "Biztosan visszaállítja API-kulcsát?", "AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót", "AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet", "AppUpdated": "{appName} frissítve", @@ -546,5 +546,7 @@ "DeleteSelectedApplicationsMessageText": "Biztosan törölni szeretne {count} kiválasztott importlistát?", "CountApplicationsSelected": "{count} Gyűjtemény(ek) kiválasztva", "ManageClients": "Ügyfelek kezelése", - "IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltési kliensekkel: {0}." + "IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltési kliensekkel: {0}.", + "PasswordConfirmation": "Jelszó megerősítése", + "SecretToken": "Titkos token" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index c34068e4d..babadd6d9 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -195,7 +195,7 @@ "IndexerDetails": "Detalhes do Indexador", "IndexerDisabled": "Indexador Desabilitado", "IndexerFailureRate": "Taxa de falha do indexador", - "IndexerFlags": "Sinalizadores do indexador", + "IndexerFlags": "Sinalizadores do Indexador", "IndexerHealthCheckNoIndexers": "Não há indexadores habilitados, o {appName} não retornará resultados para a pesquisa", "IndexerInfo": "Info do Indexador", "IndexerLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas por mais de 6 horas", @@ -735,5 +735,9 @@ "TorrentBlackholeSaveMagnetFiles": "Salvar Arquivos Magnets", "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extensão a ser usada para links magnet, o padrão é '.magnet'", "TorrentBlackholeSaveMagnetFilesHelpText": "Salve o link magnet se nenhum arquivo .torrent estiver disponível (útil apenas se o cliente de download suportar magnets salvos em um arquivo)", - "UseSsl": "Usar SSL" + "UseSsl": "Usar SSL", + "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeitar Hashes de Torrent Bloqueados Durante a Captura", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", + "CustomFilter": "Filtro Personalizado", + "LabelIsRequired": "Rótulo é requerido" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index be167a119..ee4e28b99 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -462,5 +462,7 @@ "EditIndexerImplementation": "Adăugați Indexator - {implementationName}", "EditIndexerProxyImplementation": "Adăugați proxy indexator - {implementationName}", "EditApplicationImplementation": "Adăugați aplicație - {implementareName}", - "RestartProwlarr": "Reporniți {appName}" + "RestartProwlarr": "Reporniți {appName}", + "AddDownloadClientToProwlarr": "Adăugarea unui client de descărcare permite {appName} să trimită versiuni direct din interfața utilizatorului în timp ce se efectuează o căutare manuală", + "ActiveApps": "Aplicații active" } From 00bd9c241a103de5977b9e1faa6b48878d289de9 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 2 Mar 2024 20:42:19 +0000 Subject: [PATCH 473/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: GkhnGRBZ Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 26 ++++++++-------- src/NzbDrone.Core/Localization/Core/tr.json | 34 ++++++++++++++++----- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index fc6c2184c..053dd1f66 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -56,9 +56,9 @@ "ProxyCheckBadRequestMessage": "Fallo al comprobar el proxy. Status code: {0}", "Proxy": "Proxy", "Options": "Opciones", - "NoChange": "Sin Cambio", - "NoChanges": "Sin Cambios", - "MoreInfo": "Más Información", + "NoChange": "Sin cambio", + "NoChanges": "Sin cambios", + "MoreInfo": "Más información", "Logging": "Registro de eventos", "LogFiles": "Archivos de Registro", "Language": "Idioma", @@ -203,8 +203,8 @@ "Password": "Contraseña", "PageSizeHelpText": "Número de elementos por página", "PackageVersion": "Versión del paquete", - "NotificationTriggers": "Desencadenantes de Notificaciones", - "NoLeaveIt": "No, Déjalo", + "NotificationTriggers": "Disparadores de notificación", + "NoLeaveIt": "No, déjalo", "New": "Nuevo", "NetCore": ".NET Core", "Mode": "Modo", @@ -214,7 +214,7 @@ "LogLevel": "Nivel de Registro", "LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de {appName} al arrancar la app.", "Interval": "Intervalo", - "IndexerFlags": "Marcas de Indexer", + "IndexerFlags": "Banderas del indexador", "IncludeHealthWarningsHelpText": "Incluir Alertas de Salud", "IllRestartLater": "Lo reiniciaré más tarde", "IgnoredAddresses": "Ignorar direcciones", @@ -258,8 +258,8 @@ "ProwlarrSupportsAnyIndexer": "{appName} soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.", "ProwlarrSupportsAnyDownloadClient": "{appName} soporta cualquier gestor de descargas indicado debajo.", "NoUpdatesAreAvailable": "No hay actualizaciones disponibles", - "NoTagsHaveBeenAddedYet": "No se han añadido etiquetas todavía", - "NoLogFiles": "Sin archivos de registro", + "NoTagsHaveBeenAddedYet": "Ninguna etiqueta ha sido añadida aún", + "NoLogFiles": "No hay archivos de registro", "NoBackupsAreAvailable": "No hay copias de seguridad disponibles", "MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle", "ForMoreInformationOnTheIndividualDownloadClients": "Para más información individual de los gestores de descarga, haz clic en lls botones de información.", @@ -323,7 +323,7 @@ "OnGrab": "Al Capturar lanzamiento", "OnHealthIssue": "En Problema de Salud", "TestAllIndexers": "Comprobar Todos los Indexers", - "NotificationTriggersHelpText": "Seleccione qué eventos deben activar esta notificación", + "NotificationTriggersHelpText": "Selecciona qué eventos deberían disparar esta notificación", "OnApplicationUpdate": "Al Actualizar La Aplicación", "OnApplicationUpdateHelpText": "Al Actualizar La Aplicación", "AddRemoveOnly": "Sólo añadir y eliminar", @@ -411,7 +411,7 @@ "Artist": "Artista", "DeleteAppProfileMessageText": "¿Estás seguro de que quieres eliminar el perfil de la aplicación '{name}'?", "AddConnection": "Añadir Conexión", - "NotificationStatusAllClientHealthCheckMessage": "Las listas no están disponibles debido a errores", + "NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a fallos", "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}", "EditIndexerImplementation": "Editar Indexador - {implementationName}", "AuthBasic": "Básico (ventana emergente del navegador)", @@ -421,7 +421,7 @@ "Clone": "Clonar", "DisabledForLocalAddresses": "Deshabilitado para Direcciones Locales", "External": "Externo", - "None": "Ninguna", + "None": "Ninguno", "ResetAPIKeyMessageText": "¿Está seguro de que desea restablecer su clave API?", "EditIndexerProxyImplementation": "Editar Proxy de Indexador - { implementationName}", "AppUpdated": "{appName} Actualizado", @@ -612,5 +612,7 @@ "NotificationsEmailSettingsUseEncryptionHelpText": "Si prefiere utilizar el cifrado si está configurado en el servidor, utilizar siempre el cifrado mediante SSL (sólo puerto 465) o StartTLS (cualquier otro puerto) o no utilizar nunca el cifrado", "IndexerHDBitsSettingsPasskeyHelpText": "Clave de acceso desde los Detalles de Usuario", "IndexerSettingsPasskey": "Clave de Acceso", - "BlackholeFolderHelpText": "La carpeta en donde {appName} se almacenaran los {extension} file" + "BlackholeFolderHelpText": "La carpeta en donde {appName} se almacenaran los {extension} file", + "CustomFilter": "Filtros personalizados", + "LabelIsRequired": "Se requiere etiqueta" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index df5cd765b..4ca199ecf 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -104,7 +104,7 @@ "ApplicationStatusCheckAllClientMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", "CancelPendingTask": "Bu bekleyen görevi iptal etmek istediğinizden emin misiniz?", "DeleteTag": "Etiketi Sil", - "BindAddressHelpText": "Tüm arayüzler için geçerli IP4 adresi veya '*'", + "BindAddressHelpText": "Tüm arayüzler için geçerli IP adresi, localhost veya '*'", "ConnectSettings": "Bağlantı Ayarları", "DatabaseMigration": "DB Geçişi", "DeleteApplicationMessageText": "'{0}' bildirimini silmek istediğinizden emin misiniz?", @@ -136,7 +136,7 @@ "AllIndexersHiddenDueToFilter": "Uygulanan filtre nedeniyle tüm filmler gizlendi.", "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Bu, tarayıcınızla ilgili bilgileri, kullandığınız {appName} WebUI sayfalarını, hata raporlamasının yanı sıra işletim sistemi ve çalışma zamanı sürümünü içerir. Bu bilgileri, özellikleri ve hata düzeltmelerini önceliklendirmek için kullanacağız.", "ApiKey": "API Anahtarı", - "AppDataDirectory": "AppData dizini", + "AppDataDirectory": "Uygulama Veri Dizini", "NoUpdatesAreAvailable": "Güncelleme yok", "OAuthPopupMessage": "Pop-up'lar tarayıcınız tarafından engelleniyor", "Ok": "Tamam", @@ -306,7 +306,7 @@ "Automatic": "Otomatik", "AutomaticSearch": "Otomatik Arama", "Backup": "Destek olmak", - "Cancel": "İptal etmek", + "Cancel": "Vazgeç", "Level": "Seviye", "Time": "Zaman", "MaintenanceRelease": "Bakım Sürümü: hata düzeltmeleri ve diğer iyileştirmeler. Daha fazla ayrıntı için Github İşlem Geçmişine bakın", @@ -336,8 +336,8 @@ "ApplyTagsHelpTextAdd": "Ekle: Etiketleri mevcut etiket listesine ekleyin", "ApplyTagsHelpTextHowToApplyApplications": "Seçilen filmlere etiketler nasıl uygulanır", "ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın", - "ApplyTagsHelpTextHowToApplyIndexers": "Seçilen filmlere etiketler nasıl uygulanır", - "ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri temizlemek için hiçbir etiket girmeyin)", + "ApplyTagsHelpTextHowToApplyIndexers": "Seçilen indeksleyicilere etiketler nasıl uygulanır?", + "ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)", "DeleteSelectedDownloadClients": "İndirme İstemcisini Sil", "DownloadClientPriorityHelpText": "Birden çok İndirme İstemcisine öncelik verin. Round-Robin, aynı önceliğe sahip müşteriler için kullanılır.", "Genre": "Türler", @@ -348,7 +348,7 @@ "RecentChanges": "Son değişiklikler", "minutes": "Dakika", "WhatsNew": "Ne var ne yok?", - "ConnectionLostReconnect": "Radarr otomatik olarak bağlanmayı deneyecek veya aşağıdan yeniden yükle'yi tıklayabilirsiniz.", + "ConnectionLostReconnect": "{appName} otomatik bağlanmayı deneyecek veya aşağıda yeniden yükle seçeneğini işaretleyebilirsiniz.", "NotificationStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", "Applications": "Uygulamalar", @@ -372,5 +372,25 @@ "EditIndexerProxyImplementation": "Koşul Ekle - {implementationName}", "AddCustomFilter": "Özel Filtre Ekleyin", "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", - "EditDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}" + "EditDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", + "ApplicationURL": "Uygulama URL'si", + "AuthenticationRequired": "Kimlik Doğrulama Gerekli", + "ApplyChanges": "Değişiklikleri Uygula", + "CountDownloadClientsSelected": "{count} indirme istemcisi seçildi", + "CountIndexersSelected": "{count} dizin oluşturucu seçildi", + "AuthenticationRequiredWarning": "Kimlik doğrulaması olmadan uzaktan erişimi engellemek için, {appName}'da artık kimlik doğrulamanın etkinleştirilmesini gerektiriyor. İsteğe bağlı olarak yerel adresler için kimlik doğrulamayı devre dışı bırakabilirsiniz.", + "Clone": "Klon", + "Category": "Kategori", + "AppUpdated": "{appName} Güncellendi", + "AppUpdatedVersion": "{appName}, `{version}` sürümüne güncellendi; en son değişikliklerin etkin olabilmesi için {appName} uygulamasını yeniden başlatmanız gerekli", + "ApplicationUrlHelpText": "Bu uygulamanın http(s)://, bağlantı noktası ve URL tabanını içeren harici URL'si", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Yeni şifreyi onayla", + "AuthenticationRequiredPasswordHelpTextWarning": "Yeni şifre girin", + "AuthenticationRequiredUsernameHelpTextWarning": "Yeni kullanıcı adınızı girin", + "ConnectionLostToBackend": "{appName}'ın arka uçla bağlantısı kesildi ve işlevselliğin geri kazanılması için yeniden yüklenmesi gerekecek.", + "BlackholeFolderHelpText": "{appName} uygulamasının {extension} dosyasını depolayacağı klasör", + "AuthenticationMethod": "Kimlik Doğrulama Yöntemi", + "AuthenticationMethodHelpTextWarning": "Lütfen geçerli bir kimlik doğrulama yöntemi seçin", + "AuthenticationRequiredHelpText": "İstekler için Kimlik doğrulamanın gereklilik ayarını değiştirin. Riskleri anlamadığınız sürece değiştirmeyin.", + "CustomFilter": "Özel Filtre" } From cc85060b1b2d6b44b31c4644f87a79910ad147df Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 3 Mar 2024 12:11:15 +0200 Subject: [PATCH 474/964] Bump version to 1.14.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 24b22d3c9..94c2a905a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.14.1' + majorVersion: '1.14.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From a25e79031f263764c2402370588b4f16a5b64109 Mon Sep 17 00:00:00 2001 From: Louis R Date: Sun, 3 Mar 2024 06:20:36 +0100 Subject: [PATCH 475/964] Fixed: Don't disable IPv6 in IPv6-only Environment (cherry picked from commit 13af6f57796e54c3949cf340e03f020e6f8575c4) --- .../Http/Dispatchers/ManagedHttpDispatcher.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index 1c22f9d16..2720681cb 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -1,8 +1,10 @@ using System; using System.Diagnostics; using System.IO; +using System.Linq; using System.Net; using System.Net.Http; +using System.Net.NetworkInformation; using System.Net.Security; using System.Net.Sockets; using System.Text; @@ -275,6 +277,18 @@ namespace NzbDrone.Common.Http.Dispatchers return _credentialCache.Get("credentialCache", () => new CredentialCache()); } + private static bool HasRoutableIPv4Address() + { + // Get all IPv4 addresses from all interfaces and return true if there are any with non-loopback addresses + var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + + return networkInterfaces.Any(ni => + ni.OperationalStatus == OperationalStatus.Up && + ni.GetIPProperties().UnicastAddresses.Any(ip => + ip.Address.AddressFamily == AddressFamily.InterNetwork && + !IPAddress.IsLoopback(ip.Address))); + } + private static async ValueTask onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken) { // Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way. @@ -298,10 +312,8 @@ namespace NzbDrone.Common.Http.Dispatchers } catch { - // very naively fallback to ipv4 permanently for this execution based on the response of the first connection attempt. - // note that this may cause users to eventually get switched to ipv4 (on a random failure when they are switching networks, for instance) - // but in the interest of keeping this implementation simple, this is acceptable. - useIPv6 = false; + // Do not retry IPv6 if a routable IPv4 address is available, otherwise continue to attempt IPv6 connections. + useIPv6 = !HasRoutableIPv4Address(); } finally { From 882152b9117aadd621d1b248a36a233e5abc0527 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 4 Mar 2024 15:26:23 +0200 Subject: [PATCH 476/964] Use proxied requests for indexers --- src/NzbDrone.Core/Indexers/Definitions/Anidub.cs | 9 ++++++--- src/NzbDrone.Core/Indexers/Definitions/Animedia.cs | 9 ++++++--- .../Indexers/Definitions/GazelleGames.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs | 9 ++++++--- .../Definitions/TorrentRss/TorrentRssIndexer.cs | 2 +- .../Definitions/TorrentRss/TorrentRssParserFactory.cs | 11 ++++++----- .../TorrentRss/TorrentRssSettingsDetector.cs | 11 ++++++----- 7 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Anidub.cs b/src/NzbDrone.Core/Indexers/Definitions/Anidub.cs index 010b37bc9..26dabda0d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Anidub.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Anidub.cs @@ -18,6 +18,7 @@ using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.ThingiProvider; namespace NzbDrone.Core.Indexers.Definitions { @@ -43,7 +44,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IParseIndexerResponse GetParser() { - return new AnidubParser(Settings, Capabilities.Categories, RateLimit, _httpClient, _logger); + return new AnidubParser(Definition, Settings, Capabilities.Categories, RateLimit, _httpClient, _logger); } protected override async Task DoLogin() @@ -244,6 +245,7 @@ namespace NzbDrone.Core.Indexers.Definitions public class AnidubParser : IParseIndexerResponse { + private readonly ProviderDefinition _definition; private readonly UserPassTorrentBaseSettings _settings; private readonly IndexerCapabilitiesCategories _categories; private readonly TimeSpan _rateLimit; @@ -270,8 +272,9 @@ namespace NzbDrone.Core.Indexers.Definitions { "/anons_ongoing", "12" } }; - public AnidubParser(UserPassTorrentBaseSettings settings, IndexerCapabilitiesCategories categories, TimeSpan rateLimit, IIndexerHttpClient httpClient, Logger logger) + public AnidubParser(ProviderDefinition definition, UserPassTorrentBaseSettings settings, IndexerCapabilitiesCategories categories, TimeSpan rateLimit, IIndexerHttpClient httpClient, Logger logger) { + _definition = definition; _settings = settings; _categories = categories; _rateLimit = rateLimit; @@ -479,7 +482,7 @@ namespace NzbDrone.Core.Indexers.Definitions .Build(); var releaseIndexerRequest = new IndexerRequest(releaseRequest); - var releaseResponse = new IndexerResponse(releaseIndexerRequest, _httpClient.Execute(releaseIndexerRequest.HttpRequest)); + var releaseResponse = new IndexerResponse(releaseIndexerRequest, _httpClient.ExecuteProxied(releaseIndexerRequest.HttpRequest, _definition)); // Throw common http errors here before we try to parse if (releaseResponse.HttpResponse.HasHttpError) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs b/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs index 8d08c03b3..9f898b1f9 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Animedia.cs @@ -14,6 +14,7 @@ using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.ThingiProvider; namespace NzbDrone.Core.Indexers.Definitions { @@ -40,7 +41,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IParseIndexerResponse GetParser() { - return new AnimediaParser(Settings, Capabilities.Categories, RateLimit, _httpClient); + return new AnimediaParser(Definition, Settings, Capabilities.Categories, RateLimit, _httpClient); } private IndexerCapabilities SetCapabilities() @@ -144,6 +145,7 @@ namespace NzbDrone.Core.Indexers.Definitions public class AnimediaParser : IParseIndexerResponse { + private readonly ProviderDefinition _definition; private readonly NoAuthTorrentBaseSettings _settings; private readonly IndexerCapabilitiesCategories _categories; private readonly TimeSpan _rateLimit; @@ -157,8 +159,9 @@ namespace NzbDrone.Core.Indexers.Definitions private static readonly Regex CategorieOVARegex = new Regex(@"ОВА|OVA|ОНА|ONA|Special", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex CategorieDoramaRegex = new Regex(@"Дорама", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public AnimediaParser(NoAuthTorrentBaseSettings settings, IndexerCapabilitiesCategories categories, TimeSpan rateLimit, IIndexerHttpClient httpClient) + public AnimediaParser(ProviderDefinition definition, NoAuthTorrentBaseSettings settings, IndexerCapabilitiesCategories categories, TimeSpan rateLimit, IIndexerHttpClient httpClient) { + _definition = definition; _settings = settings; _categories = categories; _rateLimit = rateLimit; @@ -311,7 +314,7 @@ namespace NzbDrone.Core.Indexers.Definitions .Build(); var releaseIndexerRequest = new IndexerRequest(releaseRequest); - var releaseResponse = new IndexerResponse(releaseIndexerRequest, _httpClient.Execute(releaseIndexerRequest.HttpRequest)); + var releaseResponse = new IndexerResponse(releaseIndexerRequest, _httpClient.ExecuteProxied(releaseIndexerRequest.HttpRequest, _definition)); // Throw common http errors here before we try to parse if (releaseResponse.HttpResponse.HasHttpError) diff --git a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs index d85733965..0599be0d6 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs @@ -205,7 +205,7 @@ namespace NzbDrone.Core.Indexers.Definitions .AddQueryParam("request", "quick_user") .Build(); - var indexResponse = await _httpClient.ExecuteAsync(request).ConfigureAwait(false); + var indexResponse = await _httpClient.ExecuteProxiedAsync(request, Definition).ConfigureAwait(false); var index = Json.Deserialize(indexResponse.Content); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs b/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs index 000475db1..43793770f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Shazbat.cs @@ -19,6 +19,7 @@ using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; namespace NzbDrone.Core.Indexers.Definitions; @@ -50,7 +51,7 @@ public class Shazbat : TorrentIndexerBase public override IParseIndexerResponse GetParser() { - return new ShazbatParser(Settings, RateLimit, _httpClient, _logger); + return new ShazbatParser(Definition, Settings, RateLimit, _httpClient, _logger); } protected override async Task DoLogin() @@ -202,6 +203,7 @@ public class ShazbatRequestGenerator : IIndexerRequestGenerator public class ShazbatParser : IParseIndexerResponse { + private readonly ProviderDefinition _definition; private readonly ShazbatSettings _settings; private readonly TimeSpan _rateLimit; private readonly IIndexerHttpClient _httpClient; @@ -210,8 +212,9 @@ public class ShazbatParser : IParseIndexerResponse private readonly Regex _torrentInfoRegex = new (@"\((?\d+)\):(?\d+) \/ :(?\d+)$", RegexOptions.Compiled); private readonly HashSet _hdResolutions = new () { "1080p", "1080i", "720p" }; - public ShazbatParser(ShazbatSettings settings, TimeSpan rateLimit, IIndexerHttpClient httpClient, Logger logger) + public ShazbatParser(ProviderDefinition definition, ShazbatSettings settings, TimeSpan rateLimit, IIndexerHttpClient httpClient, Logger logger) { + _definition = definition; _settings = settings; _rateLimit = rateLimit; _httpClient = httpClient; @@ -272,7 +275,7 @@ public class ShazbatParser : IParseIndexerResponse _logger.Debug("Downloading Feed " + showRequest.ToString()); var releaseRequest = new IndexerRequest(showRequest); - var releaseResponse = new IndexerResponse(releaseRequest, _httpClient.Execute(releaseRequest.HttpRequest)); + var releaseResponse = new IndexerResponse(releaseRequest, _httpClient.ExecuteProxied(releaseRequest.HttpRequest, _definition)); if (releaseResponse.HttpResponse.Content.ContainsIgnoreCase("sign in now")) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssIndexer.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssIndexer.cs index fff80eba4..52af639b0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssIndexer.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssIndexer.cs @@ -32,7 +32,7 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentRss public override IParseIndexerResponse GetParser() { - return _torrentRssParserFactory.GetParser(Settings); + return _torrentRssParserFactory.GetParser(Settings, Definition); } public override IEnumerable DefaultDefinitions diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssParserFactory.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssParserFactory.cs index 5f5926a83..0a0e963ba 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssParserFactory.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssParserFactory.cs @@ -3,12 +3,13 @@ using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Serializer; using NzbDrone.Core.Indexers.Exceptions; +using NzbDrone.Core.ThingiProvider; namespace NzbDrone.Core.Indexers.Definitions.TorrentRss { public interface ITorrentRssParserFactory { - TorrentRssParser GetParser(TorrentRssIndexerSettings settings); + TorrentRssParser GetParser(TorrentRssIndexerSettings settings, ProviderDefinition definition); } public class TorrentRssParserFactory : ITorrentRssParserFactory @@ -26,10 +27,10 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentRss _logger = logger; } - public TorrentRssParser GetParser(TorrentRssIndexerSettings indexerSettings) + public TorrentRssParser GetParser(TorrentRssIndexerSettings indexerSettings, ProviderDefinition definition) { var key = indexerSettings.ToJson(); - var parserSettings = _settingsCache.Get(key, () => DetectParserSettings(indexerSettings), TimeSpan.FromDays(7)); + var parserSettings = _settingsCache.Get(key, () => DetectParserSettings(indexerSettings, definition), TimeSpan.FromDays(7)); if (parserSettings.UseEZTVFormat) { @@ -51,9 +52,9 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentRss }; } - private TorrentRssIndexerParserSettings DetectParserSettings(TorrentRssIndexerSettings indexerSettings) + private TorrentRssIndexerParserSettings DetectParserSettings(TorrentRssIndexerSettings indexerSettings, ProviderDefinition definition) { - var settings = _torrentRssSettingsDetector.Detect(indexerSettings); + var settings = _torrentRssSettingsDetector.Detect(indexerSettings, definition); if (settings == null) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssSettingsDetector.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssSettingsDetector.cs index 919b0c338..e1d1c2316 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssSettingsDetector.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentRss/TorrentRssSettingsDetector.cs @@ -9,28 +9,29 @@ using NzbDrone.Common.Http; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.ThingiProvider; namespace NzbDrone.Core.Indexers.Definitions.TorrentRss { public interface ITorrentRssSettingsDetector { - TorrentRssIndexerParserSettings Detect(TorrentRssIndexerSettings settings); + TorrentRssIndexerParserSettings Detect(TorrentRssIndexerSettings settings, ProviderDefinition definition); } public class TorrentRssSettingsDetector : ITorrentRssSettingsDetector { private const long ValidSizeThreshold = 2 * 1024 * 1024; - private readonly IHttpClient _httpClient; + private readonly IIndexerHttpClient _httpClient; private readonly Logger _logger; - public TorrentRssSettingsDetector(IHttpClient httpClient, Logger logger) + public TorrentRssSettingsDetector(IIndexerHttpClient httpClient, Logger logger) { _httpClient = httpClient; _logger = logger; } - public TorrentRssIndexerParserSettings Detect(TorrentRssIndexerSettings settings) + public TorrentRssIndexerParserSettings Detect(TorrentRssIndexerSettings settings, ProviderDefinition definition) { _logger.Debug("Evaluating TorrentRss feed '{0}'", settings.BaseUrl); @@ -43,7 +44,7 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentRss try { - httpResponse = _httpClient.Execute(request.HttpRequest); + httpResponse = _httpClient.ExecuteProxied(request.HttpRequest, definition); } catch (Exception ex) { From b3738f1602ce8600daffaad71ca806bc731f41f2 Mon Sep 17 00:00:00 2001 From: Helvio Pedreschi Date: Thu, 7 Mar 2024 20:29:50 -0500 Subject: [PATCH 477/964] Fixed: WebApp functionality on Apple devices (cherry picked from commit c7dd7abf892eead7796fcc482aa2f2aabaf88712) --- frontend/src/index.ejs | 9 ++++++--- frontend/src/login.html | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/frontend/src/index.ejs b/frontend/src/index.ejs index 6d08e7746..5efc89448 100644 --- a/frontend/src/index.ejs +++ b/frontend/src/index.ejs @@ -3,13 +3,16 @@ - - - + + + + + + diff --git a/frontend/src/login.html b/frontend/src/login.html index dcfb23140..4ce1031eb 100644 --- a/frontend/src/login.html +++ b/frontend/src/login.html @@ -3,13 +3,16 @@ - - + + + + + From 2ebabd69b59811053abef865fe7c5a8038782aba Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 8 Mar 2024 09:06:00 +0000 Subject: [PATCH 478/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Jason54 Co-authored-by: Mark Martines Co-authored-by: Maxence Winandy Co-authored-by: Stevie Robinson Co-authored-by: Weblate Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 4 +- src/NzbDrone.Core/Localization/Core/el.json | 2 +- src/NzbDrone.Core/Localization/Core/es.json | 89 ++++++----- src/NzbDrone.Core/Localization/Core/fi.json | 9 +- src/NzbDrone.Core/Localization/Core/fr.json | 156 ++++++++++++++++++-- src/NzbDrone.Core/Localization/Core/ko.json | 2 +- src/NzbDrone.Core/Localization/Core/nl.json | 19 +-- src/NzbDrone.Core/Localization/Core/pt.json | 6 +- 8 files changed, 214 insertions(+), 73 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 63d138579..8b94c431f 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -38,7 +38,7 @@ "AudioSearch": "Audio Suche", "Auth": "Authentifizierung", "Authentication": "Authentifizierung", - "AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich.", + "AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich", "Automatic": "Automatisch", "AutomaticSearch": "Automatische Suche", "Backup": "Sicherung", @@ -533,7 +533,7 @@ "AuthenticationMethodHelpTextWarning": "Bitte wähle eine gültige Authentifizierungsmethode aus", "AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen", - "DefaultNameCopiedProfile": "{Name} – Kopieren", + "DefaultNameCopiedProfile": "{name} – Kopieren", "AuthenticationMethod": "Authentifizierungsmethode", "Clone": "Klonen", "CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 1557ff105..a172110ec 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -515,7 +515,7 @@ "EditConnectionImplementation": "Προσθήκη", "EditApplicationImplementation": "Προσθήκη", "AddApplicationImplementation": "Προσθήκη", - "AddConnectionImplementation": "Προσθήκη", + "AddConnectionImplementation": "Προσθήκη - {implementationName}", "AddIndexerImplementation": "Προσθήκη", "EditIndexerProxyImplementation": "Προσθήκη", "CountApplicationsSelected": "Επιλέχθηκαν {0} συλλογές" diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 053dd1f66..513603fac 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -22,7 +22,7 @@ "Clear": "Borrar", "BackupNow": "Hacer copia de seguridad ahora", "Backup": "Copia de seguridad", - "AppDataLocationHealthCheckMessage": "No será posible actualizar para prevenir la eliminación de AppData al Actualizar", + "AppDataLocationHealthCheckMessage": "No será posible actualizar para evitar la eliminación de AppData al actualizar", "Analytics": "Analíticas", "All": "Todo", "About": "Acerca de", @@ -31,7 +31,7 @@ "UpdateCheckUINotWritableMessage": "No se puede instalar la actualización porque la carpeta UI '{0}' no tiene permisos de escritura para el usuario '{1}'.", "UpdateCheckStartupTranslocationMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' está en una carpeta de \"App Translocation\".", "UpdateCheckStartupNotWritableMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' no tiene permisos de escritura para el usuario '{1}'.", - "UnselectAll": "Deseleccionar Todo", + "UnselectAll": "Desmarcar todo", "UI": "UI", "Tasks": "Tareas", "Tags": "Etiquetas", @@ -39,15 +39,15 @@ "Style": "Estilo", "Status": "Estado", "Sort": "Ordenar", - "ShowAdvanced": "Mostrar Avanzado", + "ShowAdvanced": "Mostrar avanzado", "Settings": "Ajustes", - "SetTags": "Poner Etiquetas", - "SelectAll": "Seleccionar Todas", + "SetTags": "Establecer etiquetas", + "SelectAll": "Seleccionar todo", "Security": "Seguridad", "Search": "Buscar", "Scheduled": "Programado", - "SaveChanges": "Guardar Cambios", - "RestoreBackup": "Recuperar Backup", + "SaveChanges": "Guardar cambios", + "RestoreBackup": "Restaurar copia de seguridad", "ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de {appName}, no recibirás actualizaciones", "Refresh": "Actualizar", "Queue": "Cola", @@ -66,7 +66,7 @@ "Added": "Añadido", "Actions": "Acciones", "UISettingsSummary": "Fecha, idioma, y opciones de color deteriorado", - "TagsSettingsSummary": "Ver todas las etiquetas y cómo se usan. Las etiquetas no utilizadas se pueden eliminar", + "TagsSettingsSummary": "Vea todas las etiquetas y cómo se usan. Las etiquetas sin usar pueden ser eliminadas", "Size": "Tamaño", "ReleaseStatus": "Estado del Estreno", "Protocol": "Protocolo", @@ -86,10 +86,10 @@ "Type": "Tipo", "Title": "Título", "Time": "Tiempo", - "TestAll": "Testear Todo", - "Test": "Test", + "TestAll": "Probar todo", + "Test": "Prueba", "TableOptionsColumnsMessage": "Escoger qué columnas son visibles y en que orden aparecerán", - "TableOptions": "Opciones de Tabla", + "TableOptions": "Opciones de tabla", "Source": "Fuente", "Shutdown": "Apagar", "Seeders": "Semillas", @@ -115,16 +115,16 @@ "Apply": "Aplicar", "Age": "Antigüedad", "SystemTimeCheckMessage": "El reloj del sistema está retrasado más de un día. Las tareas de mantenimiento no se ejecutarán correctamente hasta que se haya corregido", - "UnsavedChanges": "Cambios no guardados", - "ShowSearchHelpText": "Mostrar botón de búsqueda al pasar el cursor por encima", - "ShowSearch": "Mostrar Búsqueda", + "UnsavedChanges": "Cambios sin guardar", + "ShowSearchHelpText": "Muestra el botón de búsqueda al pasar por encima", + "ShowSearch": "Mostrar búsqueda", "SettingsTimeFormat": "Formato de Hora", "SettingsShowRelativeDatesHelpText": "Mostrar fechas relativas (Hoy/Ayer/etc) o absolutas", "SettingsShowRelativeDates": "Mostrar Fechas Relativas", "SettingsShortDateFormat": "Formato Corto de Fecha", "SettingsLongDateFormat": "Formato Largo de Fecha", - "PendingChangesStayReview": "Permanecer y revisar cambios", - "PendingChangesMessage": "Hay cambios sin salvar, estás seguro de que quieres salir de esta página?", + "PendingChangesStayReview": "Quedarse y revisar cambios", + "PendingChangesMessage": "Tienes cambios sin guardar. ¿Estás seguro que quieres salir de esta página?", "PendingChangesDiscardChanges": "Descartar cambios y salir", "SettingsEnableColorImpairedModeHelpText": "Estilo modificado para permitir que usuarios con problemas de color distingan mejor la información codificada por colores", "SettingsEnableColorImpairedMode": "Activar Modo De Color Degradado", @@ -160,45 +160,45 @@ "AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de {appName}. Esto incluye información sobre su navegador, qué páginas de {appName} WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.", "YesCancel": "Sí, Cancelar", "Version": "Versión", - "Username": "Nombre de usuario", - "UseProxy": "Usar el Proxy", + "Username": "Usuario", + "UseProxy": "Usar proxy", "Usenet": "Usenet", - "UrlBaseHelpText": "Para soporte de reverse proxy, vacio por defecto", + "UrlBaseHelpText": "Para soporte de proxy inverso, por defecto está vacío", "URLBase": "URL Base", "Uptime": "Tiempo de actividad", - "UpdateScriptPathHelpText": "Ruta del script propio que toma el paquete de actualización y se encarga del proceso de actualización restante", + "UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización", "UpdateMechanismHelpText": "Usar el actualizador incorporado de {appName} o un script", - "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Se podrán instalar desde Sistema: Actualizaciones también", + "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones", "UnableToLoadTags": "No se pueden cargar las Etiquetas", "UnableToLoadNotifications": "No se pueden cargar las Notificaciones", "DownloadClientsLoadError": "No se puden cargar los gestores de descargas", "UISettings": "Ajustes del UI", "Torrents": "Torrents", - "TestAllClients": "Comprobar Todos los Gestores", + "TestAllClients": "Probar todos los clientes", "TagsHelpText": "Se aplica a películas con al menos una etiqueta coincidente", "SuggestTranslationChange": "Sugerir un cambio en la traducción", "StartupDirectory": "Directorio de Arranque", "SSLPort": "Puerto SSL", "SSLCertPath": "Ruta del Certificado SSL", "SSLCertPassword": "Contraseña del Certificado SSL", - "SendAnonymousUsageData": "Enviar Datos de Uso Anónimamente", - "ScriptPath": "Ruta del Script", + "SendAnonymousUsageData": "Enviar datos de uso anónimos", + "ScriptPath": "Ruta del script", "Retention": "Retención", "Result": "Resultado", - "RestartRequiredHelpTextWarning": "Requiere reiniciar para que surta efecto", + "RestartRequiredHelpTextWarning": "Requiere reiniciar para que tenga efecto", "RestartProwlarr": "Reiniciar {appName}", - "RestartNow": "Reiniciar Ahora", - "ResetAPIKey": "Reajustar API", + "RestartNow": "Reiniciar ahora", + "ResetAPIKey": "Restablecer clave API", "Reset": "Reiniciar", "RemoveFilter": "Eliminar filtro", "RemovedFromTaskQueue": "Eliminar de la cola de tareas", "RefreshMovie": "Actualizar película", "ReadTheWikiForMoreInformation": "Lee la Wiki para más información", - "ProxyUsernameHelpText": "Tienes que introducir tu nombre de usuario y contraseña sólo si son requeridos. Si no, déjalos vacios.", - "ProxyType": "Tipo de Proxy", - "ProxyPasswordHelpText": "Tienes que introducir tu nombre de usuario y contraseña sólo si son requeridos. Si no, déjalos vacios.", - "ProxyBypassFilterHelpText": "Usa ',' como separador, y '*.' como wildcard para subdominios", - "PortNumber": "Número de Puerto", + "ProxyUsernameHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.", + "ProxyType": "Tipo de proxy", + "ProxyPasswordHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.", + "ProxyBypassFilterHelpText": "Usa ',' como separador, y '*.' como comodín para subdominios", + "PortNumber": "Número de puerto", "Port": "Puerto", "Password": "Contraseña", "PageSizeHelpText": "Número de elementos por página", @@ -224,12 +224,12 @@ "EnableAutomaticSearch": "Habilitar Búsqueda Automática", "ConnectSettings": "Conectar Ajustes", "BindAddress": "Dirección de Ligado", - "OpenBrowserOnStart": "Abrir navegador al arrancar", + "OpenBrowserOnStart": "Abrir navegador al inicio", "OnHealthIssueHelpText": "En Problema de Salud", "TagCannotBeDeletedWhileInUse": "No se puede eliminar estando en uso", "SSLCertPathHelpText": "Ruta al archivo pfx", "SSLCertPasswordHelpText": "Contraseña para el archivo pfx", - "RssIsNotSupportedWithThisIndexer": "RSS no son soportadas por este indexer", + "RssIsNotSupportedWithThisIndexer": "RSS no está soportado con este indexador", "RemovingTag": "Eliminando etiqueta", "Manual": "Manual", "LogLevelTraceHelpTextWarning": "El registro de seguimiento sólo debe activarse temporalmente", @@ -248,7 +248,7 @@ "UnableToLoadUISettings": "No se han podido cargar los ajustes de UI", "UnableToLoadHistory": "No se ha podido cargar la historia", "UnableToLoadGeneralSettings": "No se han podido cargar los ajustes Generales", - "UnableToLoadBackups": "No se han podido cargar las copias de seguridad", + "UnableToLoadBackups": "No se pudo cargar las copias de seguridad", "UnableToAddANewNotificationPleaseTryAgain": "No se ha podido añadir una nueva notificación, prueba otra vez.", "UnableToAddANewIndexerPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.", "UnableToAddANewDownloadClientPleaseTryAgain": "No se ha podido añadir un nuevo gestor de descargas, prueba otra vez.", @@ -299,7 +299,7 @@ "Presets": "Preajustes", "Rss": "RSS", "Today": "Hoy", - "Tomorrow": "mañana", + "Tomorrow": "Mañana", "Torrent": "Torrents", "UnableToAddANewIndexerProxyPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.", "Wiki": "Wiki", @@ -321,10 +321,10 @@ "HistoryCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática", "HistoryCleanupDaysHelpTextWarning": "Los archivos en la papelera de reciclaje más antiguos que el número de días seleccionado serán limpiados automáticamente", "OnGrab": "Al Capturar lanzamiento", - "OnHealthIssue": "En Problema de Salud", - "TestAllIndexers": "Comprobar Todos los Indexers", + "OnHealthIssue": "Al haber un problema de salud", + "TestAllIndexers": "Probar todos los indexadores", "NotificationTriggersHelpText": "Selecciona qué eventos deberían disparar esta notificación", - "OnApplicationUpdate": "Al Actualizar La Aplicación", + "OnApplicationUpdate": "Al actualizar la aplicación", "OnApplicationUpdateHelpText": "Al Actualizar La Aplicación", "AddRemoveOnly": "Sólo añadir y eliminar", "AddedToDownloadClient": "Descarga añadida al cliente", @@ -422,7 +422,7 @@ "DisabledForLocalAddresses": "Deshabilitado para Direcciones Locales", "External": "Externo", "None": "Ninguno", - "ResetAPIKeyMessageText": "¿Está seguro de que desea restablecer su clave API?", + "ResetAPIKeyMessageText": "¿Estás seguro que quieres restablecer tu clave API?", "EditIndexerProxyImplementation": "Editar Proxy de Indexador - { implementationName}", "AppUpdated": "{appName} Actualizado", "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName}", @@ -614,5 +614,12 @@ "IndexerSettingsPasskey": "Clave de Acceso", "BlackholeFolderHelpText": "La carpeta en donde {appName} se almacenaran los {extension} file", "CustomFilter": "Filtros personalizados", - "LabelIsRequired": "Se requiere etiqueta" + "LabelIsRequired": "Se requiere etiqueta", + "TorrentBlackholeSaveMagnetFiles": "Guardar archivos magnet", + "TorrentBlackholeTorrentFolder": "Carpeta de torrent", + "UseSsl": "Usar SSL", + "UsenetBlackholeNzbFolder": "Carpeta Nzb", + "TorrentBlackholeSaveMagnetFilesHelpText": "Guarda el enlace magnet si no hay ningún archivo .torrent disponible (útil solo si el cliente de descarga soporta magnets guardados en un archivo)", + "SecretToken": "Token secreto", + "TorrentBlackholeSaveMagnetFilesExtension": "Guardar extensión de archivos magnet" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 9e77be6eb..73d673c59 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -45,7 +45,7 @@ "Refresh": "Päivitä", "RefreshMovie": "Päivitä elokuva", "ReleaseBranchCheckOfficialBranchMessage": "\"{0}\" ei ole kelvollinen {appName}-julkaisuhaara ja tämän vuoksi et saa päivityksiä.", - "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", + "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii in uudelleenkäynnistyksen.", "Result": "Tulos", "Settings": "Asetukset", "SettingsLongDateFormat": "Pitkän päiväyksen esitys", @@ -56,7 +56,6 @@ "UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.", "Enable": "Käytä", "UI": "Käyttöliittymä", - "UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.", "Usenet": "Usenet", "BackupNow": "Varmuuskopioi nyt", "NoBackupsAreAvailable": "Varmuuskopioita ei ole käytettävissä", @@ -71,7 +70,7 @@ "NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.", "ApplyTags": "Tunnistetoimenpide", "Authentication": "Tunnistautuminen", - "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.", + "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana", "BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.", "Close": "Sulje", "DeleteNotification": "Poista ilmoitus", @@ -168,7 +167,7 @@ "Size": "Koko", "Sort": "Järjestys", "UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.", - "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.", + "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää", "UnableToLoadHistory": "Historian lataus epäonnistui.", "UnableToLoadNotifications": "Virhe ladattaessa kytköksiä", "UnableToLoadTags": "Tunnisteiden lataus ei onnistu", @@ -227,7 +226,7 @@ "BeforeUpdate": "Ennen päivitystä", "BindAddress": "Sidososoite", "Branch": "Haara", - "BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara.", + "BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara", "BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.", "BypassProxyForLocalAddresses": "Ohjaa paikalliset osoitteet välityspalvelimen ohi", "Cancel": "Peruuta", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index fba04313e..4b3ca312e 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -146,7 +146,7 @@ "ApplyTags": "Appliquer les étiquettes", "AppDataDirectory": "Dossier AppData", "ApiKey": "Clé API", - "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de {appName}. Cela inclut des informations sur votre navigateur, quelle page {appName} WebUI vous utilisez, les rapports d'erreurs, ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.", + "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs aux serveurs de {appName}. Cela inclut des informations sur votre navigateur, les pages de l'interface Web de {appName} que vous utilisez, les rapports d'erreurs ainsi que le système d'exploitation et la version d'exécution. Nous utiliserons ces informations pour prioriser les fonctionnalités et les corrections de bugs.", "IgnoredAddresses": "Adresses ignorées", "Hostname": "Nom d'hôte", "GeneralSettings": "Réglages généraux", @@ -162,13 +162,13 @@ "DeleteNotification": "Supprimer la notification", "DeleteDownloadClient": "Supprimer le client de téléchargement", "DeleteBackup": "Supprimer la sauvegarde", - "DatabaseMigration": "Migration de la base de données", + "DatabaseMigration": "Migration des bases de données", "ConnectSettings": "Paramètres de connexion", - "BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de {appName}", + "BackupFolderHelpText": "Les chemins d'accès relatifs se trouvent dans le répertoire AppData de {appName}", "IllRestartLater": "Je redémarrerai plus tard", "CancelPendingTask": "Êtes-vous sur de vouloir annuler cette tâche en attente ?", "BranchUpdateMechanism": "Branche utilisée par le mécanisme de mise à jour extérieur", - "BranchUpdate": "Branche à utiliser pour mettre {appName} à jour", + "BranchUpdate": "Branche à utiliser pour mettre à jour {appName}", "BeforeUpdate": "Avant la mise à jour", "DeleteDownloadClientMessageText": "Voulez-vous supprimer le client de téléchargement « {name} » ?", "DeleteBackupMessageText": "Voulez-vous supprimer la sauvegarde « {name} » ?", @@ -222,7 +222,7 @@ "TagsHelpText": "S'applique aux indexeurs avec au moins une étiquette correspondante", "StartTypingOrSelectAPathBelow": "Commencer à écrire ou sélectionner un chemin ci-dessous", "NoTagsHaveBeenAddedYet": "Aucune identification n'a été ajoutée pour l'instant", - "IndexerFlags": "Indicateurs d'indexeur", + "IndexerFlags": "Drapeaux de l'indexeur", "DeleteTagMessageText": "Voulez-vous vraiment supprimer l'étiquette '{label}' ?", "UISettings": "Paramètres UI", "UILanguageHelpTextWarning": "Rechargement du navigateur requis", @@ -302,7 +302,7 @@ "SettingsFilterSentryEvents": "Filtrer les événements d'analyse", "SettingsConsoleLogLevel": "Niveau de journalisation de la console", "SearchIndexers": "Recherche indexeurs", - "IndexerRss": "Indexeur Rss", + "IndexerRss": "Indexeur RSS", "IndexerQuery": "Requête indexeur", "IndexerObsoleteCheckMessage": "Les indexeurs sont obsolètes ou ont été mis à jour : {0}. Veuillez supprimer et (ou) rajouter à {appName}", "IndexerHealthCheckNoIndexers": "Aucun indexeur activé, {appName} ne renverra pas de résultats de recherche", @@ -345,7 +345,7 @@ "Donations": "Dons", "Enabled": "Activé", "Grabs": "Complétés", - "Id": "Id", + "Id": "ID", "Presets": "Préconfigurations", "Privacy": "Visibilité", "Query": "Requête", @@ -482,7 +482,7 @@ "Author": "Auteur", "AverageResponseTimesMs": "Temps de réponse moyen des indexeurs (ms)", "IndexerFailureRate": "Taux d'échec de l'indexeur", - "Label": "Libellé", + "Label": "Étiquette", "More": "Plus", "Publisher": "Éditeur", "Season": "Saison", @@ -593,9 +593,9 @@ "ActiveIndexers": "Indexeurs actifs", "ActiveApps": "Applications actives", "AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur", - "Clone": "Cloner", + "Clone": "Dupliquer", "PackSeedTime": "Temps de Seed", - "ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes", + "ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes. Si aucune étiquette n'est listée ici, aucun indexeur ne sera empêché de se synchroniser en raison de ses étiquettes.", "OnHealthRestored": "Sur la santé restaurée", "OnHealthRestoredHelpText": "Sur la santé restaurée", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe", @@ -605,5 +605,139 @@ "DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)", "DownloadClientAriaSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement par défaut Aria2", - "ManageClients": "Gérer les clients" + "ManageClients": "Gérer les clients", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Ajoute un préfixe à l'URL json du déluge, voir {url}", + "Destination": "Cible", + "Directory": "Dossier", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "Dossier partagé dans lequel placer les téléchargements (facultatif), laissez vide pour utiliser l'emplacement par défaut de Download Station", + "CustomFilter": "Filtre personnalisé", + "NotificationsEmailSettingsUseEncryption": "Utiliser le cryptage", + "NotificationsEmailSettingsUseEncryptionHelpText": "Préférer utiliser le cryptage s'il est configuré sur le serveur, toujours utiliser le cryptage via SSL (port 465 uniquement) ou StartTLS (tout autre port) ou ne jamais utiliser le cryptage", + "IndexerHDBitsSettingsPasskeyHelpText": "Clé d'accès à partir des détails de l'utilisateur", + "NoApplicationsFound": "Aucune application trouvée", + "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Exclure les communiqués de SCENE des résultats", + "IndexerAlphaRatioSettingsExcludeScene": "Exclure SCENE", + "IndexerBeyondHDSettingsLimitedOnly": "Limité seulement", + "IndexerBeyondHDSettingsRssKeyHelpText": "Clé RSS du site (trouvée dans My Security => Clé RSS)", + "IndexerFileListSettingsUsernameHelpText": "Nom d'utilisateur du site", + "IndexerFileListSettingsPasskeyHelpText": "Site Passkey (Il s'agit de la chaîne alphanumérique dans l'url du tracker affichée dans votre client de téléchargement)", + "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Doit avoir les permissions Utilisateur et Torrents", + "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Rechercher des publications par nom de groupe", + "IndexerHDBitsSettingsMediums": "Supports", + "IndexerHDBitsSettingsMediumsHelpText": "Si elle n'est pas spécifiée, toutes les options sont utilisées.", + "IndexerHDBitsSettingsUsernameHelpText": "Nom d'utilisateur du site", + "IndexerIPTorrentsSettingsCookieUserAgent": "Cookie User-Agent", + "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent associé au cookie utilisé par le navigateur", + "IndexerNewznabSettingsAdditionalParametersHelpText": "Paramètres supplémentaires de Newznab", + "IndexerNebulanceSettingsApiKeyHelpText": "Clé API à partir de Paramètres de l'utilisateur > Clés API. La clé doit avoir les permissions Liste et Téléchargement", + "IndexerNewznabSettingsApiKeyHelpText": "Clé API du site", + "IndexerNewznabSettingsVipExpirationHelpText": "Entrez la date (yyyy-mm-dd) pour l'expiration du VIP ou vide, {appName} notifiera 1 semaine après l'expiration du VIP", + "IndexerRedactedSettingsApiKeyHelpText": "Clé API du site (dans Paramètres => Paramètres d'accès)", + "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement", + "IndexerSettingsAdditionalParameters": "Paramètres supplémentaires", + "IndexerSettingsApiPathHelpText": "Chemin d'accès à l'api, généralement {url}", + "IndexerSettingsApiUser": "Utilisateur de l'API", + "IndexerSettingsAppsMinimumSeeders": "Apps avec le nombre minimum de seeders disponibles", + "IndexerSettingsFreeleechOnly": "Freeleech seulement", + "IndexerSettingsGrabLimit": "Limite de saisie", + "IndexerSettingsQueryLimit": "Limite de requête", + "IndexerSettingsQueryLimitHelpText": "Le nombre de requêtes maximales tel que spécifié par l'unité respective que {appName} autorisera au site", + "IndexerSettingsRssKey": "Clé RSS", + "IndexerSettingsSeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement. Le ratio doit être d'au moins 1.0 et suivre les règles des indexeurs", + "IndexerSettingsSeedTime": "Temps d'envoie", + "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Clé API du site", + "BlackholeFolderHelpText": "Dossier dans lequel {appName} stockera le fichier {extension}", + "DefaultCategory": "Catégorie par défaut", + "DownloadClientFloodSettingsAdditionalTags": "Étiquette supplémentaire", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "Ajoute les propriétés des médias sous forme d'étiquette. Les conseils sont des exemples.", + "DownloadClientFreeboxSettingsApiUrl": "URL DE L'API", + "DownloadClientFreeboxSettingsApiUrlHelpText": "Définir l'URL de base de l'API Freebox avec la version de l'API, par exemple '{url}', par défaut '{defaultApiUrl}'", + "DownloadClientFloodSettingsTagsHelpText": "Étiquettes initiales d'un téléchargement. Pour être reconnu, un téléchargement doit avoir toutes les étiquettes initiales. Cela permet d'éviter les conflits avec des téléchargements non apparentés.", + "DownloadClientFloodSettingsUrlBaseHelpText": "Ajoute d'un préfixe à l'API Flood, tel que {url}", + "DownloadClientFreeboxSettingsPortHelpText": "Port utilisé pour accéder à l'interface de la Freebox, la valeur par défaut est '{port}'", + "DownloadClientNzbgetSettingsAddPausedHelpText": "Cette option nécessite au moins la version 16.0 de NzbGet", + "DownloadClientPneumaticSettingsNzbFolder": "Dossier Nzb", + "DownloadClientFreeboxSettingsAppTokenHelpText": "Le jeton de l'application récupéré lors de la création de l'accès à l'API Freebox (c'est-à-dire 'app_token')", + "DownloadClientFreeboxSettingsHostHelpText": "Nom d'hôte ou adresse IP de la Freebox, par défaut '{url}' (ne fonctionnera que si elle est sur le même réseau)", + "DownloadClientSettingsInitialState": "État initial", + "DownloadClientSettingsPriorityItemHelpText": "Priorité à utiliser lors de la saisie des articles", + "DownloadClientSettingsUrlBaseHelpText": "Ajoute un préfixe à l'url {clientName}, tel que {url}", + "DownloadClientSettingsUseSslHelpText": "Utiliser une connexion sécurisée lors de la connexion à {clientName}", + "DownloadClientSettingsInitialStateHelpText": "État initial pour les torrents ajoutés à {clientName}", + "DownloadClientTransmissionSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement de transmission par défaut", + "DownloadClientTransmissionSettingsUrlBaseHelpText": "Ajoute un préfixe à l'url rpc de {clientName}, par exemple {url}, la valeur par défaut étant '{defaultUrl}'", + "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement", + "IndexerBeyondHDSettingsApiKeyHelpText": "Clé API du site (dans My Security => Clé API)", + "IndexerBeyondHDSettingsRefundOnly": "Remboursement uniquement", + "IndexerBeyondHDSettingsRefundOnlyHelpText": "Recherche de remboursement seulement", + "IndexerBeyondHDSettingsRewindOnly": "Rembobiner seulement", + "IndexerBeyondHDSettingsRewindOnlyHelpText": "Recherche en arrière uniquement", + "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement", + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Recherche de freeleech uniquement (UL limitée)", + "IndexerBeyondHDSettingsSearchTypesHelpText": "Sélectionnez les types de rejets qui vous intéressent. Si aucune option n'est sélectionnée, toutes les options sont utilisées.", + "IndexerFileListSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement", + "IndexerGazelleGamesSettingsApiKeyHelpText": "Clé API du site (dans Paramètres => Paramètres d'accès)", + "IndexerBeyondHDSettingsSearchTypes": "Types de recherche", + "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Afficher uniquement les versions freeleech", + "IndexerHDBitsSettingsOrigins": "Origines", + "IndexerHDBitsSettingsCodecs": "Codecs", + "IndexerHDBitsSettingsCodecsHelpText": "Si elle n'est pas spécifiée, toutes les options sont utilisées.", + "IndexerHDBitsSettingsUseFilenamesHelpText": "Cochez cette option si vous souhaitez utiliser les noms de fichiers des torrents comme titres de publication", + "IndexerNzbIndexSettingsApiKeyHelpText": "Clé API du site", + "IndexerOrpheusSettingsApiKeyHelpText": "Clé API du site (dans Paramètres => Paramètres d'accès)", + "IndexerPassThePopcornSettingsApiKeyHelpText": "Clé API du site", + "IndexerPassThePopcornSettingsApiUserHelpText": "Ces paramètres se trouvent dans les paramètres de sécurité de PassThePopcorn (Modifier le profil > Sécurité).", + "IndexerSettingsGrabLimitHelpText": "Le nombre de prises maximales tel que spécifié par l'unité respective que {appName} autorisera sur le site", + "IndexerSettingsLimitsUnit": "Limites d'unité", + "IndexerSettingsCookie": "Cookie", + "IndexerSettingsCookieHelpText": "Cookie du site", + "IndexerSettingsSeedTimeHelpText": "Durée pendant laquelle un torrent doit être envoyé avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement", + "IndexerSettingsSeedRatio": "Ratio d'envoie", + "IndexerSettingsVipExpiration": "Expiration de la carte VIP", + "SecretToken": "Jeton secret", + "TorrentBlackholeSaveMagnetFiles": "Enregistrer les fichiers magnétiques", + "TorrentBlackholeSaveMagnetFilesExtension": "Sauvegarde des fichiers magnétiques Extension", + "UsenetBlackholeNzbFolder": "Dossier Nzb", + "XmlRpcPath": "Chemin d'accès XML RPC", + "IndexerSettingsPackSeedTimeIndexerHelpText": "Durée pendant laquelle un torrent de pack (saison ou discographie) doit être diffusé avant de s'arrêter, vide est la valeur par défaut de l'application", + "TorrentBlackholeSaveMagnetFilesHelpText": "Enregistrer le lien magnétique si aucun fichier .torrent n'est disponible (utile uniquement si le client de téléchargement prend en charge les liens magnétiques enregistrés dans un fichier)", + "IndexerId": "ID de l'indexeur", + "DownloadClientFreeboxSettingsAppId": "ID de l'application", + "DownloadClientFreeboxSettingsAppToken": "Jeton d'application", + "DownloadClientPneumaticSettingsNzbFolderHelpText": "Ce dossier devra être accessible depuis XBMC", + "DownloadClientPneumaticSettingsStrmFolder": "Dossier Strm", + "DownloadClientPneumaticSettingsStrmFolderHelpText": "Les fichiers .strm contenus dans ce dossier seront importés par drone", + "DownloadClientQbittorrentSettingsFirstAndLastFirst": "Premier et dernier premiers", + "DownloadClientQbittorrentSettingsInitialStateHelpText": "État initial des torrents ajoutés à qBittorrent. Notez que les torrents forcés ne respectent pas les restrictions relatives aux seeds", + "DownloadClientQbittorrentSettingsSequentialOrder": "Ordre séquentiel", + "DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Téléchargement dans l'ordre séquentiel (qBittorrent 4.1.0+)", + "DownloadClientRTorrentSettingsAddStoppedHelpText": "L'activation ajoutera des torrents et des magnets à rTorrent dans un état d'arrêt. Cela peut endommager les fichiers magnétiques.", + "DownloadClientRTorrentSettingsUrlPath": "Chemin d'url", + "DownloadClientRTorrentSettingsUrlPathHelpText": "Chemin d'accès au point de terminaison XMLRPC, voir {url}. Il s'agit généralement de RPC2 ou de [chemin vers ruTorrent]{url2} lors de l'utilisation de ruTorrent.", + "DownloadClientRTorrentSettingsAddStopped": "Ajout arrêté", + "DownloadClientSettingsAddPaused": "Ajout en pause", + "DownloadClientSettingsDefaultCategoryHelpText": "Catégorie de secours par défaut si aucune catégorie mappée n'existe pour une version. L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée.", + "DownloadClientSettingsDestinationHelpText": "Spécifie manuellement la destination du téléchargement, laisser vide pour utiliser la destination par défaut", + "IndexerGazelleGamesSettingsSearchGroupNames": "Recherche de noms de groupes", + "IndexerHDBitsSettingsOriginsHelpText": "Si elle n'est pas spécifiée, toutes les options sont utilisées.", + "IndexerHDBitsSettingsUseFilenames": "Utiliser les noms de fichiers", + "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement", + "IndexerSettingsApiPath": "Chemin d'accès à l'API", + "IndexerSettingsAppsMinimumSeedersHelpText": "Nombre minimum de seeders requis par les applications pour que l'indexeur s'en saisisse, vide est la valeur par défaut du profil Sync", + "IndexerSettingsBaseUrl": "Url de base", + "IndexerSettingsBaseUrlHelpText": "Sélectionnez l'url de base que {appName} utilisera pour les requêtes vers le site", + "IndexerSettingsLimitsUnitHelpText": "L'unité de temps pour le comptage des limites par indexeur", + "IndexerSettingsPackSeedTime": "Temps de seed du pack", + "IndexerSettingsPasskey": "Clé de passage", + "LabelIsRequired": "L'étiquette est requise", + "DownloadClientFreeboxSettingsAppIdHelpText": "L'ID de l'application donné lors de la création de l'accès à l'API Freebox (c'est-à-dire 'app_id')", + "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Télécharger d'abord le premier et le dernier morceau (qBittorrent 4.1.0+)", + "DownloadClientQbittorrentSettingsUseSslHelpText": "Utilisez une connexion sécurisée. Voir Options -> UI Web -> 'Utiliser HTTPS au lieu de HTTP' dans qBittorrent.", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.", + "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extension à utiliser pour les liens magnétiques, la valeur par défaut est '.magnet'", + "TorrentBlackholeTorrentFolder": "Dossier Torrent", + "UseSsl": "Utiliser SSL", + "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeter les hachages de torrents bloqués lors de la saisie", + "DownloadClientRTorrentSettingsDirectoryHelpText": "Emplacement facultatif dans lequel placer les téléchargements. Laisser vide pour utiliser l'emplacement par défaut de rTorrent", + "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Catégorie de secours par défaut si aucune catégorie mappée n'existe pour une version. L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée. Crée un sous-répertoire [catégorie] dans le répertoire de sortie." } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 2033ae2c3..30e331cff 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -118,7 +118,7 @@ "Torrents": "급류", "Type": "유형", "DeleteApplicationMessageText": "알림 '{0}'을(를) 삭제하시겠습니까?", - "AuthenticationMethodHelpText": "{appName}에 액세스하려면 사용자 이름 및 암호 필요", + "AuthenticationMethodHelpText": "{appName}에 접근하려면 사용자 이름과 암호가 필요합니다", "BackupFolderHelpText": "상대 경로는 {appName}의 AppData 디렉토리에 있습니다.", "Branch": "분기", "BranchUpdate": "{appName} 업데이트에 사용할 분기", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 5e827be89..76a959559 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -24,7 +24,7 @@ "AnalyticsEnabledHelpText": "Stuur anonieme gebruiks- en foutinformatie naar de servers van {appName}. Dit omvat informatie over uw browser, welke {appName} WebUI pagina's u gebruikt, foutrapportage en OS en runtime versie. We zullen deze informatie gebruiken om prioriteiten te stellen voor functies en het verhelpen van fouten.", "ApiKey": "API-sleutel", "ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {0} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand", - "AppDataDirectory": "AppData folder", + "AppDataDirectory": "AppData map", "AppDataLocationHealthCheckMessage": "Updaten zal niet mogelijk zijn om het verwijderen van AppData te voorkomen", "AppProfileInUse": "App-profiel in gebruik", "AppProfileSelectHelpText": "App-profielen worden gebruikt om de instellingen voor RSS, Automatisch zoeken en Interactief zoeken bij applicatiesynchronisatie te beheren", @@ -47,7 +47,7 @@ "Backup": "Veiligheidskopie", "BackupFolderHelpText": "Relatieve paden zullen t.o.v. de {appName} AppData map bekeken worden", "BackupIntervalHelpText": "Tussentijd voor automatische back-up", - "BackupNow": "Nu backup nemen", + "BackupNow": "Back-up nu maken", "BackupRetentionHelpText": "Automatische veiligheidskopieën ouder dan de retentie periode zullen worden opgeruimd", "Backups": "Veiligheidskopieën", "BeforeUpdate": "Voor Update", @@ -96,9 +96,9 @@ "DeleteIndexerProxy": "Indexeerproxy verwijderen", "DeleteIndexerProxyMessageText": "Weet u zeker dat u de proxy '{0}' wilt verwijderen?", "DeleteNotification": "Verwijder Notificatie", - "DeleteNotificationMessageText": "Bent u zeker dat u de notificatie '{0}' wilt verwijderen?", + "DeleteNotificationMessageText": "Weet je zeker dat je de notificatie ‘{name}’ wil verwijderen?", "DeleteTag": "Verwijder Tag", - "DeleteTagMessageText": "Bent u zeker dat u de tag '{0}' wilt verwijderen?", + "DeleteTagMessageText": "Weet je zeker dat je de tag '{label}' wil verwijderen?", "Description": "Beschrijving", "Details": "Details", "DevelopmentSettings": "Ontwikkelingsinstellingen", @@ -116,11 +116,11 @@ "Edit": "Bewerk", "EditIndexer": "Bewerk Indexeerder", "EditSyncProfile": "Synchronisatieprofiel toevoegen", - "Enable": "Activeer", - "EnableAutomaticSearch": "Activeer Automatisch Zoeken", + "Enable": "Inschakelen", + "EnableAutomaticSearch": "Schakel automatisch zoeken in", "EnableAutomaticSearchHelpText": "Zal worden gebruikt wanneer automatische zoekopdrachten worden uitgevoerd via de gebruikersinterface of door {appName}", "EnableIndexer": "Indexer inschakelen", - "EnableInteractiveSearch": "Activeer Interactief Zoeken", + "EnableInteractiveSearch": "Schakel interactief zoeken in", "EnableInteractiveSearchHelpText": "Zal worden gebruikt wanneer interactief zoeken wordt gebruikt", "EnableRss": "RSS inschakelen", "EnableRssHelpText": "Rss-feed voor Indexer inschakelen", @@ -402,7 +402,7 @@ "UpdateCheckStartupNotWritableMessage": "Kan de update niet installeren omdat de map '{0}' niet schrijfbaar is voor de gebruiker '{1}'.", "UpdateCheckStartupTranslocationMessage": "Kan de update niet installeren omdat de map '{0}' zich in een 'App Translocation' map bevindt.", "UpdateCheckUINotWritableMessage": "Kan de update niet installeren omdat de UI map '{0}' niet schrijfbaar is voor de gebruiker '{1}'.", - "UpdateMechanismHelpText": "Gebruik het ingebouwde updatemechanisme of een extern script", + "UpdateMechanismHelpText": "Gebruik de ingebouwde updater van {appName} of een script", "UpdateScriptPathHelpText": "Pad naar een aangepast script dat een uitgepakt updatepakket accepteert en de rest van het updateproces afhandelt", "Updates": "Updates", "Uptime": "Bedrijfstijd", @@ -483,5 +483,6 @@ "AuthenticationRequiredUsernameHelpTextWarning": "Voeg een nieuwe gebruikersnaam in", "AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.", "Episode": "aflevering", - "CountApplicationsSelected": "{count} Collectie(s) geselecteerd" + "CountApplicationsSelected": "{count} Collectie(s) geselecteerd", + "BlackholeFolderHelpText": "De map waarin {appName} het {extension} bestand opslaat" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index f5d3cf07f..8cfd4fde4 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -420,7 +420,7 @@ "ApplyTagsHelpTextRemove": "Remover: eliminar as etiquetas adicionadas", "DeleteSelectedDownloadClients": "Eliminar cliente de transferências", "DeleteSelectedApplicationsMessageText": "Tem a certeza que quer eliminar as {count} aplicações seleccionadas?", - "DeleteSelectedDownloadClientsMessageText": "Tem a certeza que quer eliminar os {count} clientes de transferência seleccionados?", + "DeleteSelectedDownloadClientsMessageText": "Tem a certeza de que pretende eliminar o(s) cliente(s) de {count} transferência selecionado(s)?", "DeleteSelectedIndexersMessageText": "Tem a certeza que quer eliminar os {count} indexadores seleccionados?", "DownloadClientPriorityHelpText": "Priorizar múltiplos clientes de transferências. Utilizaremos round robin para clientes com a mesma prioridade.", "More": "Mais", @@ -433,8 +433,8 @@ "Track": "Rastreio", "UpdateAvailable": "Nova atualização disponível", "Label": "Rótulo", - "ConnectionLostReconnect": "O Radarr tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.", - "ConnectionLostToBackend": "O Radarr perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.", + "ConnectionLostReconnect": "O {appName} tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.", + "ConnectionLostToBackend": "O {appName} perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.", "WhatsNew": "O que há de novo?", "RecentChanges": "Mudanças recentes", "minutes": "Minutos", From 2ac996c9f96c4a056144d5b67affeb488ea449b5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Mar 2024 09:07:12 +0200 Subject: [PATCH 479/964] Bump version to 1.14.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 94c2a905a..21aeb3ffb 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.14.2' + majorVersion: '1.14.3' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From dc0edb7bc181e68cc77a3c9ed0b983a54f725ac5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Mar 2024 13:36:25 +0200 Subject: [PATCH 480/964] Bump YamlDotNet, AngleSharp, BenchmarkDotNet --- src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj | 2 +- src/NzbDrone.Core/Prowlarr.Core.csproj | 4 ++-- src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj index dbfd06861..c792eca51 100644 --- a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 275d74c11..4645bc246 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -21,8 +21,8 @@ - - + + diff --git a/src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj b/src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj index 8935c3616..1559caafc 100644 --- a/src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj +++ b/src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj @@ -6,7 +6,7 @@ - + From 7f8c1ace147f96a34503e4ce04559b9046a19310 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 11 Mar 2024 10:28:05 +0200 Subject: [PATCH 481/964] Replace special chars in search term with wildcard for RuTracker --- .../Indexers/Definitions/RuTracker.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs index 648062479..aefd4ab2d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs @@ -1467,27 +1467,27 @@ namespace NzbDrone.Core.Indexers.Definitions public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { - return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories); + return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories); } public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) { - return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories); + return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories); } public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) { - return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories, searchCriteria.Season ?? 0); + return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories, searchCriteria.Season ?? 0); } public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) { - return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories); + return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories); } public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) { - return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories); + return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories); } private IndexerPageableRequestChain GetPageableRequests(string searchTerm, int[] categories, int season = 0) @@ -1525,8 +1525,10 @@ namespace NzbDrone.Core.Indexers.Definitions } else { - // use the normal search + // replace any space, special char, etc. with % (wildcard) + searchString = new Regex("[^a-zA-Zа-яА-ЯёЁ0-9]+").Replace(searchString, "%"); searchString = searchString.Replace("-", " "); + if (season != 0) { searchString += " Сезон: " + season; From 17ff86aaea2f2db8a5610efe54b329a6b3137be7 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 1 Aug 2021 13:17:03 -0700 Subject: [PATCH 482/964] Fixes: Missing default path for Download Station (cherry picked from commit 4bf3ab1511b4ea25642476bf9df13f91b6f73d76) Closes #2062 --- .../Clients/DownloadStation/TorrentDownloadStation.cs | 9 +++++---- .../Clients/DownloadStation/UsenetDownloadStation.cs | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs index 17cf57246..482e86e30 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs @@ -308,14 +308,15 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { return Settings.TvDirectory.TrimStart('/'); } - else if (Settings.Category.IsNotNullOrWhiteSpace()) - { - var destDir = GetDefaultDir(); + var destDir = GetDefaultDir(); + + if (destDir.IsNotNullOrWhiteSpace() && Settings.Category.IsNotNullOrWhiteSpace()) + { return $"{destDir.TrimEnd('/')}/{Settings.Category}"; } - return null; + return destDir.TrimEnd('/'); } protected override string AddFromTorrentLink(TorrentInfo release, string hash, string torrentLink) diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs index 562d6d975..4661c6518 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs @@ -274,14 +274,15 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { return Settings.TvDirectory.TrimStart('/'); } - else if (Settings.Category.IsNotNullOrWhiteSpace()) - { - var destDir = GetDefaultDir(); + var destDir = GetDefaultDir(); + + if (destDir.IsNotNullOrWhiteSpace() && Settings.Category.IsNotNullOrWhiteSpace()) + { return $"{destDir.TrimEnd('/')}/{Settings.Category}"; } - return null; + return destDir.TrimEnd('/'); } protected override string AddFromLink(ReleaseInfo release) From 96d2d61fa0261199805978ae4ee5f400a0a35356 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 12 Mar 2024 23:17:14 +0200 Subject: [PATCH 483/964] Add download clients notice about sync to applications --- .../DownloadClients/DownloadClients.js | 92 +++++++++++-------- src/NzbDrone.Core/Localization/Core/en.json | 2 + 2 files changed, 54 insertions(+), 40 deletions(-) diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClients.js b/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClients.js index 2fb887074..51f390d4f 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClients.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/DownloadClients.js @@ -1,10 +1,11 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import Alert from 'Components/Alert'; import Card from 'Components/Card'; import FieldSet from 'Components/FieldSet'; import Icon from 'Components/Icon'; import PageSectionContent from 'Components/Page/PageSectionContent'; -import { icons } from 'Helpers/Props'; +import { icons, kinds } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import AddDownloadClientModal from './AddDownloadClientModal'; import DownloadClient from './DownloadClient'; @@ -59,48 +60,59 @@ class DownloadClients extends Component { } = this.state; return ( -
- -
- { - items.map((item) => { - return ( - - ); - }) - } - - -
- -
-
+
+ +
+ {translate('ProwlarrDownloadClientsAlert')}
+
+ {translate('ProwlarrDownloadClientsInAppOnlyAlert')} +
+
- +
+ +
+ { + items.map((item) => { + return ( + + ); + }) + } - - -
+ +
+ +
+
+
+ + + + + +
+
); } } diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 8dc2ce311..a91ad1efb 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -521,6 +521,8 @@ "Privacy": "Privacy", "Private": "Private", "Protocol": "Protocol", + "ProwlarrDownloadClientsAlert": "If you intend to do searches directly within {appName}, you need to add Download Clients. Otherwise, you do not need to add them here. For searches from your Apps, the download clients configured there are used instead.", + "ProwlarrDownloadClientsInAppOnlyAlert": "Download clients are for {appName} in-app searches only and do not sync to apps. There are no plans to add any such functionality.", "ProwlarrSupportsAnyDownloadClient": "{appName} supports any of the download clients listed below.", "ProwlarrSupportsAnyIndexer": "{appName} supports many indexers in addition to any indexer that uses the Newznab/Torznab standard using 'Generic Newznab' (for usenet) or 'Generic Torznab' (for torrents). Search & Select your indexer from below.", "Proxies": "Proxies", From 30fd7c8c2a9a669a2966989f8875df2b0257cc68 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Mar 2024 15:52:20 +0200 Subject: [PATCH 484/964] Fix stylelint command in package.json Co-authored-by: Mark McDowall --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f15e6f5f..25d923a7b 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint": "eslint --config frontend/.eslintrc.js --ignore-path frontend/.eslintignore frontend/", "lint-fix": "yarn lint --fix", "stylelint-linux": "stylelint $(find frontend -name '*.css') --config frontend/.stylelintrc", - "stylelint-windows": "stylelint frontend/**/*.css --config frontend/.stylelintrc", + "stylelint-windows": "stylelint \"frontend/**/*.css\" --config frontend/.stylelintrc", "check-modules": "are-you-es5 check . -r" }, "repository": "https://github.com/Prowlarr/Prowlarr", From 218371a318f35b3562d0e129ca85a8f5b48a8db7 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 12 Mar 2024 22:34:47 -0700 Subject: [PATCH 485/964] Convert Queued Tasks to TS (cherry picked from commit 6d552f2a60f44052079b5e8944f5e1bbabac56e0) --- frontend/src/Commands/Command.ts | 1 - .../src/Helpers/Hooks/useModalOpenState.ts | 17 ++ .../src/System/Tasks/Queued/QueuedTaskRow.css | 9 - .../Tasks/Queued/QueuedTaskRow.css.d.ts | 2 - .../src/System/Tasks/Queued/QueuedTaskRow.js | 279 ------------------ .../src/System/Tasks/Queued/QueuedTaskRow.tsx | 238 +++++++++++++++ .../Tasks/Queued/QueuedTaskRowConnector.js | 31 -- .../Tasks/Queued/QueuedTaskRowNameCell.css | 8 + .../Queued/QueuedTaskRowNameCell.css.d.ts | 8 + .../Tasks/Queued/QueuedTaskRowNameCell.tsx | 32 ++ .../src/System/Tasks/Queued/QueuedTasks.js | 90 ------ .../src/System/Tasks/Queued/QueuedTasks.tsx | 74 +++++ .../Tasks/Queued/QueuedTasksConnector.js | 46 --- frontend/src/System/Tasks/Tasks.js | 4 +- src/NzbDrone.Core/Localization/Core/en.json | 2 + 15 files changed, 381 insertions(+), 460 deletions(-) create mode 100644 frontend/src/Helpers/Hooks/useModalOpenState.ts delete mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRow.js create mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx delete mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRowConnector.js create mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css create mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts create mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx delete mode 100644 frontend/src/System/Tasks/Queued/QueuedTasks.js create mode 100644 frontend/src/System/Tasks/Queued/QueuedTasks.tsx delete mode 100644 frontend/src/System/Tasks/Queued/QueuedTasksConnector.js diff --git a/frontend/src/Commands/Command.ts b/frontend/src/Commands/Command.ts index 45a5beed7..b9b31bf63 100644 --- a/frontend/src/Commands/Command.ts +++ b/frontend/src/Commands/Command.ts @@ -12,7 +12,6 @@ export interface CommandBody { lastStartTime: string; trigger: string; suppressMessages: boolean; - seriesId?: number; } interface Command extends ModelBase { diff --git a/frontend/src/Helpers/Hooks/useModalOpenState.ts b/frontend/src/Helpers/Hooks/useModalOpenState.ts new file mode 100644 index 000000000..f5b5a96f0 --- /dev/null +++ b/frontend/src/Helpers/Hooks/useModalOpenState.ts @@ -0,0 +1,17 @@ +import { useCallback, useState } from 'react'; + +export default function useModalOpenState( + initialState: boolean +): [boolean, () => void, () => void] { + const [isOpen, setOpen] = useState(initialState); + + const setModalOpen = useCallback(() => { + setOpen(true); + }, [setOpen]); + + const setModalClosed = useCallback(() => { + setOpen(false); + }, [setOpen]); + + return [isOpen, setModalOpen, setModalClosed]; +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.css b/frontend/src/System/Tasks/Queued/QueuedTaskRow.css index 034804711..6e38929c9 100644 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRow.css +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRow.css @@ -10,15 +10,6 @@ width: 100%; } -.commandName { - display: inline-block; - min-width: 220px; -} - -.userAgent { - color: #b0b0b0; -} - .queued, .started, .ended { diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.css.d.ts b/frontend/src/System/Tasks/Queued/QueuedTaskRow.css.d.ts index 3bc00b738..2c6010533 100644 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRow.css.d.ts +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRow.css.d.ts @@ -2,14 +2,12 @@ // Please do not change this file! interface CssExports { 'actions': string; - 'commandName': string; 'duration': string; 'ended': string; 'queued': string; 'started': string; 'trigger': string; 'triggerContent': string; - 'userAgent': string; } export const cssExports: CssExports; export default cssExports; diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.js b/frontend/src/System/Tasks/Queued/QueuedTaskRow.js deleted file mode 100644 index 917bfa11a..000000000 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRow.js +++ /dev/null @@ -1,279 +0,0 @@ -import moment from 'moment'; -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import Icon from 'Components/Icon'; -import IconButton from 'Components/Link/IconButton'; -import ConfirmModal from 'Components/Modal/ConfirmModal'; -import TableRowCell from 'Components/Table/Cells/TableRowCell'; -import TableRow from 'Components/Table/TableRow'; -import { icons, kinds } from 'Helpers/Props'; -import formatDate from 'Utilities/Date/formatDate'; -import formatDateTime from 'Utilities/Date/formatDateTime'; -import formatTimeSpan from 'Utilities/Date/formatTimeSpan'; -import titleCase from 'Utilities/String/titleCase'; -import translate from 'Utilities/String/translate'; -import styles from './QueuedTaskRow.css'; - -function getStatusIconProps(status, message) { - const title = titleCase(status); - - switch (status) { - case 'queued': - return { - name: icons.PENDING, - title - }; - - case 'started': - return { - name: icons.REFRESH, - isSpinning: true, - title - }; - - case 'completed': - return { - name: icons.CHECK, - kind: kinds.SUCCESS, - title: message === 'Completed' ? title : `${title}: ${message}` - }; - - case 'failed': - return { - name: icons.FATAL, - kind: kinds.DANGER, - title: `${title}: ${message}` - }; - - default: - return { - name: icons.UNKNOWN, - title - }; - } -} - -function getFormattedDates(props) { - const { - queued, - started, - ended, - showRelativeDates, - shortDateFormat - } = props; - - if (showRelativeDates) { - return { - queuedAt: moment(queued).fromNow(), - startedAt: started ? moment(started).fromNow() : '-', - endedAt: ended ? moment(ended).fromNow() : '-' - }; - } - - return { - queuedAt: formatDate(queued, shortDateFormat), - startedAt: started ? formatDate(started, shortDateFormat) : '-', - endedAt: ended ? formatDate(ended, shortDateFormat) : '-' - }; -} - -class QueuedTaskRow extends Component { - - // - // Lifecycle - - constructor(props, context) { - super(props, context); - - this.state = { - ...getFormattedDates(props), - isCancelConfirmModalOpen: false - }; - - this._updateTimeoutId = null; - } - - componentDidMount() { - this.setUpdateTimer(); - } - - componentDidUpdate(prevProps) { - const { - queued, - started, - ended - } = this.props; - - if ( - queued !== prevProps.queued || - started !== prevProps.started || - ended !== prevProps.ended - ) { - this.setState(getFormattedDates(this.props)); - } - } - - componentWillUnmount() { - if (this._updateTimeoutId) { - this._updateTimeoutId = clearTimeout(this._updateTimeoutId); - } - } - - // - // Control - - setUpdateTimer() { - this._updateTimeoutId = setTimeout(() => { - this.setState(getFormattedDates(this.props)); - this.setUpdateTimer(); - }, 30000); - } - - // - // Listeners - - onCancelPress = () => { - this.setState({ - isCancelConfirmModalOpen: true - }); - }; - - onAbortCancel = () => { - this.setState({ - isCancelConfirmModalOpen: false - }); - }; - - // - // Render - - render() { - const { - trigger, - commandName, - queued, - started, - ended, - status, - duration, - message, - clientUserAgent, - longDateFormat, - timeFormat, - onCancelPress - } = this.props; - - const { - queuedAt, - startedAt, - endedAt, - isCancelConfirmModalOpen - } = this.state; - - let triggerIcon = icons.QUICK; - - if (trigger === 'manual') { - triggerIcon = icons.INTERACTIVE; - } else if (trigger === 'scheduled') { - triggerIcon = icons.SCHEDULED; - } - - return ( - - - - - - - - - - - - {commandName} - - { - clientUserAgent ? - - from: {clientUserAgent} - : - null - } - - - - {queuedAt} - - - - {startedAt} - - - - {endedAt} - - - - {formatTimeSpan(duration)} - - - - { - status === 'queued' && - - } - - - - - ); - } -} - -QueuedTaskRow.propTypes = { - trigger: PropTypes.string.isRequired, - commandName: PropTypes.string.isRequired, - queued: PropTypes.string.isRequired, - started: PropTypes.string, - ended: PropTypes.string, - status: PropTypes.string.isRequired, - duration: PropTypes.string, - message: PropTypes.string, - clientUserAgent: PropTypes.string, - showRelativeDates: PropTypes.bool.isRequired, - shortDateFormat: PropTypes.string.isRequired, - longDateFormat: PropTypes.string.isRequired, - timeFormat: PropTypes.string.isRequired, - onCancelPress: PropTypes.func.isRequired -}; - -export default QueuedTaskRow; diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx b/frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx new file mode 100644 index 000000000..4511bcbf4 --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx @@ -0,0 +1,238 @@ +import moment from 'moment'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { CommandBody } from 'Commands/Command'; +import Icon from 'Components/Icon'; +import IconButton from 'Components/Link/IconButton'; +import ConfirmModal from 'Components/Modal/ConfirmModal'; +import TableRowCell from 'Components/Table/Cells/TableRowCell'; +import TableRow from 'Components/Table/TableRow'; +import useModalOpenState from 'Helpers/Hooks/useModalOpenState'; +import { icons, kinds } from 'Helpers/Props'; +import { cancelCommand } from 'Store/Actions/commandActions'; +import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; +import formatDate from 'Utilities/Date/formatDate'; +import formatDateTime from 'Utilities/Date/formatDateTime'; +import formatTimeSpan from 'Utilities/Date/formatTimeSpan'; +import titleCase from 'Utilities/String/titleCase'; +import translate from 'Utilities/String/translate'; +import QueuedTaskRowNameCell from './QueuedTaskRowNameCell'; +import styles from './QueuedTaskRow.css'; + +function getStatusIconProps(status: string, message: string | undefined) { + const title = titleCase(status); + + switch (status) { + case 'queued': + return { + name: icons.PENDING, + title, + }; + + case 'started': + return { + name: icons.REFRESH, + isSpinning: true, + title, + }; + + case 'completed': + return { + name: icons.CHECK, + kind: kinds.SUCCESS, + title: message === 'Completed' ? title : `${title}: ${message}`, + }; + + case 'failed': + return { + name: icons.FATAL, + kind: kinds.DANGER, + title: `${title}: ${message}`, + }; + + default: + return { + name: icons.UNKNOWN, + title, + }; + } +} + +function getFormattedDates( + queued: string, + started: string | undefined, + ended: string | undefined, + showRelativeDates: boolean, + shortDateFormat: string +) { + if (showRelativeDates) { + return { + queuedAt: moment(queued).fromNow(), + startedAt: started ? moment(started).fromNow() : '-', + endedAt: ended ? moment(ended).fromNow() : '-', + }; + } + + return { + queuedAt: formatDate(queued, shortDateFormat), + startedAt: started ? formatDate(started, shortDateFormat) : '-', + endedAt: ended ? formatDate(ended, shortDateFormat) : '-', + }; +} + +interface QueuedTimes { + queuedAt: string; + startedAt: string; + endedAt: string; +} + +export interface QueuedTaskRowProps { + id: number; + trigger: string; + commandName: string; + queued: string; + started?: string; + ended?: string; + status: string; + duration?: string; + message?: string; + body: CommandBody; + clientUserAgent?: string; +} + +export default function QueuedTaskRow(props: QueuedTaskRowProps) { + const { + id, + trigger, + commandName, + queued, + started, + ended, + status, + duration, + message, + body, + clientUserAgent, + } = props; + + const dispatch = useDispatch(); + const { longDateFormat, shortDateFormat, showRelativeDates, timeFormat } = + useSelector(createUISettingsSelector()); + + const updateTimeTimeoutId = useRef | null>( + null + ); + const [times, setTimes] = useState( + getFormattedDates( + queued, + started, + ended, + showRelativeDates, + shortDateFormat + ) + ); + + const [ + isCancelConfirmModalOpen, + openCancelConfirmModal, + closeCancelConfirmModal, + ] = useModalOpenState(false); + + const handleCancelPress = useCallback(() => { + dispatch(cancelCommand({ id })); + }, [id, dispatch]); + + useEffect(() => { + updateTimeTimeoutId.current = setTimeout(() => { + setTimes( + getFormattedDates( + queued, + started, + ended, + showRelativeDates, + shortDateFormat + ) + ); + }, 30000); + + return () => { + if (updateTimeTimeoutId.current) { + clearTimeout(updateTimeTimeoutId.current); + } + }; + }, [queued, started, ended, showRelativeDates, shortDateFormat, setTimes]); + + const { queuedAt, startedAt, endedAt } = times; + + let triggerIcon = icons.QUICK; + + if (trigger === 'manual') { + triggerIcon = icons.INTERACTIVE; + } else if (trigger === 'scheduled') { + triggerIcon = icons.SCHEDULED; + } + + return ( + + + + + + + + + + + + + {queuedAt} + + + + {startedAt} + + + + {endedAt} + + + + {formatTimeSpan(duration)} + + + + {status === 'queued' && ( + + )} + + + + + ); +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowConnector.js b/frontend/src/System/Tasks/Queued/QueuedTaskRowConnector.js deleted file mode 100644 index f55ab985a..000000000 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRowConnector.js +++ /dev/null @@ -1,31 +0,0 @@ -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import { cancelCommand } from 'Store/Actions/commandActions'; -import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; -import QueuedTaskRow from './QueuedTaskRow'; - -function createMapStateToProps() { - return createSelector( - createUISettingsSelector(), - (uiSettings) => { - return { - showRelativeDates: uiSettings.showRelativeDates, - shortDateFormat: uiSettings.shortDateFormat, - longDateFormat: uiSettings.longDateFormat, - timeFormat: uiSettings.timeFormat - }; - } - ); -} - -function createMapDispatchToProps(dispatch, props) { - return { - onCancelPress() { - dispatch(cancelCommand({ - id: props.id - })); - } - }; -} - -export default connect(createMapStateToProps, createMapDispatchToProps)(QueuedTaskRow); diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css new file mode 100644 index 000000000..41acb33f8 --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css @@ -0,0 +1,8 @@ +.commandName { + display: inline-block; + min-width: 220px; +} + +.userAgent { + color: #b0b0b0; +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts new file mode 100644 index 000000000..fc9081492 --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts @@ -0,0 +1,8 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'commandName': string; + 'userAgent': string; +} +export const cssExports: CssExports; +export default cssExports; diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx new file mode 100644 index 000000000..601a57242 --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { CommandBody } from 'Commands/Command'; +import TableRowCell from 'Components/Table/Cells/TableRowCell'; +import translate from 'Utilities/String/translate'; +import styles from './QueuedTaskRowNameCell.css'; + +export interface QueuedTaskRowNameCellProps { + commandName: string; + body: CommandBody; + clientUserAgent?: string; +} + +export default function QueuedTaskRowNameCell( + props: QueuedTaskRowNameCellProps +) { + const { commandName, clientUserAgent } = props; + + return ( + + {commandName} + + {clientUserAgent ? ( + + {translate('From')}: {clientUserAgent} + + ) : null} + + ); +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTasks.js b/frontend/src/System/Tasks/Queued/QueuedTasks.js deleted file mode 100644 index dac38f1d4..000000000 --- a/frontend/src/System/Tasks/Queued/QueuedTasks.js +++ /dev/null @@ -1,90 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import FieldSet from 'Components/FieldSet'; -import LoadingIndicator from 'Components/Loading/LoadingIndicator'; -import Table from 'Components/Table/Table'; -import TableBody from 'Components/Table/TableBody'; -import translate from 'Utilities/String/translate'; -import QueuedTaskRowConnector from './QueuedTaskRowConnector'; - -const columns = [ - { - name: 'trigger', - label: '', - isVisible: true - }, - { - name: 'commandName', - label: () => translate('Name'), - isVisible: true - }, - { - name: 'queued', - label: () => translate('Queued'), - isVisible: true - }, - { - name: 'started', - label: () => translate('Started'), - isVisible: true - }, - { - name: 'ended', - label: () => translate('Ended'), - isVisible: true - }, - { - name: 'duration', - label: () => translate('Duration'), - isVisible: true - }, - { - name: 'actions', - isVisible: true - } -]; - -function QueuedTasks(props) { - const { - isFetching, - isPopulated, - items - } = props; - - return ( -
- { - isFetching && !isPopulated && - - } - - { - isPopulated && - - - { - items.map((item) => { - return ( - - ); - }) - } - -
- } -
- ); -} - -QueuedTasks.propTypes = { - isFetching: PropTypes.bool.isRequired, - isPopulated: PropTypes.bool.isRequired, - items: PropTypes.array.isRequired -}; - -export default QueuedTasks; diff --git a/frontend/src/System/Tasks/Queued/QueuedTasks.tsx b/frontend/src/System/Tasks/Queued/QueuedTasks.tsx new file mode 100644 index 000000000..e79deed7c --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTasks.tsx @@ -0,0 +1,74 @@ +import React, { useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import AppState from 'App/State/AppState'; +import FieldSet from 'Components/FieldSet'; +import LoadingIndicator from 'Components/Loading/LoadingIndicator'; +import Table from 'Components/Table/Table'; +import TableBody from 'Components/Table/TableBody'; +import { fetchCommands } from 'Store/Actions/commandActions'; +import translate from 'Utilities/String/translate'; +import QueuedTaskRow from './QueuedTaskRow'; + +const columns = [ + { + name: 'trigger', + label: '', + isVisible: true, + }, + { + name: 'commandName', + label: () => translate('Name'), + isVisible: true, + }, + { + name: 'queued', + label: () => translate('Queued'), + isVisible: true, + }, + { + name: 'started', + label: () => translate('Started'), + isVisible: true, + }, + { + name: 'ended', + label: () => translate('Ended'), + isVisible: true, + }, + { + name: 'duration', + label: () => translate('Duration'), + isVisible: true, + }, + { + name: 'actions', + isVisible: true, + }, +]; + +export default function QueuedTasks() { + const dispatch = useDispatch(); + const { isFetching, isPopulated, items } = useSelector( + (state: AppState) => state.commands + ); + + useEffect(() => { + dispatch(fetchCommands()); + }, [dispatch]); + + return ( +
+ {isFetching && !isPopulated && } + + {isPopulated && ( + + + {items.map((item) => { + return ; + })} + +
+ )} +
+ ); +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTasksConnector.js b/frontend/src/System/Tasks/Queued/QueuedTasksConnector.js deleted file mode 100644 index 5fa4d9ead..000000000 --- a/frontend/src/System/Tasks/Queued/QueuedTasksConnector.js +++ /dev/null @@ -1,46 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import { fetchCommands } from 'Store/Actions/commandActions'; -import QueuedTasks from './QueuedTasks'; - -function createMapStateToProps() { - return createSelector( - (state) => state.commands, - (commands) => { - return commands; - } - ); -} - -const mapDispatchToProps = { - dispatchFetchCommands: fetchCommands -}; - -class QueuedTasksConnector extends Component { - - // - // Lifecycle - - componentDidMount() { - this.props.dispatchFetchCommands(); - } - - // - // Render - - render() { - return ( - - ); - } -} - -QueuedTasksConnector.propTypes = { - dispatchFetchCommands: PropTypes.func.isRequired -}; - -export default connect(createMapStateToProps, mapDispatchToProps)(QueuedTasksConnector); diff --git a/frontend/src/System/Tasks/Tasks.js b/frontend/src/System/Tasks/Tasks.js index 032dbede8..03a3b6ce4 100644 --- a/frontend/src/System/Tasks/Tasks.js +++ b/frontend/src/System/Tasks/Tasks.js @@ -2,7 +2,7 @@ import React from 'react'; import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; import translate from 'Utilities/String/translate'; -import QueuedTasksConnector from './Queued/QueuedTasksConnector'; +import QueuedTasks from './Queued/QueuedTasks'; import ScheduledTasksConnector from './Scheduled/ScheduledTasksConnector'; function Tasks() { @@ -10,7 +10,7 @@ function Tasks() { - + ); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index a91ad1efb..7c617ea04 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -175,6 +175,7 @@ "DisabledUntil": "Disabled Until", "Discord": "Discord", "Docker": "Docker", + "Donate": "Donate", "Donations": "Donations", "DownloadClient": "Download Client", "DownloadClientAriaSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Aria2 location", @@ -447,6 +448,7 @@ "MappedDrivesRunningAsService": "Mapped network drives are not available when running as a Windows Service. Please see the FAQ for more information", "MassEditor": "Mass Editor", "Mechanism": "Mechanism", + "Menu": "Menu", "Message": "Message", "MinimumSeeders": "Minimum Seeders", "MinimumSeedersHelpText": "Minimum seeders required by the Application for the indexer to grab", From e981cacbda6fab8b945ed51110efe10141ec8a09 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 13 Mar 2024 21:05:15 -0700 Subject: [PATCH 486/964] Fixed: Disabled select option still selectable (cherry picked from commit 063dba22a803295adee4fdcbe42718af3e85ca78) --- .../Form/AppProfileSelectInputConnector.js | 12 +++-- .../Form/AvailabilitySelectInput.js | 54 ------------------- .../src/Components/Form/FormInputGroup.js | 4 -- frontend/src/Helpers/Props/inputTypes.js | 2 - .../Select/Edit/EditIndexerModalContent.tsx | 2 +- .../ManageApplicationsEditModalContent.tsx | 2 +- .../ManageDownloadClientsEditModalContent.tsx | 2 +- src/NzbDrone.Core/Localization/Core/en.json | 1 + 8 files changed, 12 insertions(+), 67 deletions(-) delete mode 100644 frontend/src/Components/Form/AvailabilitySelectInput.js diff --git a/frontend/src/Components/Form/AppProfileSelectInputConnector.js b/frontend/src/Components/Form/AppProfileSelectInputConnector.js index 1aef10c30..ffc156484 100644 --- a/frontend/src/Components/Form/AppProfileSelectInputConnector.js +++ b/frontend/src/Components/Form/AppProfileSelectInputConnector.js @@ -24,16 +24,20 @@ function createMapStateToProps() { if (includeNoChange) { values.unshift({ key: 'noChange', - value: translate('NoChange'), - disabled: true + get value() { + return translate('NoChange'); + }, + isDisabled: true }); } if (includeMixed) { values.unshift({ key: 'mixed', - value: '(Mixed)', - disabled: true + get value() { + return `(${translate('Mixed')})`; + }, + isDisabled: true }); } diff --git a/frontend/src/Components/Form/AvailabilitySelectInput.js b/frontend/src/Components/Form/AvailabilitySelectInput.js deleted file mode 100644 index af9bdb2d6..000000000 --- a/frontend/src/Components/Form/AvailabilitySelectInput.js +++ /dev/null @@ -1,54 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import SelectInput from './SelectInput'; - -const availabilityOptions = [ - { key: 'announced', value: 'Announced' }, - { key: 'inCinemas', value: 'In Cinemas' }, - { key: 'released', value: 'Released' }, - { key: 'preDB', value: 'PreDB' } -]; - -function AvailabilitySelectInput(props) { - const values = [...availabilityOptions]; - - const { - includeNoChange, - includeMixed - } = props; - - if (includeNoChange) { - values.unshift({ - key: 'noChange', - value: 'No Change', - disabled: true - }); - } - - if (includeMixed) { - values.unshift({ - key: 'mixed', - value: '(Mixed)', - disabled: true - }); - } - - return ( - - ); -} - -AvailabilitySelectInput.propTypes = { - includeNoChange: PropTypes.bool.isRequired, - includeMixed: PropTypes.bool.isRequired -}; - -AvailabilitySelectInput.defaultProps = { - includeNoChange: false, - includeMixed: false -}; - -export default AvailabilitySelectInput; diff --git a/frontend/src/Components/Form/FormInputGroup.js b/frontend/src/Components/Form/FormInputGroup.js index a00f6f8de..cb14fd944 100644 --- a/frontend/src/Components/Form/FormInputGroup.js +++ b/frontend/src/Components/Form/FormInputGroup.js @@ -5,7 +5,6 @@ import { inputTypes, kinds } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import AppProfileSelectInputConnector from './AppProfileSelectInputConnector'; import AutoCompleteInput from './AutoCompleteInput'; -import AvailabilitySelectInput from './AvailabilitySelectInput'; import CaptchaInputConnector from './CaptchaInputConnector'; import CardigannCaptchaInputConnector from './CardigannCaptchaInputConnector'; import CheckInput from './CheckInput'; @@ -37,9 +36,6 @@ function getComponent(type) { case inputTypes.AUTO_COMPLETE: return AutoCompleteInput; - case inputTypes.AVAILABILITY_SELECT: - return AvailabilitySelectInput; - case inputTypes.CAPTCHA: return CaptchaInputConnector; diff --git a/frontend/src/Helpers/Props/inputTypes.js b/frontend/src/Helpers/Props/inputTypes.js index 6c4564341..f9cd58e6d 100644 --- a/frontend/src/Helpers/Props/inputTypes.js +++ b/frontend/src/Helpers/Props/inputTypes.js @@ -1,6 +1,5 @@ export const AUTO_COMPLETE = 'autoComplete'; export const APP_PROFILE_SELECT = 'appProfileSelect'; -export const AVAILABILITY_SELECT = 'availabilitySelect'; export const CAPTCHA = 'captcha'; export const CARDIGANNCAPTCHA = 'cardigannCaptcha'; export const CHECK = 'check'; @@ -27,7 +26,6 @@ export const TAG_SELECT = 'tagSelect'; export const all = [ AUTO_COMPLETE, APP_PROFILE_SELECT, - AVAILABILITY_SELECT, CAPTCHA, CARDIGANNCAPTCHA, CHECK, diff --git a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx index d3ab42073..d11ee5585 100644 --- a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx +++ b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx @@ -36,7 +36,7 @@ const enableOptions = [ get value() { return translate('NoChange'); }, - disabled: true, + isDisabled: true, }, { key: 'true', diff --git a/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx b/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx index 10e73b52a..57e88a4fe 100644 --- a/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx +++ b/frontend/src/Settings/Applications/Applications/Manage/Edit/ManageApplicationsEditModalContent.tsx @@ -30,7 +30,7 @@ const syncLevelOptions = [ get value() { return translate('NoChange'); }, - disabled: true, + isDisabled: true, }, { key: ApplicationSyncLevel.Disabled, diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx index a2e0f89c6..d18e694c9 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx @@ -30,7 +30,7 @@ const enableOptions = [ get value() { return translate('NoChange'); }, - disabled: true, + isDisabled: true, }, { key: 'enabled', diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 7c617ea04..89b00e67c 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -452,6 +452,7 @@ "Message": "Message", "MinimumSeeders": "Minimum Seeders", "MinimumSeedersHelpText": "Minimum seeders required by the Application for the indexer to grab", + "Mixed": "Mixed", "Mode": "Mode", "More": "More", "MoreInfo": "More Info", From 3d52096eb46727afda66fecf510f9b4803446633 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 16 Mar 2024 17:39:03 +0200 Subject: [PATCH 487/964] Downgrade YamlDotNet and improve logging for definitions update --- .../Prowlarr.Core.Test.csproj | 2 +- .../IndexerDefinitionUpdateService.cs | 24 ++++++++++--------- src/NzbDrone.Core/Indexers/IndexerFactory.cs | 4 ++-- src/NzbDrone.Core/Prowlarr.Core.csproj | 2 +- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj index c792eca51..dbfd06861 100644 --- a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NzbDrone.Core/IndexerVersions/IndexerDefinitionUpdateService.cs b/src/NzbDrone.Core/IndexerVersions/IndexerDefinitionUpdateService.cs index 6b2c4dc91..4100934a0 100644 --- a/src/NzbDrone.Core/IndexerVersions/IndexerDefinitionUpdateService.cs +++ b/src/NzbDrone.Core/IndexerVersions/IndexerDefinitionUpdateService.cs @@ -137,11 +137,11 @@ namespace NzbDrone.Core.IndexerVersions if (directoryInfo.Exists) { - var files = directoryInfo.GetFiles($"*.yml", options); + var files = directoryInfo.GetFiles("*.yml", options); foreach (var file in files) { - _logger.Debug("Loading definition " + file.FullName); + _logger.Debug("Loading definition {0}", file.FullName); try { @@ -158,9 +158,9 @@ namespace NzbDrone.Core.IndexerVersions indexerList.Add(definition); } - catch (Exception e) + catch (Exception ex) { - _logger.Error($"Error while parsing Cardigann definition {file.FullName}\n{e}"); + _logger.Error(ex, "Error while parsing Cardigann definition {0}", file.FullName); } } } @@ -188,7 +188,8 @@ namespace NzbDrone.Core.IndexerVersions if (files.Any()) { var file = files.First(); - _logger.Trace("Loading Cardigann definition " + file.FullName); + _logger.Trace("Loading Cardigann definition {0}", file.FullName); + try { var definitionString = File.ReadAllText(file.FullName); @@ -196,9 +197,9 @@ namespace NzbDrone.Core.IndexerVersions return CleanIndexerDefinition(definition); } - catch (Exception e) + catch (Exception ex) { - _logger.Error($"Error while parsing Cardigann definition {file.FullName}\n{e}"); + _logger.Error(ex, "Error while parsing Cardigann definition {0}", file.FullName); } } } @@ -206,7 +207,7 @@ namespace NzbDrone.Core.IndexerVersions var dbDefs = _versionService.All(); //Check to ensure it's in versioned defs before we go to web - if (dbDefs.Count > 0 && !dbDefs.Any(x => x.File == fileKey)) + if (dbDefs.Count > 0 && dbDefs.All(x => x.File != fileKey)) { throw new ArgumentNullException(nameof(fileKey)); } @@ -217,9 +218,10 @@ namespace NzbDrone.Core.IndexerVersions private CardigannDefinition GetHttpDefinition(string id) { - var req = new HttpRequest($"https://indexers.prowlarr.com/{DEFINITION_BRANCH}/{DEFINITION_VERSION}/{id}"); - var response = _httpClient.Get(req); + var request = new HttpRequest($"https://indexers.prowlarr.com/{DEFINITION_BRANCH}/{DEFINITION_VERSION}/{id}"); + var response = _httpClient.Get(request); var definition = _deserializer.Deserialize(response.Content); + return CleanIndexerDefinition(definition); } @@ -289,7 +291,7 @@ namespace NzbDrone.Core.IndexerVersions EnsureDefinitionsFolder(); var definitionsFolder = Path.Combine(startupFolder, "Definitions"); - var saveFile = Path.Combine(definitionsFolder, $"indexers.zip"); + var saveFile = Path.Combine(definitionsFolder, "indexers.zip"); _httpClient.DownloadFile($"https://indexers.prowlarr.com/{DEFINITION_BRANCH}/{DEFINITION_VERSION}/package.zip", saveFile); diff --git a/src/NzbDrone.Core/Indexers/IndexerFactory.cs b/src/NzbDrone.Core/Indexers/IndexerFactory.cs index 53c2c2838..a5f4e6601 100644 --- a/src/NzbDrone.Core/Indexers/IndexerFactory.cs +++ b/src/NzbDrone.Core/Indexers/IndexerFactory.cs @@ -55,10 +55,10 @@ namespace NzbDrone.Core.Indexers { MapCardigannDefinition(definition); } - catch + catch (Exception ex) { // Skip indexer if we fail in Cardigann mapping - _logger.Debug("Indexer '{0}' has no definition", definition.Name); + _logger.Debug(ex, "Indexer '{0}' has no definition", definition.Name); } } diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 4645bc246..b9ab1d826 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -21,7 +21,7 @@ - + From 2e3a95f389b57545033203b9fb4bb8c12128ef68 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 25 Jan 2024 16:56:05 +0200 Subject: [PATCH 488/964] Remove Status from IndexerDefinition --- src/NzbDrone.Core/Indexers/IndexerDefinition.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/IndexerDefinition.cs b/src/NzbDrone.Core/Indexers/IndexerDefinition.cs index a0b1df0a9..4b8a5f649 100644 --- a/src/NzbDrone.Core/Indexers/IndexerDefinition.cs +++ b/src/NzbDrone.Core/Indexers/IndexerDefinition.cs @@ -29,8 +29,6 @@ namespace NzbDrone.Core.Indexers public int AppProfileId { get; set; } public LazyLoaded AppProfile { get; set; } - public IndexerStatus Status { get; set; } - - public List ExtraFields { get; set; } = new List(); + public List ExtraFields { get; set; } = new (); } } From 50c6f15e1254a179ae95d83a03cf06a148786402 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 16 Mar 2024 15:39:32 +0000 Subject: [PATCH 489/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Davide Co-authored-by: Dennis Langthjem Co-authored-by: Gianmarco Novelli Co-authored-by: Havok Dan Co-authored-by: Ihor Mudryi Co-authored-by: MadaxDeLuXe Co-authored-by: Weblate Co-authored-by: infoaitek24 Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/da.json | 14 ++++++++------ src/NzbDrone.Core/Localization/Core/de.json | 5 +++-- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- src/NzbDrone.Core/Localization/Core/it.json | 9 +++++++-- src/NzbDrone.Core/Localization/Core/pt_BR.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/uk.json | 10 +++++++--- 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 088743963..e838f4bba 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -78,9 +78,9 @@ "UILanguage": "UI-sprog", "Custom": "Brugerdefinerede", "TagsSettingsSummary": "Se alle tags og hvordan de bruges. Ubrugte tags kan fjernes", - "Test": "Prøve", - "TestAll": "Test alle", - "TestAllClients": "Test alle klienter", + "Test": "Afprøv", + "TestAll": "Afprøv alle", + "TestAllClients": "Afprøv alle klienter", "Type": "Type", "UnableToAddANewIndexerProxyPleaseTryAgain": "Kunne ikke tilføje en ny indekser. Prøv igen.", "UnableToAddANewNotificationPleaseTryAgain": "Kan ikke tilføje en ny underretning, prøv igen.", @@ -92,7 +92,7 @@ "SetTags": "Indstil tags", "YesCancel": "Ja, Annuller", "AcceptConfirmationModal": "Accepter bekræftelsesmodal", - "AddIndexer": "Tilføj indeksør", + "AddIndexer": "Tilføj indekser", "AnalyticsEnabledHelpText": "Send anonym brugs- og fejlinformation til {appName}s servere. Dette inkluderer information om din browser, hvilke af {appName}s WebUI-sider du bruger, fejlrapportering, samt OS- og runtime-version. Vi bruger disse oplysninger til at prioritere funktioner og fejlrettelser.", "Backups": "Sikkerhedskopier", "BypassProxyForLocalAddresses": "Bypass-proxy til lokale adresser", @@ -315,7 +315,7 @@ "HistoryCleanupDaysHelpTextWarning": "Filer i papirkurven, der er ældre end det valgte antal dage, renses automatisk", "OnGrab": "ved hentning", "OnHealthIssue": "Om sundhedsspørgsmål", - "TestAllIndexers": "Test alle indeksører", + "TestAllIndexers": "Afprøv alle indeks", "GrabReleases": "Hent udgivelse", "Link": "Links", "MappedDrivesRunningAsService": "Tilsluttede netværksdrev er ikke tilgængelige, når programmet kører som en Windows-tjeneste. Se FAQ'en for mere information", @@ -375,5 +375,7 @@ "AddConnection": "Tilføj forbindelse", "EditConnectionImplementation": "Tilføj forbindelse - {implementationName}", "AddApplicationImplementation": "Tilføj forbindelse - {implementationName}", - "AddIndexerImplementation": "Tilføj betingelse - {implementationName}" + "AddIndexerImplementation": "Tilføj betingelse - {implementationName}", + "ApplyChanges": "Anvend ændringer", + "AddDownloadClientImplementation": "Tilføj downloadklient - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 8b94c431f..9976d6dd6 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -53,7 +53,7 @@ "BookSearch": "Buch Suche", "BookSearchTypes": "Buch-Suchtypen", "Branch": "Branch", - "BranchUpdate": "Verwendeter Branch zur Aktualisierung von {appName}", + "BranchUpdate": "Branch, der verwendet werden soll, um {appName} zu updaten", "BranchUpdateMechanism": "Git-Branch für den externen Updateablauf", "BypassProxyForLocalAddresses": "Proxy für lokale Adressen umgehen", "Cancel": "Abbrechen", @@ -545,5 +545,6 @@ "EditIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}", "CountApplicationsSelected": "{count} Ausgewählte Sammlung(en)", "DownloadClientAriaSettingsDirectoryHelpText": "Optionaler Speicherort für Downloads. Lassen Sie das Feld leer, um den standardmäßigen rTorrent-Speicherort zu verwenden", - "ManageClients": "Verwalte Clienten" + "ManageClients": "Verwalte Clienten", + "BlackholeFolderHelpText": "Ordner, in dem {appName} die Datei {extension} speichert" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 4b3ca312e..be08accd6 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -25,7 +25,7 @@ "AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour", "Analytics": "Statistiques", "All": "Tout", - "About": "À propos", + "About": "Tagalog", "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", "DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}", "SetTags": "Définir des étiquettes", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 3ee024fd4..fa8583073 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -297,7 +297,6 @@ "Category": "Categoria", "ClearHistory": "Cancella cronologia", "ClearHistoryMessageText": "Sei sicuro di voler cancellare tutta la cronologia di {appName}?", - "Discord": "Discord", "Donations": "Donazioni", "EnableRssHelpText": "Abilita feed RSS per l'Indicizzatore", "HomePage": "Pagina Iniziale", @@ -524,5 +523,11 @@ "EditConnectionImplementation": "Aggiungi Connessione - {implementationName}", "EditDownloadClientImplementation": "Aggiungi un Client di Download - {implementationName}", "EditIndexerImplementation": "Aggiungi indicizzatore - {implementationName}", - "EditIndexerProxyImplementation": "Aggiungi indicizzatore - {implementationName}" + "EditIndexerProxyImplementation": "Aggiungi indicizzatore - {implementationName}", + "AdvancedSettingsShownClickToHide": "Impostazioni avanzate mostrate, clicca per nasconderle", + "AdvancedSettingsHiddenClickToShow": "Impostazioni avanzate nascoste, clicca per mostrarle", + "AddApplication": "Aggiungi Applicazione", + "AddCategory": "Aggiungi Categoria", + "ActiveApps": "App Attive", + "ActiveIndexers": "Indicizzatori Attivi" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index babadd6d9..cbad5967d 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -739,5 +739,10 @@ "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeitar Hashes de Torrent Bloqueados Durante a Captura", "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", "CustomFilter": "Filtro Personalizado", - "LabelIsRequired": "Rótulo é requerido" + "LabelIsRequired": "Rótulo é requerido", + "ProwlarrDownloadClientsInAppOnlyAlert": "Os clientes de download destinam-se apenas a pesquisas no aplicativo {appName} e não sincronizam com aplicativos. Não há planos para adicionar tal funcionalidade.", + "ProwlarrDownloadClientsAlert": "Se você pretende fazer pesquisas diretamente em {appName}, você precisa adicionar Clientes de Download. Caso contrário, você não precisa adicioná-los aqui. Para pesquisas em seus aplicativos, os clientes de download configurados são usados.", + "Menu": "Menu", + "Mixed": "Misturado", + "Donate": "Doar" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 3236d97b8..28689ac32 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -34,7 +34,7 @@ "DeleteBackupMessageText": "Ви впевнені, що хочете видалити резервну копію '{0}'?", "DeleteDownloadClient": "Видалити клієнт завантаження", "DeleteDownloadClientMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{0}'?", - "Authentication": "Аутентифікація", + "Authentication": "Автентифікація", "Automatic": "Автоматичний", "AutomaticSearch": "Автоматичний пошук", "Backup": "Резервне копіювання", @@ -344,7 +344,7 @@ "DeleteSelectedApplicationsMessageText": "Ви впевнені, що хочете видалити тег {0} ?", "DeleteSelectedDownloadClients": "Видалити клієнт завантаження", "DeleteSelectedDownloadClientsMessageText": "Ви впевнені, що хочете видалити тег {0} ?", - "ApplyTagsHelpTextHowToApplyIndexers": "Як застосувати теги до вибраних фільмів", + "ApplyTagsHelpTextHowToApplyIndexers": "Як застосувати теги до вибраних індексаторів", "ApplyTagsHelpTextRemove": "Видалити: видалити введені теги", "DeleteSelectedIndexersMessageText": "Ви впевнені, що хочете видалити тег {0} ?", "DownloadClientPriorityHelpText": "Надайте пріоритет кільком клієнтам завантаження. Круговий алгоритм використовується для клієнтів з таким же пріоритетом.", @@ -384,5 +384,9 @@ "CountApplicationsSelected": "Вибрано колекцій: {0}", "Applications": "Додатки", "Categories": "Категорії", - "EditDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}" + "EditDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}", + "ApplyChanges": "Застосувати зміни", + "AuthenticationMethod": "Метод автентифікації", + "AuthenticationMethodHelpTextWarning": "Виберіть дійсний метод автентифікації", + "AppUpdated": "{appName} Оновлено" } From f0a8d22e84f5c024fb6f814fd236ab50b05a8d15 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 16 Mar 2024 21:25:28 +0200 Subject: [PATCH 490/964] Improve Search Types selection for BHD --- src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index c18465d25..cb7d2cf5f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -352,7 +352,7 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(7, Label = "IndexerBeyondHDSettingsRewindOnly", Type = FieldType.Checkbox, HelpText = "IndexerBeyondHDSettingsRewindOnlyHelpText")] public bool RewindOnly { get; set; } - [FieldDefinition(8, Label = "IndexerBeyondHDSettingsSearchTypes", Type = FieldType.TagSelect, SelectOptions = typeof(BeyondHDSearchType), HelpText = "IndexerBeyondHDSettingsSearchTypesHelpText", Advanced = true)] + [FieldDefinition(8, Label = "IndexerBeyondHDSettingsSearchTypes", Type = FieldType.Select, SelectOptions = typeof(BeyondHDSearchType), HelpText = "IndexerBeyondHDSettingsSearchTypesHelpText", Advanced = true)] public IEnumerable SearchTypes { get; set; } public override NzbDroneValidationResult Validate() From 583815b4f7a42f103be863214259923bb8c4a013 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 15:11:07 +0200 Subject: [PATCH 491/964] Bump version to 1.15.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 21aeb3ffb..543fc6573 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.14.3' + majorVersion: '1.15.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From d226e528810a9233309944367316b75a6fbc9483 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:08:40 +0200 Subject: [PATCH 492/964] Fixed: Move Reject Blocklisted Torrent Hashes While Grabbing to applications --- src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs | 2 +- src/NzbDrone.Core/Applications/Lidarr/LidarrSettings.cs | 5 ++++- src/NzbDrone.Core/Applications/Radarr/Radarr.cs | 2 +- src/NzbDrone.Core/Applications/Radarr/RadarrSettings.cs | 5 ++++- src/NzbDrone.Core/Applications/Readarr/Readarr.cs | 2 +- src/NzbDrone.Core/Applications/Readarr/ReadarrSettings.cs | 5 ++++- src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs | 2 +- src/NzbDrone.Core/Applications/Sonarr/SonarrSettings.cs | 5 ++++- src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs | 2 +- src/NzbDrone.Core/Applications/Whisparr/WhisparrSettings.cs | 5 ++++- src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs | 3 --- src/NzbDrone.Core/Localization/Core/en.json | 4 ++-- src/NzbDrone.Core/Localization/Core/fr.json | 2 -- src/NzbDrone.Core/Localization/Core/pt_BR.json | 2 -- src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs | 2 -- 15 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs index 974813d96..37e40f282 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs @@ -265,7 +265,7 @@ namespace NzbDrone.Core.Applications.Lidarr if (lidarrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) { - lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = Settings.SyncRejectBlocklistedTorrentHashesWhileGrabbing; } } diff --git a/src/NzbDrone.Core/Applications/Lidarr/LidarrSettings.cs b/src/NzbDrone.Core/Applications/Lidarr/LidarrSettings.cs index f53f3d90d..0197255a2 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/LidarrSettings.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/LidarrSettings.cs @@ -36,9 +36,12 @@ namespace NzbDrone.Core.Applications.Lidarr [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "The ApiKey generated by Lidarr in Settings/General")] public string ApiKey { get; set; } - [FieldDefinition(3, Label = "Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), Advanced = true, HelpText = "Only Indexers that support these categories will be synced")] + [FieldDefinition(3, Label = "Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), HelpText = "Only Indexers that support these categories will be synced", Advanced = true)] public IEnumerable SyncCategories { get; set; } + [FieldDefinition(4, Type = FieldType.Checkbox, Label = "ApplicationSettingsSyncRejectBlocklistedTorrentHashes", HelpText = "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText", Advanced = true)] + public bool SyncRejectBlocklistedTorrentHashesWhileGrabbing { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); diff --git a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs index 5fc796d48..058faf985 100644 --- a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs +++ b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs @@ -258,7 +258,7 @@ namespace NzbDrone.Core.Applications.Radarr if (radarrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) { - radarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + radarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = Settings.SyncRejectBlocklistedTorrentHashesWhileGrabbing; } } diff --git a/src/NzbDrone.Core/Applications/Radarr/RadarrSettings.cs b/src/NzbDrone.Core/Applications/Radarr/RadarrSettings.cs index 3736b38f2..457d7d0df 100644 --- a/src/NzbDrone.Core/Applications/Radarr/RadarrSettings.cs +++ b/src/NzbDrone.Core/Applications/Radarr/RadarrSettings.cs @@ -37,9 +37,12 @@ namespace NzbDrone.Core.Applications.Radarr [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "The ApiKey generated by Radarr in Settings/General")] public string ApiKey { get; set; } - [FieldDefinition(3, Label = "Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), Advanced = true, HelpText = "Only Indexers that support these categories will be synced")] + [FieldDefinition(3, Label = "Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), HelpText = "Only Indexers that support these categories will be synced", Advanced = true)] public IEnumerable SyncCategories { get; set; } + [FieldDefinition(4, Type = FieldType.Checkbox, Label = "ApplicationSettingsSyncRejectBlocklistedTorrentHashes", HelpText = "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText", Advanced = true)] + public bool SyncRejectBlocklistedTorrentHashesWhileGrabbing { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); diff --git a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs index 228a20a10..4a8b280b4 100644 --- a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs +++ b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs @@ -259,7 +259,7 @@ namespace NzbDrone.Core.Applications.Readarr if (readarrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) { - readarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + readarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = Settings.SyncRejectBlocklistedTorrentHashesWhileGrabbing; } } diff --git a/src/NzbDrone.Core/Applications/Readarr/ReadarrSettings.cs b/src/NzbDrone.Core/Applications/Readarr/ReadarrSettings.cs index 55a7014bd..f789586d3 100644 --- a/src/NzbDrone.Core/Applications/Readarr/ReadarrSettings.cs +++ b/src/NzbDrone.Core/Applications/Readarr/ReadarrSettings.cs @@ -37,9 +37,12 @@ namespace NzbDrone.Core.Applications.Readarr [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "The ApiKey generated by Readarr in Settings/General")] public string ApiKey { get; set; } - [FieldDefinition(3, Label = "Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), Advanced = true, HelpText = "Only Indexers that support these categories will be synced")] + [FieldDefinition(3, Label = "Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), HelpText = "Only Indexers that support these categories will be synced", Advanced = true)] public IEnumerable SyncCategories { get; set; } + [FieldDefinition(4, Type = FieldType.Checkbox, Label = "ApplicationSettingsSyncRejectBlocklistedTorrentHashes", HelpText = "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText", Advanced = true)] + public bool SyncRejectBlocklistedTorrentHashesWhileGrabbing { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); diff --git a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs index 3888f48fe..915de9bf8 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs @@ -273,7 +273,7 @@ namespace NzbDrone.Core.Applications.Sonarr if (sonarrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) { - sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = Settings.SyncRejectBlocklistedTorrentHashesWhileGrabbing; } } diff --git a/src/NzbDrone.Core/Applications/Sonarr/SonarrSettings.cs b/src/NzbDrone.Core/Applications/Sonarr/SonarrSettings.cs index 9c31df18c..87a45330f 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/SonarrSettings.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/SonarrSettings.cs @@ -43,9 +43,12 @@ namespace NzbDrone.Core.Applications.Sonarr [FieldDefinition(4, Label = "Anime Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), Advanced = true, HelpText = "Only Indexers that support these categories will be synced")] public IEnumerable AnimeSyncCategories { get; set; } - [FieldDefinition(5, Label = "Sync Anime Standard Format Search", Type = FieldType.Checkbox, Advanced = true, HelpText = "Sync also searching for anime using the standard numbering")] + [FieldDefinition(5, Label = "Sync Anime Standard Format Search", Type = FieldType.Checkbox, HelpText = "Sync also searching for anime using the standard numbering", Advanced = true)] public bool SyncAnimeStandardFormatSearch { get; set; } + [FieldDefinition(6, Type = FieldType.Checkbox, Label = "ApplicationSettingsSyncRejectBlocklistedTorrentHashes", HelpText = "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText", Advanced = true)] + public bool SyncRejectBlocklistedTorrentHashesWhileGrabbing { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); diff --git a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs index 8e894c12d..c6135c999 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs @@ -259,7 +259,7 @@ namespace NzbDrone.Core.Applications.Whisparr if (whisparrIndexer.Fields.Any(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing")) { - whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = ((ITorrentIndexerSettings)indexer.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; + whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "rejectBlocklistedTorrentHashesWhileGrabbing").Value = Settings.SyncRejectBlocklistedTorrentHashesWhileGrabbing; } } diff --git a/src/NzbDrone.Core/Applications/Whisparr/WhisparrSettings.cs b/src/NzbDrone.Core/Applications/Whisparr/WhisparrSettings.cs index 5fe636747..0dfafc166 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/WhisparrSettings.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/WhisparrSettings.cs @@ -37,9 +37,12 @@ namespace NzbDrone.Core.Applications.Whisparr [FieldDefinition(2, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "The ApiKey generated by Whisparr in Settings/General")] public string ApiKey { get; set; } - [FieldDefinition(3, Label = "Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), Advanced = true, HelpText = "Only Indexers that support these categories will be synced")] + [FieldDefinition(3, Label = "Sync Categories", Type = FieldType.Select, SelectOptions = typeof(NewznabCategoryFieldConverter), HelpText = "Only Indexers that support these categories will be synced", Advanced = true)] public IEnumerable SyncCategories { get; set; } + [FieldDefinition(4, Type = FieldType.Checkbox, Label = "ApplicationSettingsSyncRejectBlocklistedTorrentHashes", HelpText = "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText", Advanced = true)] + public bool SyncRejectBlocklistedTorrentHashesWhileGrabbing { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); diff --git a/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs b/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs index da168f576..fd5d4c813 100644 --- a/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs +++ b/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs @@ -63,8 +63,5 @@ namespace NzbDrone.Core.Indexers [FieldDefinition(4, Type = FieldType.Number, Label = "IndexerSettingsPackSeedTime", HelpText = "IndexerSettingsPackSeedTimeIndexerHelpText", Unit = "minutes", Advanced = true)] public int? PackSeedTime { get; set; } - - [FieldDefinition(5, Type = FieldType.Checkbox, Label = "IndexerSettingsRejectBlocklistedTorrentHashes", HelpText = "IndexerSettingsRejectBlocklistedTorrentHashesHelpText", Advanced = true)] - public bool RejectBlocklistedTorrentHashesWhileGrabbing { get; set; } } } diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 89b00e67c..8f78cef07 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -45,6 +45,8 @@ "Application": "Application", "ApplicationLongTermStatusCheckAllClientMessage": "All applications are unavailable due to failures for more than 6 hours", "ApplicationLongTermStatusCheckSingleClientMessage": "Applications unavailable due to failures for more than 6 hours: {0}", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sync Reject Blocklisted Torrent Hashes While Grabbing", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "If a torrent is blocked by hash it may not properly be rejected during RSS/Search for some indexers, enabling this will allow it to be rejected after the torrent is grabbed, but before it is sent to the client.", "ApplicationStatusCheckAllClientMessage": "All applications are unavailable due to failures", "ApplicationStatusCheckSingleClientMessage": "Applications unavailable due to failures: {0}", "ApplicationTagsHelpText": "Sync Indexers to this application that have one or more matching tags. If no tags are listed here, then no indexers will be prevented from syncing due to their tags.", @@ -396,8 +398,6 @@ "IndexerSettingsPasskey": "Pass Key", "IndexerSettingsQueryLimit": "Query Limit", "IndexerSettingsQueryLimitHelpText": "The number of max queries as specified by the respective unit that {appName} will allow to the site", - "IndexerSettingsRejectBlocklistedTorrentHashes": "Reject Blocklisted Torrent Hashes While Grabbing", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "If a torrent is blocked by hash it may not properly be rejected during RSS/Search for some indexers, enabling this will allow it to be rejected after the torrent is grabbed, but before it is sent to the client.", "IndexerSettingsRssKey": "RSS Key", "IndexerSettingsSeedRatio": "Seed Ratio", "IndexerSettingsSeedRatioHelpText": "The ratio a torrent should reach before stopping, empty uses the download client's default. Ratio should be at least 1.0 and follow the indexers rules", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index be08accd6..fc6b4f085 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -733,11 +733,9 @@ "DownloadClientFreeboxSettingsAppIdHelpText": "L'ID de l'application donné lors de la création de l'accès à l'API Freebox (c'est-à-dire 'app_id')", "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Télécharger d'abord le premier et le dernier morceau (qBittorrent 4.1.0+)", "DownloadClientQbittorrentSettingsUseSslHelpText": "Utilisez une connexion sécurisée. Voir Options -> UI Web -> 'Utiliser HTTPS au lieu de HTTP' dans qBittorrent.", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.", "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extension à utiliser pour les liens magnétiques, la valeur par défaut est '.magnet'", "TorrentBlackholeTorrentFolder": "Dossier Torrent", "UseSsl": "Utiliser SSL", - "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeter les hachages de torrents bloqués lors de la saisie", "DownloadClientRTorrentSettingsDirectoryHelpText": "Emplacement facultatif dans lequel placer les téléchargements. Laisser vide pour utiliser l'emplacement par défaut de rTorrent", "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Catégorie de secours par défaut si aucune catégorie mappée n'existe pour une version. L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée. Crée un sous-répertoire [catégorie] dans le répertoire de sortie." } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index cbad5967d..d5748d66b 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -736,8 +736,6 @@ "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extensão a ser usada para links magnet, o padrão é '.magnet'", "TorrentBlackholeSaveMagnetFilesHelpText": "Salve o link magnet se nenhum arquivo .torrent estiver disponível (útil apenas se o cliente de download suportar magnets salvos em um arquivo)", "UseSsl": "Usar SSL", - "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeitar Hashes de Torrent Bloqueados Durante a Captura", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", "CustomFilter": "Filtro Personalizado", "LabelIsRequired": "Rótulo é requerido", "ProwlarrDownloadClientsInAppOnlyAlert": "Os clientes de download destinam-se apenas a pesquisas no aplicativo {appName} e não sincronizam com aplicativos. Não há planos para adicionar tal funcionalidade.", diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs b/src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs index 3cbb0c94a..7f3d281f0 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerBulkResource.cs @@ -12,7 +12,6 @@ namespace Prowlarr.Api.V1.Indexers public double? SeedRatio { get; set; } public int? SeedTime { get; set; } public int? PackSeedTime { get; set; } - public bool? RejectBlocklistedTorrentHashesWhileGrabbing { get; set; } } public class IndexerBulkResourceMapper : ProviderBulkResourceMapper @@ -36,7 +35,6 @@ namespace Prowlarr.Api.V1.Indexers ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.SeedRatio = resource.SeedRatio ?? ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.SeedRatio; ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.SeedTime = resource.SeedTime ?? ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.SeedTime; ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.PackSeedTime = resource.PackSeedTime ?? ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.PackSeedTime; - ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing = resource.RejectBlocklistedTorrentHashesWhileGrabbing ?? ((ITorrentIndexerSettings)existing.Settings).TorrentBaseSettings.RejectBlocklistedTorrentHashesWhileGrabbing; } }); From 131b344119fd9a76423b5e92bd615a78925b6a9e Mon Sep 17 00:00:00 2001 From: Servarr Date: Sun, 17 Mar 2024 17:46:27 +0000 Subject: [PATCH 493/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index b6644db13..a09a4239e 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -5016,10 +5016,6 @@ "type": "integer", "format": "int32", "nullable": true - }, - "rejectBlocklistedTorrentHashesWhileGrabbing": { - "type": "boolean", - "nullable": true } }, "additionalProperties": false From 3881c9d753c2ed6614eaf6a7e6bc513957736904 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:56:41 +0200 Subject: [PATCH 494/964] Remove bulk edit for Reject Blocklisted Torrent Hashes While Grabbing --- .../Select/Edit/EditIndexerModalContent.tsx | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx index d11ee5585..9e2f3e0e9 100644 --- a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx +++ b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx @@ -19,7 +19,6 @@ interface SavePayload { seedRatio?: number; seedTime?: number; packSeedTime?: number; - rejectBlocklistedTorrentHashesWhileGrabbing?: boolean; } interface EditIndexerModalContentProps { @@ -66,10 +65,6 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { const [packSeedTime, setPackSeedTime] = useState( null ); - const [ - rejectBlocklistedTorrentHashesWhileGrabbing, - setRejectBlocklistedTorrentHashesWhileGrabbing, - ] = useState(NO_CHANGE); const save = useCallback(() => { let hasChanges = false; @@ -110,12 +105,6 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { payload.packSeedTime = packSeedTime as number; } - if (rejectBlocklistedTorrentHashesWhileGrabbing !== NO_CHANGE) { - hasChanges = true; - payload.rejectBlocklistedTorrentHashesWhileGrabbing = - rejectBlocklistedTorrentHashesWhileGrabbing === 'true'; - } - if (hasChanges) { onSavePress(payload); } @@ -129,7 +118,6 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { seedRatio, seedTime, packSeedTime, - rejectBlocklistedTorrentHashesWhileGrabbing, onSavePress, onModalClose, ]); @@ -158,9 +146,6 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { case 'packSeedTime': setPackSeedTime(value); break; - case 'rejectBlocklistedTorrentHashesWhileGrabbing': - setRejectBlocklistedTorrentHashesWhileGrabbing(value); - break; default: console.warn(`EditIndexersModalContent Unknown Input: '${name}'`); } @@ -268,23 +253,6 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { onChange={onInputChange} /> - - - - {translate('IndexerSettingsRejectBlocklistedTorrentHashes')} - - - - From 721ae1cac053a9c872e79bb0fa6e4d5b7f9d13a6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 19 Mar 2024 00:39:42 +0200 Subject: [PATCH 495/964] Fixed: (Cardigann) Avoid NullRef on forms with `multipart/form-data` --- .../Indexers/Definitions/Cardigann/CardigannBase.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs index d61f413d7..166275514 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs @@ -771,13 +771,14 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann protected Dictionary ParseCustomHeaders(Dictionary> customHeaders, Dictionary variables) { + var headers = new Dictionary(); + if (customHeaders == null) { - return null; + return headers; } // FIXME: fix jackett header handling (allow it to specifiy the same header multipe times) - var headers = new Dictionary(); foreach (var header in customHeaders) { headers.Add(header.Key, ApplyGoTemplateText(header.Value[0], variables)); From 7d5d338c8e48e3c6a2a71d929812f2daeff3a38b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 19 Mar 2024 14:21:27 +0200 Subject: [PATCH 496/964] Improve search page button colors Also show all buttons on one line for info indexer modal Fixes #2046 --- frontend/src/Indexer/Info/IndexerInfoModalContent.css | 6 ------ frontend/src/Search/SearchFooter.js | 7 ++++++- src/NzbDrone.Core/Localization/Core/en.json | 1 + 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/Indexer/Info/IndexerInfoModalContent.css b/frontend/src/Indexer/Info/IndexerInfoModalContent.css index e94b4c52c..9e8b59a88 100644 --- a/frontend/src/Indexer/Info/IndexerInfoModalContent.css +++ b/frontend/src/Indexer/Info/IndexerInfoModalContent.css @@ -47,9 +47,3 @@ justify-content: space-between; } -@media only screen and (max-width: $breakpointExtraSmall) { - .modalFooter { - flex-direction: column; - gap: 10px; - } -} diff --git a/frontend/src/Search/SearchFooter.js b/frontend/src/Search/SearchFooter.js index 5e949fc6e..872328446 100644 --- a/frontend/src/Search/SearchFooter.js +++ b/frontend/src/Search/SearchFooter.js @@ -212,7 +212,11 @@ class SearchFooter extends Component { name="searchQuery" value={searchQuery} buttons={ - + @@ -275,6 +279,7 @@ class SearchFooter extends Component { } Date: Tue, 19 Mar 2024 15:02:11 +0200 Subject: [PATCH 497/964] New: Pass general proxy credentials to FlareSolverr Fixes #2073 --- .../FlareSolverr/FlareSolverr.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs index b309ec06e..6e9d101a1 100644 --- a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs +++ b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs @@ -102,9 +102,15 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr var url = request.Url.ToString(); var maxTimeout = Settings.RequestTimeout * 1000; - // Use Proxy if no credentials are set (creds not supported as of FS 2.2.9) var proxySettings = _proxySettingsProvider.GetProxySettings(); - var proxyUrl = proxySettings != null && proxySettings.Username.IsNullOrWhiteSpace() && proxySettings.Password.IsNullOrWhiteSpace() ? GetProxyUri(proxySettings) : null; + var proxyUrl = proxySettings != null ? GetProxyUri(proxySettings) : null; + + var requestProxy = new FlareSolverrProxy + { + Url = proxyUrl?.OriginalString, + Username = proxySettings != null && proxySettings.Username.IsNotNullOrWhiteSpace() ? proxySettings.Username : null, + Password = proxySettings != null && proxySettings.Password.IsNotNullOrWhiteSpace() ? proxySettings.Password : null + }; if (request.Method == HttpMethod.Get) { @@ -113,10 +119,7 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr Cmd = "request.get", Url = url, MaxTimeout = maxTimeout, - Proxy = new FlareSolverrProxy - { - Url = proxyUrl?.OriginalString - } + Proxy = requestProxy }; } else if (request.Method == HttpMethod.Post) @@ -139,10 +142,7 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr ContentLength = null }, MaxTimeout = maxTimeout, - Proxy = new FlareSolverrProxy - { - Url = proxyUrl?.OriginalString - } + Proxy = requestProxy }; } else if (contentTypeType.Contains("multipart/form-data") @@ -169,6 +169,7 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr newRequest.LogResponseContent = true; newRequest.RequestTimeout = TimeSpan.FromSeconds(Settings.RequestTimeout + 5); newRequest.SetContent(req.ToJson()); + newRequest.ContentSummary = req.ToJson(Formatting.None); _logger.Debug("Cloudflare Detected, Applying FlareSolverr Proxy {0} to request {1}", Name, request.Url); @@ -243,6 +244,8 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr private class FlareSolverrProxy { public string Url { get; set; } + public string Username { get; set; } + public string Password { get; set; } } private class HeadersPost From 680bf46e25f9cabaa759bdd96e968c4511c8a9fe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 19 Mar 2024 21:31:09 +0200 Subject: [PATCH 498/964] Fixed: (SceneHD) Category filtering Fixes #2028 --- .../Indexers/Definitions/SceneHD.cs | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs b/src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs index e554c4d33..c3d24df2f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs @@ -38,7 +38,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IIndexerRequestGenerator GetRequestGenerator() { - return new SceneHDRequestGenerator() { Settings = Settings, Capabilities = Capabilities }; + return new SceneHDRequestGenerator(Settings, Capabilities); } public override IParseIndexerResponse GetParser() @@ -88,38 +88,42 @@ namespace NzbDrone.Core.Indexers.Definitions public class SceneHDRequestGenerator : IIndexerRequestGenerator { - public SceneHDSettings Settings { get; set; } - public IndexerCapabilities Capabilities { get; set; } - public string BaseUrl { get; set; } + private readonly SceneHDSettings _settings; + private readonly IndexerCapabilities _capabilities; + + public SceneHDRequestGenerator(SceneHDSettings settings, IndexerCapabilities capabilities) + { + _settings = settings; + _capabilities = capabilities; + } private IEnumerable GetPagedRequests(string term, int[] categories, string imdbId = null) { var search = new[] { imdbId, term }; - var qc = new NameValueCollection + var parameters = new NameValueCollection { { "api", "" }, - { "passkey", Settings.Passkey }, + { "passkey", _settings.Passkey }, + { "search", string.Join(" ", search.Where(s => s.IsNotNullOrWhiteSpace())) }, { "search", string.Join(" ", search.Where(s => s.IsNotNullOrWhiteSpace())) } }; - foreach (var cat in Capabilities.Categories.MapTorznabCapsToTrackers(categories)) + if (categories?.Length > 0) { - qc.Add("categories[" + cat + "]", "1"); + parameters.Add("cat", _capabilities.Categories.MapTorznabCapsToTrackers(categories).Distinct().Join(",")); } - var searchUrl = string.Format("{0}/browse.php?{1}", Settings.BaseUrl.TrimEnd('/'), qc.GetQueryString()); + var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/browse.php?{parameters.GetQueryString()}"; - var request = new IndexerRequest(searchUrl, HttpAccept.Json); - - yield return request; + yield return new IndexerRequest(searchUrl, HttpAccept.Json); } public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories, searchCriteria.FullImdbId)); return pageableRequests; } @@ -128,7 +132,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories)); return pageableRequests; } @@ -137,7 +141,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedTvSearchString}", searchCriteria.Categories, searchCriteria.FullImdbId)); return pageableRequests; } @@ -146,7 +150,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories)); return pageableRequests; } @@ -155,7 +159,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories)); return pageableRequests; } From 52a91a50b246e60a19120bbf31fb46b2664ddc84 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 19 Mar 2024 21:35:28 +0200 Subject: [PATCH 499/964] Remove duplicated parameter --- src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs b/src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs index c3d24df2f..505af4f0c 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SceneHD.cs @@ -105,7 +105,6 @@ namespace NzbDrone.Core.Indexers.Definitions { { "api", "" }, { "passkey", _settings.Passkey }, - { "search", string.Join(" ", search.Where(s => s.IsNotNullOrWhiteSpace())) }, { "search", string.Join(" ", search.Where(s => s.IsNotNullOrWhiteSpace())) } }; From 9ea8335aa0a2278e633bd61946d12c6fb2e9ad65 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 20 Mar 2024 02:57:29 +0200 Subject: [PATCH 500/964] Update timezone offset for PHD/CZ --- .../Indexers/Definitions/Avistaz/AvistazParserBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs index 83d7e013b..dd68952a5 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs @@ -14,7 +14,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz { public class AvistazParserBase : IParseIndexerResponse { - protected virtual string TimezoneOffset => "-05:00"; // Avistaz does not specify a timezone & returns server time + protected virtual string TimezoneOffset => "-04:00"; // Avistaz does not specify a timezone & returns server time private readonly HashSet _hdResolutions = new () { "1080p", "1080i", "720p" }; public Action, DateTime?> CookiesUpdater { get; set; } From d99398d3f8b0c088646ade25b1e38dbc01ed2ef1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 21 Mar 2024 14:02:19 +0200 Subject: [PATCH 501/964] Fix tests for PHD --- .../IndexerTests/AvistazTests/PrivateHDFixture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs index e841659fd..f0531e9ec 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://privatehd.to/torrent/78506-godzilla-2014-2160p-uhd-bluray-remux-hdr-hevc-atmos-triton"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 05:24:49")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 04:24:49")); torrentInfo.Size.Should().Be(69914591044); torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2"); torrentInfo.MagnetUrl.Should().Be(null); From 02e420580e97920e472c0200ef39d886673cf96c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 21 Mar 2024 18:40:44 +0200 Subject: [PATCH 502/964] Fixed: (SubsPlease) Season search improvements and support for movie searches Co-authored-by: Florent Delrieu --- .../Indexers/Definitions/SubsPlease.cs | 102 +++++++++--------- 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs b/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs index 5c0aa3c96..fe313997b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs @@ -82,49 +82,13 @@ namespace NzbDrone.Core.Indexers.Definitions _settings = settings; } - private IEnumerable GetSearchRequests(string term) - { - var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/api/?"; - - var searchTerm = Regex.Replace(term, "\\[?SubsPlease\\]?\\s*", string.Empty, RegexOptions.IgnoreCase).Trim(); - - // If the search terms contain a resolution, remove it from the query sent to the API - var resMatch = Regex.Match(searchTerm, "\\d{3,4}[p|P]"); - if (resMatch.Success) - { - searchTerm = searchTerm.Replace(resMatch.Value, string.Empty); - } - - var queryParameters = new NameValueCollection - { - { "f", "search" }, - { "tz", "UTC" }, - { "s", searchTerm } - }; - - var request = new IndexerRequest(searchUrl + queryParameters.GetQueryString(), HttpAccept.Json); - - yield return request; - } - - private IEnumerable GetRssRequest() - { - var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/api/?"; - - var queryParameters = new NameValueCollection - { - { "f", "latest" }, - { "tz", "UTC" } - }; - - var request = new IndexerRequest(searchUrl + queryParameters.GetQueryString(), HttpAccept.Json); - - yield return request; - } - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { - return new IndexerPageableRequestChain(); + var pageableRequests = new IndexerPageableRequestChain(); + + pageableRequests.Add(GetSearchRequests(searchCriteria.SanitizedSearchTerm, searchCriteria)); + + return pageableRequests; } public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) @@ -136,31 +100,69 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(searchCriteria.IsRssSearch - ? GetRssRequest() - : GetSearchRequests(searchCriteria.SanitizedTvSearchString)); + var searchTerm = searchCriteria.SanitizedSearchTerm.Trim(); + + // Only include season > 1 in searchTerm, format as S2 rather than S02 + if (searchCriteria.Season is > 1) + { + searchTerm += $" S{searchCriteria.Season}"; + } + + if (int.TryParse(searchCriteria.Episode, out var episode) && episode > 0) + { + searchTerm += $" {episode:00}"; + } + + pageableRequests.Add(GetSearchRequests(searchTerm, searchCriteria)); return pageableRequests; } public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) { - var pageableRequests = new IndexerPageableRequestChain(); - - return pageableRequests; + return new IndexerPageableRequestChain(); } public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(searchCriteria.IsRssSearch - ? GetRssRequest() - : GetSearchRequests(searchCriteria.SanitizedSearchTerm)); + pageableRequests.Add(GetSearchRequests(searchCriteria.SanitizedSearchTerm, searchCriteria)); return pageableRequests; } + private IEnumerable GetSearchRequests(string term, SearchCriteriaBase searchCriteria) + { + var searchTerm = Regex.Replace(term, "\\[?SubsPlease\\]?\\s*", string.Empty, RegexOptions.IgnoreCase).Trim(); + + // If the search terms contain a resolution, remove it from the query sent to the API + var resMatch = Regex.Match(searchTerm, "\\d{3,4}[p|P]"); + if (resMatch.Success) + { + searchTerm = searchTerm.Replace(resMatch.Value, string.Empty).Trim(); + } + + var queryParameters = new NameValueCollection + { + { "tz", "UTC" } + }; + + if (searchCriteria.IsRssSearch) + { + queryParameters.Set("f", "latest"); + } + else + { + queryParameters.Set("f", "search"); + queryParameters.Set("s", searchTerm); + } + + var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/api/?{queryParameters.GetQueryString()}"; + + yield return new IndexerRequest(searchUrl, HttpAccept.Json); + } + public Func> GetCookies { get; set; } public Action, DateTime?> CookiesUpdater { get; set; } } From 2cacfba81ff2ef65885be07dae113962ea71a6fa Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 18 Mar 2024 16:48:35 -0700 Subject: [PATCH 503/964] Fixed: Task progress messages in the UI (cherry picked from commit c6417337812f3578a27f9dc1e44fdad80f557271) --- .../ApplicationIndexerSyncCommand.cs | 2 +- .../IndexerSearch/ReleaseSearchService.cs | 2 +- src/NzbDrone.Core/Messaging/Commands/Command.cs | 2 +- .../ProgressMessaging/ProgressMessageContext.cs | 16 +++++++++++++--- .../Update/Commands/ApplicationUpdateCommand.cs | 2 -- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Applications/ApplicationIndexerSyncCommand.cs b/src/NzbDrone.Core/Applications/ApplicationIndexerSyncCommand.cs index 50318ecbd..769843dd3 100644 --- a/src/NzbDrone.Core/Applications/ApplicationIndexerSyncCommand.cs +++ b/src/NzbDrone.Core/Applications/ApplicationIndexerSyncCommand.cs @@ -13,6 +13,6 @@ namespace NzbDrone.Core.Applications public override bool SendUpdatesToClient => true; - public override string CompletionMessage => null; + public override string CompletionMessage => "Completed"; } } diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index 03f546c42..e39a2d092 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -196,7 +196,7 @@ namespace NzbDrone.Core.IndexerSearch var reports = batch.SelectMany(x => x).ToList(); - _logger.Debug("Total of {0} reports were found for {1} from {2} indexer(s)", reports.Count, criteriaBase, indexers.Count); + _logger.ProgressDebug("Total of {0} reports were found for {1} from {2} indexer(s)", reports.Count, criteriaBase, indexers.Count); return reports; } diff --git a/src/NzbDrone.Core/Messaging/Commands/Command.cs b/src/NzbDrone.Core/Messaging/Commands/Command.cs index 020b5ec64..224173437 100644 --- a/src/NzbDrone.Core/Messaging/Commands/Command.cs +++ b/src/NzbDrone.Core/Messaging/Commands/Command.cs @@ -23,7 +23,7 @@ namespace NzbDrone.Core.Messaging.Commands } public virtual bool UpdateScheduledTask => true; - public virtual string CompletionMessage => "Completed"; + public virtual string CompletionMessage => null; public virtual bool RequiresDiskAccess => false; public virtual bool IsExclusive => false; public virtual bool IsTypeExclusive => false; diff --git a/src/NzbDrone.Core/ProgressMessaging/ProgressMessageContext.cs b/src/NzbDrone.Core/ProgressMessaging/ProgressMessageContext.cs index fba9ca3f3..09fecee2c 100644 --- a/src/NzbDrone.Core/ProgressMessaging/ProgressMessageContext.cs +++ b/src/NzbDrone.Core/ProgressMessaging/ProgressMessageContext.cs @@ -1,10 +1,13 @@ -using System; +using System; +using System.Threading; using NzbDrone.Core.Messaging.Commands; namespace NzbDrone.Core.ProgressMessaging { public static class ProgressMessageContext { + private static AsyncLocal _commandModelAsync = new AsyncLocal(); + [ThreadStatic] private static CommandModel _commandModel; @@ -13,8 +16,15 @@ namespace NzbDrone.Core.ProgressMessaging public static CommandModel CommandModel { - get { return _commandModel; } - set { _commandModel = value; } + get + { + return _commandModel ?? _commandModelAsync.Value; + } + set + { + _commandModel = value; + _commandModelAsync.Value = value; + } } public static bool LockReentrancy() diff --git a/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCommand.cs b/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCommand.cs index 0ca1d8074..59a827a0b 100644 --- a/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCommand.cs +++ b/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCommand.cs @@ -6,7 +6,5 @@ namespace NzbDrone.Core.Update.Commands { public override bool SendUpdatesToClient => true; public override bool IsExclusive => true; - - public override string CompletionMessage => null; } } From ee4cf93aee675f535dcafa38bf5649e32cbea228 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 23 Mar 2024 15:56:34 +0200 Subject: [PATCH 504/964] Improve Indexer Proxy healthcheck messaging --- ...ProxyCheck.cs => IndexerProxyStatusCheck.cs} | 17 ++++++++++------- src/NzbDrone.Core/Localization/Core/ar.json | 4 ++-- src/NzbDrone.Core/Localization/Core/bg.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ca.json | 4 ++-- src/NzbDrone.Core/Localization/Core/cs.json | 4 ++-- src/NzbDrone.Core/Localization/Core/da.json | 4 ++-- src/NzbDrone.Core/Localization/Core/de.json | 4 ++-- src/NzbDrone.Core/Localization/Core/el.json | 4 ++-- src/NzbDrone.Core/Localization/Core/en.json | 4 ++-- src/NzbDrone.Core/Localization/Core/es.json | 4 ++-- src/NzbDrone.Core/Localization/Core/fi.json | 4 ++-- src/NzbDrone.Core/Localization/Core/fr.json | 4 ++-- src/NzbDrone.Core/Localization/Core/he.json | 4 ++-- src/NzbDrone.Core/Localization/Core/hi.json | 4 ++-- src/NzbDrone.Core/Localization/Core/hu.json | 4 ++-- src/NzbDrone.Core/Localization/Core/is.json | 4 ++-- src/NzbDrone.Core/Localization/Core/it.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ja.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ko.json | 4 ++-- src/NzbDrone.Core/Localization/Core/nl.json | 4 ++-- src/NzbDrone.Core/Localization/Core/pl.json | 4 ++-- src/NzbDrone.Core/Localization/Core/pt.json | 4 ++-- src/NzbDrone.Core/Localization/Core/pt_BR.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ro.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ru.json | 4 ++-- src/NzbDrone.Core/Localization/Core/sv.json | 4 ++-- src/NzbDrone.Core/Localization/Core/th.json | 4 ++-- src/NzbDrone.Core/Localization/Core/tr.json | 4 ++-- src/NzbDrone.Core/Localization/Core/uk.json | 4 ++-- src/NzbDrone.Core/Localization/Core/vi.json | 4 ++-- src/NzbDrone.Core/Localization/Core/zh_CN.json | 4 ++-- 31 files changed, 70 insertions(+), 67 deletions(-) rename src/NzbDrone.Core/HealthCheck/Checks/{IndexerProxyCheck.cs => IndexerProxyStatusCheck.cs} (69%) diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerProxyCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerProxyStatusCheck.cs similarity index 69% rename from src/NzbDrone.Core/HealthCheck/Checks/IndexerProxyCheck.cs rename to src/NzbDrone.Core/HealthCheck/Checks/IndexerProxyStatusCheck.cs index 484f2bc19..39aeac49e 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerProxyCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerProxyStatusCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.IndexerProxies; @@ -9,11 +10,11 @@ namespace NzbDrone.Core.HealthCheck.Checks [CheckOn(typeof(ProviderDeletedEvent))] [CheckOn(typeof(ProviderAddedEvent))] [CheckOn(typeof(ProviderUpdatedEvent))] - public class IndexerProxyCheck : HealthCheckBase + public class IndexerProxyStatusCheck : HealthCheckBase { private readonly IIndexerProxyFactory _proxyFactory; - public IndexerProxyCheck(IIndexerProxyFactory proxyFactory, + public IndexerProxyStatusCheck(IIndexerProxyFactory proxyFactory, ILocalizationService localizationService) : base(localizationService) { @@ -37,15 +38,17 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, - _localizationService.GetLocalizedString("IndexerProxyStatusCheckAllClientMessage"), - "#proxies-are-unavailable-due-to-failures"); + _localizationService.GetLocalizedString("IndexerProxyStatusAllUnavailableHealthCheckMessage"), + "#indexer-proxies-are-unavailable-due-to-failures"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerProxyStatusCheckSingleClientMessage"), - string.Join(", ", badProxies.Select(v => v.Definition.Name))), - "#proxies-are-unavailable-due-to-failures"); + _localizationService.GetLocalizedString("IndexerProxyStatusUnavailableHealthCheckMessage", new Dictionary + { + { "indexerProxyNames", string.Join(", ", badProxies.Select(v => v.Definition.Name)) } + }), + "#indexer-proxies-are-unavailable-due-to-failures"); } } } diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 5f4c17098..75aa31775 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -29,7 +29,7 @@ "DeleteDownloadClientMessageText": "هل أنت متأكد أنك تريد حذف برنامج التنزيل \"{0}\"؟", "Filename": "اسم الملف", "HomePage": "الصفحة الرئيسية", - "IndexerProxyStatusCheckSingleClientMessage": "المفهرسات غير متاحة بسبب الإخفاقات: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "المفهرسات غير متاحة بسبب الإخفاقات: {indexerProxyNames}", "Language": "لغة", "Usenet": "يوزنت", "MovieIndexScrollTop": "فهرس الفيلم: قم بالتمرير لأعلى", @@ -133,7 +133,7 @@ "IndexerLongTermStatusCheckAllClientMessage": "جميع المفهرسات غير متوفرة بسبب الفشل لأكثر من 6 ساعات", "IndexerLongTermStatusCheckSingleClientMessage": "المفهرسات غير متاحة بسبب الإخفاقات لأكثر من 6 ساعات: {0}", "IndexerPriorityHelpText": "أولوية المفهرس من 1 (الأعلى) إلى 50 (الأدنى). الافتراضي: 25.", - "IndexerProxyStatusCheckAllClientMessage": "جميع المفهرسات غير متوفرة بسبب الفشل", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "جميع المفهرسات غير متوفرة بسبب الفشل", "NoChange": "لا تغيير", "NoLogFiles": "لا توجد ملفات سجل", "NoTagsHaveBeenAddedYet": "لم يتم إضافة أي علامات حتى الان", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 825368ade..780628855 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -61,11 +61,11 @@ "DeleteBackupMessageText": "Наистина ли искате да изтриете резервното копие '{0}'?", "DeleteTag": "Изтриване на маркера", "DeleteTagMessageText": "Наистина ли искате да изтриете маркера '{0}'?", - "IndexerProxyStatusCheckAllClientMessage": "Всички списъци са недостъпни поради неуспехи", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Всички списъци са недостъпни поради неуспехи", "LastWriteTime": "Време за последно писане", "Columns": "Колони", "EnableRss": "Активиране на RSS", - "IndexerProxyStatusCheckSingleClientMessage": "Списъци, недостъпни поради неуспехи: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Списъци, недостъпни поради неуспехи: {indexerProxyNames}", "LogLevel": "Log Level", "MovieIndexScrollTop": "Индекс на филма: Превъртете отгоре", "Queue": "Опашка", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 99776bef6..d8af57a73 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -333,8 +333,8 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "No es pot afegir un indexador nou, torneu-ho a provar.", "UpdateMechanismHelpText": "Utilitzeu l'actualitzador integrat de {appName} o un script", "UserAgentProvidedByTheAppThatCalledTheAPI": "Agent d'usuari proporcionat per l'aplicació per fer peticions a l'API", - "IndexerProxyStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors", - "IndexerProxyStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Tots els indexadors no estan disponibles a causa d'errors", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Els indexadors no estan disponibles a causa d'errors: {indexerProxyNames}", "LaunchBrowserHelpText": " Obriu un navegador web i navegueu a la pàgina d'inici de {appName} a l'inici de l'aplicació.", "Link": "Enllaços", "UILanguageHelpText": "Idioma que utilitzarà {appName} per a la interfície d'usuari", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index be75e0f71..6479ab3bd 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -105,7 +105,7 @@ "Tasks": "Úkoly", "Test": "Test", "UnableToLoadTags": "Značky nelze načíst", - "IndexerProxyStatusCheckAllClientMessage": "Všechny indexery nejsou k dispozici z důvodu selhání", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání", "ApplyTags": "Použít značky", "MoreInfo": "Více informací", "System": "Systém", @@ -183,7 +183,7 @@ "BypassProxyForLocalAddresses": "Obcházení proxy serveru pro místní adresy", "DeleteIndexerProxyMessageText": "Opravdu chcete smazat značku „{0}“?", "DeleteTag": "Smazat značku", - "IndexerProxyStatusCheckSingleClientMessage": "Indexery nedostupné z důvodu selhání: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání: {indexerProxyNames}", "Name": "název", "New": "Nový", "Protocol": "Protokol", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index e838f4bba..15de615ef 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -139,8 +139,8 @@ "IndexerLongTermStatusCheckSingleClientMessage": "Indeksatorer er ikke tilgængelige på grund af fejl i mere end 6 timer: {0}", "IndexerPriority": "Indekseringsprioritet", "IndexerPriorityHelpText": "Indekseringsprioritet fra 1 (højest) til 50 (lavest). Standard: 25.", - "IndexerProxyStatusCheckAllClientMessage": "Alle indexere er utilgængelige på grund af fejl", - "IndexerProxyStatusCheckSingleClientMessage": "Indexere utilgængelige på grund af fejl: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Alle indexere er utilgængelige på grund af fejl", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Indexere utilgængelige på grund af fejl: {indexerProxyNames}", "LaunchBrowserHelpText": " Åbn en webbrowser, og naviger til {appName}-hjemmesiden ved start af appen.", "Logging": "Logning", "LogLevel": "Logniveau", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 9976d6dd6..4df25d50e 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -185,8 +185,8 @@ "IndexerPriorityHelpText": "Indexer Priorität von 1 (höchste) bis 50 (niedrigste). Standard: 25.", "IndexerProxies": "Indexer-Proxies", "IndexerProxy": "Indexer-Proxy", - "IndexerProxyStatusCheckAllClientMessage": "Alle Indexer sind aufgrund von Fehlern nicht verfügbar", - "IndexerProxyStatusCheckSingleClientMessage": "Listen aufgrund von Fehlern nicht verfügbar: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Alle Indexer sind aufgrund von Fehlern nicht verfügbar", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Listen aufgrund von Fehlern nicht verfügbar: {indexerProxyNames}", "IndexerQuery": "Indexer Anfrage", "IndexerRss": "Indexer RSS", "IndexerSettingsSummary": "Konfiguration verschiedener globaler Indexer Einstellungen, einschließlich Proxies.", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index a172110ec..02dac92f0 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -141,8 +141,8 @@ "Hostname": "Όνομα κεντρικού υπολογιστή", "IndexerLongTermStatusCheckSingleClientMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών για περισσότερο από 6 ώρες: {0}", "IndexerPriorityHelpText": "Προτεραιότητα ευρετηρίου από 1 (Υψηλότερη) έως 50 (Χαμηλότερη). Προεπιλογή: 25.", - "IndexerProxyStatusCheckAllClientMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", - "IndexerProxyStatusCheckSingleClientMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών: {indexerProxyNames}", "LaunchBrowserHelpText": " Ανοίξτε ένα πρόγραμμα περιήγησης ιστού και μεταβείτε στην αρχική σελίδα του {appName} κατά την έναρξη της εφαρμογής.", "LogFiles": "Αρχεία καταγραφής", "Logging": "Ξύλευση", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 2a0b48532..30fa3205d 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -374,8 +374,8 @@ "IndexerPriorityHelpText": "Indexer Priority from 1 (Highest) to 50 (Lowest). Default: 25.", "IndexerProxies": "Indexer Proxies", "IndexerProxy": "Indexer Proxy", - "IndexerProxyStatusCheckAllClientMessage": "All proxies are unavailable due to failures", - "IndexerProxyStatusCheckSingleClientMessage": "Proxies unavailable due to failures: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "All indexer proxies are unavailable due to failures", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Indexer proxies unavailable due to failures: {indexerProxyNames}", "IndexerQuery": "Indexer Query", "IndexerRedactedSettingsApiKeyHelpText": "API Key from the Site (Found in Settings => Access Settings)", "IndexerRss": "Indexer RSS", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 513603fac..a93218b2d 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -308,8 +308,8 @@ "ApplicationStatusCheckSingleClientMessage": "Listas no disponibles debido a errores: {0}", "AllIndexersHiddenDueToFilter": "Todos los indexadores están ocultas debido al filtro aplicado.", "DeleteApplicationMessageText": "Seguro que quieres eliminar la notificación '{name}'?", - "IndexerProxyStatusCheckAllClientMessage": "Los indexers no están disponibles debido a errores", - "IndexerProxyStatusCheckSingleClientMessage": "Indexers no disponibles debido a errores: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Los indexers no están disponibles debido a errores", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Indexers no disponibles debido a errores: {indexerProxyNames}", "NoLinks": "Sin enlaces", "AddDownloadClient": "Añadir Cliente de Descarga", "CouldNotConnectSignalR": "No se pudo conectar a SignalR, la interfaz de usuario no se actualiza", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 73d673c59..2bd232714 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -1,5 +1,5 @@ { - "IndexerProxyStatusCheckSingleClientMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi: {indexerProxyNames}", "Logging": "Lokikirjaus", "LogLevel": "Lokikirjauksen laajuus", "MovieIndexScrollTop": "Elokuvakirjasto: vieritä ylös", @@ -278,7 +278,7 @@ "IndexerLongTermStatusCheckAllClientMessage": "Mikään tietolähde ei ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.", "IndexerLongTermStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}", "IndexerPriority": "Tietolähteiden painotus", - "IndexerProxyStatusCheckAllClientMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi", "IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi", "IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi: {0}", "NoChange": "Ei muutosta", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index fc6b4f085..42fb7dd3d 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -372,8 +372,8 @@ "IndexerProxy": "Proxy d'indexation", "IndexerSettingsSummary": "Configuration de divers paramètres globaux de l'indexeur, y compris les proxies.", "IndexerProxies": "Proxys d'indexation", - "IndexerProxyStatusCheckAllClientMessage": "Tous les proxys sont indisponibles en raison d'échecs", - "IndexerProxyStatusCheckSingleClientMessage": "Proxys indisponibles en raison d'échecs : {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Tous les proxys sont indisponibles en raison d'échecs", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxys indisponibles en raison d'échecs : {indexerProxyNames}", "IndexerVipCheckExpiringClientMessage": "Les avantages VIP de l'indexeur arrivent bientôt à expiration : {0}", "NoLinks": "Aucun liens", "Notification": "Notification", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index c9bdf6301..bee6c303f 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -160,8 +160,8 @@ "Hostname": "שם מארח", "IndexerPriority": "עדיפות אינדקס", "IndexerPriorityHelpText": "עדיפות אינדקס מ -1 (הגבוה ביותר) ל -50 (הנמוך ביותר). ברירת מחדל: 25.", - "IndexerProxyStatusCheckAllClientMessage": "כל הרשימות אינן זמינות בגלל כשלים", - "IndexerProxyStatusCheckSingleClientMessage": "אינדקסים לא זמינים בגלל כשלים: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "כל הרשימות אינן זמינות בגלל כשלים", + "IndexerProxyStatusUnavailableHealthCheckMessage": "אינדקסים לא זמינים בגלל כשלים: {indexerProxyNames}", "IndexerStatusCheckAllClientMessage": "כל האינדקסים אינם זמינים עקב כשלים", "IndexerStatusCheckSingleClientMessage": "אינדקסים לא זמינים בגלל כשלים: {0}", "NoBackupsAreAvailable": "אין גיבויים", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index d6af6b576..fc532e6a9 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -272,8 +272,8 @@ "IndexerLongTermStatusCheckSingleClientMessage": "6 घंटे से अधिक समय तक विफलताओं के कारण सूचकांक उपलब्ध नहीं: {0}", "IndexerPriority": "सूचकांक प्राथमिकता", "IndexerPriorityHelpText": "इंडेक्सर प्राथमिकता 1 (उच्चतम) से 50 (सबसे कम)। डिफ़ॉल्ट: 25", - "IndexerProxyStatusCheckAllClientMessage": "सभी सूचियाँ विफल होने के कारण अनुपलब्ध हैं", - "IndexerProxyStatusCheckSingleClientMessage": "अनुक्रमणिका विफलताओं के कारण अनुपलब्ध: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "सभी सूचियाँ विफल होने के कारण अनुपलब्ध हैं", + "IndexerProxyStatusUnavailableHealthCheckMessage": "अनुक्रमणिका विफलताओं के कारण अनुपलब्ध: {indexerProxyNames}", "InteractiveSearch": "इंटरएक्टिव खोज", "Interval": "मध्यान्तर", "KeyboardShortcuts": "कुंजीपटल अल्प मार्ग", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 3d221b35e..f5c8eb80c 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -366,8 +366,8 @@ "DeleteIndexerProxy": "Indexer Proxy törlése", "DeleteIndexerProxyMessageText": "Biztosan törlöd a(z) „{0}” proxyt?", "IndexerProxies": "Indexer Proxy(k)", - "IndexerProxyStatusCheckAllClientMessage": "Az összes Proxy elérhetetlen, hiba miatt", - "IndexerProxyStatusCheckSingleClientMessage": "Proxyk elérhetetlenek az alábbi hibák miatt: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Az összes Proxy elérhetetlen, hiba miatt", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxyk elérhetetlenek az alábbi hibák miatt: {indexerProxyNames}", "IndexerTagsHelpText": "Címkék segítségével megadhatod az indexer proxykat amelyekkel az indexer szinkronizálva van, vagy egyszerűen az indexelők rendszerezéséhez.", "UnableToLoadIndexerProxies": "Nem lehet betölteni az Indexer Proxyt", "AddIndexerProxy": "Indexer Proxy hozzáadása", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index e1572f31f..356f992d6 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -23,8 +23,8 @@ "Exception": "Undantekning", "FocusSearchBox": "Fókus leitarreitur", "Grabbed": "Greip", - "IndexerProxyStatusCheckAllClientMessage": "Allir listar eru ekki tiltækir vegna bilana", - "IndexerProxyStatusCheckSingleClientMessage": "Listar ekki tiltækir vegna bilana: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Allir listar eru ekki tiltækir vegna bilana", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Listar ekki tiltækir vegna bilana: {indexerProxyNames}", "SSLCertPassword": "SSL vottorð lykilorð", "SSLCertPasswordHelpText": "Lykilorð fyrir PFX skrá", "SSLCertPath": "SSL vottunarleið", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index fa8583073..d046328d9 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -321,8 +321,8 @@ "Custom": "Personalizzato", "FeatureRequests": "Richieste di funzionalità", "Grabs": "Prendere", - "IndexerProxyStatusCheckAllClientMessage": "Tutti i Proxy non sono disponibili a causa di errori", - "IndexerProxyStatusCheckSingleClientMessage": "Proxy non disponibili a causa di errori: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Tutti i Proxy non sono disponibili a causa di errori", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxy non disponibili a causa di errori: {indexerProxyNames}", "Reddit": "Reddit", "Torrent": "Torrent", "UnableToAddANewApplicationPleaseTryAgain": "Impossibile aggiungere una nuova applicazione, riprova.", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index bfc694859..f4262b360 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -61,8 +61,8 @@ "Files": "ファイル", "Filter": "フィルタ", "IndexerLongTermStatusCheckAllClientMessage": "6時間以上の障害のため、すべてのインデクサーが使用できなくなります", - "IndexerProxyStatusCheckAllClientMessage": "障害のため、すべてのインデクサーを使用できません", - "IndexerProxyStatusCheckSingleClientMessage": "失敗のため利用できないリスト:{0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "障害のため、すべてのインデクサーを使用できません", + "IndexerProxyStatusUnavailableHealthCheckMessage": "失敗のため利用できないリスト:{indexerProxyNames}", "Indexers": "インデクサー", "LastWriteTime": "最終書き込み時間", "Level": "レベル", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 30e331cff..6db9b99f5 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -301,8 +301,8 @@ "IndexerFlags": "인덱서 플래그", "IndexerLongTermStatusCheckAllClientMessage": "6 시간 이상 오류로 인해 모든 인덱서를 사용할 수 없습니다.", "IndexerLongTermStatusCheckSingleClientMessage": "6 시간 이상 오류로 인해 인덱서를 사용할 수 없음 : {0}", - "IndexerProxyStatusCheckAllClientMessage": "오류로 인해 모든 인덱서를 사용할 수 없습니다.", - "IndexerProxyStatusCheckSingleClientMessage": "오류로 인해 인덱서를 사용할 수 없음 : {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "오류로 인해 모든 인덱서를 사용할 수 없습니다.", + "IndexerProxyStatusUnavailableHealthCheckMessage": "오류로 인해 인덱서를 사용할 수 없음 : {indexerProxyNames}", "IndexerStatusCheckSingleClientMessage": "오류로 인해 인덱서를 사용할 수 없음 : {0}", "NetCore": ".NET Core", "Save": "저장", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 76a959559..0922cc5a5 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -177,8 +177,8 @@ "IndexerPriorityHelpText": "Indexeerder Prioriteit van 1 (Hoogste) tot 50 (Laagste). Standaard: 25.", "IndexerProxies": "Indexer-proxy's", "IndexerProxy": "Indexeerder-proxy", - "IndexerProxyStatusCheckAllClientMessage": "Alle proxy's zijn niet beschikbaar vanwege storingen", - "IndexerProxyStatusCheckSingleClientMessage": "Proxy's niet beschikbaar vanwege storingen: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Alle proxy's zijn niet beschikbaar vanwege storingen", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxy's niet beschikbaar vanwege storingen: {indexerProxyNames}", "IndexerQuery": "Indexeer zoekopdracht", "IndexerRss": "Indexeer RSS", "IndexerSettingsSummary": "Configureer verschillende globale Indexer-instellingen, waaronder proxy's.", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 8065cf33d..610e14b26 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -73,7 +73,7 @@ "CouldNotConnectSignalR": "Nie można połączyć się z SignalR, interfejs użytkownika nie zostanie zaktualizowany", "EnableInteractiveSearchHelpText": "Będzie używany, gdy używane jest wyszukiwanie interaktywne", "HomePage": "Strona główna", - "IndexerProxyStatusCheckSingleClientMessage": "Listy niedostępne z powodu błędów: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Listy niedostępne z powodu błędów: {indexerProxyNames}", "LastWriteTime": "Czas ostatniego zapisu", "Level": "Poziom", "LogFiles": "Pliki dziennika", @@ -160,7 +160,7 @@ "IndexerLongTermStatusCheckSingleClientMessage": "Indeksatory niedostępne z powodu błędów przez ponad 6 godzin: {0}", "IndexerPriority": "Priorytet indeksatora", "IndexerPriorityHelpText": "Priorytet indeksatora od 1 (najwyższy) do 50 (najniższy). Domyślnie: 25.", - "IndexerProxyStatusCheckAllClientMessage": "Wszystkie listy są niedostępne z powodu błędów", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Wszystkie listy są niedostępne z powodu błędów", "ShowSearchHelpText": "Pokaż przycisk wyszukiwania po najechaniu kursorem", "IndexerStatusCheckSingleClientMessage": "Indeksatory niedostępne z powodu błędów: {0}", "Info": "Informacje", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 8cfd4fde4..1bf752f1c 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -365,9 +365,9 @@ "DeleteIndexerProxyMessageText": "Tem a certeza que quer eliminar o proxy \"{name}\"?", "IndexerProxy": "Proxy de Indexador", "AddIndexerProxy": "Adicionar Proxy de Indexador", - "IndexerProxyStatusCheckSingleClientMessage": "Proxys indisponíveis devido a falhas: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxys indisponíveis devido a falhas: {indexerProxyNames}", "IndexerProxies": "Proxys de Indexadores", - "IndexerProxyStatusCheckAllClientMessage": "Todos os proxys estão indisponíveis devido a falhas", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Todos os proxys estão indisponíveis devido a falhas", "NoLinks": "Sem ligações", "UnableToAddANewIndexerProxyPleaseTryAgain": "Não foi possível adicionar um novo indexador, tenta novamente.", "Filters": "Filtros", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index d5748d66b..11dfa1f9a 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -207,8 +207,8 @@ "IndexerPriorityHelpText": "Prioridade do Indexador de 1 (Mais Alta) a 50 (Mais Baixa). Padrão: 25.", "IndexerProxies": "Proxies do Indexador", "IndexerProxy": "Proxy do Indexador", - "IndexerProxyStatusCheckAllClientMessage": "Todos os proxies estão indisponíveis devido a falhas", - "IndexerProxyStatusCheckSingleClientMessage": "Proxies indisponíveis devido a falhas: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Todos os proxies estão indisponíveis devido a falhas", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxies indisponíveis devido a falhas: {indexerProxyNames}", "IndexerQuery": "Consulta do indexador", "IndexerRss": "RSS do indexador", "IndexerSettingsSummary": "Defina várias configurações globais do Indexador, incluindo Proxies.", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index ee4e28b99..eb8271593 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -157,8 +157,8 @@ "EnableInteractiveSearchHelpText": "Va fi utilizat atunci când este utilizată căutarea interactivă", "ForMoreInformationOnTheIndividualDownloadClients": "Pentru mai multe informații despre clienții individuali de descărcare, faceți clic pe butoanele de informații.", "IllRestartLater": "Voi reporni mai târziu", - "IndexerProxyStatusCheckAllClientMessage": "Niciun indexator nu este disponibil datorită erorilor", - "IndexerProxyStatusCheckSingleClientMessage": "Proxiuri indisponibile datorită erorilor: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Niciun indexator nu este disponibil datorită erorilor", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxiuri indisponibile datorită erorilor: {indexerProxyNames}", "Add": "Adaugă", "Custom": "Personalizat", "DeleteBackup": "Ștergeți copia de rezervă", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 3b36cccc8..c8475297d 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -76,7 +76,7 @@ "DeleteIndexerProxyMessageText": "Вы уверены, что хотите удалить тэг '{0}'?", "ExistingTag": "Существующий тэг", "Failed": "Неудачно", - "IndexerProxyStatusCheckSingleClientMessage": "Индексаторы недоступны из-за ошибок: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Индексаторы недоступны из-за ошибок: {indexerProxyNames}", "Indexers": "Индексаторы", "InteractiveSearch": "Интерактивный поиск", "Interval": "Интервал", @@ -157,7 +157,7 @@ "IndexerLongTermStatusCheckSingleClientMessage": "Все индексаторы недоступны из-за ошибок за последние 6 часов: {0}", "IndexerPriority": "Приоритет индексаторов", "IndexerPriorityHelpText": "Приоритет индексаторов от 1 (наивысший) до 50 (низший). По-умолчанию: 25.", - "IndexerProxyStatusCheckAllClientMessage": "Все индексаторы недоступны из-за ошибок", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Все индексаторы недоступны из-за ошибок", "Info": "Информация", "Logging": "Журналирование", "Message": "Сообщение", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 4f56bbbd2..2d0cc7227 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -118,7 +118,7 @@ "HomePage": "Hemsida", "IndexerPriority": "Indexerprioritet", "Reddit": "Reddit", - "IndexerProxyStatusCheckAllClientMessage": "Samtliga indexerare otillgängliga på grund av fel", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Samtliga indexerare otillgängliga på grund av fel", "NoLinks": "Inga länkar", "NoTagsHaveBeenAddedYet": "Inga taggar har lagts till ännu", "NotificationTriggers": "Meddelandeutlösare", @@ -200,7 +200,7 @@ "AddingTag": "Lägg till tagg", "Enabled": "Aktiverad", "Exception": "Undantag", - "IndexerProxyStatusCheckSingleClientMessage": "Indexerare otillgängliga på grund av fel: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Indexerare otillgängliga på grund av fel: {indexerProxyNames}", "UILanguageHelpTextWarning": "Omladdning av webbläsaren krävs", "UnableToLoadHistory": "Det gick inte att läsa in historiken", "Uptime": "Drifttid", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 18ce7b21b..8f7870554 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -15,8 +15,8 @@ "PortNumber": "หมายเลขพอร์ต", "Restart": "เริ่มต้นใหม่", "SSLCertPathHelpText": "พา ธ ไปยังไฟล์ pfx", - "IndexerProxyStatusCheckAllClientMessage": "รายการทั้งหมดไม่พร้อมใช้งานเนื่องจากความล้มเหลว", - "IndexerProxyStatusCheckSingleClientMessage": "ตัวจัดทำดัชนีไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "รายการทั้งหมดไม่พร้อมใช้งานเนื่องจากความล้มเหลว", + "IndexerProxyStatusUnavailableHealthCheckMessage": "ตัวจัดทำดัชนีไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {indexerProxyNames}", "Indexers": "ดัชนี", "Info": "ข้อมูล", "InteractiveSearch": "การค้นหาแบบโต้ตอบ", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 4ca199ecf..dd8a57cfa 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -269,8 +269,8 @@ "EventType": "Etkinlik tipi", "Exception": "İstisna", "ExistingTag": "Mevcut etiket", - "IndexerProxyStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", - "IndexerProxyStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {indexerProxyNames}", "Indexers": "Dizin oluşturucular", "Name": "İsim", "New": "Yeni", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 28689ac32..3194b0fab 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -318,8 +318,8 @@ "EnableRss": "Увімкнути RSS", "HistoryCleanupDaysHelpText": "Встановіть значення 0, щоб вимкнути автоматичне очищення", "HistoryCleanupDaysHelpTextWarning": "Файли в кошику, старші за вибрану кількість днів, будуть очищені автоматично", - "IndexerProxyStatusCheckAllClientMessage": "Усі індексатори недоступні через збої", - "IndexerProxyStatusCheckSingleClientMessage": "Індексатори недоступні через помилки: {0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Усі індексатори недоступні через збої", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Індексатори недоступні через помилки: {indexerProxyNames}", "ReleaseBranchCheckOfficialBranchMessage": "Гілка {0} не є дійсною гілкою випуску {appName}, ви не отримуватимете оновлення", "UnableToAddANewApplicationPleaseTryAgain": "Не вдалося додати нове сповіщення, спробуйте ще раз.", "UnableToAddANewAppProfilePleaseTryAgain": "Не вдалося додати новий профіль якості, спробуйте ще раз.", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index bf6ed05da..d0294de21 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -11,7 +11,7 @@ "NoChanges": "Không thay đổi", "NoLeaveIt": "Không để nó", "NoLogFiles": "Không có tệp nhật ký", - "IndexerProxyStatusCheckSingleClientMessage": "Danh sách không có sẵn do lỗi: {0}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Danh sách không có sẵn do lỗi: {indexerProxyNames}", "Indexers": "Người lập chỉ mục", "InteractiveSearch": "Tìm kiếm tương tác", "Message": "Thông điệp", @@ -184,7 +184,7 @@ "NoChange": "Không thay đổi", "PortNumber": "Số cổng", "Proxy": "Ủy quyền", - "IndexerProxyStatusCheckAllClientMessage": "Tất cả các trình lập chỉ mục không khả dụng do lỗi", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Tất cả các trình lập chỉ mục không khả dụng do lỗi", "IndexerStatusCheckAllClientMessage": "Tất cả các trình lập chỉ mục không khả dụng do lỗi", "Info": "Thông tin", "MoreInfo": "Thêm thông tin", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 62fe1053e..35c94f567 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -206,8 +206,8 @@ "IndexerPriorityHelpText": "索引器优先级从1(最高)到50(最低),默认25。", "IndexerProxies": "搜刮器代理", "IndexerProxy": "搜刮器代理", - "IndexerProxyStatusCheckAllClientMessage": "所有搜刮器都因错误不可用", - "IndexerProxyStatusCheckSingleClientMessage": "搜刮器因错误不可用:{0}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "所有搜刮器都因错误不可用", + "IndexerProxyStatusUnavailableHealthCheckMessage": "搜刮器因错误不可用:{indexerProxyNames}", "IndexerQuery": "搜刮器查询", "IndexerRss": "搜刮器RSS", "IndexerSettingsSummary": "配置全局索引器设置,包括代理。", From ee7c821cabd4f3cb7531e055d8efc5045c2ae035 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 23 Mar 2024 13:56:58 +0000 Subject: [PATCH 505/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dani Talens Co-authored-by: Havok Dan Co-authored-by: Jason54 Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 9 ++++++++- src/NzbDrone.Core/Localization/Core/fr.json | 12 ++++++++++-- src/NzbDrone.Core/Localization/Core/pt_BR.json | 5 ++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index d8af57a73..26f7eddfa 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -431,5 +431,12 @@ "Id": "ID", "Author": "Autor", "ManageClients": "Gestiona els clients", - "CountApplicationsSelected": "{count} Col·lecció(ns) seleccionades" + "CountApplicationsSelected": "{count} Col·lecció(ns) seleccionades", + "DownloadClientAriaSettingsDirectoryHelpText": "Ubicació opcional per a les baixades, deixeu-lo en blanc per utilitzar la ubicació predeterminada d'Aria2", + "Donate": "Dona", + "BlackholeFolderHelpText": "Carpeta on {appName} emmagatzemarà els fitxers {extension}", + "Destination": "Destinació", + "Directory": "Directori", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Afegeix un prefix a l'url json del Deluge, vegeu {url}", + "CustomFilter": "Filtres personalitzats" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 42fb7dd3d..402c268aa 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -25,7 +25,7 @@ "AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour", "Analytics": "Statistiques", "All": "Tout", - "About": "Tagalog", + "About": "À propos", "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", "DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}", "SetTags": "Définir des étiquettes", @@ -737,5 +737,13 @@ "TorrentBlackholeTorrentFolder": "Dossier Torrent", "UseSsl": "Utiliser SSL", "DownloadClientRTorrentSettingsDirectoryHelpText": "Emplacement facultatif dans lequel placer les téléchargements. Laisser vide pour utiliser l'emplacement par défaut de rTorrent", - "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Catégorie de secours par défaut si aucune catégorie mappée n'existe pour une version. L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée. Crée un sous-répertoire [catégorie] dans le répertoire de sortie." + "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Catégorie de secours par défaut si aucune catégorie mappée n'existe pour une version. L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée. Crée un sous-répertoire [catégorie] dans le répertoire de sortie.", + "ProwlarrDownloadClientsInAppOnlyAlert": "Les clients de téléchargement servent uniquement à effectuer des recherches dans l'application {appName} et ne se synchronisent pas avec les applications. Il n'est pas prévu d'ajouter une telle fonctionnalité.", + "Donate": "Donation", + "Menu": "Menu", + "Mixed": "Mixte", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Synchroniser le rejet des hachages torrent sur liste bloquée lors de la saisie", + "ClickToChangeQueryOptions": "Cliquez pour modifier les options de la requête", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.", + "ProwlarrDownloadClientsAlert": "Si vous avez l'intention d'effectuer des recherches directement dans {appName}, vous devez ajouter les clients de téléchargement. Sinon, vous n'avez pas besoin de les ajouter ici. Pour les recherches à partir de vos applications, les clients de téléchargement qui y sont configurés sont utilisés à la place." } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 11dfa1f9a..29c22a2c5 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -742,5 +742,8 @@ "ProwlarrDownloadClientsAlert": "Se você pretende fazer pesquisas diretamente em {appName}, você precisa adicionar Clientes de Download. Caso contrário, você não precisa adicioná-los aqui. Para pesquisas em seus aplicativos, os clientes de download configurados são usados.", "Menu": "Menu", "Mixed": "Misturado", - "Donate": "Doar" + "Donate": "Doar", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronizar Lista de Bloqueio de Hashes de Torrents Rejeitados Enquanto Baixando", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", + "ClickToChangeQueryOptions": "Clique para alterar as opções de consulta" } From a3e134ce0bf46993cb9a24926f59b5b6ebae000f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 23 Mar 2024 15:59:26 +0200 Subject: [PATCH 506/964] Link indexer proxy settings from health page --- frontend/src/System/Status/Health/Health.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/System/Status/Health/Health.js b/frontend/src/System/Status/Health/Health.js index 372867e56..ec3ad388c 100644 --- a/frontend/src/System/Status/Health/Health.js +++ b/frontend/src/System/Status/Health/Health.js @@ -41,6 +41,14 @@ function getInternalLink(source) { to="/settings/connect" /> ); + case 'IndexerProxyStatusCheck': + return ( + + ); case 'IndexerRssCheck': case 'IndexerSearchCheck': case 'IndexerStatusCheck': From a33023b8c6a83d33a65525275dfb6aa028460e6e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 Mar 2023 20:10:11 +0200 Subject: [PATCH 507/964] New: Migrate M-Team - TP to API --- .../IndexerDefinitionUpdateService.cs | 2 + .../Indexers/Definitions/MTeamTp.cs | 494 ++++++++++++++++++ src/NzbDrone.Core/Localization/Core/en.json | 2 + 3 files changed, 498 insertions(+) create mode 100644 src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs diff --git a/src/NzbDrone.Core/IndexerVersions/IndexerDefinitionUpdateService.cs b/src/NzbDrone.Core/IndexerVersions/IndexerDefinitionUpdateService.cs index 4100934a0..70c15fb10 100644 --- a/src/NzbDrone.Core/IndexerVersions/IndexerDefinitionUpdateService.cs +++ b/src/NzbDrone.Core/IndexerVersions/IndexerDefinitionUpdateService.cs @@ -46,6 +46,8 @@ namespace NzbDrone.Core.IndexerVersions "desitorrents", "hdbits", "lat-team", + "mteamtp", + "mteamtp2fa", "reelflix", "shareisland", "skipthecommercials", diff --git a/src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs b/src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs new file mode 100644 index 000000000..d2db162be --- /dev/null +++ b/src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs @@ -0,0 +1,494 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using FluentValidation; +using Newtonsoft.Json; +using NLog; +using NzbDrone.Common.Extensions; +using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Annotations; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.Exceptions; +using NzbDrone.Core.Indexers.Exceptions; +using NzbDrone.Core.Indexers.Settings; +using NzbDrone.Core.IndexerSearch.Definitions; +using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.Parser; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Validation; + +namespace NzbDrone.Core.Indexers.Definitions; + +public class MTeamTp : TorrentIndexerBase +{ + public override string Name => "M-Team - TP"; + public override string[] IndexerUrls => new[] + { + "https://kp.m-team.cc/", + "https://tp.m-team.cc/", + "https://pt.m-team.cc/" + }; + public override string Description => "M-Team TP (MTTP) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / 3X"; + public override string Language => "zh-CN"; + public override DownloadProtocol Protocol => DownloadProtocol.Torrent; + public override IndexerPrivacy Privacy => IndexerPrivacy.Private; + public override int PageSize => 100; + public override TimeSpan RateLimit => TimeSpan.FromSeconds(5); + public override IndexerCapabilities Capabilities => SetCapabilities(); + + public const string UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.35"; + + public MTeamTp(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) + : base(httpClient, eventAggregator, indexerStatusService, configService, logger) + { + } + + public override IIndexerRequestGenerator GetRequestGenerator() + { + return new MTeamTpRequestGenerator(Settings, Capabilities); + } + + public override IParseIndexerResponse GetParser() + { + return new MTeamTpParser(Settings, Capabilities.Categories); + } + + public override async Task Download(Uri link) + { + var request = new HttpRequestBuilder(link.ToString()) + .SetHeader("x-api-key", Settings.ApiKey) + .Accept(HttpAccept.Json) + .Post() + .Build(); + + request.Headers.UserAgent = UserAgent; + + var response = await _httpClient.ExecuteProxiedAsync(request, Definition); + + if (!STJson.TryDeserialize(response.Content, out var jsonResponse)) + { + throw new ReleaseDownloadException("Invalid response received from M-Team, not a valid JSON"); + } + + if (jsonResponse.Data.IsNullOrWhiteSpace()) + { + throw new ReleaseDownloadException($"Unable to find download link for: {link}"); + } + + return await base.Download(new Uri(jsonResponse.Data)); + } + + protected override Task GetDownloadRequest(Uri link) + { + var request = new HttpRequest(link.AbsoluteUri) + { + AllowAutoRedirect = true, + Headers = + { + UserAgent = UserAgent + } + }; + + return Task.FromResult(request); + } + + protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) + { + return false; + } + + private static IndexerCapabilities SetCapabilities() + { + var caps = new IndexerCapabilities + { + TvSearchParams = new List + { + TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.ImdbId + }, + MovieSearchParams = new List + { + MovieSearchParam.Q, MovieSearchParam.ImdbId + }, + MusicSearchParams = new List + { + MusicSearchParam.Q + }, + BookSearchParams = new List + { + BookSearchParam.Q + } + }; + + caps.Categories.AddCategoryMapping(401, NewznabStandardCategory.MoviesSD, "Movie(電影)/SD"); + caps.Categories.AddCategoryMapping(419, NewznabStandardCategory.MoviesHD, "Movie(電影)/HD"); + caps.Categories.AddCategoryMapping(420, NewznabStandardCategory.MoviesDVD, "Movie(電影)/DVDiSo"); + caps.Categories.AddCategoryMapping(421, NewznabStandardCategory.MoviesBluRay, "Movie(電影)/Blu-Ray"); + caps.Categories.AddCategoryMapping(439, NewznabStandardCategory.MoviesHD, "Movie(電影)/Remux"); + caps.Categories.AddCategoryMapping(403, NewznabStandardCategory.TVSD, "TV Series(影劇/綜藝)/SD"); + caps.Categories.AddCategoryMapping(402, NewznabStandardCategory.TVHD, "TV Series(影劇/綜藝)/HD"); + caps.Categories.AddCategoryMapping(435, NewznabStandardCategory.TVSD, "TV Series(影劇/綜藝)/DVDiSo"); + caps.Categories.AddCategoryMapping(438, NewznabStandardCategory.TVHD, "TV Series(影劇/綜藝)/BD"); + caps.Categories.AddCategoryMapping(404, NewznabStandardCategory.TVDocumentary, "紀錄教育"); + caps.Categories.AddCategoryMapping(405, NewznabStandardCategory.TVAnime, "Anime(動畫)"); + caps.Categories.AddCategoryMapping(407, NewznabStandardCategory.TVSport, "Sports(運動)"); + caps.Categories.AddCategoryMapping(422, NewznabStandardCategory.PC0day, "Software(軟體)"); + caps.Categories.AddCategoryMapping(423, NewznabStandardCategory.PCGames, "PCGame(PC遊戲)"); + caps.Categories.AddCategoryMapping(427, NewznabStandardCategory.Books, "eBook(電子書)"); + caps.Categories.AddCategoryMapping(409, NewznabStandardCategory.Other, "Misc(其他)"); + + // music + caps.Categories.AddCategoryMapping(406, NewznabStandardCategory.AudioVideo, "MV(演唱)"); + caps.Categories.AddCategoryMapping(408, NewznabStandardCategory.AudioOther, "Music(AAC/ALAC)"); + caps.Categories.AddCategoryMapping(434, NewznabStandardCategory.Audio, "Music(無損)"); + + // adult + caps.Categories.AddCategoryMapping(410, NewznabStandardCategory.XXX, "AV(有碼)/HD Censored"); + caps.Categories.AddCategoryMapping(429, NewznabStandardCategory.XXX, "AV(無碼)/HD Uncensored"); + caps.Categories.AddCategoryMapping(424, NewznabStandardCategory.XXXSD, "AV(有碼)/SD Censored"); + caps.Categories.AddCategoryMapping(430, NewznabStandardCategory.XXXSD, "AV(無碼)/SD Uncensored"); + caps.Categories.AddCategoryMapping(426, NewznabStandardCategory.XXXDVD, "AV(無碼)/DVDiSo Uncensored"); + caps.Categories.AddCategoryMapping(437, NewznabStandardCategory.XXXDVD, "AV(有碼)/DVDiSo Censored"); + caps.Categories.AddCategoryMapping(431, NewznabStandardCategory.XXX, "AV(有碼)/Blu-Ray Censored"); + caps.Categories.AddCategoryMapping(432, NewznabStandardCategory.XXX, "AV(無碼)/Blu-Ray Uncensored"); + caps.Categories.AddCategoryMapping(436, NewznabStandardCategory.XXX, "AV(網站)/0Day"); + caps.Categories.AddCategoryMapping(425, NewznabStandardCategory.XXX, "IV(寫真影集)/Video Collection"); + caps.Categories.AddCategoryMapping(433, NewznabStandardCategory.XXXImageSet, "IV(寫真圖集)/Picture Collection"); + caps.Categories.AddCategoryMapping(411, NewznabStandardCategory.XXX, "H-Game(遊戲)"); + caps.Categories.AddCategoryMapping(412, NewznabStandardCategory.XXX, "H-Anime(動畫)"); + caps.Categories.AddCategoryMapping(413, NewznabStandardCategory.XXX, "H-Comic(漫畫)"); + caps.Categories.AddCategoryMapping(440, NewznabStandardCategory.XXX, "AV(Gay)/HD"); + + return caps; + } +} + +public class MTeamTpRequestGenerator : IIndexerRequestGenerator +{ + private readonly MTeamTpSettings _settings; + private readonly IndexerCapabilities _capabilities; + + private readonly int[] _trackerAdultCategories = { 410, 429, 424, 430, 426, 437, 431, 432, 436, 425, 433, 411, 412, 413, 440 }; + + public MTeamTpRequestGenerator(MTeamTpSettings settings, IndexerCapabilities capabilities) + { + _settings = settings; + _capabilities = capabilities; + } + + public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) + { + var pageableRequests = new IndexerPageableRequestChain(); + + pageableRequests.Add(GetPagedRequests(MTeamTpRequestType.Normal, searchCriteria, searchCriteria.SanitizedSearchTerm, searchCriteria.FullImdbId)); + + return pageableRequests; + } + + public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) + { + var pageableRequests = new IndexerPageableRequestChain(); + + pageableRequests.Add(GetPagedRequests(MTeamTpRequestType.Normal, searchCriteria, searchCriteria.SanitizedTvSearchString, searchCriteria.FullImdbId)); + + return pageableRequests; + } + + public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) + { + var pageableRequests = new IndexerPageableRequestChain(); + + pageableRequests.Add(GetPagedRequests(MTeamTpRequestType.Normal, searchCriteria, searchCriteria.SanitizedSearchTerm)); + + return pageableRequests; + } + + public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) + { + var pageableRequests = new IndexerPageableRequestChain(); + + pageableRequests.Add(GetPagedRequests(MTeamTpRequestType.Normal, searchCriteria, searchCriteria.SanitizedSearchTerm)); + + return pageableRequests; + } + + public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria) + { + var pageableRequests = new IndexerPageableRequestChain(); + + pageableRequests.Add(GetPagedRequests(MTeamTpRequestType.Normal, searchCriteria, searchCriteria.SanitizedSearchTerm)); + pageableRequests.Add(GetPagedRequests(MTeamTpRequestType.Adult, searchCriteria, searchCriteria.SanitizedSearchTerm)); + + return pageableRequests; + } + + private IEnumerable GetPagedRequests(MTeamTpRequestType mTeamTpRequestType, SearchCriteriaBase searchCriteria, string searchTerm, string imdbId = null) + { + var categoryMapping = _capabilities.Categories + .MapTorznabCapsToTrackers(searchCriteria.Categories) + .Select(int.Parse) + .Distinct() + .ToList(); + + var adultCategories = categoryMapping.Where(c => _trackerAdultCategories.Contains(c)).ToList(); + var normalCategories = categoryMapping.Except(adultCategories).ToList(); + + switch (mTeamTpRequestType) + { + case MTeamTpRequestType.Adult when adultCategories.Any(): + yield return BuildSearchRequest(mTeamTpRequestType, adultCategories, searchTerm, imdbId); + break; + case MTeamTpRequestType.Normal when !categoryMapping.Any() || normalCategories.Any(): + yield return BuildSearchRequest(mTeamTpRequestType, normalCategories, searchTerm, imdbId); + break; + } + } + + private IndexerRequest BuildSearchRequest(MTeamTpRequestType requestType, IEnumerable categoryMapping, string searchTerm, string imdbId) + { + var request = new HttpRequestBuilder(_settings.BaseUrl) + .Resource("/api/torrent/search") + .SetHeader("x-api-key", _settings.ApiKey) + .Accept(HttpAccept.Json) + .Post() + .Build(); + + var query = new MTeamTpApiSearchQuery + { + Mode = requestType, + Categories = categoryMapping?.Select(x => x.ToString()).ToArray() ?? Array.Empty(), + PageNumber = 1, + PageSize = 100 + }; + + if (imdbId.IsNotNullOrWhiteSpace()) + { + query.Imdb = imdbId.Trim(); + } + + if (searchTerm.IsNotNullOrWhiteSpace()) + { + query.Keyword = searchTerm.Trim(); + } + + if (_settings.FreeleechOnly) + { + query.Discount = "FREE"; + } + + request.Headers.ContentType = "application/json"; + request.SetContent(query.ToJson()); + request.ContentSummary = query.ToJson(Formatting.None); + request.Headers.UserAgent = MTeamTp.UserAgent; + + return new IndexerRequest(request); + } + + public Func> GetCookies { get; set; } + public Action, DateTime?> CookiesUpdater { get; set; } +} + +public class MTeamTpParser : IParseIndexerResponse +{ + private readonly MTeamTpSettings _settings; + private readonly IndexerCapabilitiesCategories _categories; + + public MTeamTpParser(MTeamTpSettings settings, IndexerCapabilitiesCategories categories) + { + _settings = settings; + _categories = categories; + } + + public IList ParseResponse(IndexerResponse indexerResponse) + { + var httpResponse = indexerResponse.HttpResponse; + + if (httpResponse.StatusCode != HttpStatusCode.OK) + { + throw new IndexerException(indexerResponse, $"Unexpected response status {indexerResponse.HttpResponse.StatusCode} code from indexer request"); + } + + if (!httpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value)) + { + throw new IndexerException(indexerResponse, $"Unexpected response header {indexerResponse.HttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}"); + } + + if (!STJson.TryDeserialize(indexerResponse.Content, out var jsonResponse)) + { + throw new IndexerException(indexerResponse, "Invalid response received from M-Team, not a valid JSON"); + } + + var releaseInfos = new List(); + + if (jsonResponse?.Data?.Torrents == null) + { + return releaseInfos; + } + + foreach (var torrent in jsonResponse.Data.Torrents) + { + var torrentId = int.Parse(torrent.Id); + var infoUrl = $"{_settings.BaseUrl.TrimEnd('/')}/detail/{torrentId}"; + + var release = new TorrentInfo + { + Guid = infoUrl, + Title = CleanTitle(torrent.Name), + InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(torrentId), + Categories = _categories.MapTrackerCatToNewznab(torrent.Category), + Description = torrent.Description, + Files = int.Parse(torrent.NumFiles), + Size = long.Parse(torrent.Size), + Grabs = int.Parse(torrent.Status.TimesCompleted), + Seeders = int.Parse(torrent.Status.Seeders), + Peers = int.Parse(torrent.Status.Seeders) + int.Parse(torrent.Status.Leechers), + DownloadVolumeFactor = torrent.Status.Discount.ToUpperInvariant() switch + { + "FREE" => 0, + "_2X_FREE" => 0, + "PERCENT_50" => 0.5, + "_2X_PERCENT_50" => 0.5, + "PERCENT_70" => 0.3, + _ => 1 + }, + UploadVolumeFactor = torrent.Status.Discount.ToUpperInvariant() switch + { + "_2X_FREE" => 2, + "_2X_PERCENT_50" => 2, + _ => 1 + }, + MinimumRatio = 1, + MinimumSeedTime = 172800 // 2 days + }; + + if (torrent.Imdb.IsNotNullOrWhiteSpace()) + { + release.ImdbId = ParseUtil.GetImdbId(torrent.Imdb.Split('/').LastOrDefault()).GetValueOrDefault(); + } + + if (torrent.Status?.CreatedDate != null && + DateTime.TryParseExact($"{torrent.Status.CreatedDate} +08:00", "yyyy-MM-dd HH:mm:ss zzz", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var publishDate)) + { + release.PublishDate = publishDate; + } + + releaseInfos.Add(release); + } + + return releaseInfos + .OrderByDescending(o => o.PublishDate) + .ToArray(); + } + + private string GetDownloadUrl(int torrentId) + { + var url = new HttpUri(_settings.BaseUrl) + .CombinePath("/api/torrent/genDlToken") + .AddQueryParam("id", torrentId); + + return url.FullUri; + } + + private static string CleanTitle(string title) + { + title = Regex.Replace(title, @"\s+", " ", RegexOptions.Compiled); + + return title.Trim(); + } + + public Action, DateTime?> CookiesUpdater { get; set; } +} + +public class MTeamTpValidator : NoAuthSettingsValidator +{ + public MTeamTpValidator() + { + RuleFor(c => c.ApiKey).NotEmpty(); + } +} + +public class MTeamTpSettings : NoAuthTorrentBaseSettings +{ + private static readonly MTeamTpValidator Validator = new (); + + [FieldDefinition(2, Label = "ApiKey", HelpText = "IndexerMTeamTpSettingsApiKeyHelpText", Privacy = PrivacyLevel.ApiKey)] + public string ApiKey { get; set; } + + [FieldDefinition(3, Label = "IndexerSettingsFreeleechOnly", Type = FieldType.Checkbox, HelpText = "IndexerMTeamTpSettingsFreeleechOnlyHelpText")] + public bool FreeleechOnly { get; set; } + + public override NzbDroneValidationResult Validate() + { + return new NzbDroneValidationResult(Validator.Validate(this)); + } +} + +internal enum MTeamTpRequestType +{ + Normal, + Adult +} + +internal class MTeamTpApiSearchQuery +{ + [JsonProperty(Required = Required.Always)] + public MTeamTpRequestType Mode { get; set; } + + [JsonProperty(Required = Required.Always)] + public IEnumerable Categories { get; set; } + + public string Discount { get; set; } + public string Imdb { get; set; } + public string Keyword { get; set; } + public int? PageNumber { get; set; } + public int? PageSize { get; set; } +} + +internal class MTeamTpApiResponse +{ + public MTeamTpApiData Data { get; set; } +} + +internal class MTeamTpApiData +{ + [JsonPropertyName("data")] + public IReadOnlyCollection Torrents { get; set; } +} + +internal class MTeamTpApiTorrent +{ + public string Id { get; set; } + public string Name { get; set; } + + [JsonPropertyName("smallDescr")] + public string Description { get; set; } + + public string Category { get; set; } + + [JsonPropertyName("numfiles")] + public string NumFiles { get; set; } + + public string Imdb { get; set; } + public string Size { get; set; } + public MTeamTpApiReleaseStatus Status { get; set; } +} + +internal class MTeamTpApiReleaseStatus +{ + public string CreatedDate { get; set; } + public string Discount { get; set; } + public string TimesCompleted { get; set; } + public string Seeders { get; set; } + public string Leechers { get; set; } +} + +internal class MTeamTpApiDownloadTokenResponse +{ + public string Data { get; set; } +} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 30fa3205d..d15b86c2c 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -358,6 +358,8 @@ "IndexerInfo": "Indexer Info", "IndexerLongTermStatusCheckAllClientMessage": "All indexers are unavailable due to failures for more than 6 hours", "IndexerLongTermStatusCheckSingleClientMessage": "Indexers unavailable due to failures for more than 6 hours: {0}", + "IndexerMTeamTpSettingsApiKeyHelpText": "API Key from the Site (Found in User Control Panel => Security => Laboratory)", + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Search freeleech releases only", "IndexerName": "Indexer Name", "IndexerNebulanceSettingsApiKeyHelpText": "API Key from User Settings > Api Keys. Key must have List and Download permissions", "IndexerNewznabSettingsAdditionalParametersHelpText": "Additional Newznab parameters", From 12671e99051c06d7fe02fb61bebe423f4637c74f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 26 Mar 2024 19:24:49 +0200 Subject: [PATCH 508/964] New: Advanced settings toggle in indexer, notification and download client modals --- .../EditDownloadClientModalContent.js | 9 +++++++++ ...EditDownloadClientModalContentConnector.js | 19 +++++++++++++++++-- .../EditIndexerProxyModalContent.js | 9 +++++++++ .../EditIndexerProxyModalContentConnector.js | 17 +++++++++++++++-- .../EditNotificationModalContent.js | 9 +++++++++ .../EditNotificationModalContentConnector.js | 17 +++++++++++++++-- 6 files changed, 74 insertions(+), 6 deletions(-) diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js b/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js index b4dd3c1e9..c57432710 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js @@ -17,6 +17,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { icons, inputTypes, kinds } from 'Helpers/Props'; +import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton'; import translate from 'Utilities/String/translate'; import AddCategoryModalConnector from './Categories/AddCategoryModalConnector'; import Category from './Categories/Category'; @@ -61,6 +62,7 @@ class EditDownloadClientModalContent extends Component { onModalClose, onSavePress, onTestPress, + onAdvancedSettingsPress, onDeleteDownloadClientPress, onConfirmDeleteCategory, ...otherProps @@ -219,6 +221,12 @@ class EditDownloadClientModalContent extends Component { } + + { + this.props.toggleAdvancedSettings(); + }; + onConfirmDeleteCategory = (id) => { this.props.deleteDownloadClientCategory({ id }); }; @@ -81,6 +94,7 @@ class EditDownloadClientModalContentConnector extends Component { {...this.props} onSavePress={this.onSavePress} onTestPress={this.onTestPress} + onAdvancedSettingsPress={this.onAdvancedSettingsPress} onInputChange={this.onInputChange} onFieldChange={this.onFieldChange} onConfirmDeleteCategory={this.onConfirmDeleteCategory} @@ -102,6 +116,7 @@ EditDownloadClientModalContentConnector.propTypes = { setDownloadClientFieldValue: PropTypes.func.isRequired, saveDownloadClient: PropTypes.func.isRequired, testDownloadClient: PropTypes.func.isRequired, + toggleAdvancedSettings: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; diff --git a/frontend/src/Settings/Indexers/IndexerProxies/EditIndexerProxyModalContent.js b/frontend/src/Settings/Indexers/IndexerProxies/EditIndexerProxyModalContent.js index 8579c2a2f..59e10422b 100644 --- a/frontend/src/Settings/Indexers/IndexerProxies/EditIndexerProxyModalContent.js +++ b/frontend/src/Settings/Indexers/IndexerProxies/EditIndexerProxyModalContent.js @@ -14,6 +14,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes, kinds } from 'Helpers/Props'; +import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton'; import translate from 'Utilities/String/translate'; import styles from './EditIndexerProxyModalContent.css'; @@ -31,6 +32,7 @@ function EditIndexerProxyModalContent(props) { onModalClose, onSavePress, onTestPress, + onAdvancedSettingsPress, onDeleteIndexerProxyPress, ...otherProps } = props; @@ -130,6 +132,12 @@ function EditIndexerProxyModalContent(props) { } + + { + this.props.toggleAdvancedSettings(); + }; + // // Render @@ -65,6 +76,7 @@ class EditIndexerProxyModalContentConnector extends Component { {...this.props} onSavePress={this.onSavePress} onTestPress={this.onTestPress} + onAdvancedSettingsPress={this.onAdvancedSettingsPress} onInputChange={this.onInputChange} onFieldChange={this.onFieldChange} /> @@ -82,6 +94,7 @@ EditIndexerProxyModalContentConnector.propTypes = { setIndexerProxyFieldValue: PropTypes.func.isRequired, saveIndexerProxy: PropTypes.func.isRequired, testIndexerProxy: PropTypes.func.isRequired, + toggleAdvancedSettings: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; diff --git a/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js b/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js index 60e368617..ed00d96e6 100644 --- a/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js +++ b/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js @@ -14,6 +14,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes, kinds } from 'Helpers/Props'; +import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton'; import translate from 'Utilities/String/translate'; import NotificationEventItems from './NotificationEventItems'; import styles from './EditNotificationModalContent.css'; @@ -32,6 +33,7 @@ function EditNotificationModalContent(props) { onModalClose, onSavePress, onTestPress, + onAdvancedSettingsPress, onDeleteNotificationPress, ...otherProps } = props; @@ -136,6 +138,12 @@ function EditNotificationModalContent(props) { } + + { + this.props.toggleAdvancedSettings(); + }; + // // Render @@ -65,6 +76,7 @@ class EditNotificationModalContentConnector extends Component { {...this.props} onSavePress={this.onSavePress} onTestPress={this.onTestPress} + onAdvancedSettingsPress={this.onAdvancedSettingsPress} onInputChange={this.onInputChange} onFieldChange={this.onFieldChange} /> @@ -82,6 +94,7 @@ EditNotificationModalContentConnector.propTypes = { setNotificationFieldValue: PropTypes.func.isRequired, saveNotification: PropTypes.func.isRequired, testNotification: PropTypes.func.isRequired, + toggleAdvancedSettings: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; From ab289cfc868a704cc72b709e8f178b873d59a302 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 26 Mar 2024 17:25:27 +0000 Subject: [PATCH 509/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Altair Co-authored-by: Charles Follet Co-authored-by: Havok Dan Co-authored-by: Stanislav Co-authored-by: Weblate Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 21 +++++++++++++++++-- .../Localization/Core/pt_BR.json | 4 +++- src/NzbDrone.Core/Localization/Core/sk.json | 13 +++++++++--- src/NzbDrone.Core/Localization/Core/tr.json | 14 ++++++++++--- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index a93218b2d..53be4e31f 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -426,7 +426,7 @@ "EditIndexerProxyImplementation": "Editar Proxy de Indexador - { implementationName}", "AppUpdated": "{appName} Actualizado", "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName}", - "AddApplicationImplementation": "Agregar aplicación - { implementationName}", + "AddApplicationImplementation": "Agregar aplicación - {implementationName}", "AddConnectionImplementation": "Añadir Conexión - {implementationName}", "AddIndexerImplementation": "Agregar Indexador - {implementationName}", "AddIndexerProxyImplementation": "Agregar Proxy de Indexador - { implementationName}", @@ -621,5 +621,22 @@ "UsenetBlackholeNzbFolder": "Carpeta Nzb", "TorrentBlackholeSaveMagnetFilesHelpText": "Guarda el enlace magnet si no hay ningún archivo .torrent disponible (útil solo si el cliente de descarga soporta magnets guardados en un archivo)", "SecretToken": "Token secreto", - "TorrentBlackholeSaveMagnetFilesExtension": "Guardar extensión de archivos magnet" + "TorrentBlackholeSaveMagnetFilesExtension": "Guardar extensión de archivos magnet", + "Donate": "Donar", + "ClickToChangeQueryOptions": "Haz clic para cambiar las opciones de petición", + "DefaultCategory": "Categoría predeterminada", + "Destination": "Destino", + "Directory": "Directorio", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Añade un prefijo al url del json de deluge, vea {url}", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "Carpeta compartida opcional en la que poner las descargas, dejar en blanco para usar la ubicación de la Estación de Descarga predeterminada", + "DownloadClientFloodSettingsAdditionalTags": "Etiquetas adicionales", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "Añade propiedades de medios como etiquetas. Los consejos son ejemplos.", + "DownloadClientFreeboxSettingsAppId": "ID de la app", + "DownloadClientFreeboxSettingsAppToken": "Token de la app", + "DownloadClientFreeboxSettingsApiUrl": "URL de API", + "DownloadClientFreeboxSettingsApiUrlHelpText": "Define la URL base de la API Freebox con la versión de la API, p. ej. '{url}', por defecto a '{defaultApiUrl}'", + "DownloadClientFreeboxSettingsAppIdHelpText": "ID de la app dada cuando se crea acceso a la API de Freebox (esto es 'app_id')", + "DownloadClientFloodSettingsTagsHelpText": "Etiquetas iniciales de una descarga. Para ser reconocida, una descarga debe tener todas las etiquetas iniciales. Esto evita conflictos con descargas no relacionadas.", + "DownloadClientFloodSettingsUrlBaseHelpText": "Añade un prefijo a la API de Flood, como {url}", + "DownloadClientFreeboxSettingsAppTokenHelpText": "Token de la app recuperado cuando se crea acceso a la API de Freebox (esto es 'app_token')" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 29c22a2c5..ffe6ec937 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -745,5 +745,7 @@ "Donate": "Doar", "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronizar Lista de Bloqueio de Hashes de Torrents Rejeitados Enquanto Baixando", "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", - "ClickToChangeQueryOptions": "Clique para alterar as opções de consulta" + "ClickToChangeQueryOptions": "Clique para alterar as opções de consulta", + "IndexerMTeamTpSettingsApiKeyHelpText": "Chave API do Site (Encontrada no Painel de Controle do Usuário => Segurança => Laboratório)", + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech" } diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index 99388e163..0f2044797 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -35,7 +35,7 @@ "DeleteNotificationMessageText": "Naozaj chcete zmazať značku formátu {0} ?", "DeleteTagMessageText": "Naozaj chcete zmazať značku formátu {0} ?", "AllIndexersHiddenDueToFilter": "Všetky filmy sú skryté kvôli použitému filtru.", - "AnalyticsEnabledHelpText": "Odosielajte anonymné informácie o používaní a chybách na servery {appName}u. To zahŕňa informácie o vašom prehliadači, ktoré stránky {appName} WebUI používate, hlásenia chýb a taktiež verziu operačného systému a spúšťacieho prostredia. Tieto informácie použijeme k uprednostňovaniu funkcií a oprav chýb.", + "AnalyticsEnabledHelpText": "Odosielajte anonymné informácie o používaní a chybách na servery aplikácie {appName}. Zahŕňa to informácie o vašom prehliadači, ktoré stránky webového používateľského rozhrania {appName} používate, hlásenia chýb, ako aj verziu operačného systému a spustenia. Tieto informácie použijeme na stanovenie priorít funkcií a opráv chýb.", "AuthenticationMethodHelpText": "Vyžadovať používateľské meno a heslo pre prístup k {appName}u", "BackupFolderHelpText": "Relatívne cesty budú v priečinku AppData {appName}u", "BranchUpdate": "Vetva, ktorá sa má použiť k aktualizácií {appName}u", @@ -106,7 +106,7 @@ "ApplicationURL": "URL aplikácie", "ApplicationUrlHelpText": "Externá URL tejto aplikácie vrátane http(s)://, portu a URL základu", "Label": "Štítok", - "ApplyTagsHelpTextAdd": "Pridať: Pridajte značky do existujúceho zoznamu značiek", + "ApplyTagsHelpTextAdd": "Pridať: Pridať značky do existujúceho zoznamu značiek", "ApplyTagsHelpTextRemove": "Odobrať: Odoberie zadané značky", "ApplyTagsHelpTextReplace": "Nahradiť: Nahradí značky zadanými značkami (pre vymazanie všetkých značiek, nezadávajte žiadne)", "ApplyTagsHelpTextHowToApplyApplications": "Ako použiť značky na vybrané filmy", @@ -119,5 +119,12 @@ "DisabledForLocalAddresses": "Zakázané pre miestne adresy", "ResetAPIKeyMessageText": "Naozaj chcete obnoviť kľúč API?", "CountApplicationsSelected": "{count} Označených kolekcií", - "Id": "ID" + "Id": "ID", + "EnableSslHelpText": " Vyžaduje sa reštart s oprávnením správcu, aby sa zmeny prejavili", + "RestartRequiredHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "Album": "Album", + "AddConnection": "Pridať podmienku", + "AddConnectionImplementation": "Pridať pripojenie - {implementationName}", + "AddDownloadClientImplementation": "Pridať klienta pre sťahovanie - {implementationName}", + "AddIndexerImplementation": "Pridať Indexer - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index dd8a57cfa..30cc2a16c 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -361,11 +361,11 @@ "Application": "Uygulamalar", "Episode": "bölüm", "AddConnection": "Bağlantı Ekle", - "AddApplicationImplementation": "Koşul Ekle - {implementationName}", + "AddApplicationImplementation": "Uygulama Ekle - {implementationName}", "AddIndexerImplementation": "Yeni Dizin Ekle - {implementationName}", "AddIndexerProxyImplementation": "Koşul Ekle - {implementationName}", "EditConnectionImplementation": "Koşul Ekle - {implementationName}", - "AddConnectionImplementation": "Koşul Ekle - {implementationName}", + "AddConnectionImplementation": "Bağlantı Ekle - {implementationName}", "RestartProwlarr": "{appName}'ı yeniden başlatın", "EditApplicationImplementation": "Koşul Ekle - {implementationName}", "EditIndexerImplementation": "Koşul Ekle - {implementationName}", @@ -392,5 +392,13 @@ "AuthenticationMethod": "Kimlik Doğrulama Yöntemi", "AuthenticationMethodHelpTextWarning": "Lütfen geçerli bir kimlik doğrulama yöntemi seçin", "AuthenticationRequiredHelpText": "İstekler için Kimlik doğrulamanın gereklilik ayarını değiştirin. Riskleri anlamadığınız sürece değiştirmeyin.", - "CustomFilter": "Özel Filtre" + "CustomFilter": "Özel Filtre", + "AddRemoveOnly": "Sadece Ekle ve Kaldır", + "AddSyncProfile": "Eşitleme Profili Ekle", + "AddDownloadClientToProwlarr": "İndirme istemcisi eklemek, görsel arayüz üzerinde manuel arama yaparak indirilecek içeriği {appName} uygulamasına direkt olarak eklemenize olanak sağlar.", + "AddApplication": "Uygulama Ekle", + "AddCategory": "Kategori Ekle", + "AddNewIndexer": "Yeni İçerik Sağlayıcı Ekle", + "ActiveApps": "Aktif Uygulamalar", + "ActiveIndexers": "Aktif İçerik Kaynakları" } From d55a38da4a0679c27bf077467d65e13c7eead595 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 27 Mar 2024 14:15:17 +0200 Subject: [PATCH 510/964] New: Allow HEAD requests to ping endpoint --- src/Prowlarr.Http/Ping/PingController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Prowlarr.Http/Ping/PingController.cs b/src/Prowlarr.Http/Ping/PingController.cs index d36f958a1..776e8e58a 100644 --- a/src/Prowlarr.Http/Ping/PingController.cs +++ b/src/Prowlarr.Http/Ping/PingController.cs @@ -22,6 +22,7 @@ namespace Prowlarr.Http [AllowAnonymous] [HttpGet("/ping")] + [HttpHead("/ping")] [Produces("application/json")] public ActionResult GetStatus() { From 14ae062db28141954a00a058c72a0be51ae6cf24 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 28 Mar 2024 01:47:41 +0200 Subject: [PATCH 511/964] Fixed: Http Client getting network interfaces on aarch64 Co-authored-by: Louis R Fixes #2076 --- .../Http/Dispatchers/ManagedHttpDispatcher.cs | 36 +++++++++++++------ src/NzbDrone.Core.Test/Framework/CoreTest.cs | 2 +- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index 2720681cb..29bb49fa5 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -10,6 +10,7 @@ using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; +using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http.Proxy; @@ -31,11 +32,14 @@ namespace NzbDrone.Common.Http.Dispatchers private readonly ICached _httpClientCache; private readonly ICached _credentialCache; + private readonly Logger _logger; + public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider, ICreateManagedWebProxy createManagedWebProxy, ICertificateValidationService certificateValidationService, IUserAgentBuilder userAgentBuilder, - ICacheManager cacheManager) + ICacheManager cacheManager, + Logger logger) { _proxySettingsProvider = proxySettingsProvider; _createManagedWebProxy = createManagedWebProxy; @@ -44,6 +48,8 @@ namespace NzbDrone.Common.Http.Dispatchers _httpClientCache = cacheManager.GetCache(typeof(ManagedHttpDispatcher)); _credentialCache = cacheManager.GetCache(typeof(ManagedHttpDispatcher), "credentialcache"); + + _logger = logger; } public async Task GetResponseAsync(HttpRequest request, CookieContainer cookies) @@ -277,19 +283,27 @@ namespace NzbDrone.Common.Http.Dispatchers return _credentialCache.Get("credentialCache", () => new CredentialCache()); } - private static bool HasRoutableIPv4Address() + private bool HasRoutableIPv4Address() { // Get all IPv4 addresses from all interfaces and return true if there are any with non-loopback addresses - var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + try + { + var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); - return networkInterfaces.Any(ni => - ni.OperationalStatus == OperationalStatus.Up && - ni.GetIPProperties().UnicastAddresses.Any(ip => - ip.Address.AddressFamily == AddressFamily.InterNetwork && - !IPAddress.IsLoopback(ip.Address))); + return networkInterfaces.Any(ni => + ni.OperationalStatus == OperationalStatus.Up && + ni.GetIPProperties().UnicastAddresses.Any(ip => + ip.Address.AddressFamily == AddressFamily.InterNetwork && + !IPAddress.IsLoopback(ip.Address))); + } + catch (Exception e) + { + _logger.Debug(e, "Caught exception while GetAllNetworkInterfaces assuming IPv4 connectivity: {0}", e.Message); + return true; + } } - private static async ValueTask onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken) + private async ValueTask onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken) { // Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way. // This issue is being tracked at https://github.com/dotnet/runtime/issues/26177 and expected to be fixed in .NET 6. @@ -313,7 +327,9 @@ namespace NzbDrone.Common.Http.Dispatchers catch { // Do not retry IPv6 if a routable IPv4 address is available, otherwise continue to attempt IPv6 connections. - useIPv6 = !HasRoutableIPv4Address(); + var routableIPv4 = HasRoutableIPv4Address(); + _logger.Info("IPv4 is available: {0}, IPv6 will be {1}", routableIPv4, routableIPv4 ? "disabled" : "left enabled"); + useIPv6 = !routableIPv4; } finally { diff --git a/src/NzbDrone.Core.Test/Framework/CoreTest.cs b/src/NzbDrone.Core.Test/Framework/CoreTest.cs index 6dbd46c31..3e6a8f66e 100644 --- a/src/NzbDrone.Core.Test/Framework/CoreTest.cs +++ b/src/NzbDrone.Core.Test/Framework/CoreTest.cs @@ -25,7 +25,7 @@ namespace NzbDrone.Core.Test.Framework Mocker.SetConstant(new HttpProxySettingsProvider(Mocker.Resolve())); Mocker.SetConstant(new ManagedWebProxyFactory(Mocker.Resolve())); Mocker.SetConstant(new X509CertificateValidationService(Mocker.Resolve(), TestLogger)); - Mocker.SetConstant(new ManagedHttpDispatcher(Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve())); + Mocker.SetConstant(new ManagedHttpDispatcher(Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), TestLogger)); Mocker.SetConstant(new HttpClient(Array.Empty(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), TestLogger)); Mocker.SetConstant(new ProwlarrCloudRequestBuilder()); } From 41ce79ccce2b86f5c2006b9ba9d9dab39e02f392 Mon Sep 17 00:00:00 2001 From: Servarr Date: Wed, 27 Mar 2024 23:55:15 +0000 Subject: [PATCH 512/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index a09a4239e..ce09e992c 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -3311,6 +3311,23 @@ } } } + }, + "head": { + "tags": [ + "Ping" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PingResource" + } + } + } + } + } } }, "/api/v1/search": { From 8fa8a1303644a2ef0e7020e2ee3385a0ed1a2ea2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 28 Mar 2024 03:41:53 +0200 Subject: [PATCH 513/964] Bump version to 1.16.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 543fc6573..fdbc1e75a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.15.0' + majorVersion: '1.16.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 2803ad5ba07427dcb8ea93fd726151059153b17e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 29 Mar 2024 01:43:52 +0200 Subject: [PATCH 514/964] Update name for RuTracker.org Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> --- src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs index aefd4ab2d..78f92df52 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs @@ -23,14 +23,14 @@ namespace NzbDrone.Core.Indexers.Definitions { public class RuTracker : TorrentIndexerBase { - public override string Name => "RuTracker"; + public override string Name => "RuTracker.org"; public override string[] IndexerUrls => new[] { "https://rutracker.org/", "https://rutracker.net/", "https://rutracker.nl/" }; - public override string Description => "RuTracker is a Semi-Private Russian torrent site with a thriving file-sharing community"; + public override string Description => "RuTracker.org is a Semi-Private Russian torrent site with a thriving file-sharing community"; public override string Language => "ru-RU"; public override Encoding Encoding => Encoding.GetEncoding("windows-1251"); public override IndexerPrivacy Privacy => IndexerPrivacy.SemiPrivate; From 6a1e01abbda1901666965e28a522e2489319a7a2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 29 Mar 2024 02:54:56 +0200 Subject: [PATCH 515/964] Disable Shizaproject due to being unusable --- src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs b/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs index e817a41a0..fc565775d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Shizaproject.cs @@ -17,6 +17,7 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers.Definitions { + [Obsolete("Site unusable due to lack of new releases")] public class Shizaproject : TorrentIndexerBase { public override string Name => "ShizaProject"; From 5447fad1fce6402c534665ba128a13c6f681e890 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 30 Mar 2024 16:46:30 +0200 Subject: [PATCH 516/964] Fixed: (Cardigann) Deprecate noappend for category and categorydesc --- .../Indexers/Definitions/Cardigann/CardigannParser.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs index 78c2b2760..17bdfed72 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs @@ -502,6 +502,11 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann value = release.Description; break; case "category": + if (fieldModifiers.Contains("noappend")) + { + _logger.Warn("The \"noappend\" modifier is deprecated. Please switch to \"default\". See the Definition Format in the Wiki for more information."); + } + var cats = _categories.MapTrackerCatToNewznab(value); if (cats.Any()) { @@ -518,6 +523,11 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann value = release.Categories.ToString(); break; case "categorydesc": + if (fieldModifiers.Contains("noappend")) + { + _logger.Warn("The \"noappend\" modifier is deprecated. Please switch to \"default\". See the Definition Format in the Wiki for more information."); + } + var catsDesc = _categories.MapTrackerCatDescToNewznab(value); if (catsDesc.Any()) { From 41b043e551932dd8a6cdc1a7bed21e6d2cb7bb7d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 30 Mar 2024 16:48:02 +0200 Subject: [PATCH 517/964] Fixed: (Cardigann) Log invalid category values --- .../Definitions/Cardigann/CardigannParser.cs | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs index 17bdfed72..8edc7d6de 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs @@ -508,19 +508,23 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann } var cats = _categories.MapTrackerCatToNewznab(value); + if (cats.Any()) { - if (release.Categories == null || fieldModifiers.Contains("noappend")) - { - release.Categories = cats; - } - else - { - release.Categories = release.Categories.Union(cats).ToList(); - } + release.Categories = release.Categories == null || fieldModifiers.Contains("noappend") + ? cats + : release.Categories.Union(cats).ToList(); + } + + if (value.IsNotNullOrWhiteSpace() && !release.Categories.Any()) + { + _logger.Warn("[{0}] Invalid category for value: '{1}'", _definition.Id, value); + } + else + { + value = release.Categories.ToString(); } - value = release.Categories.ToString(); break; case "categorydesc": if (fieldModifiers.Contains("noappend")) @@ -529,19 +533,23 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann } var catsDesc = _categories.MapTrackerCatDescToNewznab(value); + if (catsDesc.Any()) { - if (release.Categories == null || fieldModifiers.Contains("noappend")) - { - release.Categories = catsDesc; - } - else - { - release.Categories = release.Categories.Union(catsDesc).ToList(); - } + release.Categories = release.Categories == null || fieldModifiers.Contains("noappend") + ? catsDesc + : release.Categories.Union(catsDesc).ToList(); + } + + if (value.IsNotNullOrWhiteSpace() && !release.Categories.Any()) + { + _logger.Warn("[{0}] Invalid category for value: '{1}'", _definition.Id, value); + } + else + { + value = release.Categories.ToString(); } - value = release.Categories.ToString(); break; case "size": release.Size = ParseUtil.GetBytes(value); From 5aefb467905b00bcded63b6e7f0591db20f02b42 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 31 Mar 2024 15:11:15 +0300 Subject: [PATCH 518/964] Fixed: Check VIP expiration only for enabled indexers Check on ProviderBulkUpdatedEvent as well Fixes #2082 --- .../HealthCheck/Checks/IndexerVIPCheck.cs | 21 +++++++++---------- .../Checks/IndexerVIPExpiredCheck.cs | 21 +++++++++---------- src/NzbDrone.Core/Localization/Core/de.json | 4 ++-- src/NzbDrone.Core/Localization/Core/el.json | 4 ++-- src/NzbDrone.Core/Localization/Core/en.json | 4 ++-- src/NzbDrone.Core/Localization/Core/es.json | 4 ++-- src/NzbDrone.Core/Localization/Core/fi.json | 4 ++-- src/NzbDrone.Core/Localization/Core/fr.json | 4 ++-- src/NzbDrone.Core/Localization/Core/hu.json | 4 ++-- src/NzbDrone.Core/Localization/Core/it.json | 4 ++-- src/NzbDrone.Core/Localization/Core/nl.json | 4 ++-- .../Localization/Core/pt_BR.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ro.json | 4 ++-- src/NzbDrone.Core/Localization/Core/sv.json | 4 ++-- .../Localization/Core/zh_CN.json | 4 ++-- 15 files changed, 46 insertions(+), 48 deletions(-) diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerVIPCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerVIPCheck.cs index 4265b5963..2337403b8 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerVIPCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerVIPCheck.cs @@ -11,6 +11,7 @@ namespace NzbDrone.Core.HealthCheck.Checks [CheckOn(typeof(ProviderAddedEvent))] [CheckOn(typeof(ProviderUpdatedEvent))] [CheckOn(typeof(ProviderDeletedEvent))] + [CheckOn(typeof(ProviderBulkUpdatedEvent))] [CheckOn(typeof(ProviderBulkDeletedEvent))] public class IndexerVIPCheck : HealthCheckBase { @@ -24,7 +25,7 @@ namespace NzbDrone.Core.HealthCheck.Checks public override HealthCheck Check() { - var indexers = _indexerFactory.AllProviders(false); + var indexers = _indexerFactory.Enabled(false); var expiringProviders = new List(); foreach (var provider in indexers) @@ -39,12 +40,8 @@ namespace NzbDrone.Core.HealthCheck.Checks var expiration = (string)vipProp.GetValue(provider.Definition.Settings); - if (expiration.IsNullOrWhiteSpace()) - { - continue; - } - - if (DateTime.Parse(expiration).Between(DateTime.Now, DateTime.Now.AddDays(7))) + if (expiration.IsNotNullOrWhiteSpace() && + DateTime.Parse(expiration).Between(DateTime.Now, DateTime.Now.AddDays(7))) { expiringProviders.Add(provider); } @@ -53,10 +50,12 @@ namespace NzbDrone.Core.HealthCheck.Checks if (!expiringProviders.Empty()) { return new HealthCheck(GetType(), - HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerVipCheckExpiringClientMessage"), - string.Join(", ", expiringProviders.Select(v => v.Definition.Name))), - "#indexer-vip-expiring"); + HealthCheckResult.Warning, + _localizationService.GetLocalizedString("IndexerVipExpiringHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", expiringProviders.Select(v => v.Definition.Name).ToArray()) } + }), + "#indexer-vip-expiring"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerVIPExpiredCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerVIPExpiredCheck.cs index 8b0dd06e7..0f3dffc1e 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerVIPExpiredCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerVIPExpiredCheck.cs @@ -11,6 +11,7 @@ namespace NzbDrone.Core.HealthCheck.Checks [CheckOn(typeof(ProviderAddedEvent))] [CheckOn(typeof(ProviderUpdatedEvent))] [CheckOn(typeof(ProviderDeletedEvent))] + [CheckOn(typeof(ProviderBulkUpdatedEvent))] [CheckOn(typeof(ProviderBulkDeletedEvent))] public class IndexerVIPExpiredCheck : HealthCheckBase { @@ -24,7 +25,7 @@ namespace NzbDrone.Core.HealthCheck.Checks public override HealthCheck Check() { - var indexers = _indexerFactory.AllProviders(false); + var indexers = _indexerFactory.Enabled(false); var expiredProviders = new List(); foreach (var provider in indexers) @@ -39,12 +40,8 @@ namespace NzbDrone.Core.HealthCheck.Checks var expiration = (string)vipProp.GetValue(provider.Definition.Settings); - if (expiration.IsNullOrWhiteSpace()) - { - continue; - } - - if (DateTime.Parse(expiration).Before(DateTime.Now)) + if (expiration.IsNotNullOrWhiteSpace() && + DateTime.Parse(expiration).Before(DateTime.Now)) { expiredProviders.Add(provider); } @@ -53,10 +50,12 @@ namespace NzbDrone.Core.HealthCheck.Checks if (!expiredProviders.Empty()) { return new HealthCheck(GetType(), - HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("IndexerVipCheckExpiredClientMessage"), - string.Join(", ", expiredProviders.Select(v => v.Definition.Name))), - "#indexer-vip-expired"); + HealthCheckResult.Error, + _localizationService.GetLocalizedString("IndexerVipExpiredHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", expiredProviders.Select(v => v.Definition.Name).ToArray()) } + }), + "#indexer-vip-expired"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 4df25d50e..617ebf858 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -194,8 +194,8 @@ "IndexerStatusCheckAllClientMessage": "Alle Indexer sind aufgrund von Fehlern nicht verfügbar", "IndexerStatusCheckSingleClientMessage": "Indexer aufgrund von Fehlern nicht verfügbar: {0}", "IndexerTagsHelpText": "Benutze Tags, um Indexer-Proxies zu spezifizieren, mit welchen Apps der Indexer synchronisiert oder um Indexer zu organisieren.", - "IndexerVipCheckExpiredClientMessage": "Die VIP Indexer Vorteile sind abgelaufen: {0}", - "IndexerVipCheckExpiringClientMessage": "Die Indexer VIP Vorteile verfallen bald: {0}", + "IndexerVipExpiredHealthCheckMessage": "Die VIP Indexer Vorteile sind abgelaufen: {indexerNames}", + "IndexerVipExpiringHealthCheckMessage": "Die Indexer VIP Vorteile verfallen bald: {indexerNames}", "Indexers": "Indexer", "Info": "Info", "InstanceName": "Instanzname", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 02dac92f0..e3ac6b6a3 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -356,7 +356,7 @@ "Auth": "Auth", "BookSearch": "Αναζήτηση βιβλίου", "FullSync": "Πλήρης συγχρονισμός", - "IndexerVipCheckExpiringClientMessage": "Τα οφέλη VIP του ευρετηρίου λήγουν σύντομα: {0}", + "IndexerVipExpiringHealthCheckMessage": "Τα οφέλη VIP του ευρετηρίου λήγουν σύντομα: {indexerNames}", "NotSupported": "Δεν υποστηρίζεται", "Parameters": "Παράμετροι", "Public": "Δημόσιο", @@ -394,7 +394,7 @@ "IndexerQuery": "Ερώτημα ευρετηρίου", "IndexerSettingsSummary": "Διαμορφώστε διάφορες καθολικές ρυθμίσεις ευρετηρίου, συμπεριλαμβανομένων των διακομιστών μεσολάβησης.", "IndexerSite": "Ιστότοπος ευρετηρίου", - "IndexerVipCheckExpiredClientMessage": "Τα προνόμια VIP του ευρετηρίου έχουν λήξει: {0}", + "IndexerVipExpiredHealthCheckMessage": "Τα προνόμια VIP του ευρετηρίου έχουν λήξει: {indexerNames}", "MappedCategories": "Χαρτογραφημένες κατηγορίες", "MovieSearch": "Αναζήτηση ταινίας", "MovieSearchTypes": "Τύποι αναζήτησης ταινιών", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index d15b86c2c..24effc8eb 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -415,8 +415,8 @@ "IndexerTagsHelpText": "Use tags to specify Indexer Proxies or which apps the indexer is synced to.", "IndexerTagsHelpTextWarning": "Tags should be used with caution, they can have unintended effects. An indexer with a tag will only sync to apps with the same tag.", "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Site API Key", - "IndexerVipCheckExpiredClientMessage": "Indexer VIP benefits have expired: {0}", - "IndexerVipCheckExpiringClientMessage": "Indexer VIP benefits expiring soon: {0}", + "IndexerVipExpiredHealthCheckMessage": "Indexer VIP benefits have expired: {indexerNames}", + "IndexerVipExpiringHealthCheckMessage": "Indexer VIP benefits expiring soon: {indexerNames}", "Indexers": "Indexers", "Info": "Info", "InitialFailure": "Initial Failure", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 53be4e31f..a31e5d4df 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -524,10 +524,10 @@ "IndexerRss": "RSS del Indexador", "IndexerSettingsSummary": "Configurar varios ajustes globales del Indexador, incluyendo Proxies.", "IndexerName": "Nombre del Indexador", - "IndexerVipCheckExpiringClientMessage": "Las ventajas VIP de los indexadores expiran pronto: {0}", + "IndexerVipExpiringHealthCheckMessage": "Las ventajas VIP de los indexadores expiran pronto: {indexerNames}", "IndexerProxies": "Proxies del Indexador", "IndexerHistoryLoadError": "Error al cargar el historial del Indexador", - "IndexerVipCheckExpiredClientMessage": "Las ventajas VIP del Indexador han caducado: {0}", + "IndexerVipExpiredHealthCheckMessage": "Las ventajas VIP del Indexador han caducado: {indexerNames}", "IndexerQuery": "Consulta dedl Indexador", "IndexerSite": "Sitio del Indexador", "IndexerStatus": "Estado del indexador", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 2bd232714..be74545de 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -317,7 +317,7 @@ "IndexerObsoleteCheckMessage": "Tietolähteet ovat poistuneet tai ne ovat muuttuneet: {0}. Poista ja/tai lisää ne {appName}iin uudelleen.", "IndexerProxy": "Tiedonhaun välityspalvelin", "IndexerSettingsSummary": "Määritä useita globaaleita tietolähdeasetuksia, kuten välityspalvelimia.", - "IndexerVipCheckExpiringClientMessage": "Tietolähteen VIP-edut erääntyvät pian: {0}", + "IndexerVipExpiringHealthCheckMessage": "Tietolähteen VIP-edut erääntyvät pian: {indexerNames}", "ProwlarrSupportsAnyIndexer": "{appName} tukee Newznab- ja Torznab-yhteensopivien tietolähteiden ohella myös useita muita lähteitä vaihtoehdoilla \"Yleinen Newznab\" (Usenetille) ja 'Yleinen Torznab' (torrenteille).", "SettingsIndexerLogging": "Tehostettu tietolähteiden valvonta", "AddIndexerProxy": "Lisää tiedonhaun välityspalvelin", @@ -330,7 +330,7 @@ "IndexerRss": "Tietolähteen RSS", "SearchIndexers": "Etsi tietolähteistä", "AddRemoveOnly": "Ainoastaan lisää/poista", - "IndexerVipCheckExpiredClientMessage": "Tietolähteen VIP-edut ovat erääntyneet: {0}", + "IndexerVipExpiredHealthCheckMessage": "Tietolähteen VIP-edut ovat erääntyneet: {indexerNames}", "MaintenanceRelease": "Huoltojulkaisu: korjauksia ja muita parannuksia. Lue lisää Githubin muutoshistoriasta.", "Query": "Kysely", "Redirect": "Uudelleenohjaus", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 402c268aa..776528a3d 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -368,13 +368,13 @@ "AppSettingsSummary": "Applications et paramètres pour configurer comment {appName} interagit avec vos programmes PVR", "IndexerTagsHelpText": "Utilisez des étiquettes pour spécifier les proxies d'indexation ou les applications avec lesquelles l'indexeur est synchronisé.", "Notifications": "Notifications", - "IndexerVipCheckExpiredClientMessage": "Les avantages VIP de l'indexeur ont expiré : {0}", + "IndexerVipExpiredHealthCheckMessage": "Les avantages VIP de l'indexeur ont expiré : {indexerNames}", "IndexerProxy": "Proxy d'indexation", "IndexerSettingsSummary": "Configuration de divers paramètres globaux de l'indexeur, y compris les proxies.", "IndexerProxies": "Proxys d'indexation", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Tous les proxys sont indisponibles en raison d'échecs", "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxys indisponibles en raison d'échecs : {indexerProxyNames}", - "IndexerVipCheckExpiringClientMessage": "Les avantages VIP de l'indexeur arrivent bientôt à expiration : {0}", + "IndexerVipExpiringHealthCheckMessage": "Les avantages VIP de l'indexeur arrivent bientôt à expiration : {indexerNames}", "NoLinks": "Aucun liens", "Notification": "Notification", "UnableToAddANewIndexerProxyPleaseTryAgain": "Impossible d'ajouter un nouveau proxy d'indexation, veuillez réessayer.", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index f5c8eb80c..608be849e 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -374,8 +374,8 @@ "IndexerSettingsSummary": "Konfigurálja a különböző globális indexer beállításokat, beleértve a proxykat is.", "Notifications": "Értesítések", "UnableToAddANewIndexerProxyPleaseTryAgain": "Nem lehet új Indexer Proxyt hozzáadni, próbálja újra.", - "IndexerVipCheckExpiredClientMessage": "Az Indexer VIP előnyei lejártak: {0}", - "IndexerVipCheckExpiringClientMessage": "Az Indexer VIP előnyei hamarosan lejárnak: {0}", + "IndexerVipExpiredHealthCheckMessage": "Az Indexer VIP előnyei lejártak: {indexerNames}", + "IndexerVipExpiringHealthCheckMessage": "Az Indexer VIP előnyei hamarosan lejárnak: {indexerNames}", "IndexerProxy": "Indexelő Proxy", "NoLinks": "Nincsenek Linkek", "Notification": "Értesítés", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index d046328d9..1ecd02999 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -365,8 +365,8 @@ "Apps": "Le App", "DevelopmentSettings": "Impostazioni di Sviluppo", "RedirectHelpText": "Reindirizza le richieste di download per l'Indicizzatore e passa il prelievo direttamente invece di inoltrare la richiesta tramite {appName}", - "IndexerVipCheckExpiredClientMessage": "I benefici VIP dell'Indicizzatore sono scaduti: {0}", - "IndexerVipCheckExpiringClientMessage": "I benefici VIP dell'Indicizzatore scadranno a breve: {0}", + "IndexerVipExpiredHealthCheckMessage": "I benefici VIP dell'Indicizzatore sono scaduti: {indexerNames}", + "IndexerVipExpiringHealthCheckMessage": "I benefici VIP dell'Indicizzatore scadranno a breve: {indexerNames}", "IndexerProxies": "Proxy degli Indicizzatori", "Stats": "Statistiche", "SyncAppIndexers": "Sincronizza tutti gli indicizzatori", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 0922cc5a5..cd700d98e 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -185,8 +185,8 @@ "IndexerStatusCheckAllClientMessage": "Alle indexeerders zijn onbeschikbaar wegens fouten", "IndexerStatusCheckSingleClientMessage": "Indexeerders onbeschikbaar wegens fouten: {0}", "IndexerTagsHelpText": "Gebruik tags om standaardclients op te geven, Indexeerder-proxy's op te geven of gewoon om uw indexeerders te ordenen.", - "IndexerVipCheckExpiredClientMessage": "Indexeerder VIP-voordelen zijn verlopen: {0}", - "IndexerVipCheckExpiringClientMessage": "Indexeerder VIP-voordelen verlopen binnenkort: {0}", + "IndexerVipExpiredHealthCheckMessage": "Indexeerder VIP-voordelen zijn verlopen: {indexerNames}", + "IndexerVipExpiringHealthCheckMessage": "Indexeerder VIP-voordelen verlopen binnenkort: {indexerNames}", "Indexers": "Indexeerders", "Info": "Info", "InstanceName": "Naam van de instantie", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index ffe6ec937..f2895b59b 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -216,8 +216,8 @@ "IndexerStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas", "IndexerStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas: {0}", "IndexerTagsHelpText": "Use tags para especificar Proxies do indexador ou com quais aplicativos o indexador está sincronizado.", - "IndexerVipCheckExpiredClientMessage": "Benefícios VIP do Indexador expiraram: {0}", - "IndexerVipCheckExpiringClientMessage": "Os benefícios VIPS do Indexador expirarão em breve: {0}", + "IndexerVipExpiredHealthCheckMessage": "Benefícios VIP do Indexador expiraram: {indexerNames}", + "IndexerVipExpiringHealthCheckMessage": "Os benefícios VIPS do Indexador expirarão em breve: {indexerNames}", "Indexers": "Indexadores", "Info": "Informações", "InitialFailure": "Falha Inicial", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index eb8271593..eba9f2f6e 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -328,7 +328,7 @@ "EnableRssHelpText": "Activați flux RSS pentru indexator", "IndexerHealthCheckNoIndexers": "Niciun indexator nu este activat, {appName} nu va returna rezultate la căutare.", "IndexerProxy": "Proxy indexator", - "IndexerVipCheckExpiredClientMessage": "Beneficiile VIP pentru indexator au expirat: {0}", + "IndexerVipExpiredHealthCheckMessage": "Beneficiile VIP pentru indexator au expirat: {indexerNames}", "IndexerNoDefCheckMessage": "Indexatorii nu au definiție și nu vor funcționa: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în {appName}", "IndexerRss": "RSS indexator", "EnabledRedirected": "Activat, Redirecționat", @@ -363,7 +363,7 @@ "FullSync": "Sincronizare completă", "IndexerObsoleteCheckMessage": "Indexatorii sunt învechiți sau nu au fost actualizați: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în {appName}", "IndexerProxies": "Proxiuri indexatoare", - "IndexerVipCheckExpiringClientMessage": "Beneficiile VIP pentru indexator expiră în curând: {0}", + "IndexerVipExpiringHealthCheckMessage": "Beneficiile VIP pentru indexator expiră în curând: {indexerNames}", "ApplicationLongTermStatusCheckAllClientMessage": "Toate aplicațiile sunt indisponibile din cauza unor eșecuri pentru mai mult de 6 ore", "ApplicationLongTermStatusCheckSingleClientMessage": "Aplicațiile indisponibile din cauza unor eșecuri pentru mai mult de 6 ore: {0}", "LastDuration": "Ultima durată", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 2d0cc7227..20bd4781d 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -342,8 +342,8 @@ "NoSearchResultsFound": "Inget sökresultat hittat, försök utföra en ny sökning nedan.", "NetCore": ".NET", "MaintenanceRelease": "Underhållsutgåva", - "IndexerVipCheckExpiringClientMessage": "Indexer VIP förmåner utgår snart: {0}", - "IndexerVipCheckExpiredClientMessage": "Indexer VIP förmåner har utgått: {0}", + "IndexerVipExpiringHealthCheckMessage": "Indexer VIP förmåner utgår snart: {indexerNames}", + "IndexerVipExpiredHealthCheckMessage": "Indexer VIP förmåner har utgått: {indexerNames}", "IndexerTagsHelpText": "Använd taggar för att specificera standardklient, specificera Indexer Proxies, eller bara för att organisera dina indexers.", "IndexerSettingsSummary": "Konfigurera flera globala Indexerinställningar, includerat Proxies.", "IndexerRss": "Indexer Rss", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 35c94f567..efada1129 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -215,8 +215,8 @@ "IndexerStatusCheckAllClientMessage": "所有搜刮器都因错误不可用", "IndexerStatusCheckSingleClientMessage": "搜刮器因错误不可用:{0}", "IndexerTagsHelpText": "使用标签来指定索引器代理或索引器同步到哪些应用程序。", - "IndexerVipCheckExpiredClientMessage": "索引器VIP特权已过期:{0}", - "IndexerVipCheckExpiringClientMessage": "索引器VIP特权即将过期:{0}", + "IndexerVipExpiredHealthCheckMessage": "索引器VIP特权已过期:{indexerNames}", + "IndexerVipExpiringHealthCheckMessage": "索引器VIP特权即将过期:{indexerNames}", "Indexers": "索引器", "Info": "信息", "InitialFailure": "初始化失败", From 4dac60bef9063f4a3ff9d77b1ee1cdeb944cf557 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 1 Apr 2024 00:49:31 +0300 Subject: [PATCH 519/964] Fixed: Displaying capabilities for Newznab and Torznab feeds (#2083) --- .../Indexers/Definitions/Newznab/Newznab.cs | 18 +++++++--- .../Newznab/NewznabCapabilitiesProvider.cs | 10 +++--- .../Newznab/NewznabCapabilitiesSettings.cs | 35 +++++++++++++++++++ .../Definitions/Newznab/NewznabSettings.cs | 3 +- .../Indexers/Definitions/Torznab/Torznab.cs | 18 +++++++--- src/NzbDrone.Core/Indexers/IndexerFactory.cs | 8 +++-- 6 files changed, 75 insertions(+), 17 deletions(-) create mode 100644 src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesSettings.cs diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs index 882cb6e5e..e7109f504 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Core.Indexers.Newznab public string[] GetBaseUrlFromSettings() { - if (Definition == null || Settings?.Categories == null) + if (Definition == null || Settings?.Capabilities == null) { return new[] { "" }; } @@ -61,14 +61,24 @@ namespace NzbDrone.Core.Indexers.Newznab { var caps = new IndexerCapabilities(); - if (Definition == null || Settings?.Categories == null) + if (Definition == null || Settings?.Capabilities == null) { return caps; } - foreach (var category in Settings.Categories) + caps.SupportsRawSearch = Settings.Capabilities?.SupportsRawSearch ?? false; + caps.SearchParams = Settings.Capabilities?.SearchParams ?? new List { SearchParam.Q }; + caps.TvSearchParams = Settings.Capabilities?.TvSearchParams ?? new List(); + caps.MovieSearchParams = Settings.Capabilities?.MovieSearchParams ?? new List(); + caps.MusicSearchParams = Settings.Capabilities?.MusicSearchParams ?? new List(); + caps.BookSearchParams = Settings.Capabilities?.BookSearchParams ?? new List(); + + if (Settings.Capabilities?.Categories != null) { - caps.Categories.AddCategoryMapping(category.Name, category); + foreach (var category in Settings.Capabilities.Categories) + { + caps.Categories.AddCategoryMapping(category.Name, category); + } } return caps; diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs index e182b97e7..f72f0a9f9 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesProvider.cs @@ -124,7 +124,7 @@ namespace NzbDrone.Core.Indexers.Newznab { foreach (var param in xmlBasicSearch.Attribute("supportedParams").Value.Split(',')) { - if (Enum.TryParse(param, true, out SearchParam searchParam)) + if (Enum.TryParse(param, true, out SearchParam searchParam) && !capabilities.SearchParams.Contains(searchParam)) { capabilities.SearchParams.AddIfNotNull(searchParam); } @@ -146,7 +146,7 @@ namespace NzbDrone.Core.Indexers.Newznab { foreach (var param in xmlMovieSearch.Attribute("supportedParams").Value.Split(',')) { - if (Enum.TryParse(param, true, out MovieSearchParam searchParam)) + if (Enum.TryParse(param, true, out MovieSearchParam searchParam) && !capabilities.MovieSearchParams.Contains(searchParam)) { capabilities.MovieSearchParams.AddIfNotNull(searchParam); } @@ -166,7 +166,7 @@ namespace NzbDrone.Core.Indexers.Newznab { foreach (var param in xmlTvSearch.Attribute("supportedParams").Value.Split(',')) { - if (Enum.TryParse(param, true, out TvSearchParam searchParam)) + if (Enum.TryParse(param, true, out TvSearchParam searchParam) && !capabilities.TvSearchParams.Contains(searchParam)) { capabilities.TvSearchParams.AddIfNotNull(searchParam); } @@ -186,7 +186,7 @@ namespace NzbDrone.Core.Indexers.Newznab { foreach (var param in xmlAudioSearch.Attribute("supportedParams").Value.Split(',')) { - if (Enum.TryParse(param, true, out MusicSearchParam searchParam)) + if (Enum.TryParse(param, true, out MusicSearchParam searchParam) && !capabilities.MusicSearchParams.Contains(searchParam)) { capabilities.MusicSearchParams.AddIfNotNull(searchParam); } @@ -206,7 +206,7 @@ namespace NzbDrone.Core.Indexers.Newznab { foreach (var param in xmlBookSearch.Attribute("supportedParams").Value.Split(',')) { - if (Enum.TryParse(param, true, out BookSearchParam searchParam)) + if (Enum.TryParse(param, true, out BookSearchParam searchParam) && !capabilities.BookSearchParams.Contains(searchParam)) { capabilities.BookSearchParams.AddIfNotNull(searchParam); } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesSettings.cs new file mode 100644 index 000000000..244d1c869 --- /dev/null +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesSettings.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; + +namespace NzbDrone.Core.Indexers.Newznab; + +public class NewznabCapabilitiesSettings +{ + public bool SupportsRawSearch { get; set; } + + public List SearchParams { get; set; } = new (); + + public List TvSearchParams { get; set; } = new (); + + public List MovieSearchParams { get; set; } = new (); + + public List MusicSearchParams { get; set; } = new (); + + public List BookSearchParams { get; set; } = new (); + + public List Categories { get; set; } = new (); + + public NewznabCapabilitiesSettings() + { + } + + public NewznabCapabilitiesSettings(IndexerCapabilities capabilities) + { + SupportsRawSearch = capabilities?.SupportsRawSearch ?? false; + SearchParams = capabilities?.SearchParams; + TvSearchParams = capabilities?.TvSearchParams; + MovieSearchParams = capabilities?.MovieSearchParams; + MusicSearchParams = capabilities?.MusicSearchParams; + BookSearchParams = capabilities?.BookSearchParams; + Categories = capabilities?.Categories.GetTorznabCategoryList(); + } +} diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabSettings.cs index b517c5894..67b787e12 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabSettings.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using FluentValidation; @@ -76,7 +75,7 @@ namespace NzbDrone.Core.Indexers.Newznab [FieldDefinition(7)] public IndexerBaseSettings BaseSettings { get; set; } = new (); - public List Categories { get; set; } + public NewznabCapabilitiesSettings Capabilities { get; set; } // Field 8 is used by TorznabSettings MinimumSeeders // If you need to add another field here, update TorznabSettings as well and this comment diff --git a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs index 512aaf091..049fec0b1 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Core.Indexers.Torznab public string[] GetBaseUrlFromSettings() { - if (Definition == null || Settings?.Categories == null) + if (Definition == null || Settings?.Capabilities == null) { return new[] { "" }; } @@ -61,14 +61,24 @@ namespace NzbDrone.Core.Indexers.Torznab { var caps = new IndexerCapabilities(); - if (Definition == null || Settings?.Categories == null) + if (Definition == null || Settings?.Capabilities == null) { return caps; } - foreach (var category in Settings.Categories) + caps.SupportsRawSearch = Settings.Capabilities?.SupportsRawSearch ?? false; + caps.SearchParams = Settings.Capabilities?.SearchParams ?? new List { SearchParam.Q }; + caps.TvSearchParams = Settings.Capabilities?.TvSearchParams ?? new List(); + caps.MovieSearchParams = Settings.Capabilities?.MovieSearchParams ?? new List(); + caps.MusicSearchParams = Settings.Capabilities?.MusicSearchParams ?? new List(); + caps.BookSearchParams = Settings.Capabilities?.BookSearchParams ?? new List(); + + if (Settings.Capabilities?.Categories != null) { - caps.Categories.AddCategoryMapping(category.Name, category); + foreach (var category in Settings.Capabilities.Categories) + { + caps.Categories.AddCategoryMapping(category.Name, category); + } } return caps; diff --git a/src/NzbDrone.Core/Indexers/IndexerFactory.cs b/src/NzbDrone.Core/Indexers/IndexerFactory.cs index a5f4e6601..0c9668fab 100644 --- a/src/NzbDrone.Core/Indexers/IndexerFactory.cs +++ b/src/NzbDrone.Core/Indexers/IndexerFactory.cs @@ -284,7 +284,9 @@ namespace NzbDrone.Core.Indexers if (definition.Enable && definition.Implementation is nameof(Newznab.Newznab) or nameof(Torznab.Torznab)) { var settings = (NewznabSettings)definition.Settings; - settings.Categories = _newznabCapabilitiesProvider.GetCapabilities(settings, definition)?.Categories.GetTorznabCategoryList(); + var capabilities = _newznabCapabilitiesProvider.GetCapabilities(settings, definition); + + settings.Capabilities = new NewznabCapabilitiesSettings(capabilities); } if (definition.Implementation == nameof(Cardigann)) @@ -304,7 +306,9 @@ namespace NzbDrone.Core.Indexers if (definition.Enable && definition.Implementation is nameof(Newznab.Newznab) or nameof(Torznab.Torznab)) { var settings = (NewznabSettings)definition.Settings; - settings.Categories = _newznabCapabilitiesProvider.GetCapabilities(settings, definition)?.Categories.GetTorznabCategoryList(); + var capabilities = _newznabCapabilitiesProvider.GetCapabilities(settings, definition); + + settings.Capabilities = new NewznabCapabilitiesSettings(capabilities); } if (definition.Implementation == nameof(Cardigann)) From f0c7d13b20d82b9e99ac43665c841a4a76d5c27c Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 16 Oct 2023 23:51:00 -0700 Subject: [PATCH 520/964] Translations for health checks Use named tokens for backend translations (cherry picked from commit 11f96c31048c2d1aafca0c91736d439f7f9a95a8) --- .../Checks/ApiKeyValidationCheck.cs | 5 +- .../Checks/DownloadClientStatusCheck.cs | 14 +++- .../Checks/IndexerDownloadClientCheck.cs | 6 +- .../Checks/IndexerLongTermStatusCheck.cs | 13 ++-- .../HealthCheck/Checks/IndexerStatusCheck.cs | 9 ++- .../Checks/NotificationStatusCheck.cs | 6 +- .../HealthCheck/Checks/ProxyCheck.cs | 70 +++++++++++++------ .../HealthCheck/Checks/UpdateCheck.cs | 26 +++++-- src/NzbDrone.Core/Localization/Core/ar.json | 22 +++--- src/NzbDrone.Core/Localization/Core/bg.json | 26 +++---- src/NzbDrone.Core/Localization/Core/ca.json | 26 +++---- src/NzbDrone.Core/Localization/Core/cs.json | 28 ++++---- src/NzbDrone.Core/Localization/Core/da.json | 24 +++---- src/NzbDrone.Core/Localization/Core/de.json | 30 ++++---- src/NzbDrone.Core/Localization/Core/el.json | 24 +++---- src/NzbDrone.Core/Localization/Core/en.json | 32 ++++----- src/NzbDrone.Core/Localization/Core/es.json | 30 ++++---- src/NzbDrone.Core/Localization/Core/fi.json | 26 +++---- src/NzbDrone.Core/Localization/Core/fr.json | 30 ++++---- src/NzbDrone.Core/Localization/Core/he.json | 28 ++++---- src/NzbDrone.Core/Localization/Core/hi.json | 26 +++---- src/NzbDrone.Core/Localization/Core/hu.json | 32 ++++----- src/NzbDrone.Core/Localization/Core/id.json | 4 +- src/NzbDrone.Core/Localization/Core/is.json | 26 +++---- src/NzbDrone.Core/Localization/Core/it.json | 28 ++++---- src/NzbDrone.Core/Localization/Core/ja.json | 26 +++---- src/NzbDrone.Core/Localization/Core/ko.json | 26 +++---- .../Localization/Core/nb_NO.json | 2 +- src/NzbDrone.Core/Localization/Core/nl.json | 28 ++++---- src/NzbDrone.Core/Localization/Core/pl.json | 30 ++++---- src/NzbDrone.Core/Localization/Core/pt.json | 22 +++--- .../Localization/Core/pt_BR.json | 32 ++++----- src/NzbDrone.Core/Localization/Core/ro.json | 26 +++---- src/NzbDrone.Core/Localization/Core/ru.json | 30 ++++---- src/NzbDrone.Core/Localization/Core/sv.json | 24 +++---- src/NzbDrone.Core/Localization/Core/th.json | 20 +++--- src/NzbDrone.Core/Localization/Core/tr.json | 26 +++---- src/NzbDrone.Core/Localization/Core/uk.json | 22 +++--- src/NzbDrone.Core/Localization/Core/vi.json | 26 +++---- .../Localization/Core/zh_CN.json | 30 ++++---- .../Localization/Core/zh_TW.json | 2 +- 41 files changed, 514 insertions(+), 449 deletions(-) diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs index e65fe0972..d3198b111 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs @@ -1,4 +1,5 @@ -using NLog; +using System.Collections.Generic; +using NLog; using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration.Events; using NzbDrone.Core.Lifecycle; @@ -28,7 +29,7 @@ namespace NzbDrone.Core.HealthCheck.Checks { _logger.Warn("Please update your API key to be at least {0} characters long. You can do this via settings or the config file", MinimumLength); - return new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format(_localizationService.GetLocalizedString("ApiKeyValidationHealthCheckMessage"), MinimumLength), "#invalid-api-key"); + return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("ApiKeyValidationHealthCheckMessage", new Dictionary { { "length", MinimumLength } }), "#invalid-api-key"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs index cef8b239e..6be6f572d 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Download; @@ -39,10 +40,19 @@ namespace NzbDrone.Core.HealthCheck.Checks if (backOffProviders.Count == enabledProviders.Count) { - return new HealthCheck(GetType(), HealthCheckResult.Error, _localizationService.GetLocalizedString("DownloadClientStatusCheckAllClientMessage"), "#download-clients-are-unavailable-due-to-failures"); + return new HealthCheck(GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString("DownloadClientStatusAllClientHealthCheckMessage"), + "#download-clients-are-unavailable-due-to-failures"); } - return new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format(_localizationService.GetLocalizedString("DownloadClientStatusCheckSingleClientMessage"), string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), "#download-clients-are-unavailable-due-to-failures"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + _localizationService.GetLocalizedString("DownloadClientStatusSingleClientHealthCheckMessage", new Dictionary + { + { "downloadClientNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } + }), + "#download-clients-are-unavailable-due-to-failures"); } } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs index 0d1682efc..592304606 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Core.Download; using NzbDrone.Core.Indexers; @@ -39,7 +40,10 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerDownloadClientHealthCheckMessage"), string.Join(", ", invalidIndexers.Select(v => v.Name).ToArray())), + _localizationService.GetLocalizedString("IndexerDownloadClientHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", invalidIndexers.Select(v => v.Name).ToArray()) } + }), "#invalid-indexer-download-client-setting"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs index 758259a13..f65f44962 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Indexers; @@ -17,9 +18,7 @@ namespace NzbDrone.Core.HealthCheck.Checks private readonly IIndexerFactory _providerFactory; private readonly IIndexerStatusService _providerStatusService; - public IndexerLongTermStatusCheck(IIndexerFactory providerFactory, - IIndexerStatusService providerStatusService, - ILocalizationService localizationService) + public IndexerLongTermStatusCheck(IIndexerFactory providerFactory, IIndexerStatusService providerStatusService, ILocalizationService localizationService) : base(localizationService) { _providerFactory = providerFactory; @@ -46,14 +45,16 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, - _localizationService.GetLocalizedString("IndexerLongTermStatusCheckAllClientMessage"), + _localizationService.GetLocalizedString("IndexerLongTermStatusAllUnavailableHealthCheckMessage"), "#indexers-are-unavailable-due-to-failures"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerLongTermStatusCheckSingleClientMessage"), - string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), + _localizationService.GetLocalizedString("IndexerLongTermStatusUnavailableHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } + }), "#indexers-are-unavailable-due-to-failures"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs index 968cb5e8f..2e8846a75 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Indexers; @@ -44,14 +45,16 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, - _localizationService.GetLocalizedString("IndexerStatusCheckAllClientMessage"), + _localizationService.GetLocalizedString("IndexerStatusAllUnavailableHealthCheckMessage"), "#indexers-are-unavailable-due-to-failures"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerStatusCheckSingleClientMessage"), - string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), + _localizationService.GetLocalizedString("IndexerStatusUnavailableHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } + }), "#indexers-are-unavailable-due-to-failures"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs index c9b5e2561..daf5ee725 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Localization; @@ -45,7 +46,10 @@ namespace NzbDrone.Core.HealthCheck.Checks return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("NotificationStatusSingleClientHealthCheckMessage"), string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), + _localizationService.GetLocalizedString("NotificationStatusSingleClientHealthCheckMessage", new Dictionary + { + { "notificationNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } + }), "#notifications-are-unavailable-due-to-failures"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs index f8f7df340..ba1e40657 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Net; using NLog; @@ -19,7 +20,7 @@ namespace NzbDrone.Core.HealthCheck.Checks private readonly IHttpRequestBuilderFactory _cloudRequestBuilder; - public ProxyCheck(IProwlarrCloudRequestBuilder cloudRequestBuilder, IConfigService configService, IHttpClient client, ILocalizationService localizationService, Logger logger) + public ProxyCheck(IProwlarrCloudRequestBuilder cloudRequestBuilder, IConfigService configService, IHttpClient client, Logger logger, ILocalizationService localizationService) : base(localizationService) { _configService = configService; @@ -31,35 +32,58 @@ namespace NzbDrone.Core.HealthCheck.Checks public override HealthCheck Check() { - if (_configService.ProxyEnabled) + if (!_configService.ProxyEnabled) { - var addresses = Dns.GetHostAddresses(_configService.ProxyHostname); - if (!addresses.Any()) - { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("ProxyCheckResolveIpMessage"), _configService.ProxyHostname)); - } + return new HealthCheck(GetType()); + } - var request = _cloudRequestBuilder.Create() - .Resource("/ping") - .Build(); + var addresses = Dns.GetHostAddresses(_configService.ProxyHostname); - try - { - var response = _client.Execute(request); - - // We only care about 400 responses, other error codes can be ignored - if (response.StatusCode == HttpStatusCode.BadRequest) + if (!addresses.Any()) + { + return new HealthCheck(GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString("ProxyResolveIpHealthCheckMessage", new Dictionary { - _logger.Error("Proxy Health Check failed: {0}", response.StatusCode); - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("ProxyCheckBadRequestMessage"), response.StatusCode)); - } - } - catch (Exception ex) + { "proxyHostName", _configService.ProxyHostname } + }), + "#proxy-failed-resolve-ip"); + } + + var request = _cloudRequestBuilder.Create() + .Resource("/ping") + .Build(); + + try + { + var response = _client.Execute(request); + + // We only care about 400 responses, other error codes can be ignored + if (response.StatusCode == HttpStatusCode.BadRequest) { - _logger.Error(ex, "Proxy Health Check failed"); - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("ProxyCheckFailedToTestMessage"), request.Url)); + _logger.Error("Proxy Health Check failed: {0}", response.StatusCode); + + return new HealthCheck(GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString("ProxyBadRequestHealthCheckMessage", new Dictionary + { + { "statusCode", response.StatusCode } + }), + "#proxy-failed-test"); } } + catch (Exception ex) + { + _logger.Error(ex, "Proxy Health Check failed"); + + return new HealthCheck(GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString("ProxyFailedToTestHealthCheckMessage", new Dictionary + { + { "url", request.Url } + }), + "#proxy-failed-test"); + } return new HealthCheck(GetType()); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs index f92e29b80..09b3eea1f 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; @@ -47,7 +48,12 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("UpdateCheckStartupTranslocationMessage"), startupFolder), + _localizationService.GetLocalizedString( + "UpdateStartupTranslocationHealthCheckMessage", + new Dictionary + { + { "startupFolder", startupFolder } + }), "#cannot-install-update-because-startup-folder-is-in-an-app-translocation-folder."); } @@ -55,7 +61,13 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("UpdateCheckStartupNotWritableMessage"), startupFolder, Environment.UserName), + _localizationService.GetLocalizedString( + "UpdateStartupNotWritableHealthCheckMessage", + new Dictionary + { + { "startupFolder", startupFolder }, + { "userName", Environment.UserName } + }), "#cannot-install-update-because-startup-folder-is-not-writable-by-the-user"); } @@ -63,14 +75,20 @@ namespace NzbDrone.Core.HealthCheck.Checks { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("UpdateCheckUINotWritableMessage"), uiFolder, Environment.UserName), + _localizationService.GetLocalizedString( + "UpdateUiNotWritableHealthCheckMessage", + new Dictionary + { + { "uiFolder", uiFolder }, + { "userName", Environment.UserName } + }), "#cannot-install-update-because-ui-folder-is-not-writable-by-the-user"); } } if (BuildInfo.BuildDateTime < DateTime.UtcNow.AddDays(-14) && _checkUpdateService.AvailableUpdate() != null) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("UpdateAvailable"), "#new-update-is-available"); + return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("UpdateAvailableHealthCheckMessage")); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 75aa31775..d20f582f3 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -47,8 +47,8 @@ "Protocol": "بروتوكول", "Analytics": "تحليلات", "ProxyBypassFilterHelpText": "استخدم \"،\" كفاصل ، و \"*.\" كحرف بدل للنطاقات الفرعية", - "ProxyCheckBadRequestMessage": "فشل اختبار الوكيل. رمز الحالة: {0}", - "ProxyCheckFailedToTestMessage": "فشل اختبار الوكيل: {0}", + "ProxyBadRequestHealthCheckMessage": "فشل اختبار الوكيل. رمز الحالة: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "فشل اختبار الوكيل: {url}", "ProxyPasswordHelpText": "ما عليك سوى إدخال اسم مستخدم وكلمة مرور إذا كان أحدهما مطلوبًا. اتركها فارغة وإلا.", "ProxyUsernameHelpText": "ما عليك سوى إدخال اسم مستخدم وكلمة مرور إذا كان أحدهما مطلوبًا. اتركها فارغة وإلا.", "Queue": "طابور", @@ -68,7 +68,7 @@ "UnableToAddANewIndexerPleaseTryAgain": "غير قادر على إضافة مفهرس جديد ، يرجى المحاولة مرة أخرى.", "UnableToLoadBackups": "تعذر تحميل النسخ الاحتياطية", "UnsavedChanges": "التغييرات غير المحفوظة", - "UpdateCheckUINotWritableMessage": "لا يمكن تثبيت التحديث لأن مجلد واجهة المستخدم '{0}' غير قابل للكتابة بواسطة المستخدم '{1}'", + "UpdateUiNotWritableHealthCheckMessage": "لا يمكن تثبيت التحديث لأن مجلد واجهة المستخدم '{uiFolder}' غير قابل للكتابة بواسطة المستخدم '{userName}'", "UpdateScriptPathHelpText": "المسار إلى برنامج نصي مخصص يأخذ حزمة تحديث مستخرجة ويتعامل مع ما تبقى من عملية التحديث", "Username": "اسم المستخدم", "Warn": "حذر", @@ -87,8 +87,8 @@ "Details": "تفاصيل", "Donations": "التبرعات", "DownloadClient": "تحميل العميل", - "IndexerStatusCheckAllClientMessage": "جميع المفهرسات غير متوفرة بسبب الفشل", - "IndexerStatusCheckSingleClientMessage": "المفهرسات غير متاحة بسبب الإخفاقات: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "جميع المفهرسات غير متوفرة بسبب الفشل", + "IndexerStatusUnavailableHealthCheckMessage": "المفهرسات غير متاحة بسبب الإخفاقات: {indexerNames}", "Info": "معلومات", "Interval": "فترة", "Manual": "كتيب", @@ -130,8 +130,8 @@ "IncludeHealthWarningsHelpText": "قم بتضمين التحذيرات الصحية", "Indexer": "مفهرس", "IndexerFlags": "أعلام المفهرس", - "IndexerLongTermStatusCheckAllClientMessage": "جميع المفهرسات غير متوفرة بسبب الفشل لأكثر من 6 ساعات", - "IndexerLongTermStatusCheckSingleClientMessage": "المفهرسات غير متاحة بسبب الإخفاقات لأكثر من 6 ساعات: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "جميع المفهرسات غير متوفرة بسبب الفشل لأكثر من 6 ساعات", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "المفهرسات غير متاحة بسبب الإخفاقات لأكثر من 6 ساعات: {indexerNames}", "IndexerPriorityHelpText": "أولوية المفهرس من 1 (الأعلى) إلى 50 (الأدنى). الافتراضي: 25.", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "جميع المفهرسات غير متوفرة بسبب الفشل", "NoChange": "لا تغيير", @@ -185,7 +185,7 @@ "NetCore": ".شبكة", "Password": "كلمه السر", "Proxy": "الوكيل", - "ProxyCheckResolveIpMessage": "فشل حل عنوان IP لمضيف الخادم الوكيل المكون {0}", + "ProxyResolveIpHealthCheckMessage": "فشل حل عنوان IP لمضيف الخادم الوكيل المكون {proxyHostName}", "ProxyType": "نوع الوكيل", "ReleaseStatus": "حالة الإصدار", "Search": "بحث", @@ -212,8 +212,8 @@ "DeleteIndexerProxyMessageText": "هل أنت متأكد أنك تريد حذف العلامة \"{0}\"؟", "DeleteNotification": "حذف الإعلام", "DownloadClients": "تحميل العملاء", - "DownloadClientStatusCheckAllClientMessage": "جميع عملاء التنزيل غير متاحين بسبب الفشل", - "DownloadClientStatusCheckSingleClientMessage": "برامج التنزيل غير متاحة بسبب الإخفاقات: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "جميع عملاء التنزيل غير متاحين بسبب الفشل", + "DownloadClientStatusSingleClientHealthCheckMessage": "برامج التنزيل غير متاحة بسبب الإخفاقات: {downloadClientNames}", "Edit": "تعديل", "EditIndexer": "تحرير المفهرس", "Enable": "ممكن", @@ -347,7 +347,7 @@ "WhatsNew": "ما هو الجديد؟", "minutes": "الدقائق", "NotificationStatusAllClientHealthCheckMessage": "جميع القوائم غير متاحة بسبب الإخفاقات", - "NotificationStatusSingleClientHealthCheckMessage": "القوائم غير متاحة بسبب الإخفاقات: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "القوائم غير متاحة بسبب الإخفاقات: {notificationNames}", "AuthBasic": "أساسي (المتصفح المنبثق)", "AuthForm": "النماذج (صفحة تسجيل الدخول)", "DisabledForLocalAddresses": "معطل بسبب العناوين المحلية", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 780628855..6312005f8 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -102,7 +102,7 @@ "UnableToAddANewIndexerProxyPleaseTryAgain": "Не може да се добави нов индексатор, моля, опитайте отново.", "UnableToAddANewNotificationPleaseTryAgain": "Не може да се добави ново известие, моля, опитайте отново.", "UpdateAutomaticallyHelpText": "Автоматично изтегляне и инсталиране на актуализации. Все още ще можете да инсталирате от System: Updates", - "UpdateCheckStartupTranslocationMessage": "Не може да се инсталира актуализация, защото стартовата папка „{0}“ е в папка за преместване на приложения.", + "UpdateStartupTranslocationHealthCheckMessage": "Не може да се инсталира актуализация, защото стартовата папка „{startupFolder}“ е в папка за преместване на приложения.", "ReleaseStatus": "Състояние на освобождаване", "UpdateScriptPathHelpText": "Път към персонализиран скрипт, който взема извлечен пакет за актуализация и обработва останалата част от процеса на актуализация", "UseProxy": "Използвай прокси", @@ -200,9 +200,9 @@ "PortNumber": "Номер на пристанище", "Proxy": "Прокси", "ProxyBypassFilterHelpText": "Използвайте „,“ като разделител и „*“. като заместващ знак за поддомейни", - "ProxyCheckBadRequestMessage": "Неуспешно тестване на прокси. Код на състоянието: {0}", - "ProxyCheckFailedToTestMessage": "Неуспешно тестване на прокси: {0}", - "ProxyCheckResolveIpMessage": "Неуспешно разрешаване на IP адреса за конфигурирания прокси хост {0}", + "ProxyBadRequestHealthCheckMessage": "Неуспешно тестване на прокси. Код на състоянието: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Неуспешно тестване на прокси: {url}", + "ProxyResolveIpHealthCheckMessage": "Неуспешно разрешаване на IP адреса за конфигурирания прокси хост {proxyHostName}", "ProxyPasswordHelpText": "Трябва само да въведете потребителско име и парола, ако е необходимо. В противен случай ги оставете празни.", "ProxyType": "Тип прокси", "ExistingTag": "Съществуващ маркер", @@ -239,8 +239,8 @@ "Test": "Тест", "UI": "Потребителски интерфейс", "UILanguage": "Език на потребителския интерфейс", - "UpdateCheckStartupNotWritableMessage": "Не може да се инсталира актуализация, тъй като стартовата папка „{0}“ не може да се записва от потребителя „{1}“.", - "UpdateCheckUINotWritableMessage": "Не може да се инсталира актуализация, защото папката „{0}“ на потребителския интерфейс не може да се записва от потребителя „{1}“.", + "UpdateStartupNotWritableHealthCheckMessage": "Не може да се инсталира актуализация, тъй като стартовата папка „{startupFolder}“ не може да се записва от потребителя „{userName}“.", + "UpdateUiNotWritableHealthCheckMessage": "Не може да се инсталира актуализация, защото папката „{uiFolder}“ на потребителския интерфейс не може да се записва от потребителя „{userName}“.", "Enable": "Активиране", "EventType": "Тип на събитието", "Failed": "Се провали", @@ -253,13 +253,13 @@ "HideAdvanced": "Скрий Разширено", "Indexer": "Индексатор", "IndexerFlags": "Индексиращи знамена", - "IndexerLongTermStatusCheckAllClientMessage": "Всички индексатори са недостъпни поради грешки за повече от 6 часа", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Всички индексатори са недостъпни поради грешки за повече от 6 часа", "SSLCertPathHelpText": "Път към pfx файл", "UrlBaseHelpText": "За обратна поддръжка на прокси по подразбиране е празно", "View": "Изглед", "BranchUpdate": "Клон, който да се използва за актуализиране на {appName}", "Indexers": "Индексатори", - "IndexerStatusCheckAllClientMessage": "Всички индексатори са недостъпни поради грешки", + "IndexerStatusAllUnavailableHealthCheckMessage": "Всички индексатори са недостъпни поради грешки", "Mode": "Режим", "TagsSettingsSummary": "Вижте всички тагове и как се използват. Неизползваните маркери могат да бъдат премахнати", "TestAllClients": "Тествайте всички клиенти", @@ -272,8 +272,8 @@ "Updates": "Актуализации", "Uptime": "Време за работа", "DownloadClientSettings": "Изтеглете настройките на клиента", - "DownloadClientStatusCheckAllClientMessage": "Всички клиенти за изтегляне са недостъпни поради неуспехи", - "DownloadClientStatusCheckSingleClientMessage": "Клиентите за изтегляне са недостъпни поради грешки: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "Всички клиенти за изтегляне са недостъпни поради неуспехи", + "DownloadClientStatusSingleClientHealthCheckMessage": "Клиентите за изтегляне са недостъпни поради грешки: {downloadClientNames}", "Edit": "редактиране", "EnableAutomaticSearch": "Активирайте автоматичното търсене", "EnableAutomaticSearchHelpText": "Ще се използва, когато се извършват автоматични търсения чрез потребителския интерфейс или от {appName}", @@ -288,9 +288,9 @@ "GeneralSettingsSummary": "Порт, SSL, потребителско име / парола, прокси, анализи и актуализации", "History": "История", "Host": "Водещ", - "IndexerLongTermStatusCheckSingleClientMessage": "Индексатори не са налични поради неуспехи за повече от 6 часа: {0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Индексатори не са налични поради неуспехи за повече от 6 часа: {indexerNames}", "IndexerPriorityHelpText": "Приоритет на индексатора от 1 (най-висок) до 50 (най-нисък). По подразбиране: 25.", - "IndexerStatusCheckSingleClientMessage": "Индексатори не са налични поради грешки: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Индексатори не са налични поради грешки: {indexerNames}", "LaunchBrowserHelpText": " Отворете уеб браузър и отворете началната страница на {appName} при стартиране на приложението.", "ResetAPIKey": "Нулиране на API ключ", "Restart": "Рестартирам", @@ -346,7 +346,7 @@ "RecentChanges": "Последни промени", "WhatsNew": "Какво ново?", "minutes": "Минути", - "NotificationStatusSingleClientHealthCheckMessage": "Списъци, недостъпни поради неуспехи: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Списъци, недостъпни поради неуспехи: {notificationNames}", "NotificationStatusAllClientHealthCheckMessage": "Всички списъци са недостъпни поради неуспехи", "AuthBasic": "Основно (изскачащ прозорец на браузъра)", "AuthForm": "Формуляри (Страница за вход)", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 26f7eddfa..d216eb60b 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -74,7 +74,7 @@ "Retention": "Retenció", "Title": "Títol", "DeleteNotification": "Suprimeix la notificació", - "ProxyCheckBadRequestMessage": "No s'ha pogut provar el servidor intermediari. Codi d'estat: {0}", + "ProxyBadRequestHealthCheckMessage": "No s'ha pogut provar el servidor intermediari. Codi d'estat: {statusCode}", "Reddit": "Reddit", "System": "Sistema", "Username": "Nom d'usuari", @@ -128,8 +128,8 @@ "Filters": "Filtres", "FocusSearchBox": "Posa el focus a la caixa de cerca", "Grabbed": "Capturat", - "IndexerStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors", - "IndexerStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Tots els indexadors no estan disponibles a causa d'errors", + "IndexerStatusUnavailableHealthCheckMessage": "Els indexadors no estan disponibles a causa d'errors: {indexerNames}", "MovieIndexScrollTop": "Índex de pel·lícules: Desplaçament superior", "NotificationTriggers": "Activadors de notificacions", "NotificationTriggersHelpText": "Seleccioneu quins esdeveniments haurien d'activar aquesta notificació", @@ -175,7 +175,7 @@ "DeleteTagMessageText": "Esteu segur que voleu suprimir l'etiqueta '{label}'?", "Details": "Detalls", "Disabled": "Desactivat", - "DownloadClientStatusCheckAllClientMessage": "Tots els clients de descàrrega no estan disponibles a causa d'errors", + "DownloadClientStatusAllClientHealthCheckMessage": "Tots els clients de descàrrega no estan disponibles a causa d'errors", "Edit": "Edita", "EnableInteractiveSearchHelpText": "S'utilitzarà quan s'utilitzi la cerca interactiva", "EnableInteractiveSearch": "Activa la cerca interactiva", @@ -198,8 +198,8 @@ "OnApplicationUpdateHelpText": "A l'actualitzar de l'aplicació", "OnGrab": "Al capturar", "PackageVersion": "Versió del paquet", - "ProxyCheckFailedToTestMessage": "No s'ha pogut provar el servidor intermediari: {0}", - "ProxyCheckResolveIpMessage": "No s'ha pogut resoldre l'adreça IP de l'amfitrió intermediari configurat {0}", + "ProxyFailedToTestHealthCheckMessage": "No s'ha pogut provar el servidor intermediari: {url}", + "ProxyResolveIpHealthCheckMessage": "No s'ha pogut resoldre l'adreça IP de l'amfitrió intermediari configurat {proxyHostName}", "Queued": "En cua", "ReadTheWikiForMoreInformation": "Llegiu el Wiki per a més informació", "RestartRequiredHelpTextWarning": "Cal reiniciar perquè tingui efecte", @@ -235,13 +235,13 @@ "Enable": "Activa", "IndexerFlags": "Indicadors de l'indexador", "UnableToLoadNotifications": "No es poden carregar les notificacions", - "IndexerLongTermStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors durant més de 6 hores", - "IndexerLongTermStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors durant més de 6 hores: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Tots els indexadors no estan disponibles a causa d'errors durant més de 6 hores", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Els indexadors no estan disponibles a causa d'errors durant més de 6 hores: {indexerNames}", "IndexerPriority": "Prioritat de l'indexador", "UnsavedChanges": "Canvis no desats", "UpdateAutomaticallyHelpText": "Baixeu i instal·leu les actualitzacions automàticament. Encara podreu instal·lar des de Sistema: Actualitzacions", "UpdateCheckStartupTranslocationMessage": "No es pot instal·lar l'actualització perquè la carpeta d'inici \"{0}\" es troba en una carpeta de translocació d'aplicacions.", - "UpdateCheckUINotWritableMessage": "No es pot instal·lar l'actualització perquè l'usuari '{1}' no pot escriure la carpeta de la IU '{0}'.", + "UpdateUiNotWritableHealthCheckMessage": "No es pot instal·lar l'actualització perquè l'usuari '{userName}' no pot escriure la carpeta de la IU '{uiFolder}'.", "UpdateScriptPathHelpText": "Camí a un script personalitzat que pren un paquet d'actualització i gestiona la resta del procés d'actualització", "Uptime": "Temps de funcionament", "Info": "Informació", @@ -266,7 +266,7 @@ "Discord": "Discord", "Docker": "Docker", "Donations": "Donacions", - "DownloadClientStatusCheckSingleClientMessage": "Baixa els clients no disponibles a causa d'errors: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Baixa els clients no disponibles a causa d'errors: {downloadClientNames}", "HealthNoIssues": "No hi ha cap problema amb la configuració", "HideAdvanced": "Amaga avançat", "History": "Història", @@ -362,14 +362,14 @@ "Theme": "Tema", "Track": "Traça", "Year": "Any", - "UpdateAvailable": "Nova actualització disponible", + "UpdateAvailableHealthCheckMessage": "Nova actualització disponible", "ConnectionLostReconnect": "{appName} intentarà connectar-se automàticament, o podeu fer clic a recarregar.", "ConnectionLostToBackend": "{appName} ha perdut la connexió amb el backend i s'haurà de tornar a carregar per a restaurar la funcionalitat.", "RecentChanges": "Canvis recents", "WhatsNew": "Que hi ha de nou?", "minutes": "Minuts", "DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}", - "NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {notificationNames}", "AddConnection": "Afegeix una connexió", "NotificationStatusAllClientHealthCheckMessage": "Totes les notificacions no estan disponibles a causa d'errors", "AuthBasic": "Basic (finestra emergent del navegador)", @@ -394,7 +394,7 @@ "EditIndexerImplementation": "Edita l'indexador - {implementationName}", "EditSelectedDownloadClients": "Editeu els clients de descàrrega seleccionats", "EditSelectedIndexers": "Edita els indexadors seleccionats", - "IndexerDownloadClientHealthCheckMessage": "Indexadors amb clients de baixada no vàlids: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Indexadors amb clients de baixada no vàlids: {indexerNames}.", "AddCustomFilter": "Afegeix un filtre personalitzat", "AddDownloadClientImplementation": "Afegeix un client de descàrrega - {implementationName}", "AddIndexerImplementation": "Afegeix un indexador - {implementationName}", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 6479ab3bd..a0becd1bf 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -23,7 +23,7 @@ "ProxyType": "Typ serveru proxy", "Reddit": "Reddit", "ErrorLoadingContents": "Chyba při načítání obsahu", - "IndexerLongTermStatusCheckAllClientMessage": "Všechny indexery nejsou k dispozici z důvodu selhání po dobu delší než 6 hodin", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání po dobu delší než 6 hodin", "RemovedFromTaskQueue": "Odebráno z fronty úkolů", "ResetAPIKey": "Resetovat klíč API", "SSLCertPassword": "Heslo SSL Cert", @@ -41,8 +41,8 @@ "Docker": "Přístavní dělník", "Donations": "Dary", "DownloadClientSettings": "Stáhněte si nastavení klienta", - "DownloadClientStatusCheckAllClientMessage": "Všichni klienti pro stahování nejsou kvůli chybám k dispozici", - "DownloadClientStatusCheckSingleClientMessage": "Stahování klientů není k dispozici z důvodu selhání: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "Všichni klienti pro stahování nejsou kvůli chybám k dispozici", + "DownloadClientStatusSingleClientHealthCheckMessage": "Stahování klientů není k dispozici z důvodu selhání: {downloadClientNames}", "Folder": "Složka", "Grabs": "Urvat", "HealthNoIssues": "Žádné problémy s vaší konfigurací", @@ -55,7 +55,7 @@ "IndexerPriority": "Priorita indexování", "IndexerPriorityHelpText": "Priorita indexování od 1 (nejvyšší) do 50 (nejnižší). Výchozí: 25.", "Indexers": "Indexery", - "IndexerStatusCheckAllClientMessage": "Všechny indexery nejsou k dispozici z důvodu selhání", + "IndexerStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání", "LastWriteTime": "Čas posledního zápisu", "Level": "Úroveň", "LogLevel": "Úroveň protokolu", @@ -67,7 +67,7 @@ "Ok": "OK", "SendAnonymousUsageData": "Odesílejte anonymní údaje o používání", "UnselectAll": "Odznačit vše", - "UpdateCheckStartupNotWritableMessage": "Aktualizaci nelze nainstalovat, protože spouštěcí složku „{0}“ nelze zapisovat uživatelem „{1}“.", + "UpdateStartupNotWritableHealthCheckMessage": "Aktualizaci nelze nainstalovat, protože spouštěcí složku „{startupFolder}“ nelze zapisovat uživatelem „{userName}“.", "Version": "Verze", "AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery {appName}u. To zahrnuje informace o vašem prohlížeči, které stránky {appName} WebUI používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k upřednostnění funkcí a oprav chyb.", "ApiKey": "Klíč API", @@ -124,9 +124,9 @@ "Grabbed": "Popadl", "Health": "Zdraví", "LogLevelTraceHelpTextWarning": "Trasování protokolování by mělo být povoleno pouze dočasně", - "ProxyCheckBadRequestMessage": "Nepodařilo se otestovat proxy. StatusCode: {0}", - "ProxyCheckFailedToTestMessage": "Nepodařilo se otestovat proxy: {0}", - "ProxyCheckResolveIpMessage": "Nepodařilo se vyřešit adresu IP konfigurovaného hostitele proxy {0}", + "ProxyBadRequestHealthCheckMessage": "Nepodařilo se otestovat proxy. StatusCode: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Nepodařilo se otestovat proxy: {url}", + "ProxyResolveIpHealthCheckMessage": "Nepodařilo se vyřešit adresu IP konfigurovaného hostitele proxy {proxyHostName}", "ProxyPasswordHelpText": "Musíte pouze zadat uživatelské jméno a heslo, pokud je požadováno. Jinak je nechte prázdné.", "ProxyUsernameHelpText": "Musíte pouze zadat uživatelské jméno a heslo, pokud je požadováno. Jinak je nechte prázdné.", "Queue": "Fronta", @@ -161,8 +161,8 @@ "UnableToAddANewIndexerPleaseTryAgain": "Nelze přidat nový indexer, zkuste to znovu.", "UnableToAddANewIndexerProxyPleaseTryAgain": "Nelze přidat nový indexer, zkuste to znovu.", "UnableToLoadNotifications": "Nelze načíst oznámení", - "UpdateCheckStartupTranslocationMessage": "Aktualizaci nelze nainstalovat, protože spouštěcí složka „{0}“ je ve složce Translocation aplikace.", - "UpdateCheckUINotWritableMessage": "Aktualizaci nelze nainstalovat, protože uživatelská složka „{0}“ není zapisovatelná uživatelem „{1}“.", + "UpdateStartupTranslocationHealthCheckMessage": "Aktualizaci nelze nainstalovat, protože spouštěcí složka „{startupFolder}“ je ve složce Translocation aplikace.", + "UpdateUiNotWritableHealthCheckMessage": "Aktualizaci nelze nainstalovat, protože uživatelská složka „{uiFolder}“ není zapisovatelná uživatelem „{userName}“.", "UpdateMechanismHelpText": "Použijte vestavěný aktualizátor {appName} nebo skript", "UpdateScriptPathHelpText": "Cesta k vlastnímu skriptu, který přebírá extrahovaný balíček aktualizace a zpracovává zbytek procesu aktualizace", "Uptime": "Provozuschopnost", @@ -265,8 +265,8 @@ "Exception": "Výjimka", "ExistingTag": "Stávající značka", "IllRestartLater": "Restartuji později", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexery nedostupné z důvodu selhání po dobu delší než 6 hodin: {0}", - "IndexerStatusCheckSingleClientMessage": "Indexery nedostupné z důvodu selhání: {0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání po dobu delší než 6 hodin: {indexerNames}", + "IndexerStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání: {indexerNames}", "SettingsTimeFormat": "Časový formát", "ShowAdvanced": "Zobrazit pokročilé", "ShowSearch": "Zobrazit vyhledávání", @@ -353,7 +353,7 @@ "ApplicationURL": "URL aplikace", "ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základní adresy URL", "ApplyChanges": "Použít změny", - "ApiKeyValidationHealthCheckMessage": "Aktualizujte svůj klíč API tak, aby měl alespoň {0} znaků. Můžete to provést prostřednictvím nastavení nebo konfiguračního souboru", + "ApiKeyValidationHealthCheckMessage": "Aktualizujte svůj klíč API tak, aby měl alespoň {length} znaků. Můžete to provést prostřednictvím nastavení nebo konfiguračního souboru", "AppUpdated": "{appName} aktualizován", "AddDownloadClientImplementation": "Přidat klienta pro stahování - {implementationName}", "AuthenticationRequired": "Vyžadované ověření", @@ -371,7 +371,7 @@ "EditIndexerImplementation": "Upravit indexer - {implementationName}", "Episode": "epizoda", "NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání", - "NotificationStatusSingleClientHealthCheckMessage": "Seznamy nejsou k dispozici z důvodu selhání: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Seznamy nejsou k dispozici z důvodu selhání: {notificationNames}", "Application": "Aplikace", "AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}", "Encoding": "Kódování", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 15de615ef..90be9e749 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -3,8 +3,8 @@ "Language": "Sprog", "KeyboardShortcuts": "Keyboard Genveje", "Info": "Information", - "IndexerStatusCheckSingleClientMessage": "Indexere utilgængelige på grund af fejl: {0}", - "IndexerStatusCheckAllClientMessage": "Alle indeksører er utilgængelige på grund af fejl", + "IndexerStatusUnavailableHealthCheckMessage": "Indexere utilgængelige på grund af fejl: {indexerNames}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Alle indeksører er utilgængelige på grund af fejl", "Indexers": "Indexere", "History": "Historie", "HideAdvanced": "Gemt Avancerede", @@ -21,8 +21,8 @@ "Events": "Begivenheder", "Error": "Fejl", "Edit": "Rediger", - "DownloadClientStatusCheckSingleClientMessage": "Download klienter er ikke tilgængelige på grund af fejl: {0}", - "DownloadClientStatusCheckAllClientMessage": "Alle download klienter er utilgængelige på grund af fejl", + "DownloadClientStatusSingleClientHealthCheckMessage": "Download klienter er ikke tilgængelige på grund af fejl: {downloadClientNames}", + "DownloadClientStatusAllClientHealthCheckMessage": "Alle download klienter er utilgængelige på grund af fejl", "DownloadClientsSettingsSummary": "Indstilling af downloadklienter til brug for {appName}s søgefunktion", "DownloadClients": "Download Klienter", "DownloadClient": "Download Klient", @@ -135,8 +135,8 @@ "IllRestartLater": "Jeg genstarter senere", "IncludeHealthWarningsHelpText": "Inkluder sundhedsadvarsler", "Indexer": "Indekser", - "IndexerLongTermStatusCheckAllClientMessage": "Alle indeksatorer er ikke tilgængelige på grund af fejl i mere end 6 timer", - "IndexerLongTermStatusCheckSingleClientMessage": "Indeksatorer er ikke tilgængelige på grund af fejl i mere end 6 timer: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Alle indeksatorer er ikke tilgængelige på grund af fejl i mere end 6 timer", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indeksatorer er ikke tilgængelige på grund af fejl i mere end 6 timer: {indexerNames}", "IndexerPriority": "Indekseringsprioritet", "IndexerPriorityHelpText": "Indekseringsprioritet fra 1 (højest) til 50 (lavest). Standard: 25.", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Alle indexere er utilgængelige på grund af fejl", @@ -173,9 +173,9 @@ "Priority": "Prioritet", "Protocol": "Protokol", "ProxyBypassFilterHelpText": "Brug ',' som en separator og '*.' som et jokertegn for underdomæner", - "ProxyCheckBadRequestMessage": "Kunne ikke teste proxy. Statuskode: {0}", - "ProxyCheckFailedToTestMessage": "Kunne ikke teste proxy: {0}", - "ProxyCheckResolveIpMessage": "Mislykkedes at løse IP-adressen til den konfigurerede proxyhost {0}", + "ProxyBadRequestHealthCheckMessage": "Kunne ikke teste proxy. Statuskode: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Kunne ikke teste proxy: {url}", + "ProxyResolveIpHealthCheckMessage": "Mislykkedes at løse IP-adressen til den konfigurerede proxyhost {proxyHostName}", "ProxyPasswordHelpText": "Du skal kun indtaste et brugernavn og en adgangskode, hvis der kræves et. Lad dem være tomme ellers.", "ProxyUsernameHelpText": "Du skal kun indtaste et brugernavn og en adgangskode, hvis der kræves et. Lad dem være tomme ellers.", "ReadTheWikiForMoreInformation": "Læs Wiki for mere information", @@ -239,7 +239,7 @@ "UnableToLoadUISettings": "UI-indstillingerne kunne ikke indlæses", "UnselectAll": "Fravælg alle", "UpdateAutomaticallyHelpText": "Download og installer opdateringer automatisk. Du kan stadig installere fra System: Updates", - "UpdateCheckStartupNotWritableMessage": "Kan ikke installere opdatering, fordi startmappen '{0}' ikke kan skrives af brugeren '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "Kan ikke installere opdatering, fordi startmappen '{startupFolder}' ikke kan skrives af brugeren '{userName}'.", "UpdateCheckUINotWritableMessage": "Kan ikke installere opdatering, fordi brugergrænsefladen \"{0}\" ikke kan skrives af brugeren \"{1}\".", "UpdateScriptPathHelpText": "Sti til et brugerdefineret script, der tager en udpakket opdateringspakke og håndterer resten af opdateringsprocessen", "Uptime": "Oppetid", @@ -265,7 +265,7 @@ "StartupDirectory": "Startmappe", "Status": "Status", "DownloadClientsLoadError": "Kunne ikke indlæse downloadklienter", - "UpdateCheckStartupTranslocationMessage": "Kan ikke installere opdatering, fordi startmappen '{0}' er i en App Translocation-mappe.", + "UpdateStartupTranslocationHealthCheckMessage": "Kan ikke installere opdatering, fordi startmappen '{startupFolder}' er i en App Translocation-mappe.", "UpdateMechanismHelpText": "Brug den indbyggede opdateringsfunktion eller et script", "View": "Udsigt", "Warn": "Advare", @@ -363,7 +363,7 @@ "ConnectionLostReconnect": "Radarr vil prøve at tilslutte automatisk, eller du kan klikke genindlæs forneden.", "minutes": "Protokoller", "NotificationStatusAllClientHealthCheckMessage": "Alle lister er utilgængelige på grund af fejl", - "NotificationStatusSingleClientHealthCheckMessage": "Lister utilgængelige på grund af fejl: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Lister utilgængelige på grund af fejl: {notificationNames}", "AuthForm": "Formularer (login-side)", "DisabledForLocalAddresses": "Deaktiveret for lokale adresser", "ResetAPIKeyMessageText": "Er du sikker på, at du vil nulstille din API-nøgle?", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 617ebf858..d373c6744 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -20,7 +20,7 @@ "Analytics": "Analysen", "AnalyticsEnabledHelpText": "Senden Sie anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen zu Ihrem Browser, welche {appName}-WebUI-Seiten Sie verwenden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.", "ApiKey": "API-Schlüssel", - "ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {0} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen", + "ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {length} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen", "AppDataDirectory": "AppData-Verzeichnis", "AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern", "AppProfileInUse": "App-Profil im Einsatz", @@ -107,8 +107,8 @@ "Donations": "Spenden", "DownloadClient": "Download Client", "DownloadClientSettings": "Downloader Einstellungen", - "DownloadClientStatusCheckAllClientMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar", - "DownloadClientStatusCheckSingleClientMessage": "Download Clients aufgrund von Fehlern nicht verfügbar: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar", + "DownloadClientStatusSingleClientHealthCheckMessage": "Download Clients aufgrund von Fehlern nicht verfügbar: {downloadClientNames}", "DownloadClients": "Downloader", "DownloadClientsSettingsSummary": "Download der Client-Konfigurationen für die Integration in die {appName} UI-Suche", "Duration": "Dauer", @@ -176,8 +176,8 @@ "IndexerFlags": "Indexer-Flags", "IndexerHealthCheckNoIndexers": "Keine Indexer aktiviert, {appName} wird keine Suchergebnisse zurückgeben", "IndexerInfo": "Indexer-Info", - "IndexerLongTermStatusCheckAllClientMessage": "Alle Indexer sind wegen über 6 Stunden langen bestehender Fehler nicht verfügbar", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexer wegen über 6 Stunden langen bestehenden Fehlern nicht verfügbar: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Alle Indexer sind wegen über 6 Stunden langen bestehender Fehler nicht verfügbar", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexer wegen über 6 Stunden langen bestehenden Fehlern nicht verfügbar: {indexerNames}", "IndexerName": "Indexer-Name", "IndexerNoDefCheckMessage": "Indexer haben keine Definition und werden nicht funktionieren: {0}. Bitte entferne und (oder) füge diese neu zu {appName} hinzu", "IndexerObsoleteCheckMessage": "Indexer sind nicht mehr verfügbar oder wurden aktualiiert: {0}. Bitte enfernen und (oder) neu zu {appName} hinzufügen", @@ -191,8 +191,8 @@ "IndexerRss": "Indexer RSS", "IndexerSettingsSummary": "Konfiguration verschiedener globaler Indexer Einstellungen, einschließlich Proxies.", "IndexerSite": "Indexer-Seite", - "IndexerStatusCheckAllClientMessage": "Alle Indexer sind aufgrund von Fehlern nicht verfügbar", - "IndexerStatusCheckSingleClientMessage": "Indexer aufgrund von Fehlern nicht verfügbar: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Alle Indexer sind aufgrund von Fehlern nicht verfügbar", + "IndexerStatusUnavailableHealthCheckMessage": "Indexer aufgrund von Fehlern nicht verfügbar: {indexerNames}", "IndexerTagsHelpText": "Benutze Tags, um Indexer-Proxies zu spezifizieren, mit welchen Apps der Indexer synchronisiert oder um Indexer zu organisieren.", "IndexerVipExpiredHealthCheckMessage": "Die VIP Indexer Vorteile sind abgelaufen: {indexerNames}", "IndexerVipExpiringHealthCheckMessage": "Die Indexer VIP Vorteile verfallen bald: {indexerNames}", @@ -281,9 +281,9 @@ "Proxies": "Proxies", "Proxy": "Proxy", "ProxyBypassFilterHelpText": "Verwenden Sie ',' als Trennzeichen und '*.' als Wildcard für Subdomains", - "ProxyCheckBadRequestMessage": "Proxy konnte nicht getestet werden. StatusCode: {0}", - "ProxyCheckFailedToTestMessage": "Proxy konnte nicht getestet werden: {0}", - "ProxyCheckResolveIpMessage": "Fehler beim Auflösen der IP-Adresse für den konfigurierten Proxy-Host {0}", + "ProxyBadRequestHealthCheckMessage": "Proxy konnte nicht getestet werden. StatusCode: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Proxy konnte nicht getestet werden: {url}", + "ProxyResolveIpHealthCheckMessage": "Fehler beim Auflösen der IP-Adresse für den konfigurierten Proxy-Host {proxyHostName}", "ProxyPasswordHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.", "ProxyType": "Proxy-Typ", "ProxyUsernameHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.", @@ -432,9 +432,9 @@ "UnsavedChanges": "Nicht gespeicherte Änderungen", "UnselectAll": "Alle abwählen", "UpdateAutomaticallyHelpText": "Updates automatisch herunterladen und installieren. Sie können weiterhin über System: Updates installieren", - "UpdateCheckStartupNotWritableMessage": "Update kann nicht installiert werden, da der Startordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.", - "UpdateCheckStartupTranslocationMessage": "Update kann nicht installiert werden, da sich der Startordner '{0}' in einem App Translocation-Ordner befindet.", - "UpdateCheckUINotWritableMessage": "Update kann nicht installiert werden, da der Benutzeroberflächenordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.", + "UpdateStartupNotWritableHealthCheckMessage": "Update kann nicht installiert werden, da der Startordner '{startupFolder}' vom Benutzer '{userName}' nicht beschreibbar ist.", + "UpdateStartupTranslocationHealthCheckMessage": "Update kann nicht installiert werden, da sich der Startordner '{startupFolder}' in einem App Translocation-Ordner befindet.", + "UpdateUiNotWritableHealthCheckMessage": "Update kann nicht installiert werden, da der Benutzeroberflächenordner '{uiFolder}' vom Benutzer '{userName}' nicht beschreibbar ist.", "UpdateMechanismHelpText": "Verwenden Sie den integrierten Updater von {appName} oder ein Skript", "UpdateScriptPathHelpText": "Pfad zu einem benutzerdefinierten Skript, das ein extrahiertes Update-Paket übernimmt und den Rest des Update-Prozesses abwickelt", "Updates": "Aktualisierung", @@ -485,7 +485,7 @@ "More": "Mehr", "Publisher": "Herausgeber", "Track": "Trace", - "UpdateAvailable": "Neue Version verfügbar", + "UpdateAvailableHealthCheckMessage": "Neue Version verfügbar", "Year": "Jahr", "Album": "Album", "Artist": "Künstler", @@ -499,7 +499,7 @@ "DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?", "AddConnection": "Verbindung hinzufügen", "NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar", - "NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {notificationNames}", "AuthBasic": "Basis (Browser-Popup)", "AuthForm": "Formulare (Anmeldeseite)", "DisabledForLocalAddresses": "Für lokale Adressen deaktiviert", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index e3ac6b6a3..8f6e860b7 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -28,8 +28,8 @@ "EventType": "Είδος Γεγονότος", "Events": "Γεγονότα", "Edit": "Επεξεργασία", - "DownloadClientStatusCheckSingleClientMessage": "Προγράμματα λήψης που είναι μη διαθέσιμα λόγων αποτυχιών: {0}", - "DownloadClientStatusCheckAllClientMessage": "Όλα τα προγράμματα λήψης είναι μη διαθέσιμα λόγων αποτυχιών", + "DownloadClientStatusSingleClientHealthCheckMessage": "Προγράμματα λήψης που είναι μη διαθέσιμα λόγων αποτυχιών: {downloadClientNames}", + "DownloadClientStatusAllClientHealthCheckMessage": "Όλα τα προγράμματα λήψης είναι μη διαθέσιμα λόγων αποτυχιών", "DownloadClientsSettingsSummary": "Κάντε λήψη της διαμόρφωσης πελατών για ενσωμάτωση στην αναζήτηση διεπαφής χρήστη {appName}", "CustomFilters": "Custom Φιλτρα", "ConnectSettingsSummary": "Ειδοποιήσεις και προσαρμοσμένα σενάρια", @@ -73,8 +73,8 @@ "NoChange": "Καμία αλλαγή", "Port": "Λιμάνι", "PortNumber": "Αριθμός θύρας", - "IndexerStatusCheckAllClientMessage": "Όλοι οι δείκτες δεν είναι διαθέσιμοι λόγω αστοχιών", - "IndexerStatusCheckSingleClientMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Όλοι οι δείκτες δεν είναι διαθέσιμοι λόγω αστοχιών", + "IndexerStatusUnavailableHealthCheckMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών: {indexerNames}", "KeyboardShortcuts": "Συντομεύσεις πληκτρολογίου", "Language": "Γλώσσα", "Reset": "Επαναφορά", @@ -139,7 +139,7 @@ "HomePage": "Αρχική σελίδα", "Host": "Πλήθος", "Hostname": "Όνομα κεντρικού υπολογιστή", - "IndexerLongTermStatusCheckSingleClientMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών για περισσότερο από 6 ώρες: {0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών για περισσότερο από 6 ώρες: {indexerNames}", "IndexerPriorityHelpText": "Προτεραιότητα ευρετηρίου από 1 (Υψηλότερη) έως 50 (Χαμηλότερη). Προεπιλογή: 25.", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", "IndexerProxyStatusUnavailableHealthCheckMessage": "Τα ευρετήρια δεν είναι διαθέσιμα λόγω αστοχιών: {indexerProxyNames}", @@ -166,8 +166,8 @@ "PendingChangesStayReview": "Παραμείνετε και ελέγξτε τις αλλαγές", "Presets": "Προεπιλογές", "Priority": "Προτεραιότητα", - "ProxyCheckFailedToTestMessage": "Αποτυχία δοκιμής διακομιστή μεσολάβησης: {0}", - "ProxyCheckResolveIpMessage": "Αποτυχία επίλυσης της διεύθυνσης IP για τον Διαμορφωμένο διακομιστή μεσολάβησης {0}", + "ProxyFailedToTestHealthCheckMessage": "Αποτυχία δοκιμής διακομιστή μεσολάβησης: {url}", + "ProxyResolveIpHealthCheckMessage": "Αποτυχία επίλυσης της διεύθυνσης IP για τον Διαμορφωμένο διακομιστή μεσολάβησης {proxyHostName}", "Queue": "Ουρά", "ReadTheWikiForMoreInformation": "Διαβάστε το Wiki για περισσότερες πληροφορίες", "Refresh": "Φρεσκάρω", @@ -242,10 +242,10 @@ "BindAddress": "Δεσμευμένη διεύθυνση", "EnableRss": "Ενεργοποίηση RSS", "IndexerFlags": "Σημαίες ευρετηρίου", - "IndexerLongTermStatusCheckAllClientMessage": "Όλοι οι δείκτες δεν είναι διαθέσιμοι λόγω αστοχιών για περισσότερο από 6 ώρες", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Όλοι οι δείκτες δεν είναι διαθέσιμοι λόγω αστοχιών για περισσότερο από 6 ώρες", "InteractiveSearch": "Διαδραστική αναζήτηση", "Interval": "Διάστημα", - "ProxyCheckBadRequestMessage": "Αποτυχία δοκιμής διακομιστή μεσολάβησης. StatusCode: {0}", + "ProxyBadRequestHealthCheckMessage": "Αποτυχία δοκιμής διακομιστή μεσολάβησης. StatusCode: {statusCode}", "ProxyPasswordHelpText": "Πρέπει να εισαγάγετε ένα όνομα χρήστη και έναν κωδικό πρόσβασης μόνο εάν απαιτείται. Αφήστε τα κενά διαφορετικά.", "ProxyType": "Τύπος διακομιστή μεσολάβησης", "ProxyUsernameHelpText": "Πρέπει να εισαγάγετε ένα όνομα χρήστη και έναν κωδικό πρόσβασης μόνο εάν απαιτείται. Αφήστε τα κενά διαφορετικά.", @@ -459,7 +459,7 @@ "Remove": "Αφαιρώ", "Replace": "Αντικαθιστώ", "TheLatestVersionIsAlreadyInstalled": "Η τελευταία έκδοση του {appName} είναι ήδη εγκατεστημένη", - "ApiKeyValidationHealthCheckMessage": "Παρακαλούμε ενημερώστε το κλείδι API ώστε να έχει τουλάχιστον {0} χαρακτήρες. Μπορείτε να το κάνετε αυτό μέσα από τις ρυθμίσεις ή το αρχείο ρυθμίσεων", + "ApiKeyValidationHealthCheckMessage": "Παρακαλούμε ενημερώστε το κλείδι API ώστε να έχει τουλάχιστον {length} χαρακτήρες. Μπορείτε να το κάνετε αυτό μέσα από τις ρυθμίσεις ή το αρχείο ρυθμίσεων", "StopSelecting": "Διακοπή Επιλογής", "OnHealthRestored": "Στην Αποκατάσταση Υγείας", "ApplicationURL": "Διεύθυνση URL εφαρμογής", @@ -485,7 +485,7 @@ "Theme": "Θέμα", "Track": "Ιχνος", "Year": "Ετος", - "UpdateAvailable": "Νέα ενημέρωση είναι διαθέσιμη", + "UpdateAvailableHealthCheckMessage": "Νέα ενημέρωση είναι διαθέσιμη", "Artist": "Καλλιτέχνης", "Author": "Συγγραφέας", "Book": "Βιβλίο", @@ -501,7 +501,7 @@ "DeleteAppProfileMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το προφίλ ποιότητας '{0}'?", "AddConnection": "Προσθήκη Σύνδεσης", "NotificationStatusAllClientHealthCheckMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", - "NotificationStatusSingleClientHealthCheckMessage": "Μη διαθέσιμες λίστες λόγω αποτυχιών: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Μη διαθέσιμες λίστες λόγω αποτυχιών: {notificationNames}", "AuthBasic": "Βασικό (Αναδυόμενο παράθυρο προγράμματος περιήγησης)", "AuthForm": "Φόρμες (σελίδα σύνδεσης)", "Clone": "Κλωνοποίηση", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 24effc8eb..3a88c6e8d 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -34,7 +34,7 @@ "Analytics": "Analytics", "AnalyticsEnabledHelpText": "Send anonymous usage and error information to {appName}'s servers. This includes information on your browser, which {appName} WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes.", "ApiKey": "API Key", - "ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file", + "ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {length} characters long. You can do this via settings or the config file", "AppDataDirectory": "AppData Directory", "AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update", "AppProfileInUse": "App Profile in Use", @@ -226,8 +226,8 @@ "DownloadClientSettingsPriorityItemHelpText": "Priority to use when grabbing items", "DownloadClientSettingsUrlBaseHelpText": "Adds a prefix to the {clientName} url, such as {url}", "DownloadClientSettingsUseSslHelpText": "Use secure connection when connection to {clientName}", - "DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures", - "DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "All download clients are unavailable due to failures", + "DownloadClientStatusSingleClientHealthCheckMessage": "Download clients unavailable due to failures: {downloadClientNames}", "DownloadClientTransmissionSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Transmission location", "DownloadClientTransmissionSettingsUrlBaseHelpText": "Adds a prefix to the {clientName} rpc url, eg {url}, defaults to '{defaultUrl}'", "DownloadClients": "Download Clients", @@ -327,7 +327,7 @@ "IndexerCategories": "Indexer Categories", "IndexerDetails": "Indexer Details", "IndexerDisabled": "Indexer Disabled", - "IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {indexerNames}.", "IndexerDownloadClientHelpText": "Specify which download client is used for grabs made within {appName} from this indexer", "IndexerFailureRate": "Indexer Failure Rate", "IndexerFileListSettingsFreeleechOnlyHelpText": "Search freeleech releases only", @@ -356,8 +356,8 @@ "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Search freeleech releases only", "IndexerId": "Indexer ID", "IndexerInfo": "Indexer Info", - "IndexerLongTermStatusCheckAllClientMessage": "All indexers are unavailable due to failures for more than 6 hours", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexers unavailable due to failures for more than 6 hours: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures for more than 6 hours", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures for more than 6 hours: {indexerNames}", "IndexerMTeamTpSettingsApiKeyHelpText": "API Key from the Site (Found in User Control Panel => Security => Laboratory)", "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Search freeleech releases only", "IndexerName": "Indexer Name", @@ -410,8 +410,8 @@ "IndexerSettingsVipExpiration": "VIP Expiration", "IndexerSite": "Indexer Site", "IndexerStatus": "Indexer Status", - "IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures", - "IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures", + "IndexerStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures: {indexerNames}", "IndexerTagsHelpText": "Use tags to specify Indexer Proxies or which apps the indexer is synced to.", "IndexerTagsHelpTextWarning": "Tags should be used with caution, they can have unintended effects. An indexer with a tag will only sync to apps with the same tag.", "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Site API Key", @@ -489,7 +489,7 @@ "NotSupported": "Not Supported", "Notification": "Notification", "NotificationStatusAllClientHealthCheckMessage": "All notifications are unavailable due to failures", - "NotificationStatusSingleClientHealthCheckMessage": "Notifications unavailable due to failures: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Notifications unavailable due to failures: {notificationNames}", "NotificationTriggers": "Notification Triggers", "NotificationTriggersHelpText": "Select which events should trigger this notification", "Notifications": "Notifications", @@ -533,11 +533,11 @@ "ProwlarrSupportsAnyIndexer": "{appName} supports many indexers in addition to any indexer that uses the Newznab/Torznab standard using 'Generic Newznab' (for usenet) or 'Generic Torznab' (for torrents). Search & Select your indexer from below.", "Proxies": "Proxies", "Proxy": "Proxy", + "ProxyBadRequestHealthCheckMessage": "Failed to test proxy. Status code: {statusCode}", "ProxyBypassFilterHelpText": "Use ',' as a separator, and '*.' as a wildcard for subdomains", - "ProxyCheckBadRequestMessage": "Failed to test proxy. Status code: {0}", - "ProxyCheckFailedToTestMessage": "Failed to test proxy: {0}", - "ProxyCheckResolveIpMessage": "Failed to resolve the IP Address for the Configured Proxy Host {0}", + "ProxyFailedToTestHealthCheckMessage": "Failed to test proxy: {url}", "ProxyPasswordHelpText": "You only need to enter a username and password if one is required. Leave them blank otherwise.", + "ProxyResolveIpHealthCheckMessage": "Failed to resolve the IP Address for the Configured Proxy Host {proxyHostName}", "ProxyType": "Proxy Type", "ProxyUsernameHelpText": "You only need to enter a username and password if one is required. Leave them blank otherwise.", "Public": "Public", @@ -718,12 +718,12 @@ "UnsavedChanges": "Unsaved Changes", "UnselectAll": "Unselect All", "UpdateAutomaticallyHelpText": "Automatically download and install updates. You will still be able to install from System: Updates", - "UpdateAvailable": "New update is available", - "UpdateCheckStartupNotWritableMessage": "Cannot install update because startup folder '{0}' is not writable by the user '{1}'.", - "UpdateCheckStartupTranslocationMessage": "Cannot install update because startup folder '{0}' is in an App Translocation folder.", - "UpdateCheckUINotWritableMessage": "Cannot install update because UI folder '{0}' is not writable by the user '{1}'.", + "UpdateAvailableHealthCheckMessage": "New update is available", "UpdateMechanismHelpText": "Use {appName}'s built-in updater or a script", "UpdateScriptPathHelpText": "Path to a custom script that takes an extracted update package and handle the remainder of the update process", + "UpdateStartupNotWritableHealthCheckMessage": "Cannot install update because startup folder '{startupFolder}' is not writable by the user '{userName}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Cannot install update because startup folder '{startupFolder}' is in an App Translocation folder.", + "UpdateUiNotWritableHealthCheckMessage": "Cannot install update because UI folder '{uiFolder}' is not writable by the user '{userName}'.", "Updates": "Updates", "Uptime": "Uptime", "Url": "Url", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index a31e5d4df..5978550d1 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -10,8 +10,8 @@ "Files": "Archivos", "Events": "Eventos", "Edit": "Editar", - "DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}", - "DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores", + "DownloadClientStatusSingleClientHealthCheckMessage": "Gestores de descargas no disponibles debido a errores: {downloadClientNames}", + "DownloadClientStatusAllClientHealthCheckMessage": "Los gestores de descargas no están disponibles debido a errores", "DownloadClients": "Clientes de descarga", "Delete": "Eliminar", "Dates": "Fechas", @@ -28,9 +28,9 @@ "About": "Acerca de", "View": "Vista", "Updates": "Actualizaciones", - "UpdateCheckUINotWritableMessage": "No se puede instalar la actualización porque la carpeta UI '{0}' no tiene permisos de escritura para el usuario '{1}'.", + "UpdateUiNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta UI '{uiFolder}' no tiene permisos de escritura para el usuario '{userName}'.", "UpdateCheckStartupTranslocationMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' está en una carpeta de \"App Translocation\".", - "UpdateCheckStartupNotWritableMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' no tiene permisos de escritura para el usuario '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de arranque '{startupFolder}' no tiene permisos de escritura para el usuario '{userName}'.", "UnselectAll": "Desmarcar todo", "UI": "UI", "Tasks": "Tareas", @@ -51,9 +51,9 @@ "ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de {appName}, no recibirás actualizaciones", "Refresh": "Actualizar", "Queue": "Cola", - "ProxyCheckResolveIpMessage": "No se pudo resolver la dirección IP del Host Proxy configurado {0}", - "ProxyCheckFailedToTestMessage": "Fallo al comprobar el proxy: {0}", - "ProxyCheckBadRequestMessage": "Fallo al comprobar el proxy. Status code: {0}", + "ProxyResolveIpHealthCheckMessage": "No se pudo resolver la dirección IP del Host Proxy configurado {proxyHostName}", + "ProxyFailedToTestHealthCheckMessage": "Fallo al comprobar el proxy: {url}", + "ProxyBadRequestHealthCheckMessage": "Fallo al comprobar el proxy. Status code: {statusCode}", "Proxy": "Proxy", "Options": "Opciones", "NoChange": "Sin cambio", @@ -62,7 +62,7 @@ "Logging": "Registro de eventos", "LogFiles": "Archivos de Registro", "Language": "Idioma", - "IndexerStatusCheckAllClientMessage": "Todos los indexadores no están disponibles debido a errores", + "IndexerStatusAllUnavailableHealthCheckMessage": "Todos los indexadores no están disponibles debido a errores", "Added": "Añadido", "Actions": "Acciones", "UISettingsSummary": "Fecha, idioma, y opciones de color deteriorado", @@ -71,7 +71,7 @@ "ReleaseStatus": "Estado del Estreno", "Protocol": "Protocolo", "LastWriteTime": "Última Fecha de Escritura", - "IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {indexerNames}", + "IndexerStatusUnavailableHealthCheckMessage": "Indexadores no disponibles debido a errores: {indexerNames}", "Indexer": "Indexador", "Grabbed": "Añadido", "GeneralSettingsSummary": "Puerto, SSL, nombre de usuario/contraseña , proxy, analíticas, y actualizaciones", @@ -284,8 +284,8 @@ "MovieIndexScrollBottom": "Indice de Películas: Desplazar hacia abajo", "CloseCurrentModal": "Cerrar esta Ventana Modal", "AcceptConfirmationModal": "Aceptar Confirmación de esta Ventana Modal", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}", - "IndexerLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexers no disponible por errores durando más de 6 horas: {indexerNames}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Ningún indexer está disponible por errores durando más de 6 horas", "Reddit": "Reddit", "UnableToAddANewAppProfilePleaseTryAgain": "No se ha podido añadir un nuevo perfil de calidad, prueba otra vez.", "DeleteIndexerProxyMessageText": "¿Seguro que quieres eliminar el proxy indexador '{name}'?", @@ -388,7 +388,7 @@ "More": "Más", "Track": "Rastro", "Year": "Año", - "UpdateAvailable": "La nueva actualización está disponible", + "UpdateAvailableHealthCheckMessage": "La nueva actualización está disponible", "Genre": "Género", "Publisher": "Editor", "AuthenticationRequired": "Autenticación requerida", @@ -399,8 +399,8 @@ "EditSelectedIndexers": "Editar Indexadores Seleccionados", "Implementation": "Implementación", "ManageDownloadClients": "Gestionar Clientes de Descarga", - "ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {0} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración", - "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.", + "ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {length} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración", + "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {indexerNames}.", "Episode": "Episodio", "ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.", "ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", @@ -412,7 +412,7 @@ "DeleteAppProfileMessageText": "¿Estás seguro de que quieres eliminar el perfil de la aplicación '{name}'?", "AddConnection": "Añadir Conexión", "NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a fallos", - "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {notificationNames}", "EditIndexerImplementation": "Editar Indexador - {implementationName}", "AuthBasic": "Básico (ventana emergente del navegador)", "AuthForm": "Formularios (Página de inicio de sesión)", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index be74545de..6dde0f610 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -93,9 +93,9 @@ "Presets": "Esiasetukset", "Priority": "Painotus", "Protocol": "Protokolla", - "ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.", - "ProxyCheckFailedToTestMessage": "Välityspalvelintesti epäonnistui: {0}", - "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.", + "ProxyBadRequestHealthCheckMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {statusCode}.", + "ProxyFailedToTestHealthCheckMessage": "Välityspalvelintesti epäonnistui: {url}", + "ProxyResolveIpHealthCheckMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.", "ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.", "ProxyType": "Välityspalvelimen tyyppi", "ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.", @@ -154,7 +154,7 @@ "Disabled": "Ei käytössä", "DownloadClients": "Lataustyökalut", "DownloadClientSettings": "Lataustyökalujen asetukset", - "DownloadClientStatusCheckAllClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä", + "DownloadClientStatusAllClientHealthCheckMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä", "Mode": "Tila", "MoreInfo": "Lisätietoja", "SelectAll": "Valitse kaikki", @@ -247,7 +247,7 @@ "DeleteBackup": "Poista varmuuskopio", "DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion \"{name}\"?", "DeleteDownloadClient": "Poista lataustyökalu", - "DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {downloadClientNames}", "EditIndexer": "Muokkaa tietolähdettä", "EnableAutomaticSearch": "Käytä automaattihakua", "EnableInteractiveSearch": "Käytä manuaalihakuun", @@ -275,12 +275,12 @@ "IncludeHealthWarningsHelpText": "Sisällytä kuntovaroitukset", "Indexer": "Tietolähde", "IndexerFlags": "Tietolähteen liput", - "IndexerLongTermStatusCheckAllClientMessage": "Mikään tietolähde ei ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.", - "IndexerLongTermStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Mikään tietolähde ei ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Tietolähteet eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {indexerNames}", "IndexerPriority": "Tietolähteiden painotus", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi", - "IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi", - "IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi", + "IndexerStatusUnavailableHealthCheckMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi: {indexerNames}", "NoChange": "Ei muutosta", "NoLogFiles": "Lokitiedostoja ei ole", "SSLCertPasswordHelpText": "PFX-tiedoston salasana", @@ -480,7 +480,7 @@ "Artist": "Esittäjä", "Author": "Kirjailija", "Book": "Kirja", - "UpdateAvailable": "Uusi päivitys on saatavilla", + "UpdateAvailableHealthCheckMessage": "Uusi päivitys on saatavilla", "Episode": "Jakso", "Label": "Nimi", "Theme": "Teema", @@ -492,7 +492,7 @@ "minutes": "minuuttia", "AddConnection": "Lisää yhteys", "NotificationStatusAllClientHealthCheckMessage": "Mikään ilmoituspavelu ei ole ongelmien vuoksi käytettävissä.", - "NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {notificationNames}", "AuthBasic": "Perus (ponnahdusikkuna)", "AuthForm": "Lomake (kirjautumissivu)", "DisabledForLocalAddresses": "Ei käytössä paikallisille osoitteille", @@ -511,7 +511,7 @@ "NoDownloadClientsFound": "Lataustyökaluja ei löytynyt", "CountDownloadClientsSelected": "{count} lataustyökalu(a) on valittu", "EditSelectedDownloadClients": "Muokkaa valittuja lataustyökaluja", - "IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä lataustyökaluilla: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä lataustyökaluilla: {indexerNames}.", "AddIndexerProxyImplementation": "Lisää tiedonhaun välityspalvelin - {implementationName}", "EditIndexerProxyImplementation": "Muokkaa tiedonhaun välityspalvelinta - {implementationName}", "EditDownloadClientImplementation": "Muokataan lataustyökalua - {implementationName}", @@ -564,7 +564,7 @@ "SearchAllIndexers": "Etsi kaikista tietolähteistä", "SeedRatioHelpText": "Jakosuhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.", "TorznabUrl": "Torznab URL", - "ApiKeyValidationHealthCheckMessage": "Muuta rajapinnan (API) avain ainakin {0} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.", + "ApiKeyValidationHealthCheckMessage": "Muuta rajapinnan (API) avain ainakin {length} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.", "OnHealthRestored": "Terveystilan vakautuessa", "OnHealthRestoredHelpText": "Terveystilan vakautuessa", "TotalHostQueries": "Isännän kyselyiden kokonaismäärä", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 776528a3d..f25b59a7d 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -1,5 +1,5 @@ { - "IndexerStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs", + "IndexerStatusAllUnavailableHealthCheckMessage": "Tous les indexeurs sont indisponibles en raison d'échecs", "Indexers": "Indexeurs", "Host": "Hôte", "History": "Historique", @@ -11,7 +11,7 @@ "Files": "Fichiers", "Events": "Événements", "Edit": "Modifier", - "DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", + "DownloadClientStatusAllClientHealthCheckMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", "DownloadClients": "Clients de télécharg.", "Dates": "Dates", "Date": "Date", @@ -26,13 +26,13 @@ "Analytics": "Statistiques", "All": "Tout", "About": "À propos", - "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", - "DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Indexeurs indisponibles en raison d'échecs : {indexerNames}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {downloadClientNames}", "SetTags": "Définir des étiquettes", "ReleaseStatus": "Statut de la version", - "UpdateCheckUINotWritableMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", - "UpdateCheckStartupTranslocationMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' se trouve dans un dossier App Translocation.", - "UpdateCheckStartupNotWritableMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", + "UpdateUiNotWritableHealthCheckMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{uiFolder}' n'est pas accessible en écriture par l'utilisateur '{userName}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{startupFolder}' se trouve dans un dossier App Translocation.", + "UpdateStartupNotWritableHealthCheckMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{startupFolder}' n'est pas accessible en écriture par l'utilisateur '{userName}'.", "UnselectAll": "Tout désélectionner", "UISettingsSummary": "Date, langue, et perceptions des couleurs", "TagsSettingsSummary": "Voir toutes les étiquettes et comment elles sont utilisées. Les étiquettes inutilisées peuvent être supprimées", @@ -51,9 +51,9 @@ "ReleaseBranchCheckOfficialBranchMessage": "La branche {0} n'est pas une branche de version {appName} valide, vous ne recevrez pas de mises à jour", "Refresh": "Rafraîchir", "Queue": "File d'attente", - "ProxyCheckResolveIpMessage": "Impossible de résoudre l'adresse IP de l'hôte proxy configuré {0}", - "ProxyCheckFailedToTestMessage": "Échec du test du proxy : {0}", - "ProxyCheckBadRequestMessage": "Échec du test du proxy. Code d'état : {0}", + "ProxyResolveIpHealthCheckMessage": "Impossible de résoudre l'adresse IP de l'hôte proxy configuré {proxyHostName}", + "ProxyFailedToTestHealthCheckMessage": "Échec du test du proxy : {url}", + "ProxyBadRequestHealthCheckMessage": "Échec du test du proxy. Code d'état : {statusCode}", "Proxy": "Proxy", "Protocol": "Protocole", "Options": "Options", @@ -284,8 +284,8 @@ "OnHealthIssueHelpText": "Sur un problème de santé", "AcceptConfirmationModal": "Accepter les modalités d'utilisation", "OpenThisModal": "Ouvrir cette fenêtre modale", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison de pannes pendant plus de 6 heures : {0}", - "IndexerLongTermStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs de plus de 6 heures", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexeurs indisponibles en raison de pannes pendant plus de 6 heures : {indexerNames}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Tous les indexeurs sont indisponibles en raison d'échecs de plus de 6 heures", "Yesterday": "Hier", "Tomorrow": "Demain", "Today": "Aujourd'hui", @@ -493,7 +493,7 @@ "Track": "Piste", "Year": "Année", "ApplicationURL": "URL de l'application", - "ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration", + "ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {length} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration", "ApplicationUrlHelpText": "L'URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL", "ApplyChanges": "Appliquer les modifications", "ApplyTagsHelpTextAdd": "Ajouter : ajoute les étiquettes à la liste de étiquettes existantes", @@ -509,7 +509,7 @@ "DeleteSelectedDownloadClients": "Supprimer le(s) client(s) de téléchargement", "DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer {count} client(s) de téléchargement sélectionné(s) ?", "StopSelecting": "Effacer la sélection", - "UpdateAvailable": "Une nouvelle mise à jour est disponible", + "UpdateAvailableHealthCheckMessage": "Une nouvelle mise à jour est disponible", "AdvancedSettingsHiddenClickToShow": "Paramètres avancés masqués, cliquez pour afficher", "AdvancedSettingsShownClickToHide": "Paramètres avancés affichés, cliquez pour masquer", "AppsMinimumSeeders": "Apps avec le nombre minimum de seeders disponibles", @@ -537,7 +537,7 @@ "AddIndexerImplementation": "Ajouter un indexeur - {implementationName}", "EditConnectionImplementation": "Modifier la connexion - {implementationName}", "NotificationStatusAllClientHealthCheckMessage": "Toutes les notifications ne sont pas disponibles en raison d'échecs", - "NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison d'échecs : {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison d'échecs : {notificationNames}", "EditApplicationImplementation": "Ajouter une condition - {implementationName}", "EditIndexerImplementation": "Modifier l'indexeur - {implementationName}", "EditIndexerProxyImplementation": "Modifier un proxy d'indexeur - {implementationName}", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index bee6c303f..734399cc7 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -20,7 +20,7 @@ "NoLinks": "אין קישורים", "PendingChangesDiscardChanges": "מחק שינויים ועזוב", "ProxyBypassFilterHelpText": "השתמש ב- ',' כמפריד וב- '*.' כתו כללי לתת-דומיינים", - "ProxyCheckBadRequestMessage": "נכשל בדיקת ה- proxy. קוד קוד: {0}", + "ProxyBadRequestHealthCheckMessage": "נכשל בדיקת ה- proxy. קוד קוד: {statusCode}", "ReleaseStatus": "שחרור סטטוס", "Reload": "לִטעוֹן מִחָדָשׁ", "RemovedFromTaskQueue": "הוסר מתור המשימות", @@ -39,8 +39,8 @@ "Added": "נוסף", "Component": "רְכִיב", "Info": "מידע", - "IndexerLongTermStatusCheckAllClientMessage": "כל האינדקסים אינם זמינים עקב כשלים במשך יותר מ -6 שעות", - "IndexerLongTermStatusCheckSingleClientMessage": "אינדקסים לא זמינים עקב כשלים במשך יותר משש שעות: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "כל האינדקסים אינם זמינים עקב כשלים במשך יותר מ -6 שעות", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "אינדקסים לא זמינים עקב כשלים במשך יותר משש שעות: {indexerNames}", "Manual": "מדריך ל", "PageSize": "גודל עמוד", "PageSizeHelpText": "מספר הפריטים להצגה בכל עמוד", @@ -80,8 +80,8 @@ "Custom": "המותאם אישית", "CustomFilters": "מסננים מותאמים אישית", "Date": "תַאֲרִיך", - "DownloadClientStatusCheckAllClientMessage": "כל לקוחות ההורדה אינם זמינים עקב כשלים", - "DownloadClientStatusCheckSingleClientMessage": "הורדת לקוחות לא זמינה עקב כשלים: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "כל לקוחות ההורדה אינם זמינים עקב כשלים", + "DownloadClientStatusSingleClientHealthCheckMessage": "הורדת לקוחות לא זמינה עקב כשלים: {downloadClientNames}", "Fixed": "תוקן", "FocusSearchBox": "תיבת חיפוש פוקוס", "Folder": "תיקיה", @@ -141,7 +141,7 @@ "Time": "זְמַן", "Title": "כותרת", "UnableToLoadHistory": "לא ניתן לטעון את ההיסטוריה", - "UpdateCheckStartupNotWritableMessage": "לא ניתן להתקין את העדכון מכיוון שתיקיית ההפעלה '{0}' אינה ניתנת לכתיבה על ידי המשתמש '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "לא ניתן להתקין את העדכון מכיוון שתיקיית ההפעלה '{startupFolder}' אינה ניתנת לכתיבה על ידי המשתמש '{userName}'.", "AddDownloadClient": "הוסף לקוח הורדות", "Filename": "שם קובץ", "Files": "קבצים", @@ -162,13 +162,13 @@ "IndexerPriorityHelpText": "עדיפות אינדקס מ -1 (הגבוה ביותר) ל -50 (הנמוך ביותר). ברירת מחדל: 25.", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "כל הרשימות אינן זמינות בגלל כשלים", "IndexerProxyStatusUnavailableHealthCheckMessage": "אינדקסים לא זמינים בגלל כשלים: {indexerProxyNames}", - "IndexerStatusCheckAllClientMessage": "כל האינדקסים אינם זמינים עקב כשלים", - "IndexerStatusCheckSingleClientMessage": "אינדקסים לא זמינים בגלל כשלים: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "כל האינדקסים אינם זמינים עקב כשלים", + "IndexerStatusUnavailableHealthCheckMessage": "אינדקסים לא זמינים בגלל כשלים: {indexerNames}", "NoBackupsAreAvailable": "אין גיבויים", "PackageVersion": "גרסת חבילה", "Peers": "עמיתים", - "ProxyCheckFailedToTestMessage": "נכשל בדיקת ה- proxy: {0}", - "ProxyCheckResolveIpMessage": "פתרון כתובת ה- IP עבור מארח ה- Proxy המוגדר {0} נכשל", + "ProxyFailedToTestHealthCheckMessage": "נכשל בדיקת ה- proxy: {url}", + "ProxyResolveIpHealthCheckMessage": "פתרון כתובת ה- IP עבור מארח ה- Proxy המוגדר {proxyHostName} נכשל", "ProxyPasswordHelpText": "עליך להזין שם משתמש וסיסמה רק אם נדרשים שם. השאר אותם ריקים אחרת.", "ProxyUsernameHelpText": "עליך להזין שם משתמש וסיסמה רק אם נדרשים שם. השאר אותם ריקים אחרת.", "Reddit": "רדיט", @@ -197,8 +197,8 @@ "Tomorrow": "מָחָר", "Torrent": "טורנטים", "UnableToAddANewIndexerProxyPleaseTryAgain": "לא ניתן להוסיף אינדקס חדש, נסה שוב.", - "UpdateCheckStartupTranslocationMessage": "לא ניתן להתקין את העדכון מכיוון שתיקיית ההפעלה '{0}' נמצאת בתיקיית טרנסלוקציה של אפליקציות.", - "UpdateCheckUINotWritableMessage": "לא ניתן להתקין את העדכון מכיוון שתיקיית ממשק המשתמש '{0}' אינה ניתנת לכתיבה על ידי המשתמש '{1}'.", + "UpdateStartupTranslocationHealthCheckMessage": "לא ניתן להתקין את העדכון מכיוון שתיקיית ההפעלה '{startupFolder}' נמצאת בתיקיית טרנסלוקציה של אפליקציות.", + "UpdateUiNotWritableHealthCheckMessage": "לא ניתן להתקין את העדכון מכיוון שתיקיית ממשק המשתמש '{uiFolder}' אינה ניתנת לכתיבה על ידי המשתמש '{userName}'.", "Updates": "עדכונים", "UpdateScriptPathHelpText": "נתיב לסקריפט מותאם אישית שלוקח חבילת עדכון שחולצה ומטפל בשארית תהליך העדכון", "Uptime": "זמן עבודה", @@ -386,7 +386,7 @@ "DeleteSelectedDownloadClients": "מחק את לקוח ההורדות", "DeleteSelectedIndexersMessageText": "האם אתה בטוח שברצונך למחוק את האינדקס '{0}'?", "DownloadClientPriorityHelpText": "העדיפו עדיפות למספר לקוחות הורדה. Round-Robin משמש ללקוחות עם אותה עדיפות.", - "ApiKeyValidationHealthCheckMessage": "עדכן בבקשה את מפתח ה־API שלך כדי שיהיה באורך של לפחות {0} תווים. תוכל לעשות זאת בהגדרות או דרך קובץ הקונפיגורציה.", + "ApiKeyValidationHealthCheckMessage": "עדכן בבקשה את מפתח ה־API שלך כדי שיהיה באורך של לפחות {length} תווים. תוכל לעשות זאת בהגדרות או דרך קובץ הקונפיגורציה.", "More": "יותר", "Track": "זֵכֶר", "ApplyTagsHelpTextHowToApplyApplications": "כיצד להחיל תגים על הסרטים שנבחרו", @@ -401,7 +401,7 @@ "Album": "אלבום", "Artist": "אמן", "NotificationStatusAllClientHealthCheckMessage": "כל הרשימות אינן זמינות בגלל כשלים", - "NotificationStatusSingleClientHealthCheckMessage": "רשימות לא זמינות בגלל כשלים: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "רשימות לא זמינות בגלל כשלים: {notificationNames}", "ResetAPIKeyMessageText": "האם אתה בטוח שברצונך לאפס את מפתח ה- API שלך?", "DisabledForLocalAddresses": "מושבת לכתובות מקומיות", "Publisher": "מוציא לאור", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index fc532e6a9..4b19feb30 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -54,7 +54,7 @@ "Authentication": "प्रमाणीकरण", "ClientPriority": "ग्राहक प्राथमिकता", "Connections": "सम्बन्ध", - "DownloadClientStatusCheckSingleClientMessage": "विफलताओं के कारण अनुपलब्ध ग्राहक डाउनलोड करें: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "विफलताओं के कारण अनुपलब्ध ग्राहक डाउनलोड करें: {downloadClientNames}", "NoChanges": "कोई बदलाव नहीं", "Yesterday": "बिता कल", "DeleteIndexerProxyMessageText": "क्या आप वाकई '{0}' टैग हटाना चाहते हैं?", @@ -104,8 +104,8 @@ "DownloadClientSettings": "क्लाइंट सेटिंग्स डाउनलोड करें", "EventType": "घटना प्रकार", "Exception": "अपवाद", - "IndexerStatusCheckAllClientMessage": "विफलताओं के कारण सभी अनुक्रमणिका अनुपलब्ध हैं", - "IndexerStatusCheckSingleClientMessage": "अनुक्रमणिका विफलताओं के कारण अनुपलब्ध: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "विफलताओं के कारण सभी अनुक्रमणिका अनुपलब्ध हैं", + "IndexerStatusUnavailableHealthCheckMessage": "अनुक्रमणिका विफलताओं के कारण अनुपलब्ध: {indexerNames}", "Info": "जानकारी", "Language": "भाषा: हिन्दी", "UnableToAddANewDownloadClientPleaseTryAgain": "नया डाउनलोड क्लाइंट जोड़ने में असमर्थ, कृपया पुनः प्रयास करें।", @@ -133,9 +133,9 @@ "NoLinks": "कोई लिंक नहीं", "BindAddress": "बाँध का पता", "Branch": "डाली", - "ProxyCheckBadRequestMessage": "प्रॉक्सी का परीक्षण करने में विफल। स्थिति कोड: {0}", - "ProxyCheckFailedToTestMessage": "प्रॉक्सी का परीक्षण करने में विफल: {0}", - "ProxyCheckResolveIpMessage": "कॉन्फ़िगर प्रॉक्सी होस्ट {0} के लिए आईपी एड्रेस को हल करने में विफल", + "ProxyBadRequestHealthCheckMessage": "प्रॉक्सी का परीक्षण करने में विफल। स्थिति कोड: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "प्रॉक्सी का परीक्षण करने में विफल: {url}", + "ProxyResolveIpHealthCheckMessage": "कॉन्फ़िगर प्रॉक्सी होस्ट {proxyHostName} के लिए आईपी एड्रेस को हल करने में विफल", "ProxyPasswordHelpText": "यदि आवश्यक हो तो आपको केवल एक उपयोगकर्ता नाम और पासवर्ड दर्ज करना होगा। उन्हें खाली छोड़ दें अन्यथा।", "ProxyType": "प्रॉक्सी प्रकार", "ProxyUsernameHelpText": "यदि आवश्यक हो तो आपको केवल एक उपयोगकर्ता नाम और पासवर्ड दर्ज करना होगा। उन्हें खाली छोड़ दें अन्यथा।", @@ -170,7 +170,7 @@ "UnsavedChanges": "बिना बदलाव किए", "UnselectAll": "सभी का चयन रद्द", "UpdateAutomaticallyHelpText": "अपडेट को स्वचालित रूप से डाउनलोड और इंस्टॉल करें। आप अभी भी सिस्टम से अपडेट कर पाएंगे: अपडेट", - "UpdateCheckUINotWritableMessage": "अद्यतन स्थापित नहीं कर सकता क्योंकि UI फ़ोल्डर '{0}' उपयोगकर्ता '{1}' द्वारा लिखने योग्य नहीं है।", + "UpdateUiNotWritableHealthCheckMessage": "अद्यतन स्थापित नहीं कर सकता क्योंकि UI फ़ोल्डर '{uiFolder}' उपयोगकर्ता '{userName}' द्वारा लिखने योग्य नहीं है।", "Uptime": "अपटाइम", "URLBase": "URL बेस", "YesCancel": "हाँ, रद्द करें", @@ -234,7 +234,7 @@ "CloneProfile": "क्लोन प्रोफ़ाइल", "Close": "बंद करे", "CloseCurrentModal": "वर्तमान मोडल को बंद करें", - "DownloadClientStatusCheckAllClientMessage": "सभी डाउनलोड क्लाइंट विफलताओं के कारण अनुपलब्ध हैं", + "DownloadClientStatusAllClientHealthCheckMessage": "सभी डाउनलोड क्लाइंट विफलताओं के कारण अनुपलब्ध हैं", "Edit": "संपादित करें", "EnableAutomaticSearch": "स्वचालित खोज सक्षम करें", "EnableAutomaticSearchHelpText": "यूआई के माध्यम से या रेडर द्वारा स्वचालित खोज किए जाने पर उपयोग किया जाएगा", @@ -268,8 +268,8 @@ "Hostname": "होस्ट का नाम", "IncludeHealthWarningsHelpText": "स्वास्थ्य चेतावनी शामिल करें", "IndexerFlags": "इंडेक्स फ्लैग", - "IndexerLongTermStatusCheckAllClientMessage": "6 घंटे से अधिक समय तक विफलताओं के कारण सभी सूचकांक अनुपलब्ध हैं", - "IndexerLongTermStatusCheckSingleClientMessage": "6 घंटे से अधिक समय तक विफलताओं के कारण सूचकांक उपलब्ध नहीं: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "6 घंटे से अधिक समय तक विफलताओं के कारण सभी सूचकांक अनुपलब्ध हैं", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "6 घंटे से अधिक समय तक विफलताओं के कारण सूचकांक उपलब्ध नहीं: {indexerNames}", "IndexerPriority": "सूचकांक प्राथमिकता", "IndexerPriorityHelpText": "इंडेक्सर प्राथमिकता 1 (उच्चतम) से 50 (सबसे कम)। डिफ़ॉल्ट: 25", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "सभी सूचियाँ विफल होने के कारण अनुपलब्ध हैं", @@ -297,8 +297,8 @@ "DownloadClientsLoadError": "डाउनलोड क्लाइंट लोड करने में असमर्थ", "UnableToLoadGeneralSettings": "सामान्य सेटिंग्स लोड करने में असमर्थ", "UnableToLoadNotifications": "सूचनाएं लोड करने में असमर्थ", - "UpdateCheckStartupNotWritableMessage": "अपडेट स्थापित नहीं किया जा सकता क्योंकि स्टार्टअप फ़ोल्डर '{0}' उपयोगकर्ता '{1}' द्वारा लिखने योग्य नहीं है।", - "UpdateCheckStartupTranslocationMessage": "अपडेट स्थापित नहीं किया जा सकता क्योंकि स्टार्टअप फ़ोल्डर '{0}' ऐप ट्रांसलेशन फ़ोल्डर में है।", + "UpdateStartupNotWritableHealthCheckMessage": "अपडेट स्थापित नहीं किया जा सकता क्योंकि स्टार्टअप फ़ोल्डर '{startupFolder}' उपयोगकर्ता '{userName}' द्वारा लिखने योग्य नहीं है।", + "UpdateStartupTranslocationHealthCheckMessage": "अपडेट स्थापित नहीं किया जा सकता क्योंकि स्टार्टअप फ़ोल्डर '{startupFolder}' ऐप ट्रांसलेशन फ़ोल्डर में है।", "NoUpdatesAreAvailable": "कोई अद्यतन उपलब्ध नहीं हैं", "OAuthPopupMessage": "आपके ब्राउज़र द्वारा पॉप-अप्स को ब्लॉक किया जा रहा है", "OnHealthIssueHelpText": "स्वास्थ्य के मुद्दे पर", @@ -347,7 +347,7 @@ "minutes": "मिनट", "DeleteAppProfileMessageText": "क्या आप वाकई गुणवत्ता प्रोफ़ाइल {0} को हटाना चाहते हैं", "NotificationStatusAllClientHealthCheckMessage": "सभी सूचियाँ विफल होने के कारण अनुपलब्ध हैं", - "NotificationStatusSingleClientHealthCheckMessage": "विफलताओं के कारण अनुपलब्ध सूची: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "विफलताओं के कारण अनुपलब्ध सूची: {notificationNames}", "AuthBasic": "बेसिक (ब्राउज़र पॉपअप)", "AuthForm": "प्रपत्र (लॉग इन पेज)", "DisabledForLocalAddresses": "स्थानीय पते के लिए अक्षम", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 608be849e..55de21e31 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -10,8 +10,8 @@ "Enable": "Aktiválás", "EditIndexer": "Indexer Szerkesztése", "Edit": "Szerkeszt", - "DownloadClientStatusCheckSingleClientMessage": "Letöltőkliens hiba miatt nem elérhető: {0}", - "DownloadClientStatusCheckAllClientMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt", + "DownloadClientStatusSingleClientHealthCheckMessage": "Letöltőkliens hiba miatt nem elérhető: {downloadClientNames}", + "DownloadClientStatusAllClientHealthCheckMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt", "DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a {appName} felhasználói felület keresésbe történő integráláshoz", "DownloadClientSettings": "Letöltőkliens Beállítások", "DownloadClients": "Letöltő kliensek", @@ -160,9 +160,9 @@ "ProxyUsernameHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.", "ProxyType": "Proxy típus", "ProxyPasswordHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.", - "ProxyCheckResolveIpMessage": "Nem sikerült megoldani a konfigurált proxykiszolgáló IP-címét {0}", - "ProxyCheckFailedToTestMessage": "Proxy tesztelése sikertelen: {0}", - "ProxyCheckBadRequestMessage": "Proxy tesztelése sikertelen. Állapotkód: {0}", + "ProxyResolveIpHealthCheckMessage": "Nem sikerült megoldani a konfigurált proxykiszolgáló IP-címét {proxyHostName}", + "ProxyFailedToTestHealthCheckMessage": "Proxy tesztelése sikertelen: {url}", + "ProxyBadRequestHealthCheckMessage": "Proxy tesztelése sikertelen. Állapotkód: {statusCode}", "ProxyBypassFilterHelpText": "Használja a ',' jelet elválasztóként és a '*' jelet. helyettesítő karakterként az aldomainekhez", "Proxy": "Proxy", "Protocol": "Protokoll", @@ -215,7 +215,7 @@ "Interval": "Intervallum", "InteractiveSearch": "Interaktív Keresés", "Info": "Infó", - "IndexerStatusCheckSingleClientMessage": "Indexerek elérhetetlenek a következő hiba miatt: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Indexerek elérhetetlenek a következő hiba miatt: {indexerNames}", "Hostname": "Hosztnév", "Host": "Hoszt", "Grabbed": "Megragadta", @@ -249,7 +249,7 @@ "TagCannotBeDeletedWhileInUse": "Használat közben nem törölhető", "TableOptionsColumnsMessage": "Válasszd ki, mely oszlopok legyenek láthatóak, és milyen sorrendben jelenjenek meg", "SystemTimeCheckMessage": "A rendszeridő több mint 1 napja nem frissült. Előfordulhat, hogy az ütemezett feladatok az idő kijavításáig nem futnak megfelelően", - "IndexerStatusCheckAllClientMessage": "Az összes indexer elérhetetlen hiba miatt", + "IndexerStatusAllUnavailableHealthCheckMessage": "Az összes indexer elérhetetlen hiba miatt", "Indexers": "Indexerek", "IndexerPriorityHelpText": "Indexelő prioritás 1-től (legmagasabb) 50-ig (legalacsonyabb). Alapértelmezés: 25.", "IndexerPriority": "Indexer Prioritása", @@ -271,9 +271,9 @@ "UpdateScriptPathHelpText": "Keresse meg az egyéni parancsfájl elérési útját, amely kibontott frissítési csomagot vesz fel, és kezeli a frissítési folyamat fennmaradó részét", "Updates": "Frissítések", "UpdateMechanismHelpText": "Használja a {appName} beépített frissítőjét vagy szkriptjét", - "UpdateCheckUINotWritableMessage": "Nem lehet telepíteni a frissítést, mert a(z) „{0}” felhasználói felület mappát nem írhatja a „{1}” felhasználó.", - "UpdateCheckStartupTranslocationMessage": "Nem lehet telepíteni a frissítést, mert a (z) „{0}” indítási mappa az Alkalmazások Transzlokációs mappájában található.", - "UpdateCheckStartupNotWritableMessage": "A frissítés nem telepíthető, mert a (z) „{0}” indítási mappát a „{1}” felhasználó nem írhatja.", + "UpdateUiNotWritableHealthCheckMessage": "Nem lehet telepíteni a frissítést, mert a(z) „{uiFolder}” felhasználói felület mappát nem írhatja a „{userName}” felhasználó.", + "UpdateStartupTranslocationHealthCheckMessage": "Nem lehet telepíteni a frissítést, mert a (z) „{startupFolder}” indítási mappa az Alkalmazások Transzlokációs mappájában található.", + "UpdateStartupNotWritableHealthCheckMessage": "A frissítés nem telepíthető, mert a (z) „{startupFolder}” indítási mappát a „{userName}” felhasználó nem írhatja.", "UpdateAutomaticallyHelpText": "A frissítések automatikus letöltése és telepítése. A Rendszer: Frissítések alkalmazásból továbbra is telepíteni tudja", "UnselectAll": "Minden kijelölés megszüntetése", "UnsavedChanges": "Nem mentett változások", @@ -284,8 +284,8 @@ "ShowSearch": "Keresés mutatása", "SetTags": "Címkék beállítása", "NotificationTriggers": "Értesítési triggerek", - "IndexerLongTermStatusCheckSingleClientMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt: {0}", - "IndexerLongTermStatusCheckAllClientMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt: {indexerNames}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt", "SettingsLogSql": "SQL naplózás", "IndexerRss": "Indexer Rss", "IndexerAuth": "Indexelő auth", @@ -476,12 +476,12 @@ "EditSelectedDownloadClients": "Kijelölt letöltési kliensek szerkesztése", "Label": "Címke", "SelectIndexers": "Indexelők keresése", - "ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {0} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban", + "ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {length} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban", "Episode": "Epizód", "Genre": "Műfajok", "Theme": "Téma", "Track": "Dal", - "UpdateAvailable": "Új frissítés elérhető", + "UpdateAvailableHealthCheckMessage": "Új frissítés elérhető", "Year": "Év", "Book": "Könyv", "Season": "Évad", @@ -496,7 +496,7 @@ "minutes": "percek", "AddConnection": "Csatlakozás hozzáadása", "NotificationStatusAllClientHealthCheckMessage": "Az összes értesítés nem érhető el hibák miatt", - "NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {notificationNames}", "AuthBasic": "Alap (böngésző előugró ablak)", "AuthForm": "Űrlapok (bejelentkezési oldal)", "DisabledForLocalAddresses": "Helyi címeknél letiltva", @@ -546,7 +546,7 @@ "DeleteSelectedApplicationsMessageText": "Biztosan törölni szeretne {count} kiválasztott importlistát?", "CountApplicationsSelected": "{count} Gyűjtemény(ek) kiválasztva", "ManageClients": "Ügyfelek kezelése", - "IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltési kliensekkel: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltési kliensekkel: {indexerNames}.", "PasswordConfirmation": "Jelszó megerősítése", "SecretToken": "Titkos token" } diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index d6793551a..659fdcc29 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -26,8 +26,8 @@ "Indexer": "Pengindeks", "No": "Tidak", "Priority": "Prioritas", - "ProxyCheckBadRequestMessage": "Gagal menguji proxy. Kode Status: {0}", - "ProxyCheckFailedToTestMessage": "Gagal menguji proxy: {0}", + "ProxyBadRequestHealthCheckMessage": "Gagal menguji proxy. Kode Status: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Gagal menguji proxy: {url}", "Queue": "Antrean", "Backup": "Cadangan", "Backups": "Cadangan", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 356f992d6..4ae25f491 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -104,7 +104,7 @@ "PackageVersion": "Pakki Útgáfa", "PageSize": "Stærð blaðsíðu", "PageSizeHelpText": "Fjöldi atriða til að sýna á hverri síðu", - "ProxyCheckResolveIpMessage": "Mistókst að leysa IP-tölu fyrir stillta proxy-gestgjafa {0}", + "ProxyResolveIpHealthCheckMessage": "Mistókst að leysa IP-tölu fyrir stillta proxy-gestgjafa {proxyHostName}", "ProxyPasswordHelpText": "Þú þarft aðeins að slá inn notendanafn og lykilorð ef þess er krafist. Láttu þá vera auða annars.", "ProxyType": "Umboðsmaður", "Queue": "Biðröð", @@ -127,9 +127,9 @@ "UnableToLoadUISettings": "Ekki er hægt að hlaða stillingar HÍ", "UnselectAll": "Afmarkaðu allt", "UpdateAutomaticallyHelpText": "Sjálfkrafa hlaða niður og setja upp uppfærslur. Þú munt samt geta sett upp úr System: Updates", - "UpdateCheckStartupNotWritableMessage": "Ekki er hægt að setja uppfærslu þar sem ræsimappan '{0}' er ekki skrifanleg af notandanum '{1}'.", - "UpdateCheckStartupTranslocationMessage": "Ekki er hægt að setja uppfærslu vegna þess að ræsimappan '{0}' er í forritunarmöppu forrits.", - "UpdateCheckUINotWritableMessage": "Ekki er hægt að setja uppfærslu vegna þess að notendamöppan '{0}' er ekki skrifuð af notandanum '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "Ekki er hægt að setja uppfærslu þar sem ræsimappan '{startupFolder}' er ekki skrifanleg af notandanum '{userName}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Ekki er hægt að setja uppfærslu vegna þess að ræsimappan '{startupFolder}' er í forritunarmöppu forrits.", + "UpdateUiNotWritableHealthCheckMessage": "Ekki er hægt að setja uppfærslu vegna þess að notendamöppan '{uiFolder}' er ekki skrifuð af notandanum '{userName}'.", "UpdateMechanismHelpText": "Notaðu innbyggða uppfærslu {appName} eða handrit", "Updates": "Uppfærslur", "UpdateScriptPathHelpText": "Leið að sérsniðnu handriti sem tekur útdreginn uppfærslupakka og annast afganginn af uppfærsluferlinu", @@ -211,8 +211,8 @@ "Discord": "Ósætti", "Docker": "Docker", "DownloadClients": "Sækja viðskiptavini", - "DownloadClientStatusCheckAllClientMessage": "Allir viðskiptavinir sem hlaða niður eru ekki tiltækir vegna bilana", - "DownloadClientStatusCheckSingleClientMessage": "Sæktu viðskiptavini sem eru ekki tiltækir vegna bilana: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "Allir viðskiptavinir sem hlaða niður eru ekki tiltækir vegna bilana", + "DownloadClientStatusSingleClientHealthCheckMessage": "Sæktu viðskiptavini sem eru ekki tiltækir vegna bilana: {downloadClientNames}", "EditIndexer": "Breyttu Indexer", "Enable": "Virkja", "EnableAutomaticSearch": "Virkja sjálfvirka leit", @@ -227,12 +227,12 @@ "Indexer": "Indexer", "Info": "Upplýsingar", "IndexerFlags": "Indexer fánar", - "IndexerLongTermStatusCheckAllClientMessage": "Allir verðtryggingaraðilar eru ekki tiltækir vegna bilana í meira en 6 klukkustundir", - "IndexerLongTermStatusCheckSingleClientMessage": "Vísitölufólk er ekki tiltækt vegna bilana í meira en 6 klukkustundir: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Allir verðtryggingaraðilar eru ekki tiltækir vegna bilana í meira en 6 klukkustundir", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Vísitölufólk er ekki tiltækt vegna bilana í meira en 6 klukkustundir: {indexerNames}", "IndexerPriorityHelpText": "Forgangur flokkara frá 1 (Hæstur) til 50 (Lægstur). Sjálfgefið: 25.", "Indexers": "Vísitölufólk", - "IndexerStatusCheckAllClientMessage": "Allir verðtryggingaraðilar eru ekki tiltækir vegna bilana", - "IndexerStatusCheckSingleClientMessage": "Vísitölufólk er ekki tiltækt vegna bilana: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Allir verðtryggingaraðilar eru ekki tiltækir vegna bilana", + "IndexerStatusUnavailableHealthCheckMessage": "Vísitölufólk er ekki tiltækt vegna bilana: {indexerNames}", "NoLogFiles": "Engar logskrár", "Ok": "Allt í lagi", "OnHealthIssueHelpText": "Um heilbrigðismál", @@ -270,8 +270,8 @@ "Priority": "Forgangsröð", "Protocol": "Bókun", "ProxyBypassFilterHelpText": "Notaðu ',' sem aðskilnað og '*.' sem jókort fyrir undirlén", - "ProxyCheckBadRequestMessage": "Mistókst að prófa umboðsmann. Stöðukóði: {0}", - "ProxyCheckFailedToTestMessage": "Mistókst að prófa umboðsmann: {0}", + "ProxyBadRequestHealthCheckMessage": "Mistókst að prófa umboðsmann. Stöðukóði: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Mistókst að prófa umboðsmann: {url}", "ProxyUsernameHelpText": "Þú þarft aðeins að slá inn notendanafn og lykilorð ef þess er krafist. Láttu þá vera auða annars.", "ReleaseStatus": "Sleppa stöðu", "RemovedFromTaskQueue": "Fjarlægð úr verkröð", @@ -347,7 +347,7 @@ "ConnectionLostReconnect": "Radarr mun reyna að tengjast sjálfkrafa eða þú getur smellt á endurhlaða hér að neðan.", "minutes": "Fundargerð", "NotificationStatusAllClientHealthCheckMessage": "Allir listar eru ekki tiltækir vegna bilana", - "NotificationStatusSingleClientHealthCheckMessage": "Listar ekki tiltækir vegna bilana: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Listar ekki tiltækir vegna bilana: {notificationNames}", "AuthBasic": "Grunn (sprettiglugga vafra)", "AuthForm": "Eyðublöð (Innskráningarsíða)", "DisabledForLocalAddresses": "Óvirkt vegna heimilisfanga", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 1ecd02999..3414ccc55 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -7,7 +7,7 @@ "SelectAll": "Seleziona Tutto", "Scheduled": "Programmato", "ReleaseBranchCheckOfficialBranchMessage": "La versione {0} non è una versione valida per le release di {appName}, non riceverai aggiornamenti", - "ProxyCheckResolveIpMessage": "Impossibile risolvere l'indirizzo IP per l'Host Configurato del Proxy {0}", + "ProxyResolveIpHealthCheckMessage": "Impossibile risolvere l'indirizzo IP per l'Host Configurato del Proxy {proxyHostName}", "NoChanges": "Nessuna Modifica", "NoChange": "Nessuna Modifica", "LastWriteTime": "Orario di Ultima Scrittura", @@ -21,8 +21,8 @@ "Added": "Aggiunto", "About": "Info", "Updates": "Aggiornamenti", - "UpdateCheckUINotWritableMessage": "Impossibile installare l'aggiornamento perché l'utente '{1}' non ha i permessi di scrittura per la cartella dell'interfaccia '{0}'.", - "UpdateCheckStartupNotWritableMessage": "Impossibile installare l'aggiornamento perché l'utente '{1}' non ha i permessi di scrittura per la cartella di avvio '{0}'.", + "UpdateUiNotWritableHealthCheckMessage": "Impossibile installare l'aggiornamento perché l'utente '{userName}' non ha i permessi di scrittura per la cartella dell'interfaccia '{uiFolder}'.", + "UpdateStartupNotWritableHealthCheckMessage": "Impossibile installare l'aggiornamento perché l'utente '{userName}' non ha i permessi di scrittura per la cartella di avvio '{startupFolder}'.", "UpdateCheckStartupTranslocationMessage": "Impossibile installare l'aggiornamento perché la cartella '{0}' si trova in una cartella di \"App Translocation\".", "UI": "Interfaccia", "Tasks": "Attività", @@ -41,8 +41,8 @@ "ReleaseStatus": "Stato Release", "Refresh": "Aggiorna", "Queue": "Coda", - "ProxyCheckFailedToTestMessage": "Test del proxy fallito: {0}", - "ProxyCheckBadRequestMessage": "Il test del proxy è fallito. Codice Stato: {0}", + "ProxyFailedToTestHealthCheckMessage": "Test del proxy fallito: {url}", + "ProxyBadRequestHealthCheckMessage": "Il test del proxy è fallito. Codice Stato: {statusCode}", "Proxy": "Proxy", "Protocol": "Protocollo", "Options": "Opzioni", @@ -50,8 +50,8 @@ "Logging": "Logging", "LogFiles": "File di Log", "Language": "Lingua", - "IndexerStatusCheckSingleClientMessage": "Indicizzatori non disponibili a causa di errori: {0}", - "IndexerStatusCheckAllClientMessage": "Nessun Indicizzatore disponibile a causa di errori", + "IndexerStatusUnavailableHealthCheckMessage": "Indicizzatori non disponibili a causa di errori: {indexerNames}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Nessun Indicizzatore disponibile a causa di errori", "Indexers": "Indicizzatori", "Host": "Host", "History": "Storia", @@ -65,8 +65,8 @@ "EventType": "Tipo di Evento", "Events": "Eventi", "Edit": "Modifica", - "DownloadClientStatusCheckSingleClientMessage": "Client per il download non disponibili per errori: {0}", - "DownloadClientStatusCheckAllClientMessage": "Nessun client di download è disponibile a causa di errori", + "DownloadClientStatusSingleClientHealthCheckMessage": "Client per il download non disponibili per errori: {downloadClientNames}", + "DownloadClientStatusAllClientHealthCheckMessage": "Nessun client di download è disponibile a causa di errori", "DownloadClientsSettingsSummary": "Configurazione dei client di download per l'integrazione nella ricerca di {appName}", "DownloadClients": "Clients di Download", "DownloadClient": "Client di Download", @@ -284,8 +284,8 @@ "FocusSearchBox": "Evidenzia casella di ricerca", "CloseCurrentModal": "Chiudi la Modale Attuale", "AcceptConfirmationModal": "Accetta Conferma Modale", - "IndexerLongTermStatusCheckSingleClientMessage": "Alcuni Indicizzatori non sono disponibili da più di 6 ore a causa di errori: {0}", - "IndexerLongTermStatusCheckAllClientMessage": "Nessun Indicizzatore è disponibile da più di 6 ore a causa di errori", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Alcuni Indicizzatori non sono disponibili da più di 6 ore a causa di errori: {indexerNames}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Nessun Indicizzatore è disponibile da più di 6 ore a causa di errori", "Description": "Descrizione", "Add": "Aggiungi", "Enabled": "Abilitato", @@ -484,10 +484,10 @@ "More": "Di più", "Season": "Stagione", "Year": "Anno", - "UpdateAvailable": "É disponibile un nuovo aggiornamento", + "UpdateAvailableHealthCheckMessage": "É disponibile un nuovo aggiornamento", "Author": "Autore", "ApplyChanges": "Applica Cambiamenti", - "ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {0} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione", + "ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {length} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione", "DeleteAppProfileMessageText": "Sicuro di voler cancellare il profilo di qualità {0}", "RecentChanges": "Cambiamenti recenti", "WhatsNew": "Cosa c'è di nuovo?", @@ -496,7 +496,7 @@ "minutes": "Minuti", "AddConnection": "Aggiungi Connessione", "NotificationStatusAllClientHealthCheckMessage": "Tutte le applicazioni non sono disponibili a causa di errori", - "NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {notificationNames}", "AuthForm": "Form (Pagina di Login)", "DisabledForLocalAddresses": "Disabilitato per Indirizzi Locali", "None": "Nessuna", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index f4262b360..e7e0de4db 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -41,7 +41,7 @@ "UISettings": "UI設定", "UnableToAddANewApplicationPleaseTryAgain": "新しい通知を追加できません。もう一度やり直してください。", "UnableToLoadNotifications": "通知を読み込めません", - "UpdateCheckStartupNotWritableMessage": "スタートアップフォルダ「{0}」はユーザー「{1}」によって書き込み可能ではないため、更新をインストールできません。", + "UpdateStartupNotWritableHealthCheckMessage": "スタートアップフォルダ「{startupFolder}」はユーザー「{userName}」によって書き込み可能ではないため、更新をインストールできません。", "UpdateMechanismHelpText": "{appName}の組み込みアップデーターまたはスクリプトを使用する", "Wiki": "ウィキ", "Yesterday": "昨日", @@ -51,7 +51,7 @@ "DeleteIndexerProxyMessageText": "タグ「{0}」を削除してもよろしいですか?", "Edit": "編集", "DownloadClientSettings": "クライアント設定のダウンロード", - "DownloadClientStatusCheckAllClientMessage": "障害のため、すべてのダウンロードクライアントを利用できません", + "DownloadClientStatusAllClientHealthCheckMessage": "障害のため、すべてのダウンロードクライアントを利用できません", "EnableAutomaticSearch": "自動検索を有効にする", "EnableAutomaticSearchHelpText": "UIまたはRadarによって自動検索が実行されるときに使用されます", "Enabled": "有効", @@ -60,7 +60,7 @@ "Filename": "ファイル名", "Files": "ファイル", "Filter": "フィルタ", - "IndexerLongTermStatusCheckAllClientMessage": "6時間以上の障害のため、すべてのインデクサーが使用できなくなります", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "6時間以上の障害のため、すべてのインデクサーが使用できなくなります", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "障害のため、すべてのインデクサーを使用できません", "IndexerProxyStatusUnavailableHealthCheckMessage": "失敗のため利用できないリスト:{indexerProxyNames}", "Indexers": "インデクサー", @@ -109,7 +109,7 @@ "AddDownloadClient": "ダウンロードクライアントの追加", "BackupFolderHelpText": "相対パスは{appName}のAppDataディレクトリの下にあります", "DownloadClient": "クライアントのダウンロード", - "DownloadClientStatusCheckSingleClientMessage": "失敗のためにダウンロードできないクライアント:{0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "失敗のためにダウンロードできないクライアント:{downloadClientNames}", "Restore": "戻す", "EnableRss": "RSSを有効にする", "EnableInteractiveSearch": "インタラクティブ検索を有効にする", @@ -133,7 +133,7 @@ "Connections": "接続", "ConnectSettings": "接続設定", "Options": "オプション", - "IndexerStatusCheckAllClientMessage": "障害のため、すべてのインデクサーを使用できません", + "IndexerStatusAllUnavailableHealthCheckMessage": "障害のため、すべてのインデクサーを使用できません", "Reddit": "Reddit", "Today": "今日", "Tomorrow": "明日", @@ -171,9 +171,9 @@ "Protocol": "プロトコル", "Proxy": "プロキシ", "ProxyBypassFilterHelpText": "'、'を区切り文字として使用し、 '*。'を使用します。サブドメインのワイルドカードとして", - "ProxyCheckBadRequestMessage": "プロキシのテストに失敗しました。 StatusCode:{0}", - "ProxyCheckFailedToTestMessage": "プロキシのテストに失敗しました:{0}", - "ProxyCheckResolveIpMessage": "構成済みプロキシホスト{0}のIPアドレスの解決に失敗しました", + "ProxyBadRequestHealthCheckMessage": "プロキシのテストに失敗しました。 StatusCode:{statusCode}", + "ProxyFailedToTestHealthCheckMessage": "プロキシのテストに失敗しました:{url}", + "ProxyResolveIpHealthCheckMessage": "構成済みプロキシホスト{proxyHostName}のIPアドレスの解決に失敗しました", "ProxyPasswordHelpText": "ユーザー名とパスワードが必要な場合にのみ入力する必要があります。それ以外の場合は空白のままにします。", "ProxyType": "プロキシタイプ", "RefreshMovie": "映画を更新する", @@ -215,8 +215,8 @@ "BackupRetentionHelpText": "保存期間より古い自動バックアップは自動的にクリーンアップされます", "Backups": "バックアップ", "CertificateValidation": "証明書の検証", - "UpdateCheckStartupTranslocationMessage": "スタートアップフォルダー '{0}'がAppTranslocationフォルダーにあるため、更新をインストールできません。", - "UpdateCheckUINotWritableMessage": "UIフォルダー「{0}」はユーザー「{1}」によって書き込み可能ではないため、更新をインストールできません。", + "UpdateStartupTranslocationHealthCheckMessage": "スタートアップフォルダー '{startupFolder}'がAppTranslocationフォルダーにあるため、更新をインストールできません。", + "UpdateUiNotWritableHealthCheckMessage": "UIフォルダー「{uiFolder}」はユーザー「{userName}」によって書き込み可能ではないため、更新をインストールできません。", "URLBase": "URLベース", "UrlBaseHelpText": "リバースプロキシサポートの場合、デフォルトは空です", "UseProxy": "プロキシを使う", @@ -298,8 +298,8 @@ "Host": "ホスト", "Hostname": "ホスト名", "IllRestartLater": "後で再起動します", - "IndexerLongTermStatusCheckSingleClientMessage": "6時間以上の障害のため、インデクサーを使用できません:{0}", - "IndexerStatusCheckSingleClientMessage": "失敗のためインデクサーを利用できません:{0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "6時間以上の障害のため、インデクサーを使用できません:{indexerNames}", + "IndexerStatusUnavailableHealthCheckMessage": "失敗のためインデクサーを利用できません:{indexerNames}", "Info": "情報", "NoLogFiles": "ログファイルがありません", "NoTagsHaveBeenAddedYet": "タグはまだ追加されていません", @@ -346,7 +346,7 @@ "RecentChanges": "最近の変化", "WhatsNew": "新着情報?", "minutes": "議事録", - "NotificationStatusSingleClientHealthCheckMessage": "失敗のため利用できないリスト:{0}", + "NotificationStatusSingleClientHealthCheckMessage": "失敗のため利用できないリスト:{notificationNames}", "NotificationStatusAllClientHealthCheckMessage": "障害のため、すべてのリストを利用できません", "AuthBasic": "基本(ブラウザポップアップ)", "AuthForm": "フォーム(ログインページ)", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 6db9b99f5..2ac187fba 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -52,7 +52,7 @@ "Donations": "기부", "DownloadClient": "클라이언트 다운로드", "DownloadClientSettings": "클라이언트 설정 다운로드", - "DownloadClientStatusCheckAllClientMessage": "실패로 인해 모든 다운로드 클라이언트를 사용할 수 없습니다.", + "DownloadClientStatusAllClientHealthCheckMessage": "실패로 인해 모든 다운로드 클라이언트를 사용할 수 없습니다.", "Add": "추가", "Apply": "적용", "AppDataLocationHealthCheckMessage": "업데이트 시 AppData 삭제를 방지하기 위해 업데이트 할 수 없습니다.", @@ -66,7 +66,7 @@ "DeleteDownloadClientMessageText": "다운로드 클라이언트 '{0}'을(를) 삭제하시겠습니까?", "DeleteNotification": "알림 삭제", "DeleteNotificationMessageText": "알림 '{0}'을(를) 삭제하시겠습니까?", - "DownloadClientStatusCheckSingleClientMessage": "실패로 인해 다운 불러올 수 없는 클라이언트 : {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "실패로 인해 다운 불러올 수 없는 클라이언트 : {downloadClientNames}", "MoreInfo": "더 많은 정보", "Edit": "편집하다", "Indexer": "인덱서", @@ -236,7 +236,7 @@ "FocusSearchBox": "포커스 검색 창", "GeneralSettingsSummary": "포트, SSL, 사용자 이름 / 암호, 프록시, 분석 및 업데이트", "HideAdvanced": "고급 숨기기", - "IndexerStatusCheckAllClientMessage": "오류로 인해 모든 인덱서를 사용할 수 없습니다.", + "IndexerStatusAllUnavailableHealthCheckMessage": "오류로 인해 모든 인덱서를 사용할 수 없습니다.", "InteractiveSearch": "대화형 검색", "LastWriteTime": "마지막 쓰기 시간", "Link": "연결", @@ -248,15 +248,15 @@ "PendingChangesMessage": "저장하지 않은 변경 사항이 있습니다.이 페이지에서 나가시겠습니까?", "PendingChangesStayReview": "변경 사항 유지 및 검토", "Presets": "사전 설정", - "ProxyCheckResolveIpMessage": "구성된 프록시 호스트 {0}의 IP 주소를 확인하지 못했습니다.", + "ProxyResolveIpHealthCheckMessage": "구성된 프록시 호스트 {proxyHostName}의 IP 주소를 확인하지 못했습니다.", "Reddit": "레딧", "TagsSettingsSummary": "모든 태그와 사용 방법을 확인하십시오. 사용하지 않는 태그는 제거 할 수 있습니다.", "Yesterday": "어제", "ApplicationStatusCheckAllClientMessage": "실패로 인해 모든 목록을 사용할 수 없습니다.", "ApplicationStatusCheckSingleClientMessage": "실패로 인해 사용할 수없는 목록 : {0}", "ReleaseBranchCheckOfficialBranchMessage": "{0} 분기는 유효한 Whisparr 출시 분기가 아닙니다. 업데이트를받을 수 없습니다.", - "ProxyCheckBadRequestMessage": "프록시를 테스트하지 못했습니다. StatusCode : {0}", - "ProxyCheckFailedToTestMessage": "프록시 테스트 실패 : {0}", + "ProxyBadRequestHealthCheckMessage": "프록시를 테스트하지 못했습니다. StatusCode : {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "프록시 테스트 실패 : {url}", "ReleaseStatus": "출시 상태", "Rss": "RSS", "Sort": "종류", @@ -271,7 +271,7 @@ "RefreshMovie": "영화 새로 고침", "SuggestTranslationChange": "번역 변경 제안", "Level": "수평", - "UpdateCheckStartupTranslocationMessage": "시작 폴더 '{0}'이 (가) App Translocation 폴더에 있으므로 업데이트를 설치할 수 없습니다.", + "UpdateStartupTranslocationHealthCheckMessage": "시작 폴더 '{startupFolder}'이 (가) App Translocation 폴더에 있으므로 업데이트를 설치할 수 없습니다.", "UrlBaseHelpText": "역방향 프록시 지원의 경우 기본값은 비어 있습니다.", "MovieIndexScrollBottom": "영화 색인 : 아래로 스크롤", "View": "전망", @@ -288,7 +288,7 @@ "Priority": "우선 순위", "SetTags": "태그 설정", "System": "체계", - "UpdateCheckUINotWritableMessage": "사용자 '{1}'이 (가) UI 폴더 '{0}'에 쓸 수 없기 때문에 업데이트를 설치할 수 없습니다.", + "UpdateUiNotWritableHealthCheckMessage": "사용자 '{userName}'이 (가) UI 폴더 '{uiFolder}'에 쓸 수 없기 때문에 업데이트를 설치할 수 없습니다.", "Warn": "경고", "HomePage": "홈 페이지", "Peers": "동료", @@ -299,11 +299,11 @@ "Failed": "실패한", "FeatureRequests": "기능 요청", "IndexerFlags": "인덱서 플래그", - "IndexerLongTermStatusCheckAllClientMessage": "6 시간 이상 오류로 인해 모든 인덱서를 사용할 수 없습니다.", - "IndexerLongTermStatusCheckSingleClientMessage": "6 시간 이상 오류로 인해 인덱서를 사용할 수 없음 : {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "6 시간 이상 오류로 인해 모든 인덱서를 사용할 수 없습니다.", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "6 시간 이상 오류로 인해 인덱서를 사용할 수 없음 : {indexerNames}", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "오류로 인해 모든 인덱서를 사용할 수 없습니다.", "IndexerProxyStatusUnavailableHealthCheckMessage": "오류로 인해 인덱서를 사용할 수 없음 : {indexerProxyNames}", - "IndexerStatusCheckSingleClientMessage": "오류로 인해 인덱서를 사용할 수 없음 : {0}", + "IndexerStatusUnavailableHealthCheckMessage": "오류로 인해 인덱서를 사용할 수 없음 : {indexerNames}", "NetCore": ".NET Core", "Save": "저장", "SaveSettings": "설정 저장", @@ -317,7 +317,7 @@ "Test": "테스트", "Time": "시간", "UnableToLoadIndexers": "인덱서를로드 할 수 없습니다.", - "UpdateCheckStartupNotWritableMessage": "'{1}'사용자가 '{0}'시작 폴더에 쓸 수 없기 때문에 업데이트를 설치할 수 없습니다.", + "UpdateStartupNotWritableHealthCheckMessage": "'{userName}'사용자가 '{startupFolder}'시작 폴더에 쓸 수 없기 때문에 업데이트를 설치할 수 없습니다.", "Yes": "예", "GrabReleases": "그랩 릴리스", "NextExecution": "다음 실행", @@ -346,7 +346,7 @@ "ConnectionLostToBackend": "Radarr는 백엔드와의 연결이 끊어졌으며 기능을 복원하려면 다시 로딩해야 합니다.", "DeleteAppProfileMessageText": "품질 프로필 {0}을 (를) 삭제 하시겠습니까?", "NotificationStatusAllClientHealthCheckMessage": "실패로 인해 모든 목록을 사용할 수 없습니다.", - "NotificationStatusSingleClientHealthCheckMessage": "실패로 인해 사용할 수없는 목록 : {0}", + "NotificationStatusSingleClientHealthCheckMessage": "실패로 인해 사용할 수없는 목록 : {notificationNames}", "AuthBasic": "기본 (브라우저 팝업)", "AuthForm": "양식 (로그인 페이지)", "DisabledForLocalAddresses": "로컬 주소에 대해 비활성화됨", diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index df9f73900..abebd36fc 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -127,7 +127,7 @@ "Artist": "artist", "ApplicationUrlHelpText": "Denne applikasjonens eksterne URL inkludert http(s)://, port og URL base", "ApplyChanges": "Bekreft endringer", - "ApiKeyValidationHealthCheckMessage": "Vennligst oppdater din API-nøkkel til å være minst {0} tegn lang. Du kan gjøre dette via innstillinger eller konfigurasjonsfilen", + "ApiKeyValidationHealthCheckMessage": "Vennligst oppdater din API-nøkkel til å være minst {length} tegn lang. Du kan gjøre dette via innstillinger eller konfigurasjonsfilen", "ConnectionLostReconnect": "Radarr vil forsøke å koble til automatisk, eller du kan klikke oppdater nedenfor.", "ConnectionLostToBackend": "Radarr har mistet tilkoblingen til baksystemet og må lastes inn på nytt for å gjenopprette funksjonalitet.", "DeleteAppProfileMessageText": "Er du sikker på at du vil slette denne forsinkelsesprofilen?", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index cd700d98e..5728e3e7b 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -23,7 +23,7 @@ "Analytics": "Statistieken", "AnalyticsEnabledHelpText": "Stuur anonieme gebruiks- en foutinformatie naar de servers van {appName}. Dit omvat informatie over uw browser, welke {appName} WebUI pagina's u gebruikt, foutrapportage en OS en runtime versie. We zullen deze informatie gebruiken om prioriteiten te stellen voor functies en het verhelpen van fouten.", "ApiKey": "API-sleutel", - "ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {0} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand", + "ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {length} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand", "AppDataDirectory": "AppData map", "AppDataLocationHealthCheckMessage": "Updaten zal niet mogelijk zijn om het verwijderen van AppData te voorkomen", "AppProfileInUse": "App-profiel in gebruik", @@ -108,8 +108,8 @@ "Donations": "Donaties", "DownloadClient": "Downloader", "DownloadClientSettings": "Downloader Instellingen", - "DownloadClientStatusCheckAllClientMessage": "Alle downloaders zijn onbeschikbaar wegens fouten", - "DownloadClientStatusCheckSingleClientMessage": "Downloaders onbeschikbaar wegens fouten: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "Alle downloaders zijn onbeschikbaar wegens fouten", + "DownloadClientStatusSingleClientHealthCheckMessage": "Downloaders onbeschikbaar wegens fouten: {downloadClientNames}", "DownloadClients": "Downloaders", "DownloadClientsSettingsSummary": "Clientconfiguratie downloaden voor integratie in {appName} UI-zoekopdracht", "Duration": "Duur", @@ -170,8 +170,8 @@ "IndexerAuth": "Indexer-authenticatie", "IndexerFlags": "Indexeerder Flags", "IndexerHealthCheckNoIndexers": "Geen indexers ingeschakeld, {appName} geeft geen zoekresultaten terug", - "IndexerLongTermStatusCheckAllClientMessage": "Alle indexeerders zijn niet beschikbaar vanwege storingen gedurende meer dan 6 uur", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexeerders zijn niet beschikbaar vanwege storingen gedurende meer dan 6 uur: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Alle indexeerders zijn niet beschikbaar vanwege storingen gedurende meer dan 6 uur", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexeerders zijn niet beschikbaar vanwege storingen gedurende meer dan 6 uur: {indexerNames}", "IndexerObsoleteCheckMessage": "Indexeerders zijn verouderd of zijn bijgewerkt: {0}. Gelieve te verwijderen en (of) opnieuw toe te voegen aan {appName}", "IndexerPriority": "Indexeerder Prioriteit", "IndexerPriorityHelpText": "Indexeerder Prioriteit van 1 (Hoogste) tot 50 (Laagste). Standaard: 25.", @@ -182,8 +182,8 @@ "IndexerQuery": "Indexeer zoekopdracht", "IndexerRss": "Indexeer RSS", "IndexerSettingsSummary": "Configureer verschillende globale Indexer-instellingen, waaronder proxy's.", - "IndexerStatusCheckAllClientMessage": "Alle indexeerders zijn onbeschikbaar wegens fouten", - "IndexerStatusCheckSingleClientMessage": "Indexeerders onbeschikbaar wegens fouten: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Alle indexeerders zijn onbeschikbaar wegens fouten", + "IndexerStatusUnavailableHealthCheckMessage": "Indexeerders onbeschikbaar wegens fouten: {indexerNames}", "IndexerTagsHelpText": "Gebruik tags om standaardclients op te geven, Indexeerder-proxy's op te geven of gewoon om uw indexeerders te ordenen.", "IndexerVipExpiredHealthCheckMessage": "Indexeerder VIP-voordelen zijn verlopen: {indexerNames}", "IndexerVipExpiringHealthCheckMessage": "Indexeerder VIP-voordelen verlopen binnenkort: {indexerNames}", @@ -263,9 +263,9 @@ "ProwlarrSupportsAnyIndexer": "{appName} ondersteunt veel indexeerders naast elke indexeerder die de Newznab/Torznab-standaard gebruikt met 'Generic Newznab' (voor usenet) of 'Generic Torznab' (voor torrents). Zoek en selecteer uw indexeerder hieronder.", "Proxy": "Proxy", "ProxyBypassFilterHelpText": "Gebruik ',' als scheidingsteken en '*' als wildcard voor subdomeinen", - "ProxyCheckBadRequestMessage": "Testen van proxy is mislukt. Statuscode: {0}", - "ProxyCheckFailedToTestMessage": "Testen van proxy is mislukt: {0}", - "ProxyCheckResolveIpMessage": "Achterhalen van het IP-adres voor de geconfigureerde proxy host {0} is mislukt", + "ProxyBadRequestHealthCheckMessage": "Testen van proxy is mislukt. Statuscode: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Testen van proxy is mislukt: {url}", + "ProxyResolveIpHealthCheckMessage": "Achterhalen van het IP-adres voor de geconfigureerde proxy host {proxyHostName} is mislukt", "ProxyPasswordHelpText": "Je moet alleen een gebruikersnaam en wachtwoord ingeven als dit vereist is, laat ze anders leeg.", "ProxyType": "Proxy Type", "ProxyUsernameHelpText": "Je moet alleen een gebruikersnaam en wachtwoord ingeven als dit vereist is, laat ze anders leeg.", @@ -399,9 +399,9 @@ "UnsavedChanges": "Onopgeslagen Wijzigingen", "UnselectAll": "Alles Deselecteren", "UpdateAutomaticallyHelpText": "Download en installeer updates automatisch. Je zal nog steeds kunnen installeren vanuit Systeem: Updates", - "UpdateCheckStartupNotWritableMessage": "Kan de update niet installeren omdat de map '{0}' niet schrijfbaar is voor de gebruiker '{1}'.", - "UpdateCheckStartupTranslocationMessage": "Kan de update niet installeren omdat de map '{0}' zich in een 'App Translocation' map bevindt.", - "UpdateCheckUINotWritableMessage": "Kan de update niet installeren omdat de UI map '{0}' niet schrijfbaar is voor de gebruiker '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "Kan de update niet installeren omdat de map '{startupFolder}' niet schrijfbaar is voor de gebruiker '{userName}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Kan de update niet installeren omdat de map '{startupFolder}' zich in een 'App Translocation' map bevindt.", + "UpdateUiNotWritableHealthCheckMessage": "Kan de update niet installeren omdat de UI map '{uiFolder}' niet schrijfbaar is voor de gebruiker '{userName}'.", "UpdateMechanismHelpText": "Gebruik de ingebouwde updater van {appName} of een script", "UpdateScriptPathHelpText": "Pad naar een aangepast script dat een uitgepakt updatepakket accepteert en de rest van het updateproces afhandelt", "Updates": "Updates", @@ -438,7 +438,7 @@ "DownloadClientPriorityHelpText": "Geef prioriteit aan meerdere downloaders. Round-Robin wordt gebruikt voor downloaders met dezelfde prioriteit.", "Genre": "Genres", "Year": "Jaar", - "UpdateAvailable": "Nieuwe update is beschikbaar", + "UpdateAvailableHealthCheckMessage": "Nieuwe update is beschikbaar", "Label": "Label", "Publisher": "Uitgever", "ApplyChanges": "Pas Wijzigingen Toe", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 610e14b26..f751e6515 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -92,7 +92,7 @@ "Test": "Test", "UILanguage": "Język interfejsu użytkownika", "UnableToLoadNotifications": "Nie można załadować powiadomień", - "UpdateCheckUINotWritableMessage": "Nie można zainstalować aktualizacji, ponieważ użytkownik „{1}” nie ma prawa zapisu w folderze interfejsu użytkownika „{0}”.", + "UpdateUiNotWritableHealthCheckMessage": "Nie można zainstalować aktualizacji, ponieważ użytkownik „{userName}” nie ma prawa zapisu w folderze interfejsu użytkownika „{uiFolder}”.", "UseProxy": "Użyj proxy", "DeleteIndexerProxyMessageText": "Czy na pewno chcesz usunąć tag „{0}”?", "DeleteNotificationMessageText": "Czy na pewno chcesz usunąć powiadomienie „{0}”?", @@ -130,12 +130,12 @@ "DeleteNotification": "Usuń powiadomienie", "Disabled": "Wyłączone", "Docker": "Doker", - "DownloadClientStatusCheckSingleClientMessage": "Klienci pobierania niedostępni z powodu błędów: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Klienci pobierania niedostępni z powodu błędów: {downloadClientNames}", "EditIndexer": "Edytuj indeksator", "Enable": "Włączyć", "EnableAutomaticSearch": "Włącz automatyczne wyszukiwanie", "Enabled": "Włączone", - "DownloadClientStatusCheckAllClientMessage": "Wszyscy klienci pobierania są niedostępni z powodu błędów", + "DownloadClientStatusAllClientHealthCheckMessage": "Wszyscy klienci pobierania są niedostępni z powodu błędów", "EnableInteractiveSearch": "Włącz wyszukiwanie interaktywne", "EventType": "Typ wydarzenia", "Failed": "Niepowodzenie", @@ -156,13 +156,13 @@ "Hostname": "Nazwa hosta", "IgnoredAddresses": "Ignorowane adresy", "IllRestartLater": "Zrestartuję później", - "IndexerLongTermStatusCheckAllClientMessage": "Wszystkie indeksatory są niedostępne z powodu awarii przez ponad 6 godzin", - "IndexerLongTermStatusCheckSingleClientMessage": "Indeksatory niedostępne z powodu błędów przez ponad 6 godzin: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Wszystkie indeksatory są niedostępne z powodu awarii przez ponad 6 godzin", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indeksatory niedostępne z powodu błędów przez ponad 6 godzin: {indexerNames}", "IndexerPriority": "Priorytet indeksatora", "IndexerPriorityHelpText": "Priorytet indeksatora od 1 (najwyższy) do 50 (najniższy). Domyślnie: 25.", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Wszystkie listy są niedostępne z powodu błędów", "ShowSearchHelpText": "Pokaż przycisk wyszukiwania po najechaniu kursorem", - "IndexerStatusCheckSingleClientMessage": "Indeksatory niedostępne z powodu błędów: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Indeksatory niedostępne z powodu błędów: {indexerNames}", "Info": "Informacje", "Interval": "Interwał", "Language": "Język", @@ -194,9 +194,9 @@ "Priority": "Priorytet", "Proxy": "Pełnomocnik", "ProxyBypassFilterHelpText": "Użyj znaku „,” jako separatora i „*”. jako symbol wieloznaczny dla subdomen", - "ProxyCheckBadRequestMessage": "Nie udało się przetestować serwera proxy. StatusCode: {0}", - "ProxyCheckFailedToTestMessage": "Nie udało się przetestować serwera proxy: {0}", - "ProxyCheckResolveIpMessage": "Nie udało się rozwiązać adresu IP dla skonfigurowanego hosta proxy {0}", + "ProxyBadRequestHealthCheckMessage": "Nie udało się przetestować serwera proxy. StatusCode: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Nie udało się przetestować serwera proxy: {url}", + "ProxyResolveIpHealthCheckMessage": "Nie udało się rozwiązać adresu IP dla skonfigurowanego hosta proxy {proxyHostName}", "ProxyPasswordHelpText": "Musisz tylko wprowadzić nazwę użytkownika i hasło, jeśli jest to wymagane. W przeciwnym razie pozostaw je puste.", "ProxyUsernameHelpText": "Musisz tylko wprowadzić nazwę użytkownika i hasło, jeśli jest to wymagane. W przeciwnym razie pozostaw je puste.", "Queue": "Kolejka", @@ -268,8 +268,8 @@ "UnableToLoadTags": "Nie można załadować tagów", "UnsavedChanges": "Niezapisane zmiany", "UpdateAutomaticallyHelpText": "Automatycznie pobieraj i instaluj aktualizacje. Nadal będziesz mógł zainstalować z System: Updates", - "UpdateCheckStartupNotWritableMessage": "Nie można zainstalować aktualizacji, ponieważ użytkownik „{1}” nie ma prawa zapisu do folderu startowego „{0}”.", - "UpdateCheckStartupTranslocationMessage": "Nie można zainstalować aktualizacji, ponieważ folder startowy „{0}” znajduje się w folderze translokacji aplikacji.", + "UpdateStartupNotWritableHealthCheckMessage": "Nie można zainstalować aktualizacji, ponieważ użytkownik „{userName}” nie ma prawa zapisu do folderu startowego „{startupFolder}”.", + "UpdateStartupTranslocationHealthCheckMessage": "Nie można zainstalować aktualizacji, ponieważ folder startowy „{startupFolder}” znajduje się w folderze translokacji aplikacji.", "UpdateMechanismHelpText": "Użyj wbudowanego aktualizatora {appName} lub skryptu", "Updates": "Aktualizacje", "UpdateScriptPathHelpText": "Ścieżka do niestandardowego skryptu, który pobiera wyodrębniony pakiet aktualizacji i obsługuje pozostałą część procesu aktualizacji", @@ -302,7 +302,7 @@ "Columns": "Kolumny", "Host": "Gospodarz", "Indexers": "Indeksatory", - "IndexerStatusCheckAllClientMessage": "Wszystkie indeksatory są niedostępne z powodu błędów", + "IndexerStatusAllUnavailableHealthCheckMessage": "Wszystkie indeksatory są niedostępne z powodu błędów", "RestartNow": "Zrestartuj teraz", "Rss": "RSS", "Tasks": "Zadania", @@ -357,17 +357,17 @@ "DeleteSelectedIndexersMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?", "DownloadClientPriorityHelpText": "Nadaj priorytet wielu klientom pobierania. W przypadku klientów o tym samym priorytecie używane jest działanie okrężne.", "Track": "Ślad", - "UpdateAvailable": "Dostępna jest aktualizacja", + "UpdateAvailableHealthCheckMessage": "Dostępna jest aktualizacja", "Genre": "Gatunki", "ApplyChanges": "Zastosuj zmiany", - "ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {0} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny", + "ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {length} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny", "DeleteAppProfileMessageText": "Czy na pewno chcesz usunąć profil jakości '{0}'?", "ConnectionLostReconnect": "Radarr spróbuje połączyć się automatycznie lub możesz kliknąć przycisk przeładuj poniżej.", "RecentChanges": "Ostatnie zmiany", "WhatsNew": "Co nowego?", "ConnectionLostToBackend": "Radarr utracił połączenie z silnikiem programu, aby przywrócić funkcjonalność musi zostać zrestartowany.", "minutes": "Minuty", - "NotificationStatusSingleClientHealthCheckMessage": "Listy niedostępne z powodu błędów: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Listy niedostępne z powodu błędów: {notificationNames}", "AddConnection": "Edytuj kolekcję", "NotificationStatusAllClientHealthCheckMessage": "Wszystkie listy są niedostępne z powodu błędów", "AuthForm": "Formularze (strona logowania)", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 1bf752f1c..ca66b218a 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -55,9 +55,9 @@ "ReleaseBranchCheckOfficialBranchMessage": "A ramificação {0} não é uma ramificação de versões válida do {appName}, você não receberá atualizações", "Refresh": "Atualizar", "Queue": "Fila", - "ProxyCheckResolveIpMessage": "Não é possível resolver o Endereço IP para o Anfitrião de proxy {0} definido", - "ProxyCheckFailedToTestMessage": "Falha ao testar o proxy: {0}", - "ProxyCheckBadRequestMessage": "Falha ao testar o proxy. Código de estado: {0}", + "ProxyResolveIpHealthCheckMessage": "Não é possível resolver o Endereço IP para o Anfitrião de proxy {proxyHostName} definido", + "ProxyFailedToTestHealthCheckMessage": "Falha ao testar o proxy: {url}", + "ProxyBadRequestHealthCheckMessage": "Falha ao testar o proxy. Código de estado: {statusCode}", "Proxy": "Proxy", "Protocol": "Protocolo", "PendingChangesStayReview": "Ficar e rever mudanças", @@ -79,8 +79,8 @@ "Language": "Idioma", "KeyboardShortcuts": "Atalhos do teclado", "Info": "Informações", - "IndexerStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas: {0}", - "IndexerStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas", + "IndexerStatusUnavailableHealthCheckMessage": "Indexadores indisponíveis devido a falhas: {indexerNames}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Todos os indexadores estão indisponíveis devido a falhas", "Indexers": "Indexadores", "Indexer": "Indexador", "Host": "Anfitrião", @@ -100,8 +100,8 @@ "Events": "Eventos", "Error": "Erro", "Edit": "Editar", - "DownloadClientStatusCheckSingleClientMessage": "Clientes de transferências indisponíveis devido a falhas: {0}", - "DownloadClientStatusCheckAllClientMessage": "Todos os clientes de transferências estão indisponíveis devido a falhas", + "DownloadClientStatusSingleClientHealthCheckMessage": "Clientes de transferências indisponíveis devido a falhas: {downloadClientNames}", + "DownloadClientStatusAllClientHealthCheckMessage": "Todos os clientes de transferências estão indisponíveis devido a falhas", "DownloadClientsSettingsSummary": "Definições do cliente de transferências para integração à pesquisa da IU do {appName}", "DownloadClients": "Clientes de transferências", "DownloadClient": "Cliente de transferências", @@ -289,8 +289,8 @@ "IndexerRss": "RSS do indexador", "IndexerQuery": "Consulta do indexador", "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram actualizados: {0}. Remova-os e/ou adicione-os novamente ao {appName}", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a erros por mais de 6 horas: {0}", - "IndexerLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a erros por mais de 6 horas", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexadores indisponíveis devido a erros por mais de 6 horas: {indexerNames}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Todos os indexadores estão indisponíveis devido a erros por mais de 6 horas", "IndexerHealthCheckNoIndexers": "Não há indexadores activados, o {appName} não retornará resultados de pesquisa", "IndexerAuth": "Autenticação do indexador", "EnableRssHelpText": "Activar feed RSS para o indexador", @@ -408,7 +408,7 @@ "AddSyncProfile": "Adicionar Perfil de Sincronização", "AddApplication": "Adicionar Aplicação", "AddCustomFilter": "Adicionar Filtro customizado", - "ApiKeyValidationHealthCheckMessage": "Por favor, actualize a sua API Key para ter no minimo {0} caracteres. Pode fazer através das definições ou do ficheiro de configuração", + "ApiKeyValidationHealthCheckMessage": "Por favor, actualize a sua API Key para ter no minimo {length} caracteres. Pode fazer através das definições ou do ficheiro de configuração", "ApplicationURL": "URL da aplicação", "Genre": "Gêneros", "ThemeHelpText": "Alterar o tema da interface do usuário. O tema 'Auto' usará o tema do sistema operacional para definir o modo Claro ou Escuro. Inspirado por Theme.Park", @@ -431,7 +431,7 @@ "Season": "Temporada", "Theme": "Tema", "Track": "Rastreio", - "UpdateAvailable": "Nova atualização disponível", + "UpdateAvailableHealthCheckMessage": "Nova atualização disponível", "Label": "Rótulo", "ConnectionLostReconnect": "O {appName} tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.", "ConnectionLostToBackend": "O {appName} perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index f2895b59b..22f984bb0 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -23,7 +23,7 @@ "Analytics": "Análises", "AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do {appName}. Isso inclui informações sobre seu navegador, quais páginas da interface Web do {appName} você usa, relatórios de erros, e a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.", "ApiKey": "Chave da API", - "ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração", + "ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {length} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração", "AppDataDirectory": "Diretório AppData", "AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização", "AppProfileInUse": "Perfil de aplicativo em uso", @@ -123,8 +123,8 @@ "DownloadClient": "Cliente de download", "DownloadClientCategory": "Categoria de Download do Cliente", "DownloadClientSettings": "Configurações do cliente de download", - "DownloadClientStatusCheckAllClientMessage": "Todos os clientes de download estão indisponíveis devido a falhas", - "DownloadClientStatusCheckSingleClientMessage": "Clientes de download indisponíveis devido a falhas: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "Todos os clientes de download estão indisponíveis devido a falhas", + "DownloadClientStatusSingleClientHealthCheckMessage": "Clientes de download indisponíveis devido a falhas: {downloadClientNames}", "DownloadClients": "Clientes de download", "DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do usuário do {appName}", "Duration": "Duração", @@ -198,8 +198,8 @@ "IndexerFlags": "Sinalizadores do Indexador", "IndexerHealthCheckNoIndexers": "Não há indexadores habilitados, o {appName} não retornará resultados para a pesquisa", "IndexerInfo": "Info do Indexador", - "IndexerLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas por mais de 6 horas", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas por mais de 6 horas: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Todos os indexadores estão indisponíveis devido a falhas por mais de 6 horas", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexadores indisponíveis devido a falhas por mais de 6 horas: {indexerNames}", "IndexerName": "Nome do Indexador", "IndexerNoDefCheckMessage": "Os indexadores não têm definição e não funcionarão: {0}. Por favor, remova e (ou) adicione novamente ao {appName}", "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao {appName}", @@ -213,8 +213,8 @@ "IndexerRss": "RSS do indexador", "IndexerSettingsSummary": "Defina várias configurações globais do Indexador, incluindo Proxies.", "IndexerSite": "Site do Indexador", - "IndexerStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas", - "IndexerStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Todos os indexadores estão indisponíveis devido a falhas", + "IndexerStatusUnavailableHealthCheckMessage": "Indexadores indisponíveis devido a falhas: {indexerNames}", "IndexerTagsHelpText": "Use tags para especificar Proxies do indexador ou com quais aplicativos o indexador está sincronizado.", "IndexerVipExpiredHealthCheckMessage": "Benefícios VIP do Indexador expiraram: {indexerNames}", "IndexerVipExpiringHealthCheckMessage": "Os benefícios VIPS do Indexador expirarão em breve: {indexerNames}", @@ -311,9 +311,9 @@ "Proxies": "Proxies", "Proxy": "Proxy", "ProxyBypassFilterHelpText": "Use ',' como separador e '*.' como curinga para subdomínios", - "ProxyCheckBadRequestMessage": "Falha ao testar o proxy. Código de status: {0}", - "ProxyCheckFailedToTestMessage": "Falha ao testar o proxy: {0}", - "ProxyCheckResolveIpMessage": "Falha ao resolver o endereço IP do host de proxy configurado {0}", + "ProxyBadRequestHealthCheckMessage": "Falha ao testar o proxy. Código de status: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Falha ao testar o proxy: {url}", + "ProxyResolveIpHealthCheckMessage": "Falha ao resolver o endereço IP do host de proxy configurado {proxyHostName}", "ProxyPasswordHelpText": "Você só precisa digitar um nome de usuário e senha se for necessário. Caso contrário, deixe-os em branco.", "ProxyType": "Tipo de Proxy", "ProxyUsernameHelpText": "Você só precisa digitar um nome de usuário e senha se for necessário. Caso contrário, deixe-os em branco.", @@ -475,10 +475,10 @@ "UnsavedChanges": "Alterações Não Salvas", "UnselectAll": "Desmarcar tudo", "UpdateAutomaticallyHelpText": "Baixe e instale atualizações automaticamente. Você ainda poderá instalar a partir do Sistema: Atualizações", - "UpdateAvailable": "Nova atualização está disponível", - "UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.", - "UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.", - "UpdateCheckUINotWritableMessage": "Não é possível instalar a atualização porque a pasta de IU '{0}' não pode ser gravada pelo usuário '{1}'.", + "UpdateAvailableHealthCheckMessage": "Nova atualização está disponível", + "UpdateStartupNotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{startupFolder}' não pode ser gravada pelo usuário '{userName}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{startupFolder}' está em uma pasta de translocação de aplicativo.", + "UpdateUiNotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de IU '{uiFolder}' não pode ser gravada pelo usuário '{userName}'.", "UpdateMechanismHelpText": "Use o atualizador integrado do {appName} ou um script", "UpdateScriptPathHelpText": "Caminho para um script personalizado que usa um pacote de atualização extraído e lida com o restante do processo de atualização", "Updates": "Atualizações", @@ -554,7 +554,7 @@ "SearchQueries": "Consultas de pesquisa", "minutes": "minutos", "days": "dias", - "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {indexerNames}.", "DeleteAppProfileMessageText": "Tem certeza de que deseja excluir o perfil do aplicativo '{name}'?", "AppUpdated": "{appName} atualizado", "AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}", @@ -576,7 +576,7 @@ "EditIndexerImplementation": "Editar indexador - {implementationName}", "EditIndexerProxyImplementation": "Editar Proxy do Indexador - {implementationName}", "NotificationStatusAllClientHealthCheckMessage": "Todas as notificações estão indisponíveis devido a falhas", - "NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {notificationNames}", "AuthForm": "Formulário (página de login)", "AuthenticationMethod": "Método de autenticação", "AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index eba9f2f6e..b82262b31 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -19,7 +19,7 @@ "Added": "Adăugat", "Actions": "Acțiuni", "About": "Despre", - "IndexerStatusCheckAllClientMessage": "Niciun indexator nu este disponibil datorită erorilor", + "IndexerStatusAllUnavailableHealthCheckMessage": "Niciun indexator nu este disponibil datorită erorilor", "Indexers": "Indexatori", "Indexer": "Indexator", "Host": "Gazdă", @@ -37,8 +37,8 @@ "EventType": "Tip de eveniment", "Events": "Evenimente", "Edit": "Editează", - "DownloadClientStatusCheckSingleClientMessage": "Clienții de descărcare sunt indisponibili datorită erorilor: {0}", - "DownloadClientStatusCheckAllClientMessage": "Toți clienții de descărcare sunt indisponibili datorită erorilor", + "DownloadClientStatusSingleClientHealthCheckMessage": "Clienții de descărcare sunt indisponibili datorită erorilor: {downloadClientNames}", + "DownloadClientStatusAllClientHealthCheckMessage": "Toți clienții de descărcare sunt indisponibili datorită erorilor", "Peers": "Parteneri", "PageSize": "Mărimea Paginii", "Options": "Opțiuni", @@ -56,7 +56,7 @@ "Language": "Limbă", "KeyboardShortcuts": "Scurtături din tastatură", "Info": "Info", - "IndexerStatusCheckSingleClientMessage": "Indexatoare indisponibile datorită erorilor: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Indexatoare indisponibile datorită erorilor: {indexerNames}", "HealthNoIssues": "Nicio problemă de configurare", "Error": "Eroare", "ConnectionLost": "Conexiune Pierdută", @@ -66,17 +66,17 @@ "Cancel": "Anulează", "Apply": "Aplică", "Age": "Vechime", - "ProxyCheckResolveIpMessage": "Nu am putut găsi adresa IP pentru Hostul Proxy Configurat {0}", - "ProxyCheckFailedToTestMessage": "Nu am putut testa proxy: {0}", - "ProxyCheckBadRequestMessage": "Testul proxy a eșuat. StatusCode: {0}", + "ProxyResolveIpHealthCheckMessage": "Nu am putut găsi adresa IP pentru Hostul Proxy Configurat {proxyHostName}", + "ProxyFailedToTestHealthCheckMessage": "Nu am putut testa proxy: {url}", + "ProxyBadRequestHealthCheckMessage": "Testul proxy a eșuat. StatusCode: {statusCode}", "Proxy": "Proxy", "Protocol": "Protocol", "Warn": "Atenționare", "View": "Vizualizare", "Updates": "Actualizări", - "UpdateCheckUINotWritableMessage": "Nu pot instala actualizarea pentru că dosarul UI '{0}' nu poate fi scris de către utilizatorul '{1}'.", - "UpdateCheckStartupTranslocationMessage": "Nu pot instala actualizarea pentru că folderul de pornire '{0}' este într-un folder de App Translocation.", - "UpdateCheckStartupNotWritableMessage": "Nu pot instala actualizarea pentru că dosarul '{0}' nu poate fi scris de către utilizatorul '{1}'.", + "UpdateUiNotWritableHealthCheckMessage": "Nu pot instala actualizarea pentru că dosarul UI '{uiFolder}' nu poate fi scris de către utilizatorul '{userName}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Nu pot instala actualizarea pentru că folderul de pornire '{startupFolder}' este într-un folder de App Translocation.", + "UpdateStartupNotWritableHealthCheckMessage": "Nu pot instala actualizarea pentru că dosarul '{startupFolder}' nu poate fi scris de către utilizatorul '{userName}'.", "UnselectAll": "Deselectează tot", "UISettingsSummary": "Calendar, dată și setări pentru probleme de vedere", "UI": "Interfață Grafica", @@ -239,8 +239,8 @@ "HomePage": "Pagina principală", "Hostname": "Numele gazdei", "IgnoredAddresses": "Adrese ignorate", - "IndexerLongTermStatusCheckAllClientMessage": "Toți indexatorii sunt indisponibili datorită erorilor de mai mult de 6 ore", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexatori indisponibili datorită erorilor de mai mult de 6 ore: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Toți indexatorii sunt indisponibili datorită erorilor de mai mult de 6 ore", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexatori indisponibili datorită erorilor de mai mult de 6 ore: {indexerNames}", "IndexerPriority": "Prioritate indexator", "Mode": "Mod", "MovieIndexScrollTop": "Index film: Derulați sus", @@ -438,7 +438,7 @@ "RecentChanges": "Schimbări recente", "WhatsNew": "Ce mai e nou?", "DeleteAppProfileMessageText": "Sigur doriți să ștergeți profilul de aplicație '{0}'?", - "NotificationStatusSingleClientHealthCheckMessage": "Notificări indisponibile datorită erorilor: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Notificări indisponibile datorită erorilor: {notificationNames}", "AuthBasic": "Basic (fereastră pop-up browser)", "AuthForm": "Formulare (Pagina de autentificare)", "DisabledForLocalAddresses": "Dezactivat pentru adresele locale", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index c8475297d..40045e656 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -48,7 +48,7 @@ "Filename": "Имя файла", "Files": "Файлы", "Filter": "Фильтр", - "IndexerStatusCheckAllClientMessage": "Все индексаторы недоступны из-за ошибок", + "IndexerStatusAllUnavailableHealthCheckMessage": "Все индексаторы недоступны из-за ошибок", "LogLevel": "Уровень журнала", "LogLevelTraceHelpTextWarning": "Отслеживание журнала желательно включать только на короткое время", "Logs": "Журналы", @@ -88,7 +88,7 @@ "Ok": "Ok", "AddDownloadClient": "Добавить программу для скачивания", "UpdateMechanismHelpText": "Используйте встроенную в {appName} функцию обновления или скрипт", - "IndexerStatusCheckSingleClientMessage": "Индексаторы недоступны из-за ошибок: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Индексаторы недоступны из-за ошибок: {indexerNames}", "NoTagsHaveBeenAddedYet": "Теги еще не добавлены", "UnableToLoadTags": "Невозможно загрузить теги", "AnalyticsEnabledHelpText": "Отправлять в {appName} анонимную информацию об использовании и ошибках. Анонимная статистика включает в себя информацию о браузере, какие страницы веб-интерфейса {appName} загружены, сообщения об ошибках, а также операционной системе. Мы используем эту информацию для выявления ошибок, а также для разработки нового функционала.", @@ -128,8 +128,8 @@ "Donations": "Пожертвования", "DownloadClient": "Загрузчик", "DownloadClientSettings": "Настройки клиента скачиваний", - "DownloadClientStatusCheckAllClientMessage": "Все клиенты для скачивания недоступны из-за ошибок", - "DownloadClientStatusCheckSingleClientMessage": "Клиенты для скачивания недоступны из-за ошибок: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "Все клиенты для скачивания недоступны из-за ошибок", + "DownloadClientStatusSingleClientHealthCheckMessage": "Клиенты для скачивания недоступны из-за ошибок: {downloadClientNames}", "EnableAutomaticSearch": "Включить автоматический поиск", "EnableAutomaticSearchHelpText": "Будет использовано для автоматических поисков через интерфейс или {appName}", "Enabled": "Включено", @@ -153,8 +153,8 @@ "IgnoredAddresses": "Проигнорированные адреса", "IllRestartLater": "Перезапущу позднее", "IncludeHealthWarningsHelpText": "Включая предупреждения о здоровье", - "IndexerLongTermStatusCheckAllClientMessage": "Все индексаторы недоступны из-за ошибок за последние 6 часов", - "IndexerLongTermStatusCheckSingleClientMessage": "Все индексаторы недоступны из-за ошибок за последние 6 часов: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Все индексаторы недоступны из-за ошибок за последние 6 часов", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Все индексаторы недоступны из-за ошибок за последние 6 часов: {indexerNames}", "IndexerPriority": "Приоритет индексаторов", "IndexerPriorityHelpText": "Приоритет индексаторов от 1 (наивысший) до 50 (низший). По-умолчанию: 25.", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Все индексаторы недоступны из-за ошибок", @@ -177,9 +177,9 @@ "Protocol": "Протокол", "Proxy": "Прокси", "ProxyBypassFilterHelpText": "Используйте ',' в качестве разделителя и '*.' как подстановочный знак для поддоменов", - "ProxyCheckBadRequestMessage": "Не удалось проверить прокси. Код: {0}", - "ProxyCheckFailedToTestMessage": "Не удалось проверить прокси: {0}", - "ProxyCheckResolveIpMessage": "Не удалось преобразовать IP-адрес для настроенного прокси-хоста {0}", + "ProxyBadRequestHealthCheckMessage": "Не удалось проверить прокси. Код: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Не удалось проверить прокси: {url}", + "ProxyResolveIpHealthCheckMessage": "Не удалось преобразовать IP-адрес для настроенного прокси-хоста {proxyHostName}", "ProxyPasswordHelpText": "Нужно ввести имя пользователя и пароль только если они необходимы. В противном случае оставьте их пустыми.", "ProxyType": "Тип прокси", "ProxyUsernameHelpText": "Нужно ввести имя пользователя и пароль только если они необходимы. В противном случае оставьте их пустыми.", @@ -263,9 +263,9 @@ "UnsavedChanges": "Несохраненные изменения", "UnselectAll": "Снять все выделения", "UpdateAutomaticallyHelpText": "Автоматически загружать и устанавливать обновления. Вы так же можете установить в Система: Обновления", - "UpdateCheckStartupNotWritableMessage": "Невозможно установить обновление так как загрузочная папка '{0}' недоступна для записи для пользователя '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "Невозможно установить обновление так как загрузочная папка '{startupFolder}' недоступна для записи для пользователя '{userName}'.", "UpdateCheckStartupTranslocationMessage": "Не удается установить обновление, поскольку папка автозагрузки \"{0}\" находится в папке перемещения приложений.", - "UpdateCheckUINotWritableMessage": "Невозможно установить обновление так как UI папка '{0}' недоступна для записи для пользователя '{1}'.", + "UpdateUiNotWritableHealthCheckMessage": "Невозможно установить обновление так как UI папка '{uiFolder}' недоступна для записи для пользователя '{userName}'.", "UpdateScriptPathHelpText": "Путь к пользовательскому скрипту, который обрабатывает остатки после процесса обновления", "Uptime": "Время работы", "URLBase": "Базовый URL", @@ -363,7 +363,7 @@ "DeleteSelectedIndexersMessageText": "Вы уверены, что хотите удалить {count} выбранных индексатора?", "DownloadClientPriorityHelpText": "Установите приоритет нескольких клиентов загрузки. Круговой алгоритм используется для клиентов с таким же приоритетом.", "EditSelectedDownloadClients": "Редактировать выбранные клиенты загрузки", - "ApiKeyValidationHealthCheckMessage": "Пожалуйста, обновите свой ключ API, чтобы он был длиной не менее {0} символов. Вы можете сделать это через настройки или файл конфигурации", + "ApiKeyValidationHealthCheckMessage": "Пожалуйста, обновите свой ключ API, чтобы он был длиной не менее {length} символов. Вы можете сделать это через настройки или файл конфигурации", "Genre": "Жанры", "Theme": "Тема", "Year": "Год", @@ -372,7 +372,7 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Как применить теги к выбранным индексаторам", "ApplyTagsHelpTextReplace": "Заменить: заменить теги введенными тегами (оставьте поле пустым, чтобы удалить все теги)", "Track": "След", - "UpdateAvailable": "Доступно новое обновление", + "UpdateAvailableHealthCheckMessage": "Доступно новое обновление", "More": "Более", "Publisher": "Издатель", "ConnectionLostReconnect": "Radarr попытается соединиться автоматически или нажмите кнопку внизу.", @@ -393,14 +393,14 @@ "OnHealthRestoredHelpText": "При восстановлении работоспособности", "Implementation": "Реализация", "NoDownloadClientsFound": "Клиенты для загрузки не найдены", - "IndexerDownloadClientHealthCheckMessage": "Индексаторы с недопустимыми клиентами загрузки: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Индексаторы с недопустимыми клиентами загрузки: {indexerNames}.", "StopSelecting": "Прекратить выбор", "AddDownloadClientImplementation": "Добавить клиент загрузки - {implementationName}", "AddConnection": "Добавить подключение", "AddConnectionImplementation": "Добавить подключение - {implementationName}", "ManageDownloadClients": "Менеджер клиентов загрузки", "NotificationStatusAllClientHealthCheckMessage": "Все уведомления недоступны из-за сбоев", - "NotificationStatusSingleClientHealthCheckMessage": "Уведомления недоступны из-за сбоев: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Уведомления недоступны из-за сбоев: {notificationNames}", "AddIndexerImplementation": "Добавить индексатор - {implementationName}", "AddIndexerProxyImplementation": "Добавить индексатор - {implementationName}", "EditConnectionImplementation": "Добавить соединение - {implementationName}", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 20bd4781d..b505c2563 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -1,8 +1,8 @@ { "About": "Om", "Language": "Språk", - "IndexerStatusCheckSingleClientMessage": "Indexerare otillgängliga på grund av fel: {0}", - "IndexerStatusCheckAllClientMessage": "Samtliga indexerare otillgängliga på grund av fel", + "IndexerStatusUnavailableHealthCheckMessage": "Indexerare otillgängliga på grund av fel: {indexerNames}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Samtliga indexerare otillgängliga på grund av fel", "Indexers": "Indexerare", "Host": "Värd", "History": "Historik", @@ -14,8 +14,8 @@ "Files": "Filer", "Events": "Händelser", "Edit": "Ändra", - "DownloadClientStatusCheckSingleClientMessage": "Otillgängliga nedladdningsklienter på grund av misslyckade anslutningsförsök: {0}", - "DownloadClientStatusCheckAllClientMessage": "Samtliga nedladdningsklienter är otillgängliga på grund av misslyckade anslutningsförsök", + "DownloadClientStatusSingleClientHealthCheckMessage": "Otillgängliga nedladdningsklienter på grund av misslyckade anslutningsförsök: {downloadClientNames}", + "DownloadClientStatusAllClientHealthCheckMessage": "Samtliga nedladdningsklienter är otillgängliga på grund av misslyckade anslutningsförsök", "DownloadClients": "Nerladdningsklienter", "Delete": "Radera", "Dates": "Datum", @@ -34,9 +34,9 @@ "LogFiles": "Loggfiler", "View": "Vy", "Updates": "Uppdateringar", - "UpdateCheckUINotWritableMessage": "Ej möjligt att installera uppdatering då användargränssnittsmappen '{0}' inte är skrivbar för användaren '{1}'.", + "UpdateUiNotWritableHealthCheckMessage": "Ej möjligt att installera uppdatering då användargränssnittsmappen '{uiFolder}' inte är skrivbar för användaren '{userName}'.", "UpdateCheckStartupTranslocationMessage": "Ej möjligt att installera uppdatering då uppstartsmappen '{0}' är i en \"App translocation\"-mapp.", - "UpdateCheckStartupNotWritableMessage": "Ej möjligt att installera uppdatering då uppstartsmappen '{0}' inte är skrivbar för användaren '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "Ej möjligt att installera uppdatering då uppstartsmappen '{startupFolder}' inte är skrivbar för användaren '{userName}'.", "UnselectAll": "Avmarkera samtliga", "UISettingsSummary": "Datum, språk, och färgblindhetsinställningar", "UI": "Användargränssnitt", @@ -60,9 +60,9 @@ "ReleaseBranchCheckOfficialBranchMessage": "Gren {0} är inte en giltig gren av {appName}, du kommer ej erhålla uppdateringar", "Refresh": "Uppdatera", "Queue": "Kö", - "ProxyCheckResolveIpMessage": "Misslyckades att slå upp IP-adressen till konfigurerad proxyvärd {0}", - "ProxyCheckFailedToTestMessage": "Test av proxy misslyckades: {0}", - "ProxyCheckBadRequestMessage": "Test av proxy misslyckades. Statuskod: {0}", + "ProxyResolveIpHealthCheckMessage": "Misslyckades att slå upp IP-adressen till konfigurerad proxyvärd {proxyHostName}", + "ProxyFailedToTestHealthCheckMessage": "Test av proxy misslyckades: {url}", + "ProxyBadRequestHealthCheckMessage": "Test av proxy misslyckades. Statuskod: {statusCode}", "Proxy": "Proxy", "Protocol": "Protokoll", "LastWriteTime": "Senast skriven tid", @@ -241,8 +241,8 @@ "Grabs": "Hämta", "IgnoredAddresses": "Ignorerade adresser", "IllRestartLater": "Jag startar om senare", - "IndexerLongTermStatusCheckAllClientMessage": "Alla indexerare är inte tillgängliga på grund av fel i mer än 6 timmar", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexatorer är inte tillgängliga på grund av misslyckanden i mer än sex timmar: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Alla indexerare är inte tillgängliga på grund av fel i mer än 6 timmar", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexatorer är inte tillgängliga på grund av misslyckanden i mer än sex timmar: {indexerNames}", "IndexerPriorityHelpText": "Indexeringsprioritet från 1 (högst) till 50 (lägst). Standard: 25.", "InteractiveSearch": "Interaktiv sökning", "Interval": "Intervall", @@ -431,7 +431,7 @@ "RecentChanges": "Senaste ändringar", "WhatsNew": "Vad är nytt?", "minutes": "Minuter", - "NotificationStatusSingleClientHealthCheckMessage": "Listor otillgängliga på grund av fel: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Listor otillgängliga på grund av fel: {notificationNames}", "NotificationStatusAllClientHealthCheckMessage": "Samtliga listor otillgängliga på grund av fel", "AuthBasic": "Grundläggande (Browser Popup)", "AuthForm": "Blanketter (inloggningssida)", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 8f7870554..45e49f7a6 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -35,7 +35,7 @@ "PendingChangesDiscardChanges": "ยกเลิกการเปลี่ยนแปลงและออก", "PendingChangesMessage": "คุณยังไม่ได้บันทึกการเปลี่ยนแปลงแน่ใจไหมว่าต้องการออกจากหน้านี้", "PendingChangesStayReview": "อยู่และตรวจสอบการเปลี่ยนแปลง", - "ProxyCheckFailedToTestMessage": "ไม่สามารถทดสอบพร็อกซี: {0}", + "ProxyFailedToTestHealthCheckMessage": "ไม่สามารถทดสอบพร็อกซี: {url}", "ProxyPasswordHelpText": "คุณจะต้องป้อนชื่อผู้ใช้และรหัสผ่านหากจำเป็นเท่านั้น เว้นว่างไว้เป็นอย่างอื่น", "ShowAdvanced": "แสดงขั้นสูง", "ShowSearch": "แสดงการค้นหา", @@ -149,8 +149,8 @@ "DownloadClient": "ดาวน์โหลดไคลเอนต์", "DownloadClients": "ดาวน์โหลดไคลเอนต์", "DownloadClientSettings": "ดาวน์โหลด Client Settings", - "DownloadClientStatusCheckAllClientMessage": "ไคลเอนต์ดาวน์โหลดทั้งหมดไม่สามารถใช้งานได้เนื่องจากความล้มเหลว", - "DownloadClientStatusCheckSingleClientMessage": "ดาวน์โหลดไคลเอ็นต์ไม่ได้เนื่องจากความล้มเหลว: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "ไคลเอนต์ดาวน์โหลดทั้งหมดไม่สามารถใช้งานได้เนื่องจากความล้มเหลว", + "DownloadClientStatusSingleClientHealthCheckMessage": "ดาวน์โหลดไคลเอ็นต์ไม่ได้เนื่องจากความล้มเหลว: {downloadClientNames}", "Edit": "แก้ไข", "EditIndexer": "แก้ไข Indexer", "Enable": "เปิดใช้งาน", @@ -174,12 +174,12 @@ "IllRestartLater": "ฉันจะรีสตาร์ทในภายหลัง", "Indexer": "Indexer", "IndexerFlags": "ดัชนีดัชนี", - "IndexerLongTermStatusCheckAllClientMessage": "ตัวจัดทำดัชนีทั้งหมดไม่สามารถใช้งานได้เนื่องจากความล้มเหลวเป็นเวลานานกว่า 6 ชั่วโมง", - "IndexerLongTermStatusCheckSingleClientMessage": "ดัชนีไม่พร้อมใช้งานเนื่องจากความล้มเหลวเป็นเวลานานกว่า 6 ชั่วโมง: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "ตัวจัดทำดัชนีทั้งหมดไม่สามารถใช้งานได้เนื่องจากความล้มเหลวเป็นเวลานานกว่า 6 ชั่วโมง", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "ดัชนีไม่พร้อมใช้งานเนื่องจากความล้มเหลวเป็นเวลานานกว่า 6 ชั่วโมง: {indexerNames}", "IndexerPriority": "ลำดับความสำคัญของ Indexer", "IndexerPriorityHelpText": "ลำดับความสำคัญของดัชนีจาก 1 (สูงสุด) ถึง 50 (ต่ำสุด) ค่าเริ่มต้น: 25.", - "IndexerStatusCheckAllClientMessage": "ตัวทำดัชนีทั้งหมดไม่พร้อมใช้งานเนื่องจากความล้มเหลว", - "IndexerStatusCheckSingleClientMessage": "ตัวจัดทำดัชนีไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "ตัวทำดัชนีทั้งหมดไม่พร้อมใช้งานเนื่องจากความล้มเหลว", + "IndexerStatusUnavailableHealthCheckMessage": "ตัวจัดทำดัชนีไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {indexerNames}", "MIA": "MIA", "NoBackupsAreAvailable": "ไม่มีการสำรองข้อมูล", "NoChange": "ไม่มีการเปลี่ยนแปลง", @@ -195,7 +195,7 @@ "Protocol": "มาตรการ", "Proxy": "พร็อกซี", "ProxyBypassFilterHelpText": "ใช้ \",\" เป็นตัวคั่นและ \"*.\" เป็นสัญลักษณ์แทนสำหรับโดเมนย่อย", - "ProxyCheckBadRequestMessage": "ไม่สามารถทดสอบพร็อกซี StatusCode: {0}", + "ProxyBadRequestHealthCheckMessage": "ไม่สามารถทดสอบพร็อกซี StatusCode: {statusCode}", "Restore": "คืนค่า", "RestoreBackup": "คืนค่าการสำรองข้อมูล", "Retention": "การเก็บรักษา", @@ -250,7 +250,7 @@ "DeleteNotificationMessageText": "แน่ใจไหมว่าต้องการลบการแจ้งเตือน \"{0}\"", "DeleteTag": "ลบแท็ก", "EnableSSL": "เปิดใช้งาน SSL", - "ProxyCheckResolveIpMessage": "ไม่สามารถแก้ไขที่อยู่ IP สำหรับโฮสต์พร็อกซีที่กำหนดค่าไว้ {0}", + "ProxyResolveIpHealthCheckMessage": "ไม่สามารถแก้ไขที่อยู่ IP สำหรับโฮสต์พร็อกซีที่กำหนดค่าไว้ {proxyHostName}", "ProxyType": "ประเภทพร็อกซี", "Cancel": "ยกเลิก", "NoLogFiles": "ไม่มีไฟล์บันทึก", @@ -350,7 +350,7 @@ "WhatsNew": "มีอะไรใหม่", "RecentChanges": "การเปลี่ยนแปลงล่าสุด", "NotificationStatusAllClientHealthCheckMessage": "รายการทั้งหมดไม่พร้อมใช้งานเนื่องจากความล้มเหลว", - "NotificationStatusSingleClientHealthCheckMessage": "รายการไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "รายการไม่พร้อมใช้งานเนื่องจากความล้มเหลว: {notificationNames}", "AuthBasic": "พื้นฐาน (เบราว์เซอร์ป๊อปอัพ)", "AuthForm": "แบบฟอร์ม (หน้าเข้าสู่ระบบ)", "DisabledForLocalAddresses": "ปิดใช้งานสำหรับที่อยู่ท้องถิ่น", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 30cc2a16c..cd41a3225 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -9,9 +9,9 @@ "Sort": "Çeşitle", "SetTags": "Etiketleri Ayarla", "Scheduled": "Tarifeli", - "ProxyCheckResolveIpMessage": "{0} Yapılandırılmış Proxy Ana Bilgisayarının IP Adresi çözülemedi", - "ProxyCheckFailedToTestMessage": "Proxy ile test edilemedi: {0}", - "ProxyCheckBadRequestMessage": "Proxy ile test edilemedi. DurumKodu: {0}", + "ProxyResolveIpHealthCheckMessage": "{proxyHostName} Yapılandırılmış Proxy Ana Bilgisayarının IP Adresi çözülemedi", + "ProxyFailedToTestHealthCheckMessage": "Proxy ile test edilemedi: {url}", + "ProxyBadRequestHealthCheckMessage": "Proxy ile test edilemedi. DurumKodu: {statusCode}", "Proxy": "Proxy", "Logging": "Logging", "LogFiles": "Log dosyaları", @@ -25,9 +25,9 @@ "About": "Hakkında", "View": "Görünüm", "Updates": "Güncellemeler", - "UpdateCheckUINotWritableMessage": "'{0}' UI klasörü '{1}' kullanıcısı tarafından yazılamadığından güncelleme yüklenemiyor.", - "UpdateCheckStartupTranslocationMessage": "Başlangıç klasörü '{0}' bir Uygulama Yer Değiştirme klasöründe olduğu için güncelleme yüklenemiyor.", - "UpdateCheckStartupNotWritableMessage": "'{0}' başlangıç klasörü '{1}' kullanıcısı tarafından yazılamadığından güncelleme yüklenemiyor.", + "UpdateUiNotWritableHealthCheckMessage": "'{uiFolder}' UI klasörü '{userName}' kullanıcısı tarafından yazılamadığından güncelleme yüklenemiyor.", + "UpdateStartupTranslocationHealthCheckMessage": "Başlangıç klasörü '{startupFolder}' bir Uygulama Yer Değiştirme klasöründe olduğu için güncelleme yüklenemiyor.", + "UpdateStartupNotWritableHealthCheckMessage": "'{startupFolder}' başlangıç klasörü '{userName}' kullanıcısı tarafından yazılamadığından güncelleme yüklenemiyor.", "UnselectAll": "Tüm Seçimleri Kaldır", "UISettingsSummary": "Takvim, tarih ve renk engelli seçenekler", "UI": "UI", @@ -183,12 +183,12 @@ "IllRestartLater": "Daha sonra yeniden başlayacağım", "IncludeHealthWarningsHelpText": "Sağlık Uyarılarını Dahil Et", "IndexerFlags": "Dizin Oluşturucu Bayrakları", - "IndexerLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm dizinleyiciler kullanılamıyor", - "IndexerLongTermStatusCheckSingleClientMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "6 saatten uzun süren arızalar nedeniyle tüm dizinleyiciler kullanılamıyor", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {indexerNames}", "IndexerPriority": "Dizin Oluşturucu Önceliği", "IndexerPriorityHelpText": "1 (En Yüksek) ila 50 (En Düşük) arasında Dizin Oluşturucu Önceliği. Varsayılan: 25.", - "IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", - "IndexerStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", + "IndexerStatusUnavailableHealthCheckMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {indexerNames}", "Info": "Bilgi", "InteractiveSearch": "Etkileşimli Arama", "KeyboardShortcuts": "Klavye kısayolları", @@ -253,11 +253,11 @@ "AddingTag": "Etiket ekleniyor", "CouldNotConnectSignalR": "SignalR'ye bağlanılamadı, kullanıcı arayüzü güncellenmeyecek", "Custom": "Özel", - "DownloadClientStatusCheckSingleClientMessage": "Hatalar nedeniyle indirilemeyen istemciler: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle indirilemeyen istemciler: {downloadClientNames}", "Enabled": "Etkin", "IgnoredAddresses": "Yoksayılan Adresler", "Indexer": "Dizin oluşturucu", - "DownloadClientStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indirme istemcileri kullanılamıyor", + "DownloadClientStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm indirme istemcileri kullanılamıyor", "EditIndexer": "Dizinleyiciyi Düzenle", "Enable": "etkinleştirme", "EnableInteractiveSearch": "Etkileşimli Aramayı Etkinleştir", @@ -350,7 +350,7 @@ "WhatsNew": "Ne var ne yok?", "ConnectionLostReconnect": "{appName} otomatik bağlanmayı deneyecek veya aşağıda yeniden yükle seçeneğini işaretleyebilirsiniz.", "NotificationStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", - "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {notificationNames}", "Applications": "Uygulamalar", "AuthBasic": "Temel (Tarayıcı Açılır Penceresi)", "AuthForm": "Formlar (Giriş Sayfası)", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 3194b0fab..979e4f3bb 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -83,7 +83,7 @@ "URLBase": "URL-адреса", "DownloadClients": "Клієнти завантажувачів", "DownloadClientSettings": "Налаштування клієнта завантажувача", - "DownloadClientStatusCheckSingleClientMessage": "Завантаження клієнтів недоступне через помилки: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Завантаження клієнтів недоступне через помилки: {downloadClientNames}", "Edit": "Редагувати", "EditIndexer": "Редагувати індексатор", "Docker": "Docker", @@ -108,8 +108,8 @@ "PackageVersion": "Версія пакета", "Protocol": "Протокол", "Proxy": "Проксі", - "ProxyCheckFailedToTestMessage": "Не вдалося перевірити проксі: {0}", - "ProxyCheckResolveIpMessage": "Не вдалося визначити IP-адресу для налаштованого проксі-сервера {0}", + "ProxyFailedToTestHealthCheckMessage": "Не вдалося перевірити проксі: {url}", + "ProxyResolveIpHealthCheckMessage": "Не вдалося визначити IP-адресу для налаштованого проксі-сервера {proxyHostName}", "ProxyType": "Тип проксі", "ProxyUsernameHelpText": "Вам потрібно лише ввести ім’я користувача та пароль, якщо вони потрібні. В іншому випадку залиште їх порожніми.", "Reset": "Скинути", @@ -134,7 +134,7 @@ "HomePage": "Домашня сторінка", "Hostname": "Ім'я хоста", "DeleteNotification": "Видалити сповіщення", - "IndexerStatusCheckSingleClientMessage": "Індексатори недоступні через помилки: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Індексатори недоступні через помилки: {indexerNames}", "Info": "Інформація", "InstanceNameHelpText": "Ім’я екземпляра на вкладці та ім’я програми Syslog", "InteractiveSearch": "Інтерактивний пошук", @@ -230,7 +230,7 @@ "NoBackupsAreAvailable": "Немає резервних копій", "NoLinks": "Немає посилань", "OpenThisModal": "Відкрийте цей модальний вікно", - "ProxyCheckBadRequestMessage": "Не вдалося перевірити проксі. Код стану: {0}", + "ProxyBadRequestHealthCheckMessage": "Не вдалося перевірити проксі. Код стану: {statusCode}", "ReleaseStatus": "Статус випуску", "Refresh": "Оновити", "RefreshMovie": "Оновити фільм", @@ -252,9 +252,9 @@ "Indexers": "Індексатори", "HealthNoIssues": "Немає проблем із вашою конфігурацією", "IndexerFlags": "Прапори індексатора", - "IndexerLongTermStatusCheckAllClientMessage": "Усі індексатори недоступні через збої більше 6 годин", - "IndexerLongTermStatusCheckSingleClientMessage": "Індексатори недоступні через збої більше 6 годин: {0}", - "IndexerStatusCheckAllClientMessage": "Усі індексатори недоступні через збої", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Усі індексатори недоступні через збої більше 6 годин", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Індексатори недоступні через збої більше 6 годин: {indexerNames}", + "IndexerStatusAllUnavailableHealthCheckMessage": "Усі індексатори недоступні через збої", "LastExecution": "Останнє виконання", "LogFiles": "Файли журналів", "LogLevelTraceHelpTextWarning": "Журнал трасування слід увімкнути лише тимчасово", @@ -279,7 +279,7 @@ "Discord": "Discord", "DownloadClient": "Клієнт завантажувача", "Donations": "Пожертви", - "DownloadClientStatusCheckAllClientMessage": "Усі клієнти завантаження недоступні через збої", + "DownloadClientStatusAllClientHealthCheckMessage": "Усі клієнти завантаження недоступні через збої", "Enable": "Увімкнути", "Filename": "Ім'я файлу", "Host": "Хост", @@ -353,7 +353,7 @@ "More": "Більше", "Track": "Трасувати", "Year": "Рік", - "UpdateAvailable": "Доступне нове оновлення", + "UpdateAvailableHealthCheckMessage": "Доступне нове оновлення", "Genre": "Жанри", "ConnectionLostReconnect": "Radarr спробує підключитися автоматично, або ви можете натиснути перезавантажити нижче.", "ConnectionLostToBackend": "Radarr втратив зв’язок із бекендом, і його потрібно перезавантажити, щоб відновити функціональність.", @@ -362,7 +362,7 @@ "minutes": "Хвилин", "WhatsNew": "Що нового?", "NotificationStatusAllClientHealthCheckMessage": "Усі списки недоступні через помилки", - "NotificationStatusSingleClientHealthCheckMessage": "Списки недоступні через помилки: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Списки недоступні через помилки: {notificationNames}", "AuthBasic": "Основний (спливаюче вікно браузера)", "AuthForm": "Форми (сторінка входу)", "DisabledForLocalAddresses": "Відключено для локальних адрес", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index d0294de21..294d7cbe3 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -35,8 +35,8 @@ "Priority": "Sự ưu tiên", "Protocol": "Giao thức", "ProxyBypassFilterHelpText": "Sử dụng ',' làm dấu phân tách và '*.' làm ký tự đại diện cho các miền phụ", - "ProxyCheckFailedToTestMessage": "Không thể kiểm tra proxy: {0}", - "ProxyCheckResolveIpMessage": "Không thể phân giải Địa chỉ IP cho Máy chủ Proxy đã Định cấu hình {0}", + "ProxyFailedToTestHealthCheckMessage": "Không thể kiểm tra proxy: {url}", + "ProxyResolveIpHealthCheckMessage": "Không thể phân giải Địa chỉ IP cho Máy chủ Proxy đã Định cấu hình {proxyHostName}", "ProxyPasswordHelpText": "Bạn chỉ cần nhập tên người dùng và mật khẩu nếu được yêu cầu. Nếu không, hãy để trống chúng.", "ProxyType": "Loại proxy", "ProxyUsernameHelpText": "Bạn chỉ cần nhập tên người dùng và mật khẩu nếu được yêu cầu. Nếu không, hãy để trống chúng.", @@ -78,7 +78,7 @@ "Torrent": "Torrents", "UnableToAddANewIndexerPleaseTryAgain": "Không thể thêm trình chỉ mục mới, vui lòng thử lại.", "UpdateAutomaticallyHelpText": "Tự động tải xuống và cài đặt các bản cập nhật. Bạn vẫn có thể cài đặt từ Hệ thống: Cập nhật", - "UpdateCheckStartupNotWritableMessage": "Không thể cài đặt bản cập nhật vì người dùng '{0}' không thể ghi thư mục khởi động '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "Không thể cài đặt bản cập nhật vì người dùng '{startupFolder}' không thể ghi thư mục khởi động '{userName}'.", "Backups": "Sao lưu", "BeforeUpdate": "Trước khi cập nhật", "CertificateValidationHelpText": "Thay đổi cách xác thực chứng chỉ HTTPS nghiêm ngặt", @@ -93,8 +93,8 @@ "Analytics": "phân tích", "Automatic": "Tự động", "DownloadClientSettings": "Tải xuống cài đặt ứng dụng khách", - "DownloadClientStatusCheckAllClientMessage": "Tất cả các ứng dụng khách tải xuống không khả dụng do lỗi", - "DownloadClientStatusCheckSingleClientMessage": "Ứng dụng khách tải xuống không khả dụng do lỗi: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "Tất cả các ứng dụng khách tải xuống không khả dụng do lỗi", + "DownloadClientStatusSingleClientHealthCheckMessage": "Ứng dụng khách tải xuống không khả dụng do lỗi: {downloadClientNames}", "Edit": "Biên tập", "EditIndexer": "Chỉnh sửa trình lập chỉ mục", "Enabled": "Đã bật", @@ -122,7 +122,7 @@ "Authentication": "Xác thực", "Backup": "Sao lưu", "DeleteTagMessageText": "Bạn có chắc chắn muốn xóa thẻ '{0}' không?", - "IndexerLongTermStatusCheckSingleClientMessage": "Trình lập chỉ mục không khả dụng do lỗi trong hơn 6 giờ: {0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Trình lập chỉ mục không khả dụng do lỗi trong hơn 6 giờ: {indexerNames}", "IndexerPriority": "Mức độ ưu tiên của người lập chỉ mục", "KeyboardShortcuts": "Các phím tắt bàn phím", "Language": "Ngôn ngữ", @@ -138,7 +138,7 @@ "Mechanism": "Cơ chế", "MIA": "MIA", "New": "Mới", - "ProxyCheckBadRequestMessage": "Không thể kiểm tra proxy. Mã trạng thái: {0}", + "ProxyBadRequestHealthCheckMessage": "Không thể kiểm tra proxy. Mã trạng thái: {statusCode}", "BackupRetentionHelpText": "Các bản sao lưu tự động cũ hơn khoảng thời gian lưu giữ sẽ tự động được dọn dẹp", "BindAddress": "Địa chỉ ràng buộc", "BranchUpdate": "Nhánh sử dụng để cập nhật {appName}", @@ -185,7 +185,7 @@ "PortNumber": "Số cổng", "Proxy": "Ủy quyền", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Tất cả các trình lập chỉ mục không khả dụng do lỗi", - "IndexerStatusCheckAllClientMessage": "Tất cả các trình lập chỉ mục không khả dụng do lỗi", + "IndexerStatusAllUnavailableHealthCheckMessage": "Tất cả các trình lập chỉ mục không khả dụng do lỗi", "Info": "Thông tin", "MoreInfo": "Thêm thông tin", "MovieIndexScrollBottom": "Mục lục phim: Cuộn dưới cùng", @@ -223,8 +223,8 @@ "UnableToLoadUISettings": "Không thể tải cài đặt giao diện người dùng", "UnsavedChanges": "Các thay đổi chưa được lưu", "UnselectAll": "Bỏ chọn tất cả", - "UpdateCheckStartupTranslocationMessage": "Không thể cài đặt bản cập nhật vì thư mục khởi động '{0}' nằm trong thư mục Chuyển vị ứng dụng.", - "UpdateCheckUINotWritableMessage": "Không thể cài đặt bản cập nhật vì thư mục giao diện người dùng '{0}' không thể ghi bởi người dùng '{1}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Không thể cài đặt bản cập nhật vì thư mục khởi động '{startupFolder}' nằm trong thư mục Chuyển vị ứng dụng.", + "UpdateUiNotWritableHealthCheckMessage": "Không thể cài đặt bản cập nhật vì thư mục giao diện người dùng '{uiFolder}' không thể ghi bởi người dùng '{userName}'.", "UseProxy": "Sử dụng Proxy", "Wiki": "Wiki", "YesCancel": "Có, Hủy bỏ", @@ -297,9 +297,9 @@ "GeneralSettings": "Cài đặt chung", "Indexer": "Người lập chỉ mục", "IndexerFlags": "Cờ chỉ mục", - "IndexerLongTermStatusCheckAllClientMessage": "Tất cả các trình lập chỉ mục không khả dụng do lỗi trong hơn 6 giờ", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Tất cả các trình lập chỉ mục không khả dụng do lỗi trong hơn 6 giờ", "IndexerPriorityHelpText": "Mức độ ưu tiên của người lập chỉ mục từ 1 (Cao nhất) đến 50 (Thấp nhất). Mặc định: 25.", - "IndexerStatusCheckSingleClientMessage": "Trình lập chỉ mục không khả dụng do lỗi: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Trình lập chỉ mục không khả dụng do lỗi: {indexerNames}", "Interval": "Khoảng thời gian", "RefreshMovie": "Làm mới phim", "System": "Hệ thống", @@ -348,7 +348,7 @@ "ConnectionLostReconnect": "Radarr sẽ cố gắng kết nối tự động hoặc bạn có thể nhấp vào tải lại bên dưới.", "WhatsNew": "Có gì mới?", "NotificationStatusAllClientHealthCheckMessage": "Tất cả danh sách không có sẵn do lỗi", - "NotificationStatusSingleClientHealthCheckMessage": "Danh sách không có sẵn do lỗi: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Danh sách không có sẵn do lỗi: {notificationNames}", "AuthBasic": "Cơ bản (Cửa sổ bật lên trình duyệt)", "AuthForm": "Biểu mẫu (Trang đăng nhập)", "DisabledForLocalAddresses": "Bị vô hiệu hóa đối với địa chỉ địa phương", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index efada1129..3d5092bc9 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -22,7 +22,7 @@ "Analytics": "分析", "AnalyticsEnabledHelpText": "将匿名使用情况和错误信息发送到{appName}的服务器。这包括有关您的浏览器的信息、您使用的{appName} WebUI页面、错误报告以及操作系统和运行时版本。我们将使用此信息来确定功能和错误修复的优先级。", "ApiKey": "接口密钥 (API Key)", - "ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{0}个字符长。您可以通过设置或配置文件执行此操作", + "ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{length}个字符长。您可以通过设置或配置文件执行此操作", "AppDataDirectory": "AppData目录", "AppDataLocationHealthCheckMessage": "正在更新期间的 AppData 不会被更新删除", "AppProfileInUse": "正在使用的应用程序配置文件", @@ -122,8 +122,8 @@ "DownloadClient": "下载客户端", "DownloadClientCategory": "下载客户端分类", "DownloadClientSettings": "下载客户端设置", - "DownloadClientStatusCheckAllClientMessage": "所有下载客户端都不可用", - "DownloadClientStatusCheckSingleClientMessage": "所有下载客户端都不可用: {0}", + "DownloadClientStatusAllClientHealthCheckMessage": "所有下载客户端都不可用", + "DownloadClientStatusSingleClientHealthCheckMessage": "所有下载客户端都不可用: {downloadClientNames}", "DownloadClients": "下载客户端", "DownloadClientsSettingsSummary": "下载客户端配置以集成到 {appName} UI 搜索中", "Duration": "时长", @@ -197,8 +197,8 @@ "IndexerFlags": "搜刮器标记", "IndexerHealthCheckNoIndexers": "未启用任何搜刮器,{appName}将不会返回搜索结果", "IndexerInfo": "索引器信息", - "IndexerLongTermStatusCheckAllClientMessage": "由于故障超过6小时,所有搜刮器均不可用", - "IndexerLongTermStatusCheckSingleClientMessage": "由于故障6小时,下列搜刮器都已不可用:{0}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "由于故障超过6小时,所有搜刮器均不可用", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "由于故障6小时,下列搜刮器都已不可用:{indexerNames}", "IndexerName": "‎索引‎‎名字‎", "IndexerNoDefCheckMessage": "索引器没有定义,将无法工作: {0}. 请删除或重新添加到{appName}", "IndexerObsoleteCheckMessage": "搜刮器已过弃用或已更新:{0}。请将其删除和(或)重新添加到 {appName}", @@ -212,8 +212,8 @@ "IndexerRss": "搜刮器RSS", "IndexerSettingsSummary": "配置全局索引器设置,包括代理。", "IndexerSite": "‎索引‎‎网站‎", - "IndexerStatusCheckAllClientMessage": "所有搜刮器都因错误不可用", - "IndexerStatusCheckSingleClientMessage": "搜刮器因错误不可用:{0}", + "IndexerStatusAllUnavailableHealthCheckMessage": "所有搜刮器都因错误不可用", + "IndexerStatusUnavailableHealthCheckMessage": "搜刮器因错误不可用:{indexerNames}", "IndexerTagsHelpText": "使用标签来指定索引器代理或索引器同步到哪些应用程序。", "IndexerVipExpiredHealthCheckMessage": "索引器VIP特权已过期:{indexerNames}", "IndexerVipExpiringHealthCheckMessage": "索引器VIP特权即将过期:{indexerNames}", @@ -308,9 +308,9 @@ "Proxies": "代理", "Proxy": "代理", "ProxyBypassFilterHelpText": "使用“ , ”作为分隔符,和“ *. ”作为二级域名的通配符", - "ProxyCheckBadRequestMessage": "测试代理失败。状态码:{0}", - "ProxyCheckFailedToTestMessage": "测试代理失败: {0}", - "ProxyCheckResolveIpMessage": "无法解析已设置的代理服务器主机{0}的IP地址", + "ProxyBadRequestHealthCheckMessage": "测试代理失败。状态码:{statusCode}", + "ProxyFailedToTestHealthCheckMessage": "测试代理失败: {url}", + "ProxyResolveIpHealthCheckMessage": "无法解析已设置的代理服务器主机{proxyHostName}的IP地址", "ProxyPasswordHelpText": "如果需要,您只需要输入用户名和密码,否则就让它们为空。", "ProxyType": "代理类型", "ProxyUsernameHelpText": "如果需要,您只需要输入用户名和密码。否则就让它们为空。", @@ -464,10 +464,10 @@ "UnsavedChanges": "未保存更改", "UnselectAll": "取消选择全部", "UpdateAutomaticallyHelpText": "自动下载并安装更新。你还可以在“系统:更新”中安装", - "UpdateAvailable": "有新的更新可用", - "UpdateCheckStartupNotWritableMessage": "无法安装更新,因为用户“{1}”对于启动文件夹“{0}”没有写入权限。", - "UpdateCheckStartupTranslocationMessage": "无法安装更新,因为启动文件夹“{0}”在一个应用程序迁移文件夹。Cannot install update because startup folder '{0}' is in an App Translocation folder.", - "UpdateCheckUINotWritableMessage": "无法安装升级,因为用户“{1}”不可写入界面文件夹“{0}”。", + "UpdateAvailableHealthCheckMessage": "有新的更新可用", + "UpdateStartupNotWritableHealthCheckMessage": "无法安装更新,因为用户“{userName}”对于启动文件夹“{startupFolder}”没有写入权限。", + "UpdateStartupTranslocationHealthCheckMessage": "无法安装更新,因为启动文件夹“{0}”在一个应用程序迁移文件夹。Cannot install update because startup folder '{startupFolder}' is in an App Translocation folder.", + "UpdateUiNotWritableHealthCheckMessage": "无法安装升级,因为用户“{userName}”不可写入界面文件夹“{uiFolder}”。", "UpdateMechanismHelpText": "使用 {appName} 内置的更新程序或脚本", "UpdateScriptPathHelpText": "自定义脚本的路径,该脚本处理获取的更新包并处理更新过程的其余部分", "Updates": "更新", @@ -580,7 +580,7 @@ "External": "外部的", "None": "无", "ResetAPIKeyMessageText": "您确定要重置您的 API 密钥吗?", - "IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{0}。", + "IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{indexerNames}。", "ApplicationTagsHelpTextWarning": "标签应该谨慎使用,它们可能会产生意想不到的效果。带有标签的应用程序只会与具有相同标签的索引器同步。", "EditCategory": "编辑分类", "IndexerHistoryLoadError": "加载索引器历史记录出错", diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index d012d6ea4..f83513498 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -73,7 +73,7 @@ "Rss": "RSS", "Season": "季", "Theme": "主題", - "ApiKeyValidationHealthCheckMessage": "請將您的API金鑰更新為至少{0}個字元長。您可以通過設定或配置文件進行此操作。", + "ApiKeyValidationHealthCheckMessage": "請將您的API金鑰更新為至少{length}個字元長。您可以通過設定或配置文件進行此操作。", "AppDataLocationHealthCheckMessage": "為了避免在更新過程中刪除AppData,將無法進行更新。", "AuthenticationMethodHelpText": "需要使用者名稱和密碼來存取Radarr", "Backup": "備份", From e09df2fff385bee5ae162d124883183b878912ce Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 31 Mar 2024 12:12:06 +0000 Subject: [PATCH 521/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 115 +++++++++++++++++++- 1 file changed, 112 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 5978550d1..28313faf2 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -423,14 +423,14 @@ "External": "Externo", "None": "Ninguno", "ResetAPIKeyMessageText": "¿Estás seguro que quieres restablecer tu clave API?", - "EditIndexerProxyImplementation": "Editar Proxy de Indexador - { implementationName}", + "EditIndexerProxyImplementation": "Editar proxy de indexador - {implementationName}", "AppUpdated": "{appName} Actualizado", "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName}", "AddApplicationImplementation": "Agregar aplicación - {implementationName}", "AddConnectionImplementation": "Añadir Conexión - {implementationName}", "AddIndexerImplementation": "Agregar Indexador - {implementationName}", "AddIndexerProxyImplementation": "Agregar Proxy de Indexador - { implementationName}", - "EditApplicationImplementation": "Editar Aplicación - { implementationName}", + "EditApplicationImplementation": "Editar aplicación - {implementationName}", "EditConnectionImplementation": "Editar Conexión - {implementationName}", "AddDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", "AuthenticationMethod": "Método de autenticación", @@ -638,5 +638,114 @@ "DownloadClientFreeboxSettingsAppIdHelpText": "ID de la app dada cuando se crea acceso a la API de Freebox (esto es 'app_id')", "DownloadClientFloodSettingsTagsHelpText": "Etiquetas iniciales de una descarga. Para ser reconocida, una descarga debe tener todas las etiquetas iniciales. Esto evita conflictos con descargas no relacionadas.", "DownloadClientFloodSettingsUrlBaseHelpText": "Añade un prefijo a la API de Flood, como {url}", - "DownloadClientFreeboxSettingsAppTokenHelpText": "Token de la app recuperado cuando se crea acceso a la API de Freebox (esto es 'app_token')" + "DownloadClientFreeboxSettingsAppTokenHelpText": "Token de la app recuperado cuando se crea acceso a la API de Freebox (esto es 'app_token')", + "ProwlarrDownloadClientsAlert": "Si intentas hacer búsquedas directamente dentro de {appName}, necesitas añadir clientes de descarga. De otro modo, no necesitas añadirlos aquí. Para búsquedas desde tus aplicaciones, los clientes de descarga configurados serán usados en su lugar.", + "ProwlarrDownloadClientsInAppOnlyAlert": "Los clientes de descarga son solo para búsquedas internas en {appName} y no sincronizan a las aplicaciones. No hay planes para añadir cualquier funcionalidad.", + "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extensión a usar para enlaces magnet, predeterminado a '.magnet'", + "DownloadClientRTorrentSettingsUrlPath": "Ruta de url", + "IndexerHDBitsSettingsOrigins": "Orígenes", + "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent asociado con la cookie usada desde el navegador", + "IndexerSettingsSeedRatioHelpText": "El ratio que un torrent debería alcanzar antes de detenerse, vacío usa el predeterminado del cliente de descarga. El ratio debería ser al menos 1.0 y seguir las reglas de los indexadores", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronizar rechazo de hashes de torrents en la lista de bloqueo mientras se captura", + "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Debes tener permisos de usuario y de torrents", + "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Busca lanzamientos por nombres de grupo", + "IndexerHDBitsSettingsOriginsHelpText": "Si no se especifica, se usarán todas las opciones.", + "IndexerIPTorrentsSettingsCookieUserAgent": "Cookie de User-Agent", + "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Excluye lanzamientos de ESCENA de los resultados", + "IndexerAlphaRatioSettingsExcludeScene": "Excluir ESCENA", + "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Buscar solo lanzamientos freeleech", + "IndexerBeyondHDSettingsLimitedOnly": "Solo limitados", + "IndexerBeyondHDSettingsRewindOnlyHelpText": "Buscar solo rebobinados", + "IndexerBeyondHDSettingsRssKeyHelpText": "Clave RSS del sitio (encontrada en Mi seguridad => Clave RSS)", + "IndexerBeyondHDSettingsSearchTypes": "Tipos de búsqueda", + "IndexerGazelleGamesSettingsSearchGroupNames": "Buscar nombres de grupo", + "IndexerHDBitsSettingsCodecsHelpText": "Si no se especifica, se usarán todas las opciones.", + "IndexerHDBitsSettingsMediumsHelpText": "Si no se especifica, se usarán todas las opciones.", + "IndexerHDBitsSettingsUseFilenames": "Usar nombres de archivo", + "IndexerHDBitsSettingsUseFilenamesHelpText": "Señala esta opción si quieres usar nombres de archivo como títulos de lanzamiento", + "IndexerHDBitsSettingsUsernameHelpText": "Usuario del sitio", + "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Buscar solo lanzamientos freeleech", + "IndexerNewznabSettingsAdditionalParametersHelpText": "Parámetros adicionales de Newznab", + "IndexerNewznabSettingsApiKeyHelpText": "Clave API del sitio", + "IndexerNzbIndexSettingsApiKeyHelpText": "Clave API del sitio", + "IndexerPassThePopcornSettingsApiUserHelpText": "Estas opciones se encuentran en tus opciones de seguridad de PassThePopcorn (Editar perfil > Seguridad).", + "IndexerPassThePopcornSettingsApiKeyHelpText": "Clave API del sitio", + "IndexerRedactedSettingsApiKeyHelpText": "Clave API del sitio (encontrada en Opciones => Opciones de acceso)", + "IndexerSettingsAdditionalParameters": "Parámetros adicionales", + "IndexerSettingsApiPathHelpText": "Ruta a la API, usualmente {url}", + "IndexerSettingsApiUser": "Usuario de API", + "IndexerSettingsAppsMinimumSeeders": "Semillas mínimas de las aplicaciones", + "IndexerSettingsBaseUrlHelpText": "Selecciona qué url base usará {appName} para las peticiones al sitio", + "IndexerSettingsCookie": "Cookie", + "IndexerSettingsRssKey": "Clave RSS", + "IndexerSettingsSeedRatio": "Ratio de sembrado", + "IndexerSettingsSeedTimeHelpText": "El tiempo que un torrent debería ser compartido antes de detenerse, vació usa el predeterminado del cliente de descarga", + "IndexerMTeamTpSettingsApiKeyHelpText": "Clave API del sitio (encontrada en Panel de control de usuario => Seguridad => Laboratorio)", + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Buscar solo lanzamientos freeleech", + "Menu": "Menú", + "Mixed": "Mezclado", + "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Descarga primero las primeras y últimas piezas (qBittorrent 4.1.0+)", + "DownloadClientQbittorrentSettingsFirstAndLastFirst": "Primeras y últimas primero", + "DownloadClientQbittorrentSettingsInitialStateHelpText": "Estado inicial para los torrents añadidos a qBittorrent. Ten en cuenta que Forzar torrents no cumple las restricciones de semilla", + "DownloadClientRTorrentSettingsAddStopped": "Añadir detenido", + "DownloadClientRTorrentSettingsAddStoppedHelpText": "Permite añadir torrents y magnets a rTorrent en estado detenido. Esto puede romper los archivos magnet.", + "DownloadClientQbittorrentSettingsUseSslHelpText": "Usa una conexión segura. Ver en Opciones -> Interfaz web -> 'Usar HTTPS en lugar de HTTP' en qbittorrent.", + "DownloadClientRTorrentSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación predeterminada de rTorrent", + "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Categoría devuelta por defecto si no existe ninguna categoría mapeada para un lanzamiento. Añadir una categoría específica a {appName} evita conflictos con descargas no relacionadas con {appName}. Usar una categoría es opcional, pero bastante recomendado. Crea un subdirectorio [categoría] en el directorio de salida.", + "DownloadClientSettingsAddPaused": "Añadir pausado", + "DownloadClientSettingsPriorityItemHelpText": "Prioridad a usar cuando se capturen elementos", + "DownloadClientSettingsInitialStateHelpText": "Estado inicial para torrents añadidos a {clientName}", + "DownloadClientSettingsUseSslHelpText": "Usa una conexión segura cuando haya una conexión a {clientName}", + "DownloadClientTransmissionSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación predeterminada de Transmission", + "DownloadClientSettingsUrlBaseHelpText": "Añade un prefijo a la url {clientName}, como {url}", + "IndexerBeyondHDSettingsApiKeyHelpText": "Clave API del sitio (encontrada en Mi seguridad => Clave API)", + "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Buscar solo lanzamientos freeleech", + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Buscar solo freeleech (UL limitada)", + "IndexerFileListSettingsFreeleechOnlyHelpText": "Buscar solo lanzamientos freeleech", + "IndexerFileListSettingsPasskeyHelpText": "Clave de acceso del sitio (esto es la cadena alfanumérica en la url del tracket mostrada en tu cliente de descarga)", + "IndexerFileListSettingsUsernameHelpText": "Usuario del sitio", + "IndexerHDBitsSettingsMediums": "Medios", + "IndexerHDBitsSettingsCodecs": "Códecs", + "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Mostrar solo lanzamientos freeleech", + "IndexerNebulanceSettingsApiKeyHelpText": "Clave API de Opciones de usuario > Claves API. La clave debe tener permisos de lista y descarga", + "IndexerNewznabSettingsVipExpirationHelpText": "Introduce la fecha (yyyy-mm-dd) para Expiración VIP o en blanco, {appName} notificará a una semana de la expiración del VIP", + "IndexerOrpheusSettingsApiKeyHelpText": "Clave API del sitio (encontrada en Opciones => Opciones de acceso)", + "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Buscar solo lanzamientos freeleech", + "IndexerSettingsApiPath": "Ruta de API", + "IndexerSettingsBaseUrl": "Url base", + "IndexerSettingsPackSeedTime": "Tiempo de sembrado de pack", + "IndexerSettingsLimitsUnit": "Unidad de límites", + "IndexerSettingsQueryLimit": "Límite de petición", + "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Clave API del sitio", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent es bloqueado por un hash puede no ser rechazado apropiadamente durante Buscar/RSS para algunos indexadores, habilitar esto permitirá que sea rechazado después de que el torrent sea capturado, pero antes es enviado al cliente.", + "IndexerSettingsAppsMinimumSeedersHelpText": "Semillas mínimas requeridas por las aplicaciones para que el indexador capture, dejar vacío usa el predeterminado de Sincronización de perfil", + "DownloadClientSettingsDefaultCategoryHelpText": "Categoría devuelta por defecto si no existe ninguna categoría mapeada para un lanzamiento. Añadir una categoría específica a {appName} evita conflictos con descargas no relacionadas con {appName}. Usar una categoría es opcional, pero bastante recomendado.", + "IndexerSettingsGrabLimitHelpText": "El número de capturas máximas especificadas por la unidad respectiva que {appName} permitirá al sitio", + "IndexerSettingsLimitsUnitHelpText": "La unidad o tiempo para límites de recuento por indexador", + "IndexerSettingsPackSeedTimeIndexerHelpText": "El tiempo en que un pack de torrent (temporada o discografía) debería ser compartido antes de detenerse, vacío usa el predeterminado de la aplicación", + "DownloadClientPneumaticSettingsNzbFolder": "Carpeta de Nzb", + "DownloadClientTransmissionSettingsUrlBaseHelpText": "Añade un prefijo a la url rpc de {clientName}, p. ej. {url}, predeterminado a '{defaultUrl}'", + "DownloadClientPneumaticSettingsNzbFolderHelpText": "Esta carpeta necesitará ser alcanzable desde XBMC", + "DownloadClientPneumaticSettingsStrmFolder": "Carpeta de Strm", + "DownloadClientPneumaticSettingsStrmFolderHelpText": "Los archivos .strm en esta carpeta será importados por drone", + "DownloadClientQbittorrentSettingsSequentialOrder": "Orden secuencial", + "DownloadClientFreeboxSettingsHostHelpText": "Nombre de host o dirección IP de host del Freebox, predeterminado a '{url}' (solo funcionará en la misma red)", + "DownloadClientFreeboxSettingsPortHelpText": "Puerto usado para acceder a la interfaz de Freebox, predeterminado a '{port}'", + "DownloadClientNzbgetSettingsAddPausedHelpText": "Esta opción requiere al menos NzbGet versión 16.0", + "DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Descarga en orden secuencial (qBittorrent 4.1.0+)", + "DownloadClientRTorrentSettingsUrlPathHelpText": "Ruta al endpoint de XMLRPC, ver {url}. Esto es usualmente RPC2 o [ruta a ruTorrent]{url2} cuando se usa ruTorrent.", + "DownloadClientSettingsDestinationHelpText": "Especifica manualmente el destino de descarga, dejar en blanco para usar el predeterminado", + "DownloadClientSettingsInitialState": "Estado inicial", + "IndexerBeyondHDSettingsRefundOnly": "Solo devueltos", + "IndexerBeyondHDSettingsRefundOnlyHelpText": "Buscar solo devueltos", + "IndexerBeyondHDSettingsRewindOnly": "Solo rebobinados", + "IndexerBeyondHDSettingsSearchTypesHelpText": "Selecciona los tipos de lanzamientos en los que estás interesado. Si no se selecciona ninguno, se usarán todas las opciones.", + "IndexerGazelleGamesSettingsApiKeyHelpText": "Clave API del sitio (encontrada en Opciones => Opciones de acceso)", + "IndexerSettingsGrabLimit": "Límite de captura", + "IndexerSettingsQueryLimitHelpText": "El número de peticiones máximas especificadas por la unidad respectiva que {appName} permitirá al sitio", + "IndexerSettingsSeedTime": "Tiempo de sembrado", + "IndexerSettingsCookieHelpText": "Cookie del sitio", + "IndexerSettingsFreeleechOnly": "Solo freeleech", + "IndexerSettingsVipExpiration": "Expiración del VIP", + "XmlRpcPath": "Ruta RPC de XML" } From 2a312d93ec494f9ce04d3e01e06aaa56fb90cba0 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 31 Mar 2024 23:25:54 +0000 Subject: [PATCH 522/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Jason54 Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/fr.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index f25b59a7d..5cbc8950b 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -587,7 +587,7 @@ "AddDownloadClientImplementation": "Ajouter un client de téléchargement - {implementationName}", "ManageDownloadClients": "Gérer les clients de téléchargement", "AuthenticationRequiredPasswordHelpTextWarning": "Saisir un nouveau mot de passe", - "IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {0].", + "IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {indexerNames}.", "AuthenticationMethod": "Méthode d'authentification", "AuthenticationMethodHelpTextWarning": "Veuillez choisir une méthode d'authentification valide", "ActiveIndexers": "Indexeurs actifs", @@ -745,5 +745,7 @@ "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Synchroniser le rejet des hachages torrent sur liste bloquée lors de la saisie", "ClickToChangeQueryOptions": "Cliquez pour modifier les options de la requête", "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.", - "ProwlarrDownloadClientsAlert": "Si vous avez l'intention d'effectuer des recherches directement dans {appName}, vous devez ajouter les clients de téléchargement. Sinon, vous n'avez pas besoin de les ajouter ici. Pour les recherches à partir de vos applications, les clients de téléchargement qui y sont configurés sont utilisés à la place." + "ProwlarrDownloadClientsAlert": "Si vous avez l'intention d'effectuer des recherches directement dans {appName}, vous devez ajouter les clients de téléchargement. Sinon, vous n'avez pas besoin de les ajouter ici. Pour les recherches à partir de vos applications, les clients de téléchargement qui y sont configurés sont utilisés à la place.", + "IndexerMTeamTpSettingsApiKeyHelpText": "Clé API du site (trouvée dans le panneau de configuration utilisateur => Sécurité => Laboratoire)", + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Rechercher uniquement les versions freeleech" } From c80262d75b01e9c796de2461bf3c3ca5381f7bdb Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 1 Apr 2024 02:43:31 +0300 Subject: [PATCH 523/964] Translation fixes for health checks --- src/NzbDrone.Core/Localization/Core/ar.json | 4 ++-- src/NzbDrone.Core/Localization/Core/ca.json | 4 ++-- src/NzbDrone.Core/Localization/Core/da.json | 2 +- src/NzbDrone.Core/Localization/Core/el.json | 6 +++--- src/NzbDrone.Core/Localization/Core/es.json | 2 +- src/NzbDrone.Core/Localization/Core/fi.json | 6 +++--- src/NzbDrone.Core/Localization/Core/it.json | 2 +- src/NzbDrone.Core/Localization/Core/pt.json | 6 +++--- src/NzbDrone.Core/Localization/Core/ru.json | 2 +- src/NzbDrone.Core/Localization/Core/sv.json | 2 +- src/NzbDrone.Core/Localization/Core/th.json | 6 +++--- src/NzbDrone.Core/Localization/Core/uk.json | 6 +++--- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index d20f582f3..acd6b0262 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -76,7 +76,7 @@ "EnableInteractiveSearch": "تمكين البحث التفاعلي", "Source": "مصدر", "SSLCertPassword": "كلمة مرور شهادة SSL", - "UpdateCheckStartupNotWritableMessage": "لا يمكن تثبيت التحديث لأن مجلد بدء التشغيل \"{0}\" غير قابل للكتابة بواسطة المستخدم \"{1}\".", + "UpdateStartupNotWritableHealthCheckMessage": "لا يمكن تثبيت التحديث لأن مجلد بدء التشغيل \"{startupFolder}\" غير قابل للكتابة بواسطة المستخدم \"{userName}\".", "UpdateMechanismHelpText": "استخدم المحدث أو البرنامج النصي المدمج في {appName}", "AppDataDirectory": "دليل AppData", "ConnectSettings": "ربط الإعدادات", @@ -260,7 +260,7 @@ "DownloadClientsLoadError": "تعذر تحميل عملاء التنزيل", "UnableToLoadTags": "تعذر تحميل العلامات", "UnableToLoadUISettings": "تعذر تحميل إعدادات واجهة المستخدم", - "UpdateCheckStartupTranslocationMessage": "لا يمكن تثبيت التحديث لأن مجلد بدء التشغيل \"{0}\" موجود في مجلد App Translocation.", + "UpdateStartupTranslocationHealthCheckMessage": "لا يمكن تثبيت التحديث لأن مجلد بدء التشغيل \"{startupFolder}\" موجود في مجلد App Translocation.", "Updates": "التحديثات", "Version": "الإصدار", "ApiKey": "مفتاح API", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index d216eb60b..a47d19291 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -240,7 +240,7 @@ "IndexerPriority": "Prioritat de l'indexador", "UnsavedChanges": "Canvis no desats", "UpdateAutomaticallyHelpText": "Baixeu i instal·leu les actualitzacions automàticament. Encara podreu instal·lar des de Sistema: Actualitzacions", - "UpdateCheckStartupTranslocationMessage": "No es pot instal·lar l'actualització perquè la carpeta d'inici \"{0}\" es troba en una carpeta de translocació d'aplicacions.", + "UpdateStartupTranslocationHealthCheckMessage": "No es pot instal·lar l'actualització perquè la carpeta d'inici \"{startupFolder}\" es troba en una carpeta de translocació d'aplicacions.", "UpdateUiNotWritableHealthCheckMessage": "No es pot instal·lar l'actualització perquè l'usuari '{userName}' no pot escriure la carpeta de la IU '{uiFolder}'.", "UpdateScriptPathHelpText": "Camí a un script personalitzat que pren un paquet d'actualització i gestiona la resta del procés d'actualització", "Uptime": "Temps de funcionament", @@ -294,7 +294,7 @@ "UnableToAddANewNotificationPleaseTryAgain": "No es pot afegir una notificació nova, torneu-ho a provar.", "UnableToLoadGeneralSettings": "No es pot carregar la configuració general", "UnableToLoadHistory": "No es pot carregar l'historial", - "UpdateCheckStartupNotWritableMessage": "No es pot instal·lar l'actualització perquè l'usuari \"{1}\" no pot escriure la carpeta d'inici \"{0}\".", + "UpdateStartupNotWritableHealthCheckMessage": "No es pot instal·lar l'actualització perquè l'usuari \"{userName}\" no pot escriure la carpeta d'inici \"{startupFolder}\".", "URLBase": "Base URL", "Usenet": "Usenet", "View": "Visualitza", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 90be9e749..52f47b149 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -240,7 +240,7 @@ "UnselectAll": "Fravælg alle", "UpdateAutomaticallyHelpText": "Download og installer opdateringer automatisk. Du kan stadig installere fra System: Updates", "UpdateStartupNotWritableHealthCheckMessage": "Kan ikke installere opdatering, fordi startmappen '{startupFolder}' ikke kan skrives af brugeren '{userName}'.", - "UpdateCheckUINotWritableMessage": "Kan ikke installere opdatering, fordi brugergrænsefladen \"{0}\" ikke kan skrives af brugeren \"{1}\".", + "UpdateUiNotWritableHealthCheckMessage": "Kan ikke installere opdatering, fordi brugergrænsefladen \"{uiFolder}\" ikke kan skrives af brugeren \"{userName}\".", "UpdateScriptPathHelpText": "Sti til et brugerdefineret script, der tager en udpakket opdateringspakke og håndterer resten af opdateringsprocessen", "Uptime": "Oppetid", "URLBase": "URL-base", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 8f6e860b7..8bdfc6aca 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -45,7 +45,7 @@ "Indexer": "Ευρετήριο", "PendingChangesDiscardChanges": "Απορρίψτε τις αλλαγές και φύγετε", "ShowSearchHelpText": "Εμφάνιση κουμπιού αναζήτησης στο δείκτη", - "UpdateCheckStartupNotWritableMessage": "Δεν είναι δυνατή η εγκατάσταση της ενημέρωσης επειδή ο φάκελος εκκίνησης \"{0}\" δεν είναι εγγράψιμος από τον χρήστη \"{1}\".", + "UpdateStartupNotWritableHealthCheckMessage": "Δεν είναι δυνατή η εγκατάσταση της ενημέρωσης επειδή ο φάκελος εκκίνησης \"{startupFolder}\" δεν είναι εγγράψιμος από τον χρήστη \"{userName}\".", "BranchUpdateMechanism": "Υποκατάστημα που χρησιμοποιείται από εξωτερικό μηχανισμό ενημέρωσης", "Mode": "Τρόπος", "SettingsEnableColorImpairedMode": "Ενεργοποίηση λειτουργίας με προβλήματα χρώματος", @@ -113,7 +113,7 @@ "ProxyBypassFilterHelpText": "Χρησιμοποιήστε το \",\" ως διαχωριστικό και \"*.\" ως μπαλαντέρ για υποτομείς", "UnableToAddANewAppProfilePleaseTryAgain": "Δεν είναι δυνατή η προσθήκη ενός νέου προφίλ ποιότητας. Δοκιμάστε ξανά.", "UnableToLoadHistory": "Δεν είναι δυνατή η φόρτωση του ιστορικού", - "UpdateCheckUINotWritableMessage": "Δεν είναι δυνατή η εγκατάσταση της ενημέρωσης επειδή ο φάκελος διεπαφής χρήστη \"{0}\" δεν είναι εγγράψιμος από τον χρήστη \"{1}\".", + "UpdateUiNotWritableHealthCheckMessage": "Δεν είναι δυνατή η εγκατάσταση της ενημέρωσης επειδή ο φάκελος διεπαφής χρήστη \"{uiFolder}\" δεν είναι εγγράψιμος από τον χρήστη \"{userName}\".", "AuthenticationMethodHelpText": "Απαιτήστε όνομα χρήστη και κωδικό πρόσβασης για πρόσβαση στο {appName}", "Automatic": "Αυτόματο", "BeforeUpdate": "Πριν από την ενημέρωση", @@ -219,7 +219,7 @@ "UnableToLoadNotifications": "Δεν είναι δυνατή η φόρτωση ειδοποιήσεων", "UnableToLoadUISettings": "Δεν είναι δυνατή η φόρτωση των ρυθμίσεων διεπαφής χρήστη", "UnsavedChanges": "Μη αποθηκευμένες αλλαγές", - "UpdateCheckStartupTranslocationMessage": "Δεν είναι δυνατή η εγκατάσταση της ενημέρωσης επειδή ο φάκελος εκκίνησης \"{0}\" βρίσκεται σε ένα φάκελο \"Μετατόπιση εφαρμογών\".", + "UpdateStartupTranslocationHealthCheckMessage": "Δεν είναι δυνατή η εγκατάσταση της ενημέρωσης επειδή ο φάκελος εκκίνησης \"{startupFolder}\" βρίσκεται σε ένα φάκελο \"Μετατόπιση εφαρμογών\".", "UpdateScriptPathHelpText": "Διαδρομή σε ένα προσαρμοσμένο σενάριο που λαμβάνει ένα εξαγόμενο πακέτο ενημέρωσης και χειρίζεται το υπόλοιπο της διαδικασίας ενημέρωσης", "URLBase": "Βάση διεύθυνσης URL", "UrlBaseHelpText": "Για αντίστροφη υποστήριξη διακομιστή μεσολάβησης, η προεπιλογή είναι άδεια", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 28313faf2..e9dce31fd 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -29,7 +29,7 @@ "View": "Vista", "Updates": "Actualizaciones", "UpdateUiNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta UI '{uiFolder}' no tiene permisos de escritura para el usuario '{userName}'.", - "UpdateCheckStartupTranslocationMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' está en una carpeta de \"App Translocation\".", + "UpdateStartupTranslocationHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de arranque '{startupFolder}' está en una carpeta de \"App Translocation\".", "UpdateStartupNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de arranque '{startupFolder}' no tiene permisos de escritura para el usuario '{userName}'.", "UnselectAll": "Desmarcar todo", "UI": "UI", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 6dde0f610..93083bfef 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -51,15 +51,15 @@ "SettingsLongDateFormat": "Pitkän päiväyksen esitys", "SettingsShortDateFormat": "Lyhyen päiväyksen esitys", "UnselectAll": "Tyhjennä valinnat", - "UpdateCheckStartupTranslocationMessage": "Päivitystä ei voida asentaa, koska käynnistyskansio \"{0}\" sijaitsee \"App Translocation\" -kansiossa.", - "UpdateCheckUINotWritableMessage": "Päivityksen asennus ei onnistu, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käyttöliittymäkansioon \"{0}\".", + "UpdateStartupTranslocationHealthCheckMessage": "Päivitystä ei voida asentaa, koska käynnistyskansio \"{startupFolder}\" sijaitsee \"App Translocation\" -kansiossa.", + "UpdateUiNotWritableHealthCheckMessage": "Päivityksen asennus ei onnistu, koska käyttäjällä \"{userName}\" ei ole kirjoitusoikeutta käyttöliittymäkansioon \"{uiFolder}\".", "UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.", "Enable": "Käytä", "UI": "Käyttöliittymä", "Usenet": "Usenet", "BackupNow": "Varmuuskopioi nyt", "NoBackupsAreAvailable": "Varmuuskopioita ei ole käytettävissä", - "UpdateCheckStartupNotWritableMessage": "Päivitystä ei voida asentaa, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käynnistyskansioon \"{0}\".", + "UpdateStartupNotWritableHealthCheckMessage": "Päivitystä ei voida asentaa, koska käyttäjällä \"{userName}\" ei ole kirjoitusoikeutta käynnistyskansioon \"{startupFolder}\".", "Updates": "Päivitykset", "UpdateScriptPathHelpText": "Polku komentosarjaan, joka käsittelee puretun päivitystiedoston ja hoitaa asennuksen loppuosuuden.", "Uptime": "Käyttöaika", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 3414ccc55..b86cae50a 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -23,7 +23,7 @@ "Updates": "Aggiornamenti", "UpdateUiNotWritableHealthCheckMessage": "Impossibile installare l'aggiornamento perché l'utente '{userName}' non ha i permessi di scrittura per la cartella dell'interfaccia '{uiFolder}'.", "UpdateStartupNotWritableHealthCheckMessage": "Impossibile installare l'aggiornamento perché l'utente '{userName}' non ha i permessi di scrittura per la cartella di avvio '{startupFolder}'.", - "UpdateCheckStartupTranslocationMessage": "Impossibile installare l'aggiornamento perché la cartella '{0}' si trova in una cartella di \"App Translocation\".", + "UpdateStartupTranslocationHealthCheckMessage": "Impossibile installare l'aggiornamento perché la cartella '{startupFolder}' si trova in una cartella di \"App Translocation\".", "UI": "Interfaccia", "Tasks": "Attività", "Tags": "Etichette", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index ca66b218a..2cc6315d0 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -4,9 +4,9 @@ "Warn": "Avisar", "View": "Ver", "Updates": "Atualizações", - "UpdateCheckUINotWritableMessage": "Não é possível instalar a atualização porque a pasta da IU \"{0}\" não tem permissões de escrita para o utilizador \"{1}\".", - "UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de arranque \"{0}\" não tem permissões de escrita para o utilizador \"{1}\".", - "UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de arranque \"{0}\" está em uma pasta de transposição de aplicações.", + "UpdateUiNotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta da IU \"{uiFolder}\" não tem permissões de escrita para o utilizador \"{userName}\".", + "UpdateStartupNotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de arranque \"{startupFolder}\" não tem permissões de escrita para o utilizador \"{userName}\".", + "UpdateStartupTranslocationHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de arranque \"{startupFolder}\" está em uma pasta de transposição de aplicações.", "UnselectAll": "Desmarcar todos", "UnsavedChanges": "Mudanças não guardadas", "UISettingsSummary": "Opções de calendário, data e modo de daltonismo", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 40045e656..ffd403a5b 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -264,7 +264,7 @@ "UnselectAll": "Снять все выделения", "UpdateAutomaticallyHelpText": "Автоматически загружать и устанавливать обновления. Вы так же можете установить в Система: Обновления", "UpdateStartupNotWritableHealthCheckMessage": "Невозможно установить обновление так как загрузочная папка '{startupFolder}' недоступна для записи для пользователя '{userName}'.", - "UpdateCheckStartupTranslocationMessage": "Не удается установить обновление, поскольку папка автозагрузки \"{0}\" находится в папке перемещения приложений.", + "UpdateStartupTranslocationHealthCheckMessage": "Не удается установить обновление, поскольку папка автозагрузки \"{startupFolder}\" находится в папке перемещения приложений.", "UpdateUiNotWritableHealthCheckMessage": "Невозможно установить обновление так как UI папка '{uiFolder}' недоступна для записи для пользователя '{userName}'.", "UpdateScriptPathHelpText": "Путь к пользовательскому скрипту, который обрабатывает остатки после процесса обновления", "Uptime": "Время работы", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index b505c2563..d514a130d 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -35,7 +35,7 @@ "View": "Vy", "Updates": "Uppdateringar", "UpdateUiNotWritableHealthCheckMessage": "Ej möjligt att installera uppdatering då användargränssnittsmappen '{uiFolder}' inte är skrivbar för användaren '{userName}'.", - "UpdateCheckStartupTranslocationMessage": "Ej möjligt att installera uppdatering då uppstartsmappen '{0}' är i en \"App translocation\"-mapp.", + "UpdateStartupTranslocationHealthCheckMessage": "Ej möjligt att installera uppdatering då uppstartsmappen '{startupFolder}' är i en \"App translocation\"-mapp.", "UpdateStartupNotWritableHealthCheckMessage": "Ej möjligt att installera uppdatering då uppstartsmappen '{startupFolder}' inte är skrivbar för användaren '{userName}'.", "UnselectAll": "Avmarkera samtliga", "UISettingsSummary": "Datum, språk, och färgblindhetsinställningar", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 45e49f7a6..2eb817708 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -59,7 +59,7 @@ "UnableToAddANewIndexerPleaseTryAgain": "ไม่สามารถเพิ่มตัวสร้างดัชนีใหม่ได้โปรดลองอีกครั้ง", "UnableToAddANewIndexerProxyPleaseTryAgain": "ไม่สามารถเพิ่มตัวสร้างดัชนีใหม่ได้โปรดลองอีกครั้ง", "DownloadClientsLoadError": "ไม่สามารถโหลดไคลเอนต์ดาวน์โหลด", - "UpdateCheckUINotWritableMessage": "ไม่สามารถติดตั้งการอัปเดตเนื่องจากโฟลเดอร์ UI \"{0}\" ไม่สามารถเขียนได้โดยผู้ใช้ \"{1}\"", + "UpdateUiNotWritableHealthCheckMessage": "ไม่สามารถติดตั้งการอัปเดตเนื่องจากโฟลเดอร์ UI \"{uiFolder}\" ไม่สามารถเขียนได้โดยผู้ใช้ \"{userName}\"", "Updates": "อัปเดต", "UpdateScriptPathHelpText": "พา ธ ไปยังสคริปต์แบบกำหนดเองที่ใช้แพ็กเกจโปรแกรมปรับปรุงที่แยกออกมาและจัดการส่วนที่เหลือของกระบวนการอัพเดต", "AddDownloadClient": "เพิ่มไคลเอนต์ดาวน์โหลด", @@ -216,8 +216,8 @@ "UnsavedChanges": "การเปลี่ยนแปลงที่ไม่ได้บันทึก", "UnselectAll": "ไม่เลือกทั้งหมด", "UpdateAutomaticallyHelpText": "ดาวน์โหลดและติดตั้งการอัปเดตโดยอัตโนมัติ คุณจะยังติดตั้งได้จาก System: Updates", - "UpdateCheckStartupNotWritableMessage": "ไม่สามารถติดตั้งการอัปเดตเนื่องจากโฟลเดอร์เริ่มต้น \"{0}\" ไม่สามารถเขียนได้โดยผู้ใช้ \"{1}\"", - "UpdateCheckStartupTranslocationMessage": "ไม่สามารถติดตั้งการอัปเดตได้เนื่องจากโฟลเดอร์เริ่มต้น \"{0}\" อยู่ในโฟลเดอร์การแปลแอป", + "UpdateStartupNotWritableHealthCheckMessage": "ไม่สามารถติดตั้งการอัปเดตเนื่องจากโฟลเดอร์เริ่มต้น \"{startupFolder}\" ไม่สามารถเขียนได้โดยผู้ใช้ \"{userName}\"", + "UpdateStartupTranslocationHealthCheckMessage": "ไม่สามารถติดตั้งการอัปเดตได้เนื่องจากโฟลเดอร์เริ่มต้น \"{startupFolder}\" อยู่ในโฟลเดอร์การแปลแอป", "Uptime": "เวลาทำงาน", "URLBase": "ฐาน URL", "UrlBaseHelpText": "สำหรับการสนับสนุน reverse proxy ค่าเริ่มต้นจะว่างเปล่า", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 979e4f3bb..5789a3fb5 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -185,9 +185,9 @@ "UnableToLoadUISettings": "Не вдалося завантажити налаштування інтерфейсу користувача", "UnsavedChanges": "Незбережені зміни", "UnselectAll": "Скасувати вибір усіх", - "UpdateCheckStartupNotWritableMessage": "Неможливо встановити оновлення, оскільки папка запуску \"{0}\" не може бути записана користувачем \"{1}\".", - "UpdateCheckStartupTranslocationMessage": "Неможливо встановити оновлення, оскільки папка запуску \"{0}\" знаходиться в папці переміщення програми.", - "UpdateCheckUINotWritableMessage": "Неможливо встановити оновлення, оскільки папка інтерфейсу користувача \"{0}\" не може бути записана користувачем \"{1}\".", + "UpdateStartupNotWritableHealthCheckMessage": "Неможливо встановити оновлення, оскільки папка запуску \"{startupFolder}\" не може бути записана користувачем \"{userName}\".", + "UpdateStartupTranslocationHealthCheckMessage": "Неможливо встановити оновлення, оскільки папка запуску \"{startupFolder}\" знаходиться в папці переміщення програми.", + "UpdateUiNotWritableHealthCheckMessage": "Неможливо встановити оновлення, оскільки папка інтерфейсу користувача \"{uiFolder}\" не може бути записана користувачем \"{userName}\".", "Updates": "Оновлення", "UrlBaseHelpText": "Для підтримки зворотного проксі-сервера значення за умовчанням порожнє", "UseProxy": "Використовуйте проксі", From b2ef9d5b0a2d953e061d6ffc1e693972af9fe2fe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 1 Apr 2024 03:54:02 +0300 Subject: [PATCH 524/964] Fixed: Filter invalid releases without categories or size --- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index ab921a1a7..94752c7df 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -478,6 +478,20 @@ namespace NzbDrone.Core.Indexers return false; } + if (release.Size == null) + { + _logger.Warn("Invalid Release: '{0}' from indexer: {1}. No size provided.", release.Title, Definition.Name); + + return false; + } + + if (release.Categories == null || !release.Categories.Any()) + { + _logger.Warn("Invalid Release: '{0}' from indexer: {1}. No categories provided.", release.Title, Definition.Name); + + return false; + } + return true; } From 2f85de6b695e73cef61abf7acc46233c818806f0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 1 Apr 2024 04:37:13 +0300 Subject: [PATCH 525/964] Add capabilities to Newznab & Torznab tests --- .../NewznabTests/NewznabFixture.cs | 4 ++++ .../TorznabTests/TorznabFixture.cs | 21 ++++--------------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabFixture.cs index 231c4bb56..084767ffa 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabFixture.cs @@ -33,6 +33,10 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests }; _caps = new IndexerCapabilities(); + + _caps.Categories.AddCategoryMapping(2000, NewznabStandardCategory.Movies, "Movies"); + _caps.Categories.AddCategoryMapping(5000, NewznabStandardCategory.TV, "TV"); + Mocker.GetMock() .Setup(v => v.GetCapabilities(It.IsAny(), It.IsAny())) .Returns(_caps); diff --git a/src/NzbDrone.Core.Test/IndexerTests/TorznabTests/TorznabFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/TorznabTests/TorznabFixture.cs index e5a6f6c32..a5fdf0506 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/TorznabTests/TorznabFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/TorznabTests/TorznabFixture.cs @@ -37,6 +37,9 @@ namespace NzbDrone.Core.Test.IndexerTests.TorznabTests _caps.Categories.AddCategoryMapping(2000, NewznabStandardCategory.Movies, "Movies"); _caps.Categories.AddCategoryMapping(2040, NewznabStandardCategory.MoviesHD, "Movies/HD"); + _caps.Categories.AddCategoryMapping(5000, NewznabStandardCategory.TV, "TV"); + _caps.Categories.AddCategoryMapping(5040, NewznabStandardCategory.TVHD, "TV/HD"); + _caps.Categories.AddCategoryMapping(5070, NewznabStandardCategory.TVAnime, "TV/Anime"); Mocker.GetMock() .Setup(v => v.GetCapabilities(It.IsAny(), It.IsAny())) @@ -83,23 +86,7 @@ namespace NzbDrone.Core.Test.IndexerTests.TorznabTests var releases = (await Subject.Fetch(new MovieSearchCriteria())).Releases; - releases.Should().HaveCount(5); - - releases.First().Should().BeOfType(); - var releaseInfo = releases.First() as TorrentInfo; - - releaseInfo.Title.Should().Be("Series Title S05E02 HDTV x264-Xclusive [eztv]"); - releaseInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); - releaseInfo.MagnetUrl.Should().Be("magnet:?xt=urn:btih:9fb267cff5ae5603f07a347676ec3bf3e35f75e1&dn=Game+of+Thrones+S05E02+HDTV+x264-Xclusive+%5Beztv%5D&tr=udp:%2F%2Fopen.demonii.com:1337&tr=udp:%2F%2Ftracker.coppersurfer.tk:6969&tr=udp:%2F%2Ftracker.leechers-paradise.org:6969&tr=udp:%2F%2Fexodus.desync.com:6969"); - releaseInfo.DownloadUrl.Should().Be("magnet:?xt=urn:btih:9fb267cff5ae5603f07a347676ec3bf3e35f75e1&dn=Game+of+Thrones+S05E02+HDTV+x264-Xclusive+%5Beztv%5D&tr=udp:%2F%2Fopen.demonii.com:1337&tr=udp:%2F%2Ftracker.coppersurfer.tk:6969&tr=udp:%2F%2Ftracker.leechers-paradise.org:6969&tr=udp:%2F%2Fexodus.desync.com:6969"); - releaseInfo.InfoUrl.Should().Be("https://thepiratebay.se/torrent/11811366/Series_Title_S05E02_HDTV_x264-Xclusive_%5Beztv%5D"); - releaseInfo.CommentUrl.Should().Be("https://thepiratebay.se/torrent/11811366/Series_Title_S05E02_HDTV_x264-Xclusive_%5Beztv%5D"); - releaseInfo.Indexer.Should().Be(Subject.Definition.Name); - releaseInfo.PublishDate.Should().Be(DateTime.Parse("Sat, 11 Apr 2015 21:34:00 -0600").ToUniversalTime()); - releaseInfo.Size.Should().Be(388895872); - releaseInfo.InfoHash.Should().Be("9fb267cff5ae5603f07a347676ec3bf3e35f75e1"); - releaseInfo.Seeders.Should().Be(34128); - releaseInfo.Peers.Should().Be(36724); + releases.Should().HaveCount(0); } [Test] From 1b8f09f2ce7cfd65fb0120b0585ce0d7f1f0a17f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 1 Apr 2024 17:20:21 +0300 Subject: [PATCH 526/964] Fixed: Improve capabilities fetching for applications sync --- .../LazyLibrarian/LazyLibrarian.cs | 19 ++++++++----- .../Applications/Lidarr/Lidarr.cs | 23 +++++++++------- src/NzbDrone.Core/Applications/Mylar/Mylar.cs | 19 ++++++++----- .../Applications/Radarr/Radarr.cs | 23 +++++++++------- .../Applications/Readarr/Readarr.cs | 23 +++++++++------- .../Applications/Sonarr/Sonarr.cs | 27 +++++++++++-------- .../Applications/Whisparr/Whisparr.cs | 23 +++++++++------- .../IndexerSearch/ReleaseSearchService.cs | 6 ++--- 8 files changed, 99 insertions(+), 64 deletions(-) diff --git a/src/NzbDrone.Core/Applications/LazyLibrarian/LazyLibrarian.cs b/src/NzbDrone.Core/Applications/LazyLibrarian/LazyLibrarian.cs index 205bbe472..fcf2f0824 100644 --- a/src/NzbDrone.Core/Applications/LazyLibrarian/LazyLibrarian.cs +++ b/src/NzbDrone.Core/Applications/LazyLibrarian/LazyLibrarian.cs @@ -15,12 +15,14 @@ namespace NzbDrone.Core.Applications.LazyLibrarian private readonly ILazyLibrarianV1Proxy _lazyLibrarianV1Proxy; private readonly IConfigFileProvider _configFileProvider; + private readonly IIndexerFactory _indexerFactory; - public LazyLibrarian(ILazyLibrarianV1Proxy lazyLibrarianV1Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, Logger logger) + public LazyLibrarian(ILazyLibrarianV1Proxy lazyLibrarianV1Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, IIndexerFactory indexerFactory, Logger logger) : base(appIndexerMapService, logger) { _lazyLibrarianV1Proxy = lazyLibrarianV1Proxy; _configFileProvider = configFileProvider; + _indexerFactory = indexerFactory; } public override ValidationResult Test() @@ -65,7 +67,9 @@ namespace NzbDrone.Core.Applications.LazyLibrarian public override void AddIndexer(IndexerDefinition indexer) { - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); + + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) { _logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id); @@ -74,7 +78,7 @@ namespace NzbDrone.Core.Applications.LazyLibrarian _logger.Trace("Adding indexer {0} [{1}]", indexer.Name, indexer.Id); - var lazyLibrarianIndexer = BuildLazyLibrarianIndexer(indexer, indexer.Protocol); + var lazyLibrarianIndexer = BuildLazyLibrarianIndexer(indexer, indexerCapabilities, indexer.Protocol); var remoteIndexer = _lazyLibrarianV1Proxy.AddIndexer(lazyLibrarianIndexer, Settings); @@ -107,11 +111,12 @@ namespace NzbDrone.Core.Applications.LazyLibrarian { _logger.Debug("Updating indexer {0} [{1}]", indexer.Name, indexer.Id); + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); var appMappings = _appIndexerMapService.GetMappingsForApp(Definition.Id); var indexerMapping = appMappings.FirstOrDefault(m => m.IndexerId == indexer.Id); var indexerProps = indexerMapping.RemoteIndexerName.Split(","); - var lazyLibrarianIndexer = BuildLazyLibrarianIndexer(indexer, indexer.Protocol, indexerProps[1]); + var lazyLibrarianIndexer = BuildLazyLibrarianIndexer(indexer, indexerCapabilities, indexer.Protocol, indexerProps[1]); //Use the old remote id to find the indexer on LazyLibrarian incase the update was from a name change in Prowlarr var remoteIndexer = _lazyLibrarianV1Proxy.GetIndexer(indexerProps[1], lazyLibrarianIndexer.Type, Settings); @@ -133,7 +138,7 @@ namespace NzbDrone.Core.Applications.LazyLibrarian { _appIndexerMapService.Delete(indexerMapping.Id); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { _logger.Debug("Remote indexer not found, re-adding {0} [{1}] to LazyLibrarian", indexer.Name, indexer.Id); var newRemoteIndexer = _lazyLibrarianV1Proxy.AddIndexer(lazyLibrarianIndexer, Settings); @@ -146,7 +151,7 @@ namespace NzbDrone.Core.Applications.LazyLibrarian } } - private LazyLibrarianIndexer BuildLazyLibrarianIndexer(IndexerDefinition indexer, DownloadProtocol protocol, string originalName = null) + private LazyLibrarianIndexer BuildLazyLibrarianIndexer(IndexerDefinition indexer, IndexerCapabilities indexerCapabilities, DownloadProtocol protocol, string originalName = null) { var schema = protocol == DownloadProtocol.Usenet ? LazyLibrarianProviderType.Newznab : LazyLibrarianProviderType.Torznab; @@ -156,7 +161,7 @@ namespace NzbDrone.Core.Applications.LazyLibrarian Altername = $"{indexer.Name} (Prowlarr)", Host = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/api", Apikey = _configFileProvider.ApiKey, - Categories = string.Join(",", indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())), + Categories = string.Join(",", indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())), Enabled = indexer.Enable, Type = schema, Priority = indexer.Priority diff --git a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs index 37e40f282..80ae02319 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs @@ -21,13 +21,15 @@ namespace NzbDrone.Core.Applications.Lidarr private readonly ILidarrV1Proxy _lidarrV1Proxy; private readonly ICached> _schemaCache; private readonly IConfigFileProvider _configFileProvider; + private readonly IIndexerFactory _indexerFactory; - public Lidarr(ICacheManager cacheManager, ILidarrV1Proxy lidarrV1Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, Logger logger) + public Lidarr(ICacheManager cacheManager, ILidarrV1Proxy lidarrV1Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, IIndexerFactory indexerFactory, Logger logger) : base(appIndexerMapService, logger) { _schemaCache = cacheManager.GetCache>(GetType()); _lidarrV1Proxy = lidarrV1Proxy; _configFileProvider = configFileProvider; + _indexerFactory = indexerFactory; } public override ValidationResult Test() @@ -49,7 +51,7 @@ namespace NzbDrone.Core.Applications.Lidarr try { - failures.AddIfNotNull(_lidarrV1Proxy.TestConnection(BuildLidarrIndexer(testIndexer, DownloadProtocol.Usenet), Settings)); + failures.AddIfNotNull(_lidarrV1Proxy.TestConnection(BuildLidarrIndexer(testIndexer, testIndexer.Capabilities, DownloadProtocol.Usenet), Settings)); } catch (HttpException ex) { @@ -118,7 +120,9 @@ namespace NzbDrone.Core.Applications.Lidarr public override void AddIndexer(IndexerDefinition indexer) { - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); + + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) { _logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id); @@ -127,7 +131,7 @@ namespace NzbDrone.Core.Applications.Lidarr _logger.Trace("Adding indexer {0} [{1}]", indexer.Name, indexer.Id); - var lidarrIndexer = BuildLidarrIndexer(indexer, indexer.Protocol); + var lidarrIndexer = BuildLidarrIndexer(indexer, indexerCapabilities, indexer.Protocol); var remoteIndexer = _lidarrV1Proxy.AddIndexer(lidarrIndexer, Settings); @@ -159,10 +163,11 @@ namespace NzbDrone.Core.Applications.Lidarr { _logger.Debug("Updating indexer {0} [{1}]", indexer.Name, indexer.Id); + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); var appMappings = _appIndexerMapService.GetMappingsForApp(Definition.Id); var indexerMapping = appMappings.FirstOrDefault(m => m.IndexerId == indexer.Id); - var lidarrIndexer = BuildLidarrIndexer(indexer, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); + var lidarrIndexer = BuildLidarrIndexer(indexer, indexerCapabilities, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); var remoteIndexer = _lidarrV1Proxy.GetIndexer(indexerMapping.RemoteIndexerId, Settings); @@ -174,7 +179,7 @@ namespace NzbDrone.Core.Applications.Lidarr { _logger.Debug("Syncing remote indexer with current settings"); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { // Retain user fields not-affiliated with Prowlarr lidarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => lidarrIndexer.Fields.All(s => s.Name != f.Name))); @@ -200,7 +205,7 @@ namespace NzbDrone.Core.Applications.Lidarr { _appIndexerMapService.Delete(indexerMapping.Id); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { _logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Lidarr", indexer.Name, indexer.Id); lidarrIndexer.Id = 0; @@ -214,7 +219,7 @@ namespace NzbDrone.Core.Applications.Lidarr } } - private LidarrIndexer BuildLidarrIndexer(IndexerDefinition indexer, DownloadProtocol protocol, int id = 0) + private LidarrIndexer BuildLidarrIndexer(IndexerDefinition indexer, IndexerCapabilities indexerCapabilities, DownloadProtocol protocol, int id = 0) { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _lidarrV1Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); @@ -250,7 +255,7 @@ namespace NzbDrone.Core.Applications.Lidarr lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "baseUrl").Value = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/"; lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiPath").Value = "/api"; lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiKey").Value = _configFileProvider.ApiKey; - lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); + lidarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); if (indexer.Protocol == DownloadProtocol.Torrent) { diff --git a/src/NzbDrone.Core/Applications/Mylar/Mylar.cs b/src/NzbDrone.Core/Applications/Mylar/Mylar.cs index 245e38930..3724aaf1c 100644 --- a/src/NzbDrone.Core/Applications/Mylar/Mylar.cs +++ b/src/NzbDrone.Core/Applications/Mylar/Mylar.cs @@ -15,12 +15,14 @@ namespace NzbDrone.Core.Applications.Mylar private readonly IMylarV3Proxy _mylarV3Proxy; private readonly IConfigFileProvider _configFileProvider; + private readonly IIndexerFactory _indexerFactory; - public Mylar(IMylarV3Proxy mylarV3Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, Logger logger) + public Mylar(IMylarV3Proxy mylarV3Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, IIndexerFactory indexerFactory, Logger logger) : base(appIndexerMapService, logger) { _mylarV3Proxy = mylarV3Proxy; _configFileProvider = configFileProvider; + _indexerFactory = indexerFactory; } public override ValidationResult Test() @@ -65,7 +67,9 @@ namespace NzbDrone.Core.Applications.Mylar public override void AddIndexer(IndexerDefinition indexer) { - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); + + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) { _logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id); @@ -74,7 +78,7 @@ namespace NzbDrone.Core.Applications.Mylar _logger.Trace("Adding indexer {0} [{1}]", indexer.Name, indexer.Id); - var mylarIndexer = BuildMylarIndexer(indexer, indexer.Protocol); + var mylarIndexer = BuildMylarIndexer(indexer, indexerCapabilities, indexer.Protocol); var remoteIndexer = _mylarV3Proxy.AddIndexer(mylarIndexer, Settings); @@ -107,11 +111,12 @@ namespace NzbDrone.Core.Applications.Mylar { _logger.Debug("Updating indexer {0} [{1}]", indexer.Name, indexer.Id); + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); var appMappings = _appIndexerMapService.GetMappingsForApp(Definition.Id); var indexerMapping = appMappings.FirstOrDefault(m => m.IndexerId == indexer.Id); var indexerProps = indexerMapping.RemoteIndexerName.Split(","); - var mylarIndexer = BuildMylarIndexer(indexer, indexer.Protocol, indexerProps[1]); + var mylarIndexer = BuildMylarIndexer(indexer, indexerCapabilities, indexer.Protocol, indexerProps[1]); //Use the old remote id to find the indexer on Mylar incase the update was from a name change in Prowlarr var remoteIndexer = _mylarV3Proxy.GetIndexer(indexerProps[1], mylarIndexer.Type, Settings); @@ -133,7 +138,7 @@ namespace NzbDrone.Core.Applications.Mylar { _appIndexerMapService.Delete(indexerMapping.Id); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { _logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Mylar", indexer.Name, indexer.Id); var newRemoteIndexer = _mylarV3Proxy.AddIndexer(mylarIndexer, Settings); @@ -146,7 +151,7 @@ namespace NzbDrone.Core.Applications.Mylar } } - private MylarIndexer BuildMylarIndexer(IndexerDefinition indexer, DownloadProtocol protocol, string originalName = null) + private MylarIndexer BuildMylarIndexer(IndexerDefinition indexer, IndexerCapabilities indexerCapabilities, DownloadProtocol protocol, string originalName = null) { var schema = protocol == DownloadProtocol.Usenet ? MylarProviderType.Newznab : MylarProviderType.Torznab; @@ -156,7 +161,7 @@ namespace NzbDrone.Core.Applications.Mylar Altername = $"{indexer.Name} (Prowlarr)", Host = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/api", Apikey = _configFileProvider.ApiKey, - Categories = string.Join(",", indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())), + Categories = string.Join(",", indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())), Enabled = indexer.Enable, Type = schema, }; diff --git a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs index 058faf985..43cb1ee51 100644 --- a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs +++ b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs @@ -21,13 +21,15 @@ namespace NzbDrone.Core.Applications.Radarr private readonly IRadarrV3Proxy _radarrV3Proxy; private readonly ICached> _schemaCache; private readonly IConfigFileProvider _configFileProvider; + private readonly IIndexerFactory _indexerFactory; - public Radarr(ICacheManager cacheManager, IRadarrV3Proxy radarrV3Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, Logger logger) + public Radarr(ICacheManager cacheManager, IRadarrV3Proxy radarrV3Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, IIndexerFactory indexerFactory, Logger logger) : base(appIndexerMapService, logger) { _schemaCache = cacheManager.GetCache>(GetType()); _radarrV3Proxy = radarrV3Proxy; _configFileProvider = configFileProvider; + _indexerFactory = indexerFactory; } public override ValidationResult Test() @@ -49,7 +51,7 @@ namespace NzbDrone.Core.Applications.Radarr try { - failures.AddIfNotNull(_radarrV3Proxy.TestConnection(BuildRadarrIndexer(testIndexer, DownloadProtocol.Usenet), Settings)); + failures.AddIfNotNull(_radarrV3Proxy.TestConnection(BuildRadarrIndexer(testIndexer, testIndexer.Capabilities, DownloadProtocol.Usenet), Settings)); } catch (HttpException ex) { @@ -118,7 +120,9 @@ namespace NzbDrone.Core.Applications.Radarr public override void AddIndexer(IndexerDefinition indexer) { - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); + + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) { _logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id); @@ -127,7 +131,7 @@ namespace NzbDrone.Core.Applications.Radarr _logger.Trace("Adding indexer {0} [{1}]", indexer.Name, indexer.Id); - var radarrIndexer = BuildRadarrIndexer(indexer, indexer.Protocol); + var radarrIndexer = BuildRadarrIndexer(indexer, indexerCapabilities, indexer.Protocol); var remoteIndexer = _radarrV3Proxy.AddIndexer(radarrIndexer, Settings); @@ -159,10 +163,11 @@ namespace NzbDrone.Core.Applications.Radarr { _logger.Debug("Updating indexer {0} [{1}]", indexer.Name, indexer.Id); + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); var appMappings = _appIndexerMapService.GetMappingsForApp(Definition.Id); var indexerMapping = appMappings.FirstOrDefault(m => m.IndexerId == indexer.Id); - var radarrIndexer = BuildRadarrIndexer(indexer, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); + var radarrIndexer = BuildRadarrIndexer(indexer, indexerCapabilities, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); var remoteIndexer = _radarrV3Proxy.GetIndexer(indexerMapping.RemoteIndexerId, Settings); @@ -172,7 +177,7 @@ namespace NzbDrone.Core.Applications.Radarr if (!radarrIndexer.Equals(remoteIndexer) || forceSync) { - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { // Retain user fields not-affiliated with Prowlarr radarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => radarrIndexer.Fields.All(s => s.Name != f.Name))); @@ -198,7 +203,7 @@ namespace NzbDrone.Core.Applications.Radarr { _appIndexerMapService.Delete(indexerMapping.Id); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { _logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Radarr", indexer.Name, indexer.Id); radarrIndexer.Id = 0; @@ -212,7 +217,7 @@ namespace NzbDrone.Core.Applications.Radarr } } - private RadarrIndexer BuildRadarrIndexer(IndexerDefinition indexer, DownloadProtocol protocol, int id = 0) + private RadarrIndexer BuildRadarrIndexer(IndexerDefinition indexer, IndexerCapabilities indexerCapabilities, DownloadProtocol protocol, int id = 0) { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _radarrV3Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); @@ -248,7 +253,7 @@ namespace NzbDrone.Core.Applications.Radarr radarrIndexer.Fields.FirstOrDefault(x => x.Name == "baseUrl").Value = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/"; radarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiPath").Value = "/api"; radarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiKey").Value = _configFileProvider.ApiKey; - radarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); + radarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); if (indexer.Protocol == DownloadProtocol.Torrent) { diff --git a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs index 4a8b280b4..12a6dc7d1 100644 --- a/src/NzbDrone.Core/Applications/Readarr/Readarr.cs +++ b/src/NzbDrone.Core/Applications/Readarr/Readarr.cs @@ -21,13 +21,15 @@ namespace NzbDrone.Core.Applications.Readarr private readonly ICached> _schemaCache; private readonly IReadarrV1Proxy _readarrV1Proxy; private readonly IConfigFileProvider _configFileProvider; + private readonly IIndexerFactory _indexerFactory; - public Readarr(ICacheManager cacheManager, IReadarrV1Proxy readarrV1Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, Logger logger) + public Readarr(ICacheManager cacheManager, IReadarrV1Proxy readarrV1Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, IIndexerFactory indexerFactory, Logger logger) : base(appIndexerMapService, logger) { _schemaCache = cacheManager.GetCache>(GetType()); _readarrV1Proxy = readarrV1Proxy; _configFileProvider = configFileProvider; + _indexerFactory = indexerFactory; } public override ValidationResult Test() @@ -49,7 +51,7 @@ namespace NzbDrone.Core.Applications.Readarr try { - failures.AddIfNotNull(_readarrV1Proxy.TestConnection(BuildReadarrIndexer(testIndexer, DownloadProtocol.Usenet), Settings)); + failures.AddIfNotNull(_readarrV1Proxy.TestConnection(BuildReadarrIndexer(testIndexer, testIndexer.Capabilities, DownloadProtocol.Usenet), Settings)); } catch (HttpException ex) { @@ -118,7 +120,9 @@ namespace NzbDrone.Core.Applications.Readarr public override void AddIndexer(IndexerDefinition indexer) { - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); + + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) { _logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id); @@ -127,7 +131,7 @@ namespace NzbDrone.Core.Applications.Readarr _logger.Trace("Adding indexer {0} [{1}]", indexer.Name, indexer.Id); - var readarrIndexer = BuildReadarrIndexer(indexer, indexer.Protocol); + var readarrIndexer = BuildReadarrIndexer(indexer, indexerCapabilities, indexer.Protocol); var remoteIndexer = _readarrV1Proxy.AddIndexer(readarrIndexer, Settings); @@ -159,10 +163,11 @@ namespace NzbDrone.Core.Applications.Readarr { _logger.Debug("Updating indexer {0} [{1}]", indexer.Name, indexer.Id); + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); var appMappings = _appIndexerMapService.GetMappingsForApp(Definition.Id); var indexerMapping = appMappings.FirstOrDefault(m => m.IndexerId == indexer.Id); - var readarrIndexer = BuildReadarrIndexer(indexer, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); + var readarrIndexer = BuildReadarrIndexer(indexer, indexerCapabilities, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); var remoteIndexer = _readarrV1Proxy.GetIndexer(indexerMapping.RemoteIndexerId, Settings); @@ -174,7 +179,7 @@ namespace NzbDrone.Core.Applications.Readarr { _logger.Debug("Syncing remote indexer with current settings"); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { // Retain user fields not-affiliated with Prowlarr readarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => readarrIndexer.Fields.All(s => s.Name != f.Name))); @@ -200,7 +205,7 @@ namespace NzbDrone.Core.Applications.Readarr { _appIndexerMapService.Delete(indexerMapping.Id); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { _logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Readarr", indexer.Name, indexer.Id); readarrIndexer.Id = 0; @@ -214,7 +219,7 @@ namespace NzbDrone.Core.Applications.Readarr } } - private ReadarrIndexer BuildReadarrIndexer(IndexerDefinition indexer, DownloadProtocol protocol, int id = 0) + private ReadarrIndexer BuildReadarrIndexer(IndexerDefinition indexer, IndexerCapabilities indexerCapabilities, DownloadProtocol protocol, int id = 0) { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _readarrV1Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); @@ -244,7 +249,7 @@ namespace NzbDrone.Core.Applications.Readarr readarrIndexer.Fields.FirstOrDefault(x => x.Name == "baseUrl").Value = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/"; readarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiPath").Value = "/api"; readarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiKey").Value = _configFileProvider.ApiKey; - readarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); + readarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); if (indexer.Protocol == DownloadProtocol.Torrent) { diff --git a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs index 915de9bf8..509fda8e1 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs @@ -21,13 +21,15 @@ namespace NzbDrone.Core.Applications.Sonarr private readonly ICached> _schemaCache; private readonly ISonarrV3Proxy _sonarrV3Proxy; private readonly IConfigFileProvider _configFileProvider; + private readonly IIndexerFactory _indexerFactory; - public Sonarr(ICacheManager cacheManager, ISonarrV3Proxy sonarrV3Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, Logger logger) + public Sonarr(ICacheManager cacheManager, ISonarrV3Proxy sonarrV3Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, IIndexerFactory indexerFactory, Logger logger) : base(appIndexerMapService, logger) { _schemaCache = cacheManager.GetCache>(GetType()); _sonarrV3Proxy = sonarrV3Proxy; _configFileProvider = configFileProvider; + _indexerFactory = indexerFactory; } public override ValidationResult Test() @@ -49,7 +51,7 @@ namespace NzbDrone.Core.Applications.Sonarr try { - failures.AddIfNotNull(_sonarrV3Proxy.TestConnection(BuildSonarrIndexer(testIndexer, DownloadProtocol.Usenet), Settings)); + failures.AddIfNotNull(_sonarrV3Proxy.TestConnection(BuildSonarrIndexer(testIndexer, testIndexer.Capabilities, DownloadProtocol.Usenet), Settings)); } catch (HttpException ex) { @@ -122,8 +124,10 @@ namespace NzbDrone.Core.Applications.Sonarr public override void AddIndexer(IndexerDefinition indexer) { - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty() && - indexer.Capabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Empty()) + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); + + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty() && + indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Empty()) { _logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id); @@ -132,7 +136,7 @@ namespace NzbDrone.Core.Applications.Sonarr _logger.Trace("Adding indexer {0} [{1}]", indexer.Name, indexer.Id); - var sonarrIndexer = BuildSonarrIndexer(indexer, indexer.Protocol); + var sonarrIndexer = BuildSonarrIndexer(indexer, indexerCapabilities, indexer.Protocol); var remoteIndexer = _sonarrV3Proxy.AddIndexer(sonarrIndexer, Settings); @@ -164,10 +168,11 @@ namespace NzbDrone.Core.Applications.Sonarr { _logger.Debug("Updating indexer {0} [{1}]", indexer.Name, indexer.Id); + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); var appMappings = _appIndexerMapService.GetMappingsForApp(Definition.Id); var indexerMapping = appMappings.FirstOrDefault(m => m.IndexerId == indexer.Id); - var sonarrIndexer = BuildSonarrIndexer(indexer, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); + var sonarrIndexer = BuildSonarrIndexer(indexer, indexerCapabilities, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); var remoteIndexer = _sonarrV3Proxy.GetIndexer(indexerMapping.RemoteIndexerId, Settings); @@ -179,7 +184,7 @@ namespace NzbDrone.Core.Applications.Sonarr { _logger.Debug("Syncing remote indexer with current settings"); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexer.Capabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any()) { // Retain user fields not-affiliated with Prowlarr sonarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => sonarrIndexer.Fields.All(s => s.Name != f.Name))); @@ -206,7 +211,7 @@ namespace NzbDrone.Core.Applications.Sonarr { _appIndexerMapService.Delete(indexerMapping.Id); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexer.Capabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any()) { _logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Sonarr", indexer.Name, indexer.Id); sonarrIndexer.Id = 0; @@ -220,7 +225,7 @@ namespace NzbDrone.Core.Applications.Sonarr } } - private SonarrIndexer BuildSonarrIndexer(IndexerDefinition indexer, DownloadProtocol protocol, int id = 0) + private SonarrIndexer BuildSonarrIndexer(IndexerDefinition indexer, IndexerCapabilities indexerCapabilities, DownloadProtocol protocol, int id = 0) { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _sonarrV3Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); @@ -256,8 +261,8 @@ namespace NzbDrone.Core.Applications.Sonarr sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "baseUrl").Value = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/"; sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiPath").Value = "/api"; sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiKey").Value = _configFileProvider.ApiKey; - sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); - sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "animeCategories").Value = JArray.FromObject(indexer.Capabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray())); + sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); + sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "animeCategories").Value = JArray.FromObject(indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray())); if (sonarrIndexer.Fields.Any(x => x.Name == "animeStandardFormatSearch")) { diff --git a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs index c6135c999..75d98045a 100644 --- a/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs +++ b/src/NzbDrone.Core/Applications/Whisparr/Whisparr.cs @@ -21,13 +21,15 @@ namespace NzbDrone.Core.Applications.Whisparr private readonly IWhisparrV3Proxy _whisparrV3Proxy; private readonly ICached> _schemaCache; private readonly IConfigFileProvider _configFileProvider; + private readonly IIndexerFactory _indexerFactory; - public Whisparr(ICacheManager cacheManager, IWhisparrV3Proxy whisparrV3Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, Logger logger) + public Whisparr(ICacheManager cacheManager, IWhisparrV3Proxy whisparrV3Proxy, IConfigFileProvider configFileProvider, IAppIndexerMapService appIndexerMapService, IIndexerFactory indexerFactory, Logger logger) : base(appIndexerMapService, logger) { _schemaCache = cacheManager.GetCache>(GetType()); _whisparrV3Proxy = whisparrV3Proxy; _configFileProvider = configFileProvider; + _indexerFactory = indexerFactory; } public override ValidationResult Test() @@ -49,7 +51,7 @@ namespace NzbDrone.Core.Applications.Whisparr try { - failures.AddIfNotNull(_whisparrV3Proxy.TestConnection(BuildWhisparrIndexer(testIndexer, DownloadProtocol.Usenet), Settings)); + failures.AddIfNotNull(_whisparrV3Proxy.TestConnection(BuildWhisparrIndexer(testIndexer, testIndexer.Capabilities, DownloadProtocol.Usenet), Settings)); } catch (HttpException ex) { @@ -118,7 +120,9 @@ namespace NzbDrone.Core.Applications.Whisparr public override void AddIndexer(IndexerDefinition indexer) { - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); + + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty()) { _logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id); @@ -127,7 +131,7 @@ namespace NzbDrone.Core.Applications.Whisparr _logger.Trace("Adding indexer {0} [{1}]", indexer.Name, indexer.Id); - var whisparrIndexer = BuildWhisparrIndexer(indexer, indexer.Protocol); + var whisparrIndexer = BuildWhisparrIndexer(indexer, indexerCapabilities, indexer.Protocol); var remoteIndexer = _whisparrV3Proxy.AddIndexer(whisparrIndexer, Settings); @@ -159,10 +163,11 @@ namespace NzbDrone.Core.Applications.Whisparr { _logger.Debug("Updating indexer {0} [{1}]", indexer.Name, indexer.Id); + var indexerCapabilities = _indexerFactory.GetInstance(indexer).GetCapabilities(); var appMappings = _appIndexerMapService.GetMappingsForApp(Definition.Id); var indexerMapping = appMappings.FirstOrDefault(m => m.IndexerId == indexer.Id); - var whisparrIndexer = BuildWhisparrIndexer(indexer, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); + var whisparrIndexer = BuildWhisparrIndexer(indexer, indexerCapabilities, indexer.Protocol, indexerMapping?.RemoteIndexerId ?? 0); var remoteIndexer = _whisparrV3Proxy.GetIndexer(indexerMapping.RemoteIndexerId, Settings); @@ -174,7 +179,7 @@ namespace NzbDrone.Core.Applications.Whisparr { _logger.Debug("Syncing remote indexer with current settings"); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { // Retain user fields not-affiliated with Prowlarr whisparrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => whisparrIndexer.Fields.All(s => s.Name != f.Name))); @@ -200,7 +205,7 @@ namespace NzbDrone.Core.Applications.Whisparr { _appIndexerMapService.Delete(indexerMapping.Id); - if (indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) + if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any()) { _logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Whisparr", indexer.Name, indexer.Id); whisparrIndexer.Id = 0; @@ -214,7 +219,7 @@ namespace NzbDrone.Core.Applications.Whisparr } } - private WhisparrIndexer BuildWhisparrIndexer(IndexerDefinition indexer, DownloadProtocol protocol, int id = 0) + private WhisparrIndexer BuildWhisparrIndexer(IndexerDefinition indexer, IndexerCapabilities indexerCapabilities, DownloadProtocol protocol, int id = 0) { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _whisparrV3Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); @@ -244,7 +249,7 @@ namespace NzbDrone.Core.Applications.Whisparr whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "baseUrl").Value = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/"; whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "apiPath").Value = "/api"; whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "apiKey").Value = _configFileProvider.ApiKey; - whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); + whisparrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); if (indexer.Protocol == DownloadProtocol.Torrent) { diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index e39a2d092..4d5fbd5d3 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -177,8 +177,8 @@ namespace NzbDrone.Core.IndexerSearch if (criteriaBase.Categories is { Length: > 0 }) { - //Only query supported indexers - indexers = indexers.Where(i => ((IndexerDefinition)i.Definition).Capabilities.Categories.SupportedCategories(criteriaBase.Categories).Any()).ToList(); + // Only query supported indexers + indexers = indexers.Where(i => i.GetCapabilities().Categories.SupportedCategories(criteriaBase.Categories).Any()).ToList(); if (indexers.Count == 0) { @@ -217,7 +217,7 @@ namespace NzbDrone.Core.IndexerSearch //Filter results to only those in searched categories if (criteriaBase.Categories.Length > 0) { - var expandedQueryCats = ((IndexerDefinition)indexer.Definition).Capabilities.Categories.ExpandTorznabQueryCategories(criteriaBase.Categories); + var expandedQueryCats = indexer.GetCapabilities().Categories.ExpandTorznabQueryCategories(criteriaBase.Categories); releases = releases.Where(result => result.Categories?.Any() != true || expandedQueryCats.Intersect(result.Categories.Select(c => c.Id)).Any()).ToList(); From 41b0a1211b2f5af8bf16ccfde6fe05683236a56a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 2 Apr 2024 03:11:29 +0300 Subject: [PATCH 527/964] Fixed: Migrate categories to capabilities in Newznab/Torznab settings --- ...ategory_to_capabilities_settingsFixture.cs | 200 ++++++++++++++++++ ...wznab_category_to_capabilities_settings.cs | 65 ++++++ .../Indexers/Definitions/Newznab/Newznab.cs | 23 +- .../Newznab/NewznabCapabilitiesSettings.cs | 12 +- .../Indexers/Definitions/Torznab/Torznab.cs | 23 +- 5 files changed, 291 insertions(+), 32 deletions(-) create mode 100644 src/NzbDrone.Core.Test/Datastore/Migration/040_newznab_category_to_capabilities_settingsFixture.cs create mode 100644 src/NzbDrone.Core/Datastore/Migration/040_newznab_category_to_capabilities_settings.cs diff --git a/src/NzbDrone.Core.Test/Datastore/Migration/040_newznab_category_to_capabilities_settingsFixture.cs b/src/NzbDrone.Core.Test/Datastore/Migration/040_newznab_category_to_capabilities_settingsFixture.cs new file mode 100644 index 000000000..b51bf6433 --- /dev/null +++ b/src/NzbDrone.Core.Test/Datastore/Migration/040_newznab_category_to_capabilities_settingsFixture.cs @@ -0,0 +1,200 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using FluentAssertions; +using Newtonsoft.Json.Linq; +using NUnit.Framework; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Datastore.Migration; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.Datastore.Migration +{ + [TestFixture] + public class newznab_category_to_capabilities_settingsFixture : MigrationTest + { + [Test] + public void should_migrate_categories_when_capabilities_is_not_defined() + { + var db = WithMigrationTestDb(c => + { + c.Insert.IntoTable("Indexers").Row(new + { + Name = "Usenet Indexer", + Redirect = false, + AppProfileId = 0, + DownloadClientId = 0, + Priority = 25, + Added = DateTime.UtcNow, + Implementation = "Newznab", + Settings = new + { + Categories = new[] + { + new { Id = 2000, Name = "Movies" }, + new { Id = 5000, Name = "TV" } + } + }.ToJson(), + ConfigContract = "NewznabSettings" + }); + }); + + var items = db.Query("SELECT \"Id\", \"Implementation\", \"ConfigContract\", \"Settings\" FROM \"Indexers\""); + + items.Should().HaveCount(1); + items.First().Implementation.Should().Be("Newznab"); + items.First().ConfigContract.Should().Be("NewznabSettings"); + items.First().Settings.Should().ContainKey("capabilities"); + items.First().Settings.Should().NotContainKey("categories"); + + var newznabSettings = items.First().Settings.ToObject(); + newznabSettings.Capabilities.Should().NotBeNull(); + newznabSettings.Capabilities.SupportsRawSearch.Should().Be(false); + newznabSettings.Capabilities.Categories.Should().HaveCount(2); + newznabSettings.Capabilities.Categories.Should().Contain(c => c.Id == 2000 && c.Name == "Movies"); + newznabSettings.Capabilities.Categories.Should().Contain(c => c.Id == 5000 && c.Name == "TV"); + } + + [Test] + public void should_migrate_categories_when_capabilities_is_defined() + { + var db = WithMigrationTestDb(c => + { + c.Insert.IntoTable("Indexers").Row(new + { + Name = "Usenet Indexer", + Redirect = false, + AppProfileId = 0, + DownloadClientId = 0, + Priority = 25, + Added = DateTime.UtcNow, + Implementation = "Newznab", + Settings = new + { + Capabilities = new + { + SupportsRawSearch = true + }, + Categories = new[] + { + new { Id = 2000, Name = "Movies" }, + new { Id = 5000, Name = "TV" } + } + }.ToJson(), + ConfigContract = "NewznabSettings" + }); + }); + + var items = db.Query("SELECT \"Id\", \"Implementation\", \"ConfigContract\", \"Settings\" FROM \"Indexers\""); + + items.Should().HaveCount(1); + items.First().Implementation.Should().Be("Newznab"); + items.First().ConfigContract.Should().Be("NewznabSettings"); + items.First().Settings.Should().ContainKey("capabilities"); + items.First().Settings.Should().NotContainKey("categories"); + + var newznabSettings = items.First().Settings.ToObject(); + newznabSettings.Capabilities.Should().NotBeNull(); + newznabSettings.Capabilities.SupportsRawSearch.Should().Be(true); + newznabSettings.Capabilities.Categories.Should().HaveCount(2); + newznabSettings.Capabilities.Categories.Should().Contain(c => c.Id == 2000 && c.Name == "Movies"); + newznabSettings.Capabilities.Categories.Should().Contain(c => c.Id == 5000 && c.Name == "TV"); + } + + [Test] + public void should_use_defaults_when_categories_are_empty() + { + var db = WithMigrationTestDb(c => + { + c.Insert.IntoTable("Indexers").Row(new + { + Name = "Usenet Indexer", + Redirect = false, + AppProfileId = 0, + DownloadClientId = 0, + Priority = 25, + Added = DateTime.UtcNow, + Implementation = "Newznab", + Settings = new + { + Categories = Array.Empty() + }.ToJson(), + ConfigContract = "NewznabSettings" + }); + }); + + var items = db.Query("SELECT \"Id\", \"Implementation\", \"ConfigContract\", \"Settings\" FROM \"Indexers\""); + + items.Should().HaveCount(1); + items.First().Implementation.Should().Be("Newznab"); + items.First().ConfigContract.Should().Be("NewznabSettings"); + items.First().Settings.Should().ContainKey("capabilities"); + items.First().Settings.Should().NotContainKey("categories"); + + var newznabSettings = items.First().Settings.ToObject(); + newznabSettings.Capabilities.Should().NotBeNull(); + newznabSettings.Capabilities.SupportsRawSearch.Should().Be(false); + newznabSettings.Capabilities.Categories.Should().NotBeNull(); + newznabSettings.Capabilities.Categories.Should().HaveCount(0); + } + + [Test] + public void should_use_defaults_when_settings_are_empty() + { + var db = WithMigrationTestDb(c => + { + c.Insert.IntoTable("Indexers").Row(new + { + Name = "Usenet Indexer", + Redirect = false, + AppProfileId = 0, + DownloadClientId = 0, + Priority = 25, + Added = DateTime.UtcNow, + Implementation = "Newznab", + Settings = new { }.ToJson(), + ConfigContract = "NewznabSettings" + }); + }); + + var items = db.Query("SELECT \"Id\", \"Implementation\", \"ConfigContract\", \"Settings\" FROM \"Indexers\""); + + items.Should().HaveCount(1); + items.First().Implementation.Should().Be("Newznab"); + items.First().ConfigContract.Should().Be("NewznabSettings"); + items.First().Settings.Should().NotContainKey("capabilities"); + items.First().Settings.Should().NotContainKey("categories"); + items.First().Settings.ToObject().Capabilities.Should().BeNull(); + } + } + + public class IndexerDefinition40 + { + public int Id { get; set; } + public string Implementation { get; set; } + public string ConfigContract { get; set; } + public JObject Settings { get; set; } + } + + public class NewznabSettings39 + { + public object Categories { get; set; } + } + + public class NewznabSettings40 + { + public NewznabCapabilitiesSettings40 Capabilities { get; set; } + } + + public class NewznabCapabilitiesSettings40 + { + public bool SupportsRawSearch { get; set; } + public List Categories { get; set; } + } + + public class IndexerCategory40 + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/src/NzbDrone.Core/Datastore/Migration/040_newznab_category_to_capabilities_settings.cs b/src/NzbDrone.Core/Datastore/Migration/040_newznab_category_to_capabilities_settings.cs new file mode 100644 index 000000000..ad573bd9c --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/040_newznab_category_to_capabilities_settings.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; +using System.Data; +using Dapper; +using FluentMigrator; +using Newtonsoft.Json.Linq; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(40)] + public class newznab_category_to_capabilities_settings : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.WithConnection(MoveCategoriesToCapabilities); + } + + private void MoveCategoriesToCapabilities(IDbConnection conn, IDbTransaction tran) + { + var updated = new List(); + + using (var cmd = conn.CreateCommand()) + { + cmd.Transaction = tran; + cmd.CommandText = "SELECT \"Id\", \"Settings\" FROM \"Indexers\" WHERE \"Implementation\" IN ('Newznab', 'Torznab')"; + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + var id = reader.GetInt32(0); + var settings = Json.Deserialize(reader.GetString(1)); + + if ((settings.Value("capabilities")?.ContainsKey("categories") ?? false) == false + && settings.ContainsKey("categories") + && settings.TryGetValue("categories", out var categories)) + { + if (!settings.ContainsKey("capabilities")) + { + settings.Add("capabilities", new JObject()); + } + + settings.Value("capabilities")?.Add(new JProperty("categories", JArray.FromObject(categories))); + + if (settings.ContainsKey("categories")) + { + settings.Remove("categories"); + } + } + + updated.Add(new + { + Settings = settings.ToJson(), + Id = id + }); + } + } + } + + var updateSql = "UPDATE \"Indexers\" SET \"Settings\" = @Settings WHERE \"Id\" = @Id"; + conn.Execute(updateSql, updated, transaction: tran); + } + } +} diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs index e7109f504..bea5a92be 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs @@ -61,26 +61,23 @@ namespace NzbDrone.Core.Indexers.Newznab { var caps = new IndexerCapabilities(); - if (Definition == null || Settings?.Capabilities == null) + if (Definition == null || Settings?.Capabilities?.Categories == null) { return caps; } - caps.SupportsRawSearch = Settings.Capabilities?.SupportsRawSearch ?? false; - caps.SearchParams = Settings.Capabilities?.SearchParams ?? new List { SearchParam.Q }; - caps.TvSearchParams = Settings.Capabilities?.TvSearchParams ?? new List(); - caps.MovieSearchParams = Settings.Capabilities?.MovieSearchParams ?? new List(); - caps.MusicSearchParams = Settings.Capabilities?.MusicSearchParams ?? new List(); - caps.BookSearchParams = Settings.Capabilities?.BookSearchParams ?? new List(); - - if (Settings.Capabilities?.Categories != null) + foreach (var category in Settings.Capabilities.Categories) { - foreach (var category in Settings.Capabilities.Categories) - { - caps.Categories.AddCategoryMapping(category.Name, category); - } + caps.Categories.AddCategoryMapping(category.Name, category); } + caps.SupportsRawSearch = Settings?.Capabilities?.SupportsRawSearch ?? false; + caps.SearchParams = Settings?.Capabilities?.SearchParams ?? new List { SearchParam.Q }; + caps.TvSearchParams = Settings?.Capabilities?.TvSearchParams ?? new List(); + caps.MovieSearchParams = Settings?.Capabilities?.MovieSearchParams ?? new List(); + caps.MusicSearchParams = Settings?.Capabilities?.MusicSearchParams ?? new List(); + caps.BookSearchParams = Settings?.Capabilities?.BookSearchParams ?? new List(); + return caps; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesSettings.cs index 244d1c869..ed59797af 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesSettings.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabCapabilitiesSettings.cs @@ -6,17 +6,17 @@ public class NewznabCapabilitiesSettings { public bool SupportsRawSearch { get; set; } - public List SearchParams { get; set; } = new (); + public List SearchParams { get; set; } - public List TvSearchParams { get; set; } = new (); + public List TvSearchParams { get; set; } - public List MovieSearchParams { get; set; } = new (); + public List MovieSearchParams { get; set; } - public List MusicSearchParams { get; set; } = new (); + public List MusicSearchParams { get; set; } - public List BookSearchParams { get; set; } = new (); + public List BookSearchParams { get; set; } - public List Categories { get; set; } = new (); + public List Categories { get; set; } public NewznabCapabilitiesSettings() { diff --git a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs index 049fec0b1..42008100f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs @@ -61,26 +61,23 @@ namespace NzbDrone.Core.Indexers.Torznab { var caps = new IndexerCapabilities(); - if (Definition == null || Settings?.Capabilities == null) + if (Definition == null || Settings?.Capabilities?.Categories == null) { return caps; } - caps.SupportsRawSearch = Settings.Capabilities?.SupportsRawSearch ?? false; - caps.SearchParams = Settings.Capabilities?.SearchParams ?? new List { SearchParam.Q }; - caps.TvSearchParams = Settings.Capabilities?.TvSearchParams ?? new List(); - caps.MovieSearchParams = Settings.Capabilities?.MovieSearchParams ?? new List(); - caps.MusicSearchParams = Settings.Capabilities?.MusicSearchParams ?? new List(); - caps.BookSearchParams = Settings.Capabilities?.BookSearchParams ?? new List(); - - if (Settings.Capabilities?.Categories != null) + foreach (var category in Settings.Capabilities.Categories) { - foreach (var category in Settings.Capabilities.Categories) - { - caps.Categories.AddCategoryMapping(category.Name, category); - } + caps.Categories.AddCategoryMapping(category.Name, category); } + caps.SupportsRawSearch = Settings?.Capabilities?.SupportsRawSearch ?? false; + caps.SearchParams = Settings?.Capabilities?.SearchParams ?? new List { SearchParam.Q }; + caps.TvSearchParams = Settings?.Capabilities?.TvSearchParams ?? new List(); + caps.MovieSearchParams = Settings?.Capabilities?.MovieSearchParams ?? new List(); + caps.MusicSearchParams = Settings?.Capabilities?.MusicSearchParams ?? new List(); + caps.BookSearchParams = Settings?.Capabilities?.BookSearchParams ?? new List(); + return caps; } From 9cdf5d18d8c2f903ba6e07edbd96cc9b7c301369 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 2 Apr 2024 16:01:41 +0300 Subject: [PATCH 528/964] Fixed: Categories for Newznab/Torznab in add indexer --- .../Indexers/Definitions/Newznab/Newznab.cs | 54 ++++++++++++------- .../Indexers/Definitions/Torznab/Torznab.cs | 23 ++++++-- src/NzbDrone.Core/Indexers/IndexerFactory.cs | 2 +- 3 files changed, 54 insertions(+), 25 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs index bea5a92be..8230a71d8 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/Newznab.cs @@ -91,25 +91,24 @@ namespace NzbDrone.Core.Indexers.Newznab { get { - yield return GetDefinition("abNZB", GetSettings("https://abnzb.com")); - yield return GetDefinition("altHUB", GetSettings("https://api.althub.co.za")); - yield return GetDefinition("AnimeTosho (Usenet)", GetSettings("https://feed.animetosho.org")); - yield return GetDefinition("DOGnzb", GetSettings("https://api.dognzb.cr")); - yield return GetDefinition("DrunkenSlug", GetSettings("https://drunkenslug.com")); + yield return GetDefinition("abNZB", GetSettings("https://abnzb.com"), categories: new[] { 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("altHUB", GetSettings("https://api.althub.co.za"), categories: new[] { 2000, 3000, 4000, 5000, 7000 }); + yield return GetDefinition("AnimeTosho (Usenet)", GetSettings("https://feed.animetosho.org"), categories: new[] { 2020, 5070 }); + yield return GetDefinition("DOGnzb", GetSettings("https://api.dognzb.cr"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("DrunkenSlug", GetSettings("https://drunkenslug.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000 }); yield return GetDefinition("GingaDADDY", GetSettings("https://www.gingadaddy.com")); - yield return GetDefinition("Miatrix", GetSettings("https://www.miatrix.com")); - yield return GetDefinition("Newz-Complex", GetSettings("https://newz-complex.org/www")); - yield return GetDefinition("Newz69", GetSettings("https://newz69.keagaming.com")); - yield return GetDefinition("NinjaCentral", GetSettings("https://ninjacentral.co.za")); - yield return GetDefinition("Nzb.su", GetSettings("https://api.nzb.su")); - yield return GetDefinition("NZBCat", GetSettings("https://nzb.cat")); - yield return GetDefinition("NZBFinder", GetSettings("https://nzbfinder.ws")); - yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info")); - yield return GetDefinition("NzbNoob", GetSettings("https://www.nzbnoob.com")); - yield return GetDefinition("NZBNDX", GetSettings("https://www.nzbndx.com")); - yield return GetDefinition("NzbPlanet", GetSettings("https://api.nzbplanet.net")); - yield return GetDefinition("NZBStars", GetSettings("https://nzbstars.com")); - yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api")); + yield return GetDefinition("Miatrix", GetSettings("https://www.miatrix.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("Newz69", GetSettings("https://newz69.keagaming.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("NinjaCentral", GetSettings("https://ninjacentral.co.za"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("Nzb.su", GetSettings("https://api.nzb.su"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("NZBCat", GetSettings("https://nzb.cat"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000 }); + yield return GetDefinition("NZBFinder", GetSettings("https://nzbfinder.ws"), categories: new[] { 2000, 3000, 5000, 6000, 7000 }); + yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("NzbNoob", GetSettings("https://www.nzbnoob.com"), categories: new[] { 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("NZBNDX", GetSettings("https://www.nzbndx.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("NzbPlanet", GetSettings("https://api.nzbplanet.net"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 }); + yield return GetDefinition("NZBStars", GetSettings("https://nzbstars.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000 }); + yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000 }); yield return GetDefinition("Generic Newznab", GetSettings("")); } } @@ -120,8 +119,23 @@ namespace NzbDrone.Core.Indexers.Newznab _capabilitiesProvider = capabilitiesProvider; } - private IndexerDefinition GetDefinition(string name, NewznabSettings settings) + private IndexerDefinition GetDefinition(string name, NewznabSettings settings, IEnumerable categories = null) { + var caps = new IndexerCapabilities(); + + if (categories != null) + { + foreach (var categoryId in categories) + { + var mappedCat = NewznabStandardCategory.AllCats.FirstOrDefault(x => x.Id == categoryId); + + if (mappedCat != null) + { + caps.Categories.AddCategoryMapping(mappedCat.Id, mappedCat); + } + } + } + return new IndexerDefinition { Enable = true, @@ -134,7 +148,7 @@ namespace NzbDrone.Core.Indexers.Newznab SupportsSearch = SupportsSearch, SupportsRedirect = SupportsRedirect, SupportsPagination = SupportsPagination, - Capabilities = Capabilities + Capabilities = caps }; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs index 42008100f..b41640225 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Torznab/Torznab.cs @@ -91,8 +91,8 @@ namespace NzbDrone.Core.Indexers.Torznab { get { - yield return GetDefinition("AnimeTosho", "Anime NZB/DDL mirror", settings: GetSettings("https://feed.animetosho.org")); - yield return GetDefinition("MoreThanTV", "Private torrent tracker for TV / MOVIES", settings: GetSettings("https://www.morethantv.me", apiPath: @"/api/torznab")); + yield return GetDefinition("AnimeTosho", "Anime NZB/DDL mirror", settings: GetSettings("https://feed.animetosho.org"), categories: new[] { 2020, 5070 }); + yield return GetDefinition("MoreThanTV", "Private torrent tracker for TV / MOVIES", settings: GetSettings("https://www.morethantv.me", apiPath: @"/api/torznab"), categories: new[] { 2000, 5000 }); yield return GetDefinition("Torrent Network", "Torrent Network (TN) is a GERMAN Private site for TV / MOVIES / GENERAL", language: "de-DE", settings: GetSettings("https://tntracker.org", apiPath: @"/api/torznab/api")); yield return GetDefinition("Generic Torznab", "A Newznab-like api for torrents.", settings: GetSettings("")); } @@ -104,8 +104,23 @@ namespace NzbDrone.Core.Indexers.Torznab _capabilitiesProvider = capabilitiesProvider; } - private IndexerDefinition GetDefinition(string name, string description, string language = null, TorznabSettings settings = null) + private IndexerDefinition GetDefinition(string name, string description, string language = null, TorznabSettings settings = null, IEnumerable categories = null) { + var caps = new IndexerCapabilities(); + + if (categories != null) + { + foreach (var categoryId in categories) + { + var mappedCat = NewznabStandardCategory.AllCats.FirstOrDefault(x => x.Id == categoryId); + + if (mappedCat != null) + { + caps.Categories.AddCategoryMapping(mappedCat.Id, mappedCat); + } + } + } + return new IndexerDefinition { Enable = true, @@ -119,7 +134,7 @@ namespace NzbDrone.Core.Indexers.Torznab SupportsSearch = SupportsSearch, SupportsRedirect = SupportsRedirect, SupportsPagination = SupportsPagination, - Capabilities = Capabilities + Capabilities = caps }; } diff --git a/src/NzbDrone.Core/Indexers/IndexerFactory.cs b/src/NzbDrone.Core/Indexers/IndexerFactory.cs index 0c9668fab..c67c7840e 100644 --- a/src/NzbDrone.Core/Indexers/IndexerFactory.cs +++ b/src/NzbDrone.Core/Indexers/IndexerFactory.cs @@ -208,7 +208,7 @@ namespace NzbDrone.Core.Indexers definition.Description ??= provider.Description; definition.Encoding = provider.Encoding; definition.Language ??= provider.Language; - definition.Capabilities = provider.Capabilities; + definition.Capabilities ??= provider.Capabilities; } } From 57e21a78ee973ec7ea0851e5a03855196787fce0 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 2 Apr 2024 14:32:11 +0000 Subject: [PATCH 529/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Fixer Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ar.json | 4 +- src/NzbDrone.Core/Localization/Core/bg.json | 4 +- src/NzbDrone.Core/Localization/Core/ca.json | 7 +- src/NzbDrone.Core/Localization/Core/cs.json | 6 +- src/NzbDrone.Core/Localization/Core/da.json | 17 ++++- src/NzbDrone.Core/Localization/Core/el.json | 6 +- src/NzbDrone.Core/Localization/Core/fi.json | 74 ++++++++++++++++++++- src/NzbDrone.Core/Localization/Core/hi.json | 4 +- src/NzbDrone.Core/Localization/Core/hu.json | 24 ++++++- src/NzbDrone.Core/Localization/Core/is.json | 4 +- src/NzbDrone.Core/Localization/Core/it.json | 7 +- src/NzbDrone.Core/Localization/Core/ja.json | 4 +- src/NzbDrone.Core/Localization/Core/ko.json | 4 +- src/NzbDrone.Core/Localization/Core/pt.json | 7 +- src/NzbDrone.Core/Localization/Core/ro.json | 6 +- src/NzbDrone.Core/Localization/Core/ru.json | 6 +- src/NzbDrone.Core/Localization/Core/th.json | 4 +- 17 files changed, 171 insertions(+), 17 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index acd6b0262..17abab8e4 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -353,5 +353,7 @@ "DisabledForLocalAddresses": "معطل بسبب العناوين المحلية", "None": "لا شيء", "ResetAPIKeyMessageText": "هل أنت متأكد أنك تريد إعادة تعيين مفتاح API الخاص بك؟", - "RestartProwlarr": "أعد تشغيل {appName}" + "RestartProwlarr": "أعد تشغيل {appName}", + "CustomFilter": "مرشحات مخصصة", + "IndexerHDBitsSettingsMediums": "متوسط" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 6312005f8..6a8690664 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -353,5 +353,7 @@ "DisabledForLocalAddresses": "Забранено за местни адреси", "None": "Нито един", "ResetAPIKeyMessageText": "Наистина ли искате да нулирате своя API ключ?", - "RestartProwlarr": "Рестартирайте {appName}" + "RestartProwlarr": "Рестартирайте {appName}", + "IndexerHDBitsSettingsMediums": "Среден", + "CustomFilter": "Персонализирани филтри" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index a47d19291..665e5d019 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -438,5 +438,10 @@ "Destination": "Destinació", "Directory": "Directori", "DownloadClientDelugeSettingsUrlBaseHelpText": "Afegeix un prefix a l'url json del Deluge, vegeu {url}", - "CustomFilter": "Filtres personalitzats" + "CustomFilter": "Filtres personalitzats", + "IndexerHDBitsSettingsCodecs": "Còdec", + "DownloadClientSettingsUrlBaseHelpText": "Afegeix un prefix a l'URL {connectionName}, com ara {url}", + "DownloadClientTransmissionSettingsDirectoryHelpText": "Ubicació opcional per a les baixades, deixeu-lo en blanc per utilitzar la ubicació predeterminada d'Aria2", + "DownloadClientRTorrentSettingsDirectoryHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge", + "IndexerHDBitsSettingsMediums": "Suport" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index a0becd1bf..2b5f73f97 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -408,5 +408,9 @@ "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo", "days": "dnů", "Id": "ID", - "CountApplicationsSelected": "Vybráno {0} kolekcí" + "CountApplicationsSelected": "Vybráno {0} kolekcí", + "IndexerHDBitsSettingsCodecs": "Kodek", + "IndexerHDBitsSettingsMediums": "Střední", + "Directory": "Adresář", + "CustomFilter": "Vlastní filtry" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 52f47b149..7868bd720 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -377,5 +377,20 @@ "AddApplicationImplementation": "Tilføj forbindelse - {implementationName}", "AddIndexerImplementation": "Tilføj betingelse - {implementationName}", "ApplyChanges": "Anvend ændringer", - "AddDownloadClientImplementation": "Tilføj downloadklient - {implementationName}" + "AddDownloadClientImplementation": "Tilføj downloadklient - {implementationName}", + "Album": "album", + "Theme": "Tema", + "Categories": "Kategorier", + "Application": "Applikationer", + "EditIndexerProxyImplementation": "Tilføj betingelse - {implementationName}", + "Publisher": "Udgiver", + "IndexerHDBitsSettingsCodecs": "codec", + "Applications": "Applikationer", + "AddIndexerProxyImplementation": "Tilføj betingelse - {implementationName}", + "EditIndexerImplementation": "Tilføj betingelse - {implementationName}", + "Directory": "Mappe", + "EditApplicationImplementation": "Tilføj forbindelse - {implementationName}", + "EditDownloadClientImplementation": "Tilføj downloadklient - {implementationName}", + "IndexerHDBitsSettingsMediums": "Medium", + "CustomFilter": "Bruger Tilpassede Filtere" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 8bdfc6aca..18edee506 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -518,5 +518,9 @@ "AddConnectionImplementation": "Προσθήκη - {implementationName}", "AddIndexerImplementation": "Προσθήκη", "EditIndexerProxyImplementation": "Προσθήκη", - "CountApplicationsSelected": "Επιλέχθηκαν {0} συλλογές" + "CountApplicationsSelected": "Επιλέχθηκαν {0} συλλογές", + "IndexerBeyondHDSettingsSearchTypes": "Τύποι αναζήτησης", + "IndexerHDBitsSettingsMediums": "Μεσαίο", + "UseSsl": "Χρησιμοποιήστε SSL", + "CustomFilter": "Custom Φιλτρα" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 93083bfef..84401634d 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -608,5 +608,77 @@ "NotificationsEmailSettingsUseEncryptionHelpText": "Määrittää suositaanko salausta, jos se on määritetty palvelimelle, käytetäänkö aina SSL- (vain portti 465) tai StartTLS-salausta (kaikki muut portit), voi käytetäänkö salausta lainkaan.", "ManageClients": "Hallitse työkaluja", "NoApplicationsFound": "Sovelluksia ei löytynyt", - "DownloadClientAriaSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi." + "DownloadClientAriaSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.", + "UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.", + "Donate": "Lahjoita", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "Lisää median ominaisuuksia tunnisteina. Vihjeet ovat esimerkkejä.", + "DownloadClientRTorrentSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.", + "DownloadClientSettingsUseSslHelpText": "Muodosta {clientName} -yhteys käyttäen salattua yhteyttä.", + "DownloadClientTransmissionSettingsDirectoryHelpText": "Vaihtoehtoinen latauskansio. Käytä Transmissionin oletusta jättämällä tyhjäksi.", + "DownloadClientTransmissionSettingsUrlBaseHelpText": "Lisää etuliite lataustyökalun {clientName} RPC-URL-osoitteeseen. Esimerkiksi {url}. Oletus on \"{defaultUrl}\".", + "IndexerSettingsAppsMinimumSeedersHelpText": "Sovellusten edellyttämä tietolähteestä kaapattavien kohteiden jakajien (seed) vähimmäismäärä. Jos tyhjä, käytetään synkronointiprofiilin oletusta.", + "Menu": "Valikko", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Hylkää estetyt torrent-hajautusarvot kaapattaessa", + "IndexerBeyondHDSettingsSearchTypes": "Mitä etsitään", + "IndexerSettingsSeedRatio": "Jakosuhde", + "IndexerSettingsSeedTime": "Jakoaika", + "IndexerSettingsSeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi.", + "IndexerSettingsVipExpiration": "VIP-erääntyy", + "Destination": "Kohde", + "Directory": "Kansio", + "DownloadClientFloodSettingsTagsHelpText": "Latauksen alkuperäiset tunnisteet. Jotta se voidaa tunnistaa, on latauksella oltava sen alkuperäiset tunnisteet. Tämä välttää ristiriidat muiden latausten kanssa.", + "DownloadClientFreeboxSettingsApiUrl": "Rajapinnan URL-osoite", + "DownloadClientFreeboxSettingsAppTokenHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä saatu app_token-tietue.", + "DownloadClientFreeboxSettingsHostHelpText": "Freeboxin isäntänimi tai IP-osoite. Oletus on \"{url}\" (toimii vain samassa verkossa).", + "DownloadClientPneumaticSettingsStrmFolder": "Strm-kansio", + "DownloadClientQbittorrentSettingsInitialStateHelpText": "Tila, jossa torrentit lisätään qBittorrentiin. Huomioi, että pakotetut torrentit eivät noudata nopeusrajoituksia.", + "DownloadClientSettingsAddPaused": "Lisää pysäytettynä", + "DownloadClientSettingsDestinationHelpText": "Määrittää manuaalisen tallennuskohteen. Käytä oletusta jättämällä tyhjäksi.", + "DownloadClientSettingsInitialState": "Virheellinen tila", + "DownloadClientSettingsInitialStateHelpText": "Lataustyökaluun {clientName} lisättyjen torrentien aloitustila.", + "IndexerHDBitsSettingsCodecs": "Koodekit", + "IndexerHDBitsSettingsCodecsHelpText": "Jos ei määritetty, käytetään kaikkia vaihtoehtoja.", + "IndexerHDBitsSettingsMediums": "Mediatyypit", + "IndexerHDBitsSettingsMediumsHelpText": "Jos ei määritetty, käytetään kaikkia vaihtoehtoja.", + "IndexerHDBitsSettingsOriginsHelpText": "Jos ei määritetty, käytetään kaikkia vaihtoehtoja.", + "IndexerSettingsAdditionalParameters": "Muut parametrit", + "IndexerSettingsApiPath": "API:n polku", + "IndexerSettingsApiPathHelpText": "Polku API:in (yleensä {url}).", + "IndexerSettingsCookie": "Eväste", + "IndexerSettingsPackSeedTime": "Koosteen jakoaika", + "IndexerSettingsPackSeedTimeIndexerHelpText": "Aika, joka koostepaketin (kuten sarjan tuotantokauden tai esittäjän diskografian) sisältävää torrentia tulee jakaa. Käytä sovelluksen oletusta jättämällä tyhjäksi.", + "IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa tietolähteen sääntöjä.", + "SecretToken": "Salainen tunniste", + "TorrentBlackholeSaveMagnetFiles": "Tallenna magnet-tiedostot", + "UseSsl": "Käytä SSL-salausta", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Jos torrent on estetty hajautusarvon perusteella sitä ei välttämättä hylätä oikein etsittäessä joiltakin tietolähteiltä RSS-syötteen tai haun välityksellä. Tämä mahdollistaa tällaisten torrentien hylkäämisen kaappauksen jälkeen, mutta ennen välitystä lataustyökalulle.", + "BlackholeFolderHelpText": "Kansio, jonne {appName} tallentaa {extension}-tiedoston.", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Lisää etuliitteen Delugen JSON-URL-osoitteeseen (ks. {url}).", + "DownloadClientFloodSettingsAdditionalTags": "Lisätunnisteet", + "DownloadClientPneumaticSettingsStrmFolderHelpText": "Tämän kansion .strm-tiedostot tuodaan droonilla.", + "DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Lataa tiedostot järjestyksessä (qBittorrent 4.1.0+).", + "UsenetBlackholeNzbFolder": "NZB-kansio", + "XmlRpcPath": "XML RPC -sijainti", + "DownloadClientSettingsUrlBaseHelpText": "Lisää etuliite lataustuökalun {clientName} URL-osoitteeseen, kuten {url}.", + "DownloadClientFloodSettingsUrlBaseHelpText": "Lisää etuliitteen Flood-rajapintaan (esim. {url}).", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "Valinnainen jaettu kansio latauksille. Download Stationin oletussijaintia jättämällä tyhjäksi.", + "DownloadClientFreeboxSettingsApiUrlHelpText": "Määritä Freebox-rajapinnan perus-URL rajapinnan versiolla. Esimerkiksi \"{url}\". Oletus on \"{defaultApiUrl}\".", + "DownloadClientQbittorrentSettingsFirstAndLastFirst": "Ensimmäinen ja viimeinen ensin", + "DownloadClientFreeboxSettingsAppId": "Sovellustunniste", + "DownloadClientFreeboxSettingsPortHelpText": "Freebox-liittymän portti. Oletus on \"{port}\".", + "DownloadClientPneumaticSettingsNzbFolder": "NZB-kansio", + "DownloadClientQbittorrentSettingsSequentialOrder": "Peräkkäinen järjestys", + "CustomFilter": "Omat suodattimet", + "DownloadClientFreeboxSettingsAppIdHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä käytettävä App ID -sovellustunniste.", + "DownloadClientFreeboxSettingsAppToken": "Sovellustietue", + "DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä vaatii vähintään NzbGet-version 16.0.", + "DownloadClientPneumaticSettingsNzbFolderHelpText": "Tämän kansion on oltava tavoitettavissa XBMC:stä.", + "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Aloita lataamalla ensimmäinen ja viimeinen osa (qBittorrent 4.1.0+).", + "DownloadClientQbittorrentSettingsUseSslHelpText": "Käytä suojattua yhteyttä. Katso qBittorentin asetusten \"Selainkäyttö\"-osion \"Käytä HTTPS:ää HTTP:n sijaan\" -asetus.", + "DownloadClientRTorrentSettingsAddStopped": "Lisää pysäytettynä", + "DownloadClientRTorrentSettingsUrlPath": "URL-sijainti", + "TorrentBlackholeSaveMagnetFilesHelpText": "Tallenna magnet-linkki, jos .torrent-tiedostoa ei ole käytettävissä (hyödyllinen vain lataustyökalun tukiessa tiedostoon tallennettuja magnet-linkkejä).", + "TorrentBlackholeTorrentFolder": "Torrent-kansio", + "TorrentBlackholeSaveMagnetFilesExtension": "Tallennettujen magnet-tiedostojen pääte", + "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Magnet-linkeille käytettävä tiedostopääte. Oletus on \".magnet\"." } diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 4b19feb30..1d553a4bd 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -352,5 +352,7 @@ "AuthForm": "प्रपत्र (लॉग इन पेज)", "DisabledForLocalAddresses": "स्थानीय पते के लिए अक्षम", "None": "कोई नहीं", - "ResetAPIKeyMessageText": "क्या आप वाकई अपनी API कुंजी को रीसेट करना चाहते हैं?" + "ResetAPIKeyMessageText": "क्या आप वाकई अपनी API कुंजी को रीसेट करना चाहते हैं?", + "IndexerHDBitsSettingsMediums": "मध्यम", + "CustomFilter": "कस्टम फ़िल्टर" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 55de21e31..2193e433c 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -548,5 +548,27 @@ "ManageClients": "Ügyfelek kezelése", "IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltési kliensekkel: {indexerNames}.", "PasswordConfirmation": "Jelszó megerősítése", - "SecretToken": "Titkos token" + "SecretToken": "Titkos token", + "UseSsl": "SSL használata", + "Donate": "Adományoz", + "IndexerBeyondHDSettingsSearchTypes": "Keresés típusa", + "Mixed": "Mixed", + "TorrentBlackholeSaveMagnetFiles": "Magnet fájlok mentése", + "DownloadClientSettingsInitialState": "Kezdeti állapot", + "DownloadClientSettingsInitialStateHelpText": "A torrentek kezdeti állapota hozzáadva a következőhöz {clientName}", + "DownloadClientTransmissionSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához", + "IndexerHDBitsSettingsCodecs": "Kodek", + "IndexerHDBitsSettingsMediums": "Közepes", + "BlackholeFolderHelpText": "Mappa, amelyben az {appName} tárolja az {extension} fájlt", + "Destination": "Rendeltetési hely", + "Directory": "Könyvtár", + "DownloadClientFloodSettingsAdditionalTags": "További címkék", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "Hozzáadja a média tulajdonságait címkékként. A tippek példák.", + "TorrentBlackholeSaveMagnetFilesExtension": "Magnet Files kiterjesztés mentése", + "TorrentBlackholeTorrentFolder": "Torrent mappa", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Előtagot ad a deluge json URL-hez, lásd: {url}", + "CustomFilter": "Egyedi Szűrők", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "Opcionális megosztott mappa a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Download Station hely használatához", + "DownloadClientRTorrentSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához", + "DownloadClientSettingsUseSslHelpText": "Biztonságos kapcsolat használata, amikor a(z) {clientName} szolgáltatással csatlakozik" } diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 4ae25f491..b871e0415 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -353,5 +353,7 @@ "DisabledForLocalAddresses": "Óvirkt vegna heimilisfanga", "None": "Enginn", "ResetAPIKeyMessageText": "Ertu viss um að þú viljir endurstilla API lykilinn þinn?", - "RestartProwlarr": "Endurræstu {appName}" + "RestartProwlarr": "Endurræstu {appName}", + "IndexerHDBitsSettingsMediums": "Miðlungs", + "CustomFilter": "Sérsniðin síur" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index b86cae50a..5eae433a0 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -529,5 +529,10 @@ "AddApplication": "Aggiungi Applicazione", "AddCategory": "Aggiungi Categoria", "ActiveApps": "App Attive", - "ActiveIndexers": "Indicizzatori Attivi" + "ActiveIndexers": "Indicizzatori Attivi", + "IndexerBeyondHDSettingsSearchTypes": "Tipi di Ricerca", + "Directory": "Cartella", + "CustomFilter": "Filtri Personalizzati", + "IndexerHDBitsSettingsCodecs": "Codec", + "IndexerHDBitsSettingsMediums": "medio" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index e7e0de4db..6c88ce3d6 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -353,5 +353,7 @@ "DisabledForLocalAddresses": "ローカルアドレスでは無効", "None": "なし", "ResetAPIKeyMessageText": "APIキーをリセットしてもよろしいですか?", - "RestartProwlarr": "{appName}を再起動します" + "RestartProwlarr": "{appName}を再起動します", + "IndexerHDBitsSettingsMediums": "中", + "CustomFilter": "カスタムフィルター" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 2ac187fba..5bc81c652 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -353,5 +353,7 @@ "None": "없음", "ResetAPIKeyMessageText": "API 키를 재설정하시겠습니까?", "StopSelecting": "선택 취소", - "RestartProwlarr": "{appName} 다시 시작" + "RestartProwlarr": "{appName} 다시 시작", + "IndexerHDBitsSettingsMediums": "매질", + "CustomFilter": "사용자 지정 필터" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 2cc6315d0..cc747f1e3 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -476,5 +476,10 @@ "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmar nova senha", "AdvancedSettingsHiddenClickToShow": "Definições avançadas ocultas, clique para mostrar", "AddCategory": "Adicionar Categoria", - "CountApplicationsSelected": "{count} Coleções Selecionadas" + "CountApplicationsSelected": "{count} Coleções Selecionadas", + "IndexerHDBitsSettingsMediums": "Médio", + "Directory": "Diretório", + "UseSsl": "Usar SSL", + "IndexerHDBitsSettingsCodecs": "Codificador", + "CustomFilter": "Filtros personalizados" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index b82262b31..34d259532 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -464,5 +464,9 @@ "EditApplicationImplementation": "Adăugați aplicație - {implementareName}", "RestartProwlarr": "Reporniți {appName}", "AddDownloadClientToProwlarr": "Adăugarea unui client de descărcare permite {appName} să trimită versiuni direct din interfața utilizatorului în timp ce se efectuează o căutare manuală", - "ActiveApps": "Aplicații active" + "ActiveApps": "Aplicații active", + "IndexerHDBitsSettingsMediums": "Mediu", + "IndexerSettingsVipExpiration": "Expirare VIP", + "Directory": "Director", + "CustomFilter": "Filtru personalizat" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index ffd403a5b..2bb71edd8 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -423,5 +423,9 @@ "AuthenticationRequiredWarning": "Чтобы предотвратить удаленный доступ без авторизации, {appName} теперь требует, чтобы авторизация была включена. При желании вы можете отключить авторизацию с локальных адресов.", "Id": "ID", "ManageClients": "Управление клиентами", - "CountApplicationsSelected": "{count} коллекция(ий) выбрано" + "CountApplicationsSelected": "{count} коллекция(ий) выбрано", + "IndexerHDBitsSettingsCodecs": "Кодек", + "IndexerHDBitsSettingsMediums": "Средний", + "Directory": "Каталог", + "CustomFilter": "Настраиваемые фильтры" } diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 2eb817708..4c772c7f5 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -356,5 +356,7 @@ "DisabledForLocalAddresses": "ปิดใช้งานสำหรับที่อยู่ท้องถิ่น", "None": "ไม่มี", "ResetAPIKeyMessageText": "แน่ใจไหมว่าต้องการรีเซ็ตคีย์ API", - "RestartProwlarr": "รีสตาร์ท {appName}" + "RestartProwlarr": "รีสตาร์ท {appName}", + "IndexerHDBitsSettingsMediums": "ปานกลาง", + "CustomFilter": "ตัวกรองที่กำหนดเอง" } From c32fa7a84bf397fe83ee6cf3b07894ff530ac33e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 4 Apr 2024 00:46:39 +0300 Subject: [PATCH 530/964] Update timezone for FL & AvistaZ --- .../IndexerTests/AvistazTests/AvistazFixture.cs | 2 +- .../IndexerTests/FileListTests/FileListFixture.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs | 2 +- .../Indexers/Definitions/FileList/FileListParser.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs index b8f7951d2..dcabb4dbf 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://avistaz.to/torrent/187240-japan-sinks-people-of-hope-2021-s01e05-720p-nf-web-dl-ddp20-x264-seikel"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 22:26:21")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 21:26:21")); torrentInfo.Size.Should().Be(935127615); torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs index 3699a9d0c..b6f06d180 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests torrentInfo.InfoUrl.Should().Be("https://filelist.io/details.php?id=665873"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 20:20:19")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 19:20:19")); torrentInfo.Size.Should().Be(8300512414); torrentInfo.InfoHash.Should().Be(null); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs index 4e1899651..7d9ba3b51 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs @@ -84,6 +84,6 @@ namespace NzbDrone.Core.Indexers.Definitions public class AvistaZParser : AvistazParserBase { - protected override string TimezoneOffset => "+01:00"; + protected override string TimezoneOffset => "+02:00"; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs index 2d4fa5230..7b2e8cf32 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs @@ -77,7 +77,7 @@ public class FileListParser : IParseIndexerResponse InfoUrl = GetInfoUrl(id), Seeders = row.Seeders, Peers = row.Leechers + row.Seeders, - PublishDate = DateTime.Parse(row.UploadDate + " +0200", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), + PublishDate = DateTime.Parse(row.UploadDate + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), Description = row.SmallDescription, Genres = row.SmallDescription.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList(), ImdbId = imdbId, From eaaf8db48665974f30c4058524abd4ec7fe9b5bb Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 4 Apr 2024 00:51:22 +0300 Subject: [PATCH 531/964] Update timezone for ExoticaZ --- .../IndexerTests/AvistazTests/ExoticazFixture.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs index 4c4f9f38e..fe4ada593 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://exoticaz.to/torrent/64040-ssis-419-my-first-experience-is-yua-mikami-from-the-day-i-lost-my-virginity-i-was-devoted-to-sex"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 10:04:50")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 09:04:50")); torrentInfo.Size.Should().Be(7085405541); torrentInfo.InfoHash.Should().Be("asdjfiasdf54asd7f4a2sdf544asdf"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs index 784cc56e4..0933ea6a2 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs @@ -54,7 +54,7 @@ namespace NzbDrone.Core.Indexers.Definitions { private readonly IndexerCapabilitiesCategories _categories; - protected override string TimezoneOffset => "+01:00"; + protected override string TimezoneOffset => "+02:00"; public ExoticaZParser(IndexerCapabilitiesCategories categories) { From ccc8d8002f62efb2eba753b94abfdee48f21f453 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 7 Nov 2022 18:58:40 -0800 Subject: [PATCH 532/964] Fixed: Testing SABnzbd when no categories are configured (cherry picked from commit 0e31281828c737e3f6eecbb870960194888a970a) --- .../Download/Clients/Sabnzbd/SabnzbdCategory.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdCategory.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdCategory.cs index 61b5f9228..e25a91701 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdCategory.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdCategory.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using Newtonsoft.Json; using NzbDrone.Common.Disk; using NzbDrone.Core.Download.Clients.Sabnzbd.JsonConverters; @@ -7,10 +7,14 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd { public class SabnzbdConfig { + public SabnzbdConfig() + { + Categories = new List(); + Servers = new List(); + } + public SabnzbdConfigMisc Misc { get; set; } - public List Categories { get; set; } - public List Servers { get; set; } } From a989bf82ea541151668f23c8e786c5b219b816eb Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 6 Apr 2024 00:08:32 +0300 Subject: [PATCH 533/964] Fixed: (Gazelle) Ignore ineligible releases with Use Freeleech Token --- .../Definitions/Gazelle/GazelleParser.cs | 20 +++++++++++++++---- .../Indexers/Definitions/GreatPosterWall.cs | 10 ++++++++-- .../Indexers/Definitions/Orpheus.cs | 18 ++++++++++++++--- .../Indexers/Definitions/Redacted.cs | 18 ++++++++++++++--- .../Indexers/Definitions/SecretCinema.cs | 8 ++++---- 5 files changed, 58 insertions(+), 16 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs index 998ba835b..f24954d18 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Gazelle/GazelleParser.cs @@ -59,6 +59,12 @@ public class GazelleParser : IParseIndexerResponse { foreach (var torrent in result.Torrents) { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (Settings.UseFreeleechToken && !torrent.CanUseToken) + { + continue; + } + var id = torrent.TorrentId; var title = $"{result.Artist} - {result.GroupName} ({result.GroupYear}) [{torrent.Format} {torrent.Encoding}] [{torrent.Media}]"; @@ -72,14 +78,14 @@ public class GazelleParser : IParseIndexerResponse var release = new TorrentInfo { Guid = infoUrl, + InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(id, !torrent.IsFreeLeech && !torrent.IsNeutralLeech && !torrent.IsPersonalFreeLeech), Title = WebUtility.HtmlDecode(title), Container = torrent.Encoding, Files = torrent.FileCount, Grabs = torrent.Snatches, Codec = torrent.Format, Size = long.Parse(torrent.Size), - DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken), - InfoUrl = infoUrl, Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), PublishDate = torrent.Time.ToUniversalTime(), @@ -104,6 +110,12 @@ public class GazelleParser : IParseIndexerResponse } else { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (Settings.UseFreeleechToken && !result.CanUseToken) + { + continue; + } + var id = result.TorrentId; var groupName = WebUtility.HtmlDecode(result.GroupName); var infoUrl = GetInfoUrl(result.GroupId, id); @@ -111,10 +123,10 @@ public class GazelleParser : IParseIndexerResponse var release = new TorrentInfo { Guid = infoUrl, + InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(id, !result.IsFreeLeech && !result.IsNeutralLeech && !result.IsPersonalFreeLeech), Title = groupName, Size = long.Parse(result.Size), - DownloadUrl = GetDownloadUrl(id, result.CanUseToken), - InfoUrl = infoUrl, Seeders = int.Parse(result.Seeders), Peers = int.Parse(result.Leechers) + int.Parse(result.Seeders), Files = result.FileCount, diff --git a/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs b/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs index 931b2623e..765de7aa7 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GreatPosterWall.cs @@ -168,16 +168,22 @@ public class GreatPosterWallParser : GazelleParser { foreach (var torrent in result.Torrents) { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (_settings.UseFreeleechToken && !torrent.CanUseToken) + { + continue; + } + var infoUrl = GetInfoUrl(result.GroupId.ToString(), torrent.TorrentId); var time = DateTime.SpecifyKind(torrent.Time, DateTimeKind.Unspecified); var release = new TorrentInfo { - Title = WebUtility.HtmlDecode(torrent.FileName).Trim(), Guid = infoUrl, InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(torrent.TorrentId, !torrent.IsFreeleech && !torrent.IsNeutralLeech && !torrent.IsPersonalFreeleech), + Title = WebUtility.HtmlDecode(torrent.FileName).Trim(), PosterUrl = GetPosterUrl(result.Cover), - DownloadUrl = GetDownloadUrl(torrent.TorrentId, torrent.CanUseToken), PublishDate = new DateTimeOffset(time, TimeSpan.FromHours(8)).UtcDateTime, // Time is Chinese Time, add 8 hours difference from UTC Categories = ParseCategories(torrent), Size = torrent.Size, diff --git a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs index c5131907f..67f8ff55a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Orpheus.cs @@ -276,6 +276,12 @@ namespace NzbDrone.Core.Indexers.Definitions { foreach (var torrent in result.Torrents) { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (_settings.UseFreeleechToken && !torrent.CanUseToken) + { + continue; + } + var id = torrent.TorrentId; var title = GetTitle(result, torrent); @@ -285,7 +291,7 @@ namespace NzbDrone.Core.Indexers.Definitions { Guid = infoUrl, InfoUrl = infoUrl, - DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken), + DownloadUrl = GetDownloadUrl(id, !torrent.IsFreeLeech && !torrent.IsNeutralLeech && !torrent.IsPersonalFreeLeech), Title = WebUtility.HtmlDecode(title), Artist = WebUtility.HtmlDecode(result.Artist), Album = WebUtility.HtmlDecode(result.GroupName), @@ -320,16 +326,22 @@ namespace NzbDrone.Core.Indexers.Definitions // Non-Audio files are formatted a little differently (1:1 for group and torrents) else { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (_settings.UseFreeleechToken && !result.CanUseToken) + { + continue; + } + var id = result.TorrentId; var infoUrl = GetInfoUrl(result.GroupId, id); var release = new TorrentInfo { Guid = infoUrl, + InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(id, !result.IsFreeLeech && !result.IsNeutralLeech && !result.IsPersonalFreeLeech), Title = WebUtility.HtmlDecode(result.GroupName), Size = long.Parse(result.Size), - DownloadUrl = GetDownloadUrl(id, result.CanUseToken), - InfoUrl = infoUrl, Seeders = int.Parse(result.Seeders), Peers = int.Parse(result.Leechers) + int.Parse(result.Seeders), PublishDate = long.TryParse(result.GroupTime, out var num) ? DateTimeOffset.FromUnixTimeSeconds(num).UtcDateTime : DateTimeUtil.FromFuzzyTime(result.GroupTime), diff --git a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs index 68133a087..2af30fb10 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Redacted.cs @@ -247,6 +247,12 @@ namespace NzbDrone.Core.Indexers.Definitions { foreach (var torrent in result.Torrents) { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (_settings.UseFreeleechToken && !torrent.CanUseToken) + { + continue; + } + // skip non-freeload results when freeload only is set if (_settings.FreeloadOnly && !torrent.IsFreeload) { @@ -262,7 +268,7 @@ namespace NzbDrone.Core.Indexers.Definitions { Guid = infoUrl, InfoUrl = infoUrl, - DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken && !torrent.IsFreeload), + DownloadUrl = GetDownloadUrl(id, !torrent.IsFreeLeech && !torrent.IsNeutralLeech && !torrent.IsFreeload && !torrent.IsPersonalFreeLeech), Title = WebUtility.HtmlDecode(title), Artist = WebUtility.HtmlDecode(result.Artist), Album = WebUtility.HtmlDecode(result.GroupName), @@ -297,6 +303,12 @@ namespace NzbDrone.Core.Indexers.Definitions // Non-Audio files are formatted a little differently (1:1 for group and torrents) else { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (_settings.UseFreeleechToken && !result.CanUseToken) + { + continue; + } + // skip non-freeload results when freeload only is set if (_settings.FreeloadOnly && !result.IsFreeload) { @@ -309,10 +321,10 @@ namespace NzbDrone.Core.Indexers.Definitions var release = new TorrentInfo { Guid = infoUrl, + InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(id, !result.IsFreeLeech && !result.IsNeutralLeech && !result.IsFreeload && !result.IsPersonalFreeLeech), Title = WebUtility.HtmlDecode(result.GroupName), Size = long.Parse(result.Size), - DownloadUrl = GetDownloadUrl(id, result.CanUseToken && !result.IsFreeload), - InfoUrl = infoUrl, Seeders = int.Parse(result.Seeders), Peers = int.Parse(result.Leechers) + int.Parse(result.Seeders), PublishDate = DateTimeOffset.FromUnixTimeSeconds(ParseUtil.CoerceLong(result.GroupTime)).UtcDateTime, diff --git a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs index 53b688450..1daa4b4f8 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs @@ -113,14 +113,14 @@ public class SecretCinemaParser : IParseIndexerResponse var release = new TorrentInfo { Guid = $"SecretCinema-{id}", + InfoUrl = GetInfoUrl(result.GroupId, id), + DownloadUrl = GetDownloadUrl(id), Title = title, Container = torrent.Encoding, Files = torrent.FileCount, Grabs = torrent.Snatches, Codec = torrent.Format, Size = long.Parse(torrent.Size), - DownloadUrl = GetDownloadUrl(id), - InfoUrl = GetInfoUrl(result.GroupId, id), Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), PublishDate = new DateTimeOffset(time, TimeSpan.FromHours(2)).UtcDateTime, @@ -173,10 +173,10 @@ public class SecretCinemaParser : IParseIndexerResponse var release = new TorrentInfo { Guid = $"SecretCinema-{id}", + InfoUrl = GetInfoUrl(result.GroupId, id), + DownloadUrl = GetDownloadUrl(id), Title = groupName, Size = long.Parse(result.Size), - DownloadUrl = GetDownloadUrl(id), - InfoUrl = GetInfoUrl(result.GroupId, id), Seeders = int.Parse(result.Seeders), Peers = int.Parse(result.Leechers) + int.Parse(result.Seeders), Files = result.FileCount, From 6a9e27bc06ed62a431814978b3c1a87b520bab89 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 5 Apr 2024 23:11:03 -0700 Subject: [PATCH 534/964] Fixed: Sending ntfy.sh notifications with unicode characters (cherry picked from commit a169ebff2adda5c8585c6aae6249b1c1f7c12264) --- src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs b/src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs index e05dcb755..c336dafd7 100644 --- a/src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs +++ b/src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs @@ -1,7 +1,6 @@ using System; using System.Linq; using System.Net; - using FluentValidation.Results; using NLog; using NzbDrone.Common.Extensions; @@ -112,18 +111,18 @@ namespace NzbDrone.Core.Notifications.Ntfy { try { - requestBuilder.Headers.Add("X-Title", title); - requestBuilder.Headers.Add("X-Message", message); - requestBuilder.Headers.Add("X-Priority", settings.Priority.ToString()); + requestBuilder.AddQueryParam("title", title); + requestBuilder.AddQueryParam("message", message); + requestBuilder.AddQueryParam("priority", settings.Priority.ToString()); if (settings.Tags.Any()) { - requestBuilder.Headers.Add("X-Tags", settings.Tags.Join(",")); + requestBuilder.AddQueryParam("tags", settings.Tags.Join(",")); } if (!settings.ClickUrl.IsNullOrWhiteSpace()) { - requestBuilder.Headers.Add("X-Click", settings.ClickUrl); + requestBuilder.AddQueryParam("click", settings.ClickUrl); } if (!settings.AccessToken.IsNullOrWhiteSpace()) From fe35d450f093e0b29960ac579751ed5f16fe80fe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 6 Apr 2024 21:36:58 +0300 Subject: [PATCH 535/964] Use info urls as guid and add remaster name to title for SecretCinema --- .../Indexers/Definitions/SecretCinema.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs index 1daa4b4f8..1950974c0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs @@ -104,6 +104,7 @@ public class SecretCinemaParser : IParseIndexerResponse foreach (var torrent in result.Torrents) { var id = torrent.TorrentId; + var infoUrl = GetInfoUrl(result.GroupId, id); // in SC movies, artist=director and GroupName=title var artist = WebUtility.HtmlDecode(result.Artist); @@ -112,8 +113,8 @@ public class SecretCinemaParser : IParseIndexerResponse var release = new TorrentInfo { - Guid = $"SecretCinema-{id}", - InfoUrl = GetInfoUrl(result.GroupId, id), + Guid = infoUrl, + InfoUrl = infoUrl, DownloadUrl = GetDownloadUrl(id), Title = title, Container = torrent.Encoding, @@ -143,7 +144,12 @@ public class SecretCinemaParser : IParseIndexerResponse { // Remove director from title // SC API returns no more useful information than this - release.Title = $"{title} ({result.GroupYear}) {torrent.Media}"; + release.Title = $"{title} ({result.GroupYear}) {torrent.Media}".Trim(); + + if (torrent.RemasterTitle.IsNotNullOrWhiteSpace()) + { + release.Title += $" [{torrent.RemasterTitle.Trim()}]"; + } // Replace media formats with standards release.Title = Regex.Replace(release.Title, @"\bBDMV\b", "COMPLETE BLURAY", RegexOptions.IgnoreCase); @@ -168,12 +174,13 @@ public class SecretCinemaParser : IParseIndexerResponse else { var id = result.TorrentId; + var infoUrl = GetInfoUrl(result.GroupId, id); var groupName = WebUtility.HtmlDecode(result.GroupName); var release = new TorrentInfo { - Guid = $"SecretCinema-{id}", - InfoUrl = GetInfoUrl(result.GroupId, id), + Guid = infoUrl, + InfoUrl = infoUrl, DownloadUrl = GetDownloadUrl(id), Title = groupName, Size = long.Parse(result.Size), @@ -209,7 +216,7 @@ public class SecretCinemaParser : IParseIndexerResponse private bool IsAnyMovieCategory(ICollection category) { - return category.Contains(NewznabStandardCategory.Movies) || NewznabStandardCategory.Movies.SubCategories.Any(subCat => category.Contains(subCat)); + return category.Contains(NewznabStandardCategory.Movies) || NewznabStandardCategory.Movies.SubCategories.Any(category.Contains); } private string GetDownloadUrl(int torrentId) From 37a6d03d52fbe3c24e860f440326cedc765a567e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 7 Apr 2024 01:37:26 +0300 Subject: [PATCH 536/964] Fixed: (XSpeeds) Update categories Co-authored-by: Garfield69 --- src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs index 99efc2ecc..381441434 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs @@ -120,6 +120,7 @@ public class XSpeeds : TorrentIndexerBase caps.Categories.AddCategoryMapping(113, NewznabStandardCategory.TVAnime, "Anime Boxsets"); caps.Categories.AddCategoryMapping(112, NewznabStandardCategory.MoviesOther, "Anime Movies"); caps.Categories.AddCategoryMapping(111, NewznabStandardCategory.MoviesOther, "Anime TV"); + caps.Categories.AddCategoryMapping(150, NewznabStandardCategory.PC, "Apps"); caps.Categories.AddCategoryMapping(80, NewznabStandardCategory.AudioAudiobook, "Audiobooks"); caps.Categories.AddCategoryMapping(48, NewznabStandardCategory.Books, "Books Magazines"); caps.Categories.AddCategoryMapping(68, NewznabStandardCategory.MoviesOther, "Cams/TS"); @@ -154,7 +155,7 @@ public class XSpeeds : TorrentIndexerBase caps.Categories.AddCategoryMapping(13, NewznabStandardCategory.Audio, "Music"); caps.Categories.AddCategoryMapping(135, NewznabStandardCategory.AudioLossless, "Music/FLAC"); caps.Categories.AddCategoryMapping(136, NewznabStandardCategory.Audio, "Music Boxset"); - caps.Categories.AddCategoryMapping(15, NewznabStandardCategory.AudioVideo, "Music Videos"); + caps.Categories.AddCategoryMapping(148, NewznabStandardCategory.AudioVideo, "Music Videos"); caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.Other, "Other"); caps.Categories.AddCategoryMapping(125, NewznabStandardCategory.Other, "Other/Pictures"); caps.Categories.AddCategoryMapping(54, NewznabStandardCategory.TVOther, "Soaps"); @@ -168,6 +169,7 @@ public class XSpeeds : TorrentIndexerBase caps.Categories.AddCategoryMapping(86, NewznabStandardCategory.TVSport, "Sports/MotorSports"); caps.Categories.AddCategoryMapping(89, NewznabStandardCategory.TVSport, "Sports/Olympics"); caps.Categories.AddCategoryMapping(126, NewznabStandardCategory.TV, "TV"); + caps.Categories.AddCategoryMapping(149, NewznabStandardCategory.TV, "TV Specials"); caps.Categories.AddCategoryMapping(127, NewznabStandardCategory.TVUHD, "TV 4K"); caps.Categories.AddCategoryMapping(129, NewznabStandardCategory.TVHD, "TV HD"); caps.Categories.AddCategoryMapping(130, NewznabStandardCategory.TVHD, "TV HEVC"); From 292af28d4274306bea6468bf1529d47cf89508f5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 7 Apr 2024 07:59:28 +0300 Subject: [PATCH 537/964] Bump version to 1.16.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fdbc1e75a..4955d0476 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.16.0' + majorVersion: '1.16.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 6581bddba328a9281b62c158628b47702f29fa2e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 8 Apr 2024 21:44:07 +0300 Subject: [PATCH 538/964] Detect shfs mounts --- src/NzbDrone.Mono/Disk/FindDriveType.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Mono/Disk/FindDriveType.cs b/src/NzbDrone.Mono/Disk/FindDriveType.cs index d0481c3d4..08cc611de 100644 --- a/src/NzbDrone.Mono/Disk/FindDriveType.cs +++ b/src/NzbDrone.Mono/Disk/FindDriveType.cs @@ -6,15 +6,16 @@ namespace NzbDrone.Mono.Disk { public static class FindDriveType { - private static readonly Dictionary DriveTypeMap = new Dictionary - { - { "afpfs", DriveType.Network }, - { "apfs", DriveType.Fixed }, - { "fuse.mergerfs", DriveType.Fixed }, - { "fuse.glusterfs", DriveType.Network }, - { "nullfs", DriveType.Fixed }, - { "zfs", DriveType.Fixed } - }; + private static readonly Dictionary DriveTypeMap = new () + { + { "afpfs", DriveType.Network }, + { "apfs", DriveType.Fixed }, + { "fuse.mergerfs", DriveType.Fixed }, + { "fuse.shfs", DriveType.Fixed }, + { "fuse.glusterfs", DriveType.Network }, + { "nullfs", DriveType.Fixed }, + { "zfs", DriveType.Fixed } + }; public static DriveType Find(string driveFormat) { From 5096a088d42594adc7a724a082d7bb31b631665c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 9 Apr 2024 04:49:27 +0300 Subject: [PATCH 539/964] Fixed: (IPTorrents) Improve category selector --- src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs index 1156b56e3..305335761 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs @@ -333,7 +333,7 @@ namespace NzbDrone.Core.Indexers.Definitions var publishDate = DateTimeUtil.FromTimeAgo(dateSplit.First()); var description = descrSplit.Length > 1 ? "Tags: " + descrSplit.First().Trim() : ""; - var catIcon = row.QuerySelector("td:nth-of-type(1) a"); + var catIcon = row.QuerySelector("td:nth-of-type(1) a[href^=\"?\"]"); if (catIcon == null) { // Torrents - Category column == Text or Code @@ -342,7 +342,7 @@ namespace NzbDrone.Core.Indexers.Definitions } // Torrents - Category column == Icons - var cat = _categories.MapTrackerCatToNewznab(catIcon.GetAttribute("href").Substring(1)); + var cat = _categories.MapTrackerCatToNewznab(catIcon.GetAttribute("href")?.Substring(1)); var size = ParseUtil.GetBytes(row.Children[sizeIndex].TextContent); From 4f6e05414caa5306975aa8b925dc70054d9daedf Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:30:26 -0500 Subject: [PATCH 540/964] Drop beta (Preview) from login meta description (#2097) --- frontend/src/login.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/login.html b/frontend/src/login.html index 4ce1031eb..c3773b641 100644 --- a/frontend/src/login.html +++ b/frontend/src/login.html @@ -14,7 +14,7 @@ - + Date: Tue, 9 Apr 2024 18:07:14 +0300 Subject: [PATCH 541/964] Fixed: Matching at least 2 terms in the filter releases by query --- src/NzbDrone.Core/Indexers/IndexerBase.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/IndexerBase.cs b/src/NzbDrone.Core/Indexers/IndexerBase.cs index 5acbba5dd..1caed03b3 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBase.cs @@ -171,10 +171,15 @@ namespace NzbDrone.Core.Indexers var splitRegex = new Regex("[^\\w]+"); // split search term to individual terms for less aggressive filtering, filter common terms - var terms = splitRegex.Split(searchCriteria.SearchTerm).Where(t => t.IsNotNullOrWhiteSpace() && t.Length > 1 && !commonWords.ContainsIgnoreCase(t)); + var terms = splitRegex.Split(searchCriteria.SearchTerm).Where(t => t.IsNotNullOrWhiteSpace() && t.Length > 1 && !commonWords.ContainsIgnoreCase(t)).ToArray(); // check in title and description for any term searched for - releases = releases.Where(r => terms.Any(t => (r.Title.IsNotNullOrWhiteSpace() && r.Title.ContainsIgnoreCase(t)) || (r.Description.IsNotNullOrWhiteSpace() && r.Description.ContainsIgnoreCase(t)))).ToList(); + releases = releases.Where(r => + { + var matches = terms.Where(t => (r.Title.IsNotNullOrWhiteSpace() && r.Title.ContainsIgnoreCase(t)) || (r.Description.IsNotNullOrWhiteSpace() && r.Description.ContainsIgnoreCase(t))); + + return terms.Length > 1 ? matches.Skip(1).Any() : matches.Any(); + }).ToList(); } return releases; From 8af6ea1d8f5ba7fb759d659232d8475015d1d7fd Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 9 Apr 2024 21:29:05 +0300 Subject: [PATCH 542/964] New: Retry on failed indexer requests --- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 38 ++++++++++++++++++- src/NzbDrone.Core/Prowlarr.Core.csproj | 1 + 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index 94752c7df..8e7f0fc1e 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -18,6 +18,8 @@ using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser.Model; +using Polly; +using Polly.Retry; namespace NzbDrone.Core.Indexers { @@ -28,6 +30,38 @@ namespace NzbDrone.Core.Indexers protected readonly IIndexerHttpClient _httpClient; protected readonly IEventAggregator _eventAggregator; + + protected ResiliencePipeline RetryStrategy => new ResiliencePipelineBuilder() + .AddRetry(new RetryStrategyOptions + { + ShouldHandle = static args => args.Outcome switch + { + { Result.HasHttpServerError: true } => PredicateResult.True(), + { Result.StatusCode: HttpStatusCode.RequestTimeout } => PredicateResult.True(), + _ => PredicateResult.False() + }, + Delay = RateLimit, + MaxRetryAttempts = 2, + BackoffType = DelayBackoffType.Exponential, + UseJitter = true, + OnRetry = args => + { + var exception = args.Outcome.Exception; + + if (exception is not null) + { + _logger.Warn(exception, "Request for {0} failed with exception '{1}'. Retrying in {2}s.", Definition.Name, exception.Message, args.RetryDelay.TotalSeconds); + } + else + { + _logger.Warn("Request for {0} failed with status {1}. Retrying in {2}s.", Definition.Name, args.Outcome.Result?.StatusCode, args.RetryDelay.TotalSeconds); + } + + return default; + } + }) + .Build(); + public IDictionary Cookies { get; set; } public override bool SupportsRss => true; @@ -584,7 +618,9 @@ namespace NzbDrone.Core.Indexers request.HttpRequest.SuppressHttpError = true; request.HttpRequest.Encoding ??= Encoding; - var response = await _httpClient.ExecuteProxiedAsync(request.HttpRequest, Definition); + var response = await RetryStrategy + .ExecuteAsync(static async (state, _) => await state._httpClient.ExecuteProxiedAsync(state.HttpRequest, state.Definition), (_httpClient, request.HttpRequest, Definition)) + .ConfigureAwait(false); // Check response to see if auth is needed, if needed try again if (CheckIfLoginNeeded(response)) diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index b9ab1d826..29ef56865 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -10,6 +10,7 @@ + From a84210c4529692fbc53d37b8a9df8302b7912b1c Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 4 Apr 2024 11:58:52 +0000 Subject: [PATCH 543/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Michael5564445 Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/uk.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 5789a3fb5..3df8eb6a4 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -360,7 +360,7 @@ "DeleteAppProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?", "RecentChanges": "Останні зміни", "minutes": "Хвилин", - "WhatsNew": "Що нового?", + "WhatsNew": "Що нового ?", "NotificationStatusAllClientHealthCheckMessage": "Усі списки недоступні через помилки", "NotificationStatusSingleClientHealthCheckMessage": "Списки недоступні через помилки: {notificationNames}", "AuthBasic": "Основний (спливаюче вікно браузера)", @@ -388,5 +388,13 @@ "ApplyChanges": "Застосувати зміни", "AuthenticationMethod": "Метод автентифікації", "AuthenticationMethodHelpTextWarning": "Виберіть дійсний метод автентифікації", - "AppUpdated": "{appName} Оновлено" + "AppUpdated": "{appName} Оновлено", + "Album": "Альбом", + "AuthenticationRequired": "Потрібна Автентифікація", + "AuthenticationRequiredPasswordHelpTextWarning": "Введіть новий пароль", + "AuthenticationRequiredUsernameHelpTextWarning": "Введіть нове ім'я користувача", + "Artist": "Виконавець", + "Yes": "Так", + "AuthenticationRequiredWarning": "Щоб запобігти віддаленому доступу без автентифікації, {appName} тепер вимагає ввімкнення автентифікації. За бажанням можна вимкнути автентифікацію з локальних адрес.", + "AppUpdatedVersion": "{appName} оновлено до версії `{version}`. Щоб отримати останні зміни, потрібно перезавантажити {appName}" } From 61bc35b3fa9c3e44ffeaa9ea9b0c92a98a762c50 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 9 Apr 2024 16:12:20 -0700 Subject: [PATCH 544/964] New: Option to prefix app name on Telegram notification titles (cherry picked from commit 37863a8deb339ef730b2dd5be61e1da1311fdd23) --- src/NzbDrone.Core/Localization/Core/en.json | 2 ++ .../Notifications/Telegram/Telegram.cs | 16 ++++++++++++---- .../Notifications/Telegram/TelegramService.cs | 3 ++- .../Notifications/Telegram/TelegramSettings.cs | 3 +++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 3a88c6e8d..f8ef93533 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -495,6 +495,8 @@ "Notifications": "Notifications", "NotificationsEmailSettingsUseEncryption": "Use Encryption", "NotificationsEmailSettingsUseEncryptionHelpText": "Whether to prefer using encryption if configured on the server, to always use encryption via SSL (Port 465 only) or StartTLS (any other port) or to never use encryption", + "NotificationsTelegramSettingsIncludeAppName": "Include {appName} in Title", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Optionally prefix message title with {appName} to differentiate notifications from different applications", "OAuthPopupMessage": "Pop-ups are being blocked by your browser", "Ok": "Ok", "OnApplicationUpdate": "On Application Update", diff --git a/src/NzbDrone.Core/Notifications/Telegram/Telegram.cs b/src/NzbDrone.Core/Notifications/Telegram/Telegram.cs index 6cf9b97e0..916aa6312 100644 --- a/src/NzbDrone.Core/Notifications/Telegram/Telegram.cs +++ b/src/NzbDrone.Core/Notifications/Telegram/Telegram.cs @@ -18,22 +18,30 @@ namespace NzbDrone.Core.Notifications.Telegram public override void OnGrab(GrabMessage message) { - _proxy.SendNotification(RELEASE_GRABBED_TITLE, message.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? RELEASE_GRABBED_TITLE_BRANDED : RELEASE_GRABBED_TITLE; + + _proxy.SendNotification(title, message.Message, Settings); } public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) { - _proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? HEALTH_ISSUE_TITLE_BRANDED : HEALTH_ISSUE_TITLE; + + _proxy.SendNotification(title, healthCheck.Message, Settings); } public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck) { - _proxy.SendNotification(HEALTH_RESTORED_TITLE, $"The following issue is now resolved: {previousCheck.Message}", Settings); + var title = Settings.IncludeAppNameInTitle ? HEALTH_RESTORED_TITLE_BRANDED : HEALTH_RESTORED_TITLE; + + _proxy.SendNotification(title, $"The following issue is now resolved: {previousCheck.Message}", Settings); } public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage) { - _proxy.SendNotification(APPLICATION_UPDATE_TITLE, updateMessage.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? APPLICATION_UPDATE_TITLE_BRANDED : APPLICATION_UPDATE_TITLE; + + _proxy.SendNotification(title, updateMessage.Message, Settings); } public override ValidationResult Test() diff --git a/src/NzbDrone.Core/Notifications/Telegram/TelegramService.cs b/src/NzbDrone.Core/Notifications/Telegram/TelegramService.cs index ec17ad4aa..ca235da3b 100644 --- a/src/NzbDrone.Core/Notifications/Telegram/TelegramService.cs +++ b/src/NzbDrone.Core/Notifications/Telegram/TelegramService.cs @@ -49,10 +49,11 @@ namespace NzbDrone.Core.Notifications.Telegram { try { + const string brandedTitle = "Prowlarr - Test Notification"; const string title = "Test Notification"; const string body = "This is a test message from Prowlarr"; - SendNotification(title, body, settings); + SendNotification(settings.IncludeAppNameInTitle ? brandedTitle : title, body, settings); } catch (Exception ex) { diff --git a/src/NzbDrone.Core/Notifications/Telegram/TelegramSettings.cs b/src/NzbDrone.Core/Notifications/Telegram/TelegramSettings.cs index 774fd4ca0..4ff40ae93 100644 --- a/src/NzbDrone.Core/Notifications/Telegram/TelegramSettings.cs +++ b/src/NzbDrone.Core/Notifications/Telegram/TelegramSettings.cs @@ -32,6 +32,9 @@ namespace NzbDrone.Core.Notifications.Telegram [FieldDefinition(3, Label = "Send Silently", Type = FieldType.Checkbox, HelpText = "Sends the message silently. Users will receive a notification with no sound")] public bool SendSilently { get; set; } + [FieldDefinition(4, Label = "NotificationsTelegramSettingsIncludeAppName", Type = FieldType.Checkbox, HelpText = "NotificationsTelegramSettingsIncludeAppNameHelpText")] + public bool IncludeAppNameInTitle { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); From c957168040853787057058f34a0c2a1dfdc54b87 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Tue, 9 Apr 2024 16:12:58 -0700 Subject: [PATCH 545/964] Add DevContainer, VSCode config and extensions.json (cherry picked from commit 5061dc4b5e5ea9925740496a5939a1762788b793) --- .devcontainer/devcontainer.json | 19 ++++++++++++++ .github/dependabot.yml | 12 +++++++++ .gitignore | 1 + .vscode/extensions.json | 7 ++++++ .vscode/launch.json | 26 +++++++++++++++++++ .vscode/tasks.json | 44 +++++++++++++++++++++++++++++++++ src/Directory.Build.props | 34 +++++++++++++++++++++++-- 7 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .github/dependabot.yml create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..70473224d --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet +{ + "name": "Prowlarr", + "image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "nodeGypDependencies": true, + "version": "16", + "nvmVersion": "latest" + } + }, + "forwardPorts": [9696], + "customizations": { + "vscode": { + "extensions": ["esbenp.prettier-vscode"] + } + } +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..f33a02cd1 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for more information: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +# https://containers.dev/guide/dependabot + +version: 2 +updates: + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly diff --git a/.gitignore b/.gitignore index d903078ef..689b44415 100644 --- a/.gitignore +++ b/.gitignore @@ -127,6 +127,7 @@ coverage*.xml coverage*.json setup/Output/ *.~is +.mono # VS outout folders bin diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..7a36fefe1 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "ms-dotnettools.csdevkit", + "ms-vscode-remote.remote-containers" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..d13f9426e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md + "name": "Run Prowlarr", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build dotnet", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/_output/net6.0/Prowlarr", + "args": [], + "cwd": "${workspaceFolder}", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "integratedTerminal", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..b3e22f6d1 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,44 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build dotnet", + "command": "dotnet", + "type": "process", + "args": [ + "msbuild", + "-restore", + "${workspaceFolder}/src/Prowlarr.sln", + "-p:GenerateFullPaths=true", + "-p:Configuration=Debug", + "-p:Platform=Posix", + "-consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/src/Prowlarr.sln", + "-property:GenerateFullPaths=true", + "-consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/src/Prowlarr.sln" + ], + "problemMatcher": "$msCompile" + } + ] +} diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a926a45d4..27d2dd813 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -144,16 +144,46 @@ + + + + + x64 + + + + + x86 + + + + + arm64 + + + + + arm + + + + + + + + + <_UsingDefaultRuntimeIdentifier>true - win-x64 + win-$(Architecture) <_UsingDefaultRuntimeIdentifier>true - linux-x64 + linux-$(Architecture) (); - var firstTorrentInfo = releases.ElementAt(2) as TorrentInfo; + var firstTorrentInfo = releases.ElementAt(3) as TorrentInfo; firstTorrentInfo.Title.Should().Be("[SubsPlease] One Piece: The Great Gold Pirate - 1059 [Web][MKV][h264][720p][AAC 2.0][Softsubs (SubsPlease)][Episode 1059]"); firstTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); @@ -66,7 +66,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AnimeBytesTests firstTorrentInfo.Files.Should().Be(1); firstTorrentInfo.MinimumSeedTime.Should().Be(259200); - var secondTorrentInfo = releases.ElementAt(16) as TorrentInfo; + var secondTorrentInfo = releases.ElementAt(20) as TorrentInfo; secondTorrentInfo.Title.Should().Be("[GHOST] BLEACH S03 [Blu-ray][MKV][h265 10-bit][1080p][AC3 2.0][Dual Audio][Softsubs (GHOST)]"); secondTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); @@ -84,7 +84,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AnimeBytesTests secondTorrentInfo.Files.Should().Be(22); secondTorrentInfo.MinimumSeedTime.Should().Be(655200); - var thirdTorrentInfo = releases.ElementAt(18) as TorrentInfo; + var thirdTorrentInfo = releases.ElementAt(23) as TorrentInfo; thirdTorrentInfo.Title.Should().Be("[Polarwindz] Cowboy Bebop: Tengoku no Tobira 2001 [Blu-ray][MKV][h265 10-bit][1080p][Opus 5.1][Softsubs (Polarwindz)]"); thirdTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); @@ -102,7 +102,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AnimeBytesTests thirdTorrentInfo.Files.Should().Be(1); thirdTorrentInfo.MinimumSeedTime.Should().Be(475200); - var fourthTorrentInfo = releases.ElementAt(3) as TorrentInfo; + var fourthTorrentInfo = releases.ElementAt(5) as TorrentInfo; fourthTorrentInfo.Title.Should().Be("[SubsPlease] Dr. STONE: NEW WORLD S03E03 - 03 [Web][MKV][h264][720p][AAC 2.0][Softsubs (SubsPlease)][Episode 3]"); fourthTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); @@ -120,7 +120,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AnimeBytesTests fourthTorrentInfo.Files.Should().Be(1); fourthTorrentInfo.MinimumSeedTime.Should().Be(259200); - var fifthTorrentInfo = releases.ElementAt(23) as TorrentInfo; + var fifthTorrentInfo = releases.ElementAt(28) as TorrentInfo; fifthTorrentInfo.Title.Should().Be("[-ZR-] Dr. STONE: STONE WARS S02 [Web][MKV][h264][1080p][AAC 2.0][Dual Audio][Softsubs (-ZR-)]"); fifthTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); @@ -138,7 +138,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AnimeBytesTests fifthTorrentInfo.Files.Should().Be(11); fifthTorrentInfo.MinimumSeedTime.Should().Be(529200); - var sixthTorrentInfo = releases.ElementAt(31) as TorrentInfo; + var sixthTorrentInfo = releases.ElementAt(37) as TorrentInfo; sixthTorrentInfo.Title.Should().Be("[HorribleSubs] Dr. STONE S01 [Web][MKV][h264][720p][AAC 2.0][Softsubs (HorribleSubs)]"); sixthTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); From a48d6029d9b1e5724110fd01dbe04066c8cd8db2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 13 Apr 2024 09:48:33 +0300 Subject: [PATCH 548/964] Show releases with issues in the interactive search --- src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs | 5 +++++ src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index 86fc836c7..b87d12403 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -467,6 +467,11 @@ namespace NzbDrone.Core.Indexers.Definitions // Ignore these categories as they'll cause hell with the matcher // TV Special, DVD Special, BD Special + if (groupName is "TV Special" or "DVD Special" or "BD Special") + { + continue; + } + if (groupName is "TV Series" or "OVA" or "ONA") { categories = new List { NewznabStandardCategory.TVAnime }; diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index 8e7f0fc1e..a8280f3ff 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -397,7 +397,7 @@ namespace NzbDrone.Core.Indexers } } - releases.AddRange(pagedReleases.Where(IsValidRelease)); + releases.AddRange(pagedReleases.Where(r => IsValidRelease(r, searchCriteria.InteractiveSearch))); } if (releases.Any()) @@ -503,7 +503,7 @@ namespace NzbDrone.Core.Indexers return Capabilities ?? ((IndexerDefinition)Definition).Capabilities; } - protected virtual bool IsValidRelease(ReleaseInfo release) + protected virtual bool IsValidRelease(ReleaseInfo release, bool interactiveSearch = false) { if (release.Title.IsNullOrWhiteSpace()) { @@ -512,6 +512,12 @@ namespace NzbDrone.Core.Indexers return false; } + if (interactiveSearch) + { + // Show releases with issues in the interactive search + return true; + } + if (release.Size == null) { _logger.Warn("Invalid Release: '{0}' from indexer: {1}. No size provided.", release.Title, Definition.Name); From 94634234ffb1e8a2e9d7eaa5ec0951c70cb2e166 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 13 Apr 2024 23:33:30 +0300 Subject: [PATCH 549/964] Update categories for M-Team TP --- src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs b/src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs index d2db162be..2be146ddc 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MTeamTp.cs @@ -139,7 +139,9 @@ public class MTeamTp : TorrentIndexerBase caps.Categories.AddCategoryMapping(407, NewznabStandardCategory.TVSport, "Sports(運動)"); caps.Categories.AddCategoryMapping(422, NewznabStandardCategory.PC0day, "Software(軟體)"); caps.Categories.AddCategoryMapping(423, NewznabStandardCategory.PCGames, "PCGame(PC遊戲)"); - caps.Categories.AddCategoryMapping(427, NewznabStandardCategory.Books, "eBook(電子書)"); + caps.Categories.AddCategoryMapping(427, NewznabStandardCategory.BooksEBook, "Study/Edu ebook(教育書面)"); + caps.Categories.AddCategoryMapping(441, NewznabStandardCategory.BooksOther, "Study/Edu video(教育影片)"); + caps.Categories.AddCategoryMapping(442, NewznabStandardCategory.AudioAudiobook, "Study/Edu audio(教育音檔)"); caps.Categories.AddCategoryMapping(409, NewznabStandardCategory.Other, "Misc(其他)"); // music From e3e9094d426e78097f304ebdd6fc408ac3053267 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 14 Apr 2024 08:37:49 +0300 Subject: [PATCH 550/964] Bump version to 1.16.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4955d0476..8591c4b97 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.16.1' + majorVersion: '1.16.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 09af2da6b955198b5b80a229bf65bdd2d0413979 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 15 Apr 2024 05:43:52 +0300 Subject: [PATCH 551/964] Fixed: Re-testing edited providers will forcibly test them --- .../Creators/createTestProviderHandler.js | 24 +++++++++++++++++-- src/Prowlarr.Api.V1/ProviderControllerBase.cs | 4 ++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/frontend/src/Store/Actions/Creators/createTestProviderHandler.js b/frontend/src/Store/Actions/Creators/createTestProviderHandler.js index ca26883fb..e35157dbd 100644 --- a/frontend/src/Store/Actions/Creators/createTestProviderHandler.js +++ b/frontend/src/Store/Actions/Creators/createTestProviderHandler.js @@ -1,8 +1,11 @@ +import $ from 'jquery'; +import _ from 'lodash'; import createAjaxRequest from 'Utilities/createAjaxRequest'; import getProviderState from 'Utilities/State/getProviderState'; import { set } from '../baseActions'; const abortCurrentRequests = {}; +let lastTestData = null; export function createCancelTestProviderHandler(section) { return function(getState, payload, dispatch) { @@ -17,10 +20,25 @@ function createTestProviderHandler(section, url) { return function(getState, payload, dispatch) { dispatch(set({ section, isTesting: true })); - const testData = getProviderState(payload, getState, section); + const { + queryParams = {}, + ...otherPayload + } = payload; + + const testData = getProviderState({ ...otherPayload }, getState, section); + const params = { ...queryParams }; + + // If the user is re-testing the same provider without changes + // force it to be tested. + + if (_.isEqual(testData, lastTestData)) { + params.forceTest = true; + } + + lastTestData = testData; const ajaxOptions = { - url: `${url}/test`, + url: `${url}/test?${$.param(params, true)}`, method: 'POST', contentType: 'application/json', dataType: 'json', @@ -32,6 +50,8 @@ function createTestProviderHandler(section, url) { abortCurrentRequests[section] = abortRequest; request.done((data) => { + lastTestData = null; + dispatch(set({ section, isTesting: false, diff --git a/src/Prowlarr.Api.V1/ProviderControllerBase.cs b/src/Prowlarr.Api.V1/ProviderControllerBase.cs index f65b916bb..80976c3ae 100644 --- a/src/Prowlarr.Api.V1/ProviderControllerBase.cs +++ b/src/Prowlarr.Api.V1/ProviderControllerBase.cs @@ -197,9 +197,9 @@ namespace Prowlarr.Api.V1 [SkipValidation(true, false)] [HttpPost("test")] [Consumes("application/json")] - public object Test([FromBody] TProviderResource providerResource) + public object Test([FromBody] TProviderResource providerResource, [FromQuery] bool forceTest = false) { - var providerDefinition = GetDefinition(providerResource, true, true, true); + var providerDefinition = GetDefinition(providerResource, true, !forceTest, true); Test(providerDefinition, true); From e1da3eee80c6db85743f07d0426fe32d3705c6e7 Mon Sep 17 00:00:00 2001 From: Servarr Date: Tue, 16 Apr 2024 06:22:22 +0000 Subject: [PATCH 552/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index ce09e992c..fac0ac6f4 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -273,6 +273,16 @@ "tags": [ "Application" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { @@ -1202,6 +1212,16 @@ "tags": [ "DownloadClient" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { @@ -1913,6 +1933,16 @@ "tags": [ "Indexer" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { @@ -2174,6 +2204,16 @@ "tags": [ "IndexerProxy" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { @@ -3235,6 +3275,16 @@ "tags": [ "Notification" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { From 782b2d376174c7af2324efc1eb948461b5ae2119 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Fri, 12 Apr 2024 08:16:43 +0000 Subject: [PATCH 553/964] Add dev container workspace Allows the linting and style settings for the frontend to be applied even when you load the main repo as a workspace (cherry picked from commit d6278fced49b26be975c3a6039b38a94f700864b) --- .devcontainer/Prowlarr.code-workspace | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .devcontainer/Prowlarr.code-workspace diff --git a/.devcontainer/Prowlarr.code-workspace b/.devcontainer/Prowlarr.code-workspace new file mode 100644 index 000000000..a46158e44 --- /dev/null +++ b/.devcontainer/Prowlarr.code-workspace @@ -0,0 +1,13 @@ +// This file is used to open the backend and frontend in the same workspace, which is necessary as +// the frontend has vscode settings that are distinct from the backend +{ + "folders": [ + { + "path": ".." + }, + { + "path": "../frontend" + } + ], + "settings": {} +} From 21d553cf1bd6bc348afdfbe8b12fb208046de7c1 Mon Sep 17 00:00:00 2001 From: uwuceo <76777112+uwuceo@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:14:08 +0300 Subject: [PATCH 554/964] Update description for MyAnonamouse's Freeleech setting (#2103) --- src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs index d9b880b6e..e4954ec76 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs @@ -525,7 +525,7 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(3, Type = FieldType.Select, Label = "Search Type", SelectOptions = typeof(MyAnonamouseSearchType), HelpText = "Specify the desired search type")] public int SearchType { get; set; } - [FieldDefinition(4, Type = FieldType.Checkbox, Label = "Buy Freeleech Token", HelpText = "Buy personal freeleech token for download")] + [FieldDefinition(4, Type = FieldType.Checkbox, Label = "Use Freeleech Wedges", HelpText = "Use freeleech wedges to make grabbed torrents personal freeleech")] public bool Freeleech { get; set; } [FieldDefinition(5, Type = FieldType.Checkbox, Label = "Search in description", HelpText = "Search text in the description")] From 5fee2c4cd9e5dcf3a892ba8747e4cdcdad1ff603 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 20 Apr 2024 05:17:22 +0000 Subject: [PATCH 555/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Altair Co-authored-by: Anonymous Co-authored-by: Fonkio Co-authored-by: GkhnGRBZ Co-authored-by: Havok Dan Co-authored-by: Mailme Dashite Co-authored-by: Weblate Co-authored-by: fordas Co-authored-by: toeiazarothis Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/de.json | 20 +++---- src/NzbDrone.Core/Localization/Core/es.json | 10 ++-- src/NzbDrone.Core/Localization/Core/fr.json | 6 +- .../Localization/Core/pt_BR.json | 4 +- src/NzbDrone.Core/Localization/Core/tr.json | 58 +++++++++++++++---- 5 files changed, 69 insertions(+), 29 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index d373c6744..52ef727f6 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -89,15 +89,15 @@ "DeleteApplication": "Applikation löschen", "DeleteApplicationMessageText": "Wirklich die Applikation '{0}' löschen?", "DeleteBackup": "Sicherung löschen", - "DeleteBackupMessageText": "Sind Sie sicher, dass Sie die Sicherung „{name}“ löschen möchten?", + "DeleteBackupMessageText": "Soll das Backup '{name}' wirklich gelöscht werden?", "DeleteDownloadClient": "Download-Client löschen", - "DeleteDownloadClientMessageText": "Sind Sie sicher, dass Sie den Download-Client „{name}“ löschen möchten?", + "DeleteDownloadClientMessageText": "Bist du sicher, dass du den Download Client '{name}' wirklich löschen willst?", "DeleteIndexerProxy": "Indexer Proxy löschen", "DeleteIndexerProxyMessageText": "Tag '{0}' wirklich löschen?", "DeleteNotification": "Benachrichtigung löschen", - "DeleteNotificationMessageText": "Sind Sie sicher, dass Sie die Benachrichtigung „{name}“ löschen möchten?", + "DeleteNotificationMessageText": "Bist du sicher, dass du die Benachrichtigung '{name}' wirklich löschen willst?", "DeleteTag": "Tag löschen", - "DeleteTagMessageText": "Sind Sie sicher, dass Sie das Tag „{label}“ löschen möchten?", + "DeleteTagMessageText": "Bist du sicher, dass du den Tag '{label}' wirklich löschen willst?", "Description": "Beschreibung", "Details": "Einzelheiten", "DevelopmentSettings": "Entwicklungseinstellungen", @@ -216,7 +216,7 @@ "Logging": "Protokollierung", "Logs": "Protokolle", "MIA": "MIA", - "MaintenanceRelease": "Wartung: Fehlerbehebung und andere Verbesserungen. Siehe Github Commit History für weitere Details", + "MaintenanceRelease": "Maintenance Release: Fehlerbehebungen und andere Verbesserungen. Siehe Github Commit Verlauf für weitere Details", "Manual": "Manuell", "MappedDrivesRunningAsService": "Zugeordnete Netzlaufwerke sind nicht verfügbar, wenn {appName} als Windows-Dienst ausgeführt wird. Bitte lesen Sie die FAQ für weitere Informationen", "MassEditor": "Masseneditor", @@ -471,11 +471,11 @@ "NoIndexersFound": "Keine Indexer gefunden", "Theme": "Design", "Season": "Staffel", - "ApplyTagsHelpTextAdd": "Hinzufügen: Fügen Sie die Tags der vorhandenen Tag-Liste hinzu", + "ApplyTagsHelpTextAdd": "Hinzufügen: Füge Tags zu den bestehenden Tags hinzu", "ApplyTagsHelpTextHowToApplyApplications": "Wie werden Tags zu ausgewählten Autoren zugeteilt", - "ApplyTagsHelpTextHowToApplyIndexers": "So wenden Sie Tags auf die ausgewählten Indexer an", - "ApplyTagsHelpTextRemove": "Entfernen: Die eingegebenen Tags entfernen", - "ApplyTagsHelpTextReplace": "Ersetzen: Ersetzen Sie die Tags durch die eingegebenen Tags (geben Sie keine Tags ein, um alle Tags zu löschen).", + "ApplyTagsHelpTextHowToApplyIndexers": "Wie Tags zu den selektierten Indexern hinzugefügt werden können", + "ApplyTagsHelpTextRemove": "Entfernen: Entferne die hinterlegten Tags", + "ApplyTagsHelpTextReplace": "Ersetzen: Ersetze die Tags mit den eingegebenen Tags (keine Tags eingeben um alle Tags zu löschen)", "DownloadClientPriorityHelpText": "Priorisiere mehrere Downloader. Rundlauf-Verfahren wird für Downloader mit der gleichen Priorität verwendet.", "EditSelectedIndexers": "Ausgewähle Indexer bearbeiten", "SelectIndexers": "Indexer suchen", @@ -488,7 +488,7 @@ "UpdateAvailableHealthCheckMessage": "Neue Version verfügbar", "Year": "Jahr", "Album": "Album", - "Artist": "Künstler", + "Artist": "Interpret", "Author": "Autor", "Book": "Buch", "ConnectionLostReconnect": "{appName} wird versuchen, automatisch eine Verbindung herzustellen, oder Sie können unten auf „Neu laden“ klicken.", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index e9dce31fd..1b0dc3041 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -28,7 +28,7 @@ "About": "Acerca de", "View": "Vista", "Updates": "Actualizaciones", - "UpdateUiNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta UI '{uiFolder}' no tiene permisos de escritura para el usuario '{userName}'.", + "UpdateUiNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de interfaz de usuario '{uiFolder}' no es modificable por el usuario '{userName}'.", "UpdateStartupTranslocationHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de arranque '{startupFolder}' está en una carpeta de \"App Translocation\".", "UpdateStartupNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de arranque '{startupFolder}' no tiene permisos de escritura para el usuario '{userName}'.", "UnselectAll": "Desmarcar todo", @@ -164,7 +164,7 @@ "UseProxy": "Usar proxy", "Usenet": "Usenet", "UrlBaseHelpText": "Para soporte de proxy inverso, por defecto está vacío", - "URLBase": "URL Base", + "URLBase": "URL base", "Uptime": "Tiempo de actividad", "UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización", "UpdateMechanismHelpText": "Usar el actualizador incorporado de {appName} o un script", @@ -333,7 +333,7 @@ "Applications": "Aplicaciones", "AppProfileInUse": "Perfil de aplicación en uso", "AddDownloadClientToProwlarr": "Añadir un cliente de descargas permite a {appName} enviar descargas directamente desde la interfaz en una búsqueda manual.", - "Category": "Categoria", + "Category": "Categoría", "Application": "Aplicación", "BookSearch": "Búsqueda de libros", "BookSearchTypes": "Tipos de búsqueda de libros", @@ -747,5 +747,7 @@ "IndexerSettingsCookieHelpText": "Cookie del sitio", "IndexerSettingsFreeleechOnly": "Solo freeleech", "IndexerSettingsVipExpiration": "Expiración del VIP", - "XmlRpcPath": "Ruta RPC de XML" + "XmlRpcPath": "Ruta RPC de XML", + "NotificationsTelegramSettingsIncludeAppName": "Incluir {appName} en el título", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente prefija el título del mensaje con {appName} para diferenciar las notificaciones de las diferentes aplicaciones" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 5cbc8950b..9ea26a23c 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -12,7 +12,7 @@ "Events": "Événements", "Edit": "Modifier", "DownloadClientStatusAllClientHealthCheckMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", - "DownloadClients": "Clients de télécharg.", + "DownloadClients": "Clients de téléchargement", "Dates": "Dates", "Date": "Date", "Delete": "Supprimer", @@ -747,5 +747,7 @@ "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.", "ProwlarrDownloadClientsAlert": "Si vous avez l'intention d'effectuer des recherches directement dans {appName}, vous devez ajouter les clients de téléchargement. Sinon, vous n'avez pas besoin de les ajouter ici. Pour les recherches à partir de vos applications, les clients de téléchargement qui y sont configurés sont utilisés à la place.", "IndexerMTeamTpSettingsApiKeyHelpText": "Clé API du site (trouvée dans le panneau de configuration utilisateur => Sécurité => Laboratoire)", - "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Rechercher uniquement les versions freeleech" + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Rechercher uniquement les versions freeleech", + "NotificationsTelegramSettingsIncludeAppName": "Inclure {appName} dans le Titre", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Préfixer éventuellement le titre du message par {appName} pour différencier les notifications des différentes applications" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 22f984bb0..b83df3dc1 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -747,5 +747,7 @@ "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", "ClickToChangeQueryOptions": "Clique para alterar as opções de consulta", "IndexerMTeamTpSettingsApiKeyHelpText": "Chave API do Site (Encontrada no Painel de Controle do Usuário => Segurança => Laboratório)", - "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech" + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech", + "NotificationsTelegramSettingsIncludeAppName": "Incluir {appName} no Título", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente, prefixe o título da mensagem com {appName} para diferenciar notificações de diferentes aplicativos" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index cd41a3225..d71d04b90 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -64,7 +64,7 @@ "Edit": "Düzenle", "CustomFilters": "Özel Filtreler", "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut kodları", - "Analytics": "Analitik", + "Analytics": "Analiz", "All": "Herşey", "Added": "Eklendi", "Add": "Ekle", @@ -83,7 +83,7 @@ "UnableToLoadTags": "Etiketler yüklenemiyor", "UnsavedChanges": "Kaydedilmemiş Değişiklikler", "Backups": "Yedeklemeler", - "BindAddress": "Bağlama Adresi", + "BindAddress": "Bind Adresi", "BypassProxyForLocalAddresses": "Yerel Adresler için Proxy'yi Atla", "DeleteNotificationMessageText": "'{0}' bildirimini silmek istediğinizden emin misiniz?", "EnableSslHelpText": " Etkili olması için yönetici olarak yeniden çalıştırmayı gerektirir", @@ -101,7 +101,7 @@ "TestAll": "Tümünü Test Et", "UnableToAddANewApplicationPleaseTryAgain": "Yeni bir bildirim eklenemiyor, lütfen tekrar deneyin.", "YesCancel": "Evet İptal", - "ApplicationStatusCheckAllClientMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", + "ApplicationStatusCheckAllClientMessage": "Hatalar nedeniyle tüm uygulamalar kullanılamıyor", "CancelPendingTask": "Bu bekleyen görevi iptal etmek istediğinizden emin misiniz?", "DeleteTag": "Etiketi Sil", "BindAddressHelpText": "Tüm arayüzler için geçerli IP adresi, localhost veya '*'", @@ -133,8 +133,8 @@ "RemovedFromTaskQueue": "Görev kuyruğundan kaldırıldı", "SendAnonymousUsageData": "Anonim Kullanım Verilerini Gönderin", "Age": "Yaş", - "AllIndexersHiddenDueToFilter": "Uygulanan filtre nedeniyle tüm filmler gizlendi.", - "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Bu, tarayıcınızla ilgili bilgileri, kullandığınız {appName} WebUI sayfalarını, hata raporlamasının yanı sıra işletim sistemi ve çalışma zamanı sürümünü içerir. Bu bilgileri, özellikleri ve hata düzeltmelerini önceliklendirmek için kullanacağız.", + "AllIndexersHiddenDueToFilter": "Uygulanan filtre nedeniyle tüm dizin oluşturucular gizlendi.", + "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Bu, tarayıcınızla ilgili bilgileri, kullandığınız {appName} Web arayüz sayfalarını, hata raporlamasının yanı sıra işletim sistemi ve çalışma zamanı sürümünü içerir. Bu bilgileri, özellikleri ve hata düzeltmelerini önceliklendirmek için kullanacağız.", "ApiKey": "API Anahtarı", "AppDataDirectory": "Uygulama Veri Dizini", "NoUpdatesAreAvailable": "Güncelleme yok", @@ -143,7 +143,7 @@ "OnHealthIssueHelpText": "Sağlık Sorunu Hakkında", "BranchUpdate": "{appName}'ı güncellemek için kullanılacak dal", "Close": "Kapat", - "ApplicationStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", + "ApplicationStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan uygulamalar: {0}", "ApplyTags": "Etiketleri Uygula", "RssIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor", "Interval": "Aralık", @@ -294,7 +294,7 @@ "Version": "Sürüm", "Warn": "Uyar", "Wiki": "Wiki", - "Apply": "Uygulamak", + "Apply": "Uygula", "BackupFolderHelpText": "Göreli yollar {appName}'ın AppData dizini altında olacaktır", "Grabbed": "Yakalandı", "ProxyPasswordHelpText": "Gerekirse yalnızca bir kullanıcı adı ve şifre girmeniz gerekir. Aksi takdirde boş bırakın.", @@ -305,7 +305,7 @@ "UnableToLoadGeneralSettings": "Genel ayarlar yüklenemiyor", "Automatic": "Otomatik", "AutomaticSearch": "Otomatik Arama", - "Backup": "Destek olmak", + "Backup": "Yedek", "Cancel": "Vazgeç", "Level": "Seviye", "Time": "Zaman", @@ -338,7 +338,7 @@ "ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın", "ApplyTagsHelpTextHowToApplyIndexers": "Seçilen indeksleyicilere etiketler nasıl uygulanır?", "ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)", - "DeleteSelectedDownloadClients": "İndirme İstemcisini Sil", + "DeleteSelectedDownloadClients": "İndirme İstemcilerini Sil", "DownloadClientPriorityHelpText": "Birden çok İndirme İstemcisine öncelik verin. Round-Robin, aynı önceliğe sahip müşteriler için kullanılır.", "Genre": "Türler", "Track": "İzleme", @@ -358,7 +358,7 @@ "None": "Yok", "ResetAPIKeyMessageText": "API Anahtarınızı sıfırlamak istediğinizden emin misiniz?", "Categories": "Kategoriler", - "Application": "Uygulamalar", + "Application": "Uygulama", "Episode": "bölüm", "AddConnection": "Bağlantı Ekle", "AddApplicationImplementation": "Uygulama Ekle - {implementationName}", @@ -398,7 +398,41 @@ "AddDownloadClientToProwlarr": "İndirme istemcisi eklemek, görsel arayüz üzerinde manuel arama yaparak indirilecek içeriği {appName} uygulamasına direkt olarak eklemenize olanak sağlar.", "AddApplication": "Uygulama Ekle", "AddCategory": "Kategori Ekle", - "AddNewIndexer": "Yeni İçerik Sağlayıcı Ekle", + "AddNewIndexer": "Yeni Dizin Oluşturucu Ekle", "ActiveApps": "Aktif Uygulamalar", - "ActiveIndexers": "Aktif İçerik Kaynakları" + "ActiveIndexers": "Aktif Dizin Oluşturucular", + "AdvancedSettingsHiddenClickToShow": "Gelimiş ayarlar gizli, göstermek için tıklayın", + "AddIndexerProxy": "Dizin Oluşturucu Vekili Ekle", + "AddedToDownloadClient": "İçerik istemciye eklendi", + "Album": "Albüm", + "AdvancedSettingsShownClickToHide": "Gelişmiş ayarlar gösteriliyor, gizlemek için tıklayın", + "AddToDownloadClient": "İçeriği indirme istemcisine ekle", + "DownloadClientAriaSettingsDirectoryHelpText": "İndirilenlerin yerleştirileceği isteğe bağlı konum, varsayılan Aria2 konumunu kullanmak için boş bırakın", + "Donate": "Bağış yap", + "Destination": "Hedef", + "Directory": "Rehber", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "İndirilenlerin yerleştirileceği isteğe bağlı paylaşımlı klasör, varsayılan Download Station konumunu kullanmak için boş bırakın", + "DownloadClientFloodSettingsAdditionalTags": "Ek Etiketler", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Deluge json URL'sine bir önek ekler, bkz. {url}", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "Medyanın özelliklerini etiket olarak ekler. İpuçları örnektir.", + "DownloadClientFloodSettingsTagsHelpText": "Bir indirme işleminin başlangıç etiketleri. Bir indirmenin tanınabilmesi için tüm başlangıç etiketlerine sahip olması gerekir. Bu, ilgisiz indirmelerle çakışmaları önler.", + "DownloadClientFloodSettingsUrlBaseHelpText": "Flood API'sine {url} gibi bir önek ekler", + "Database": "Veri tabanı", + "DefaultNameCopiedProfile": "{name} - Kopyala", + "DeleteSelectedDownloadClientsMessageText": "Seçilen {count} indirme istemcisini silmek istediğinizden emin misiniz?", + "DeleteSelectedIndexersMessageText": "Seçilen {count} dizin oluşturucuyu silmek istediğinizden emin misiniz?", + "DownloadClientFreeboxSettingsPortHelpText": "Freebox arayüzüne erişim için kullanılan bağlantı noktası, varsayılan olarak '{port}' şeklindedir", + "ApiKeyValidationHealthCheckMessage": "Lütfen API anahtarınızı en az {length} karakter sayısı kadar güncelleyiniz. Bunu ayarlar veya yapılandırma dosyası üzerinden yapabilirsiniz", + "AppProfileInUse": "Kullanımda Olan Uygulama Profili", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Eğer bir torrent hash değeri bazlı engellendi ise bazı dizin oluşturucular RSS/Arama sırasında bu torrenti gerektiği gibi reddedemeyebilir, bunu aktif etmek torrentin çekildikten sonra reddedilebilmesine izin verecektir, ama istemciye gönderilmeden önce.", + "AppProfileSelectHelpText": "Uygulama profilleri, Uygulama eşitlemede RSS, Otomatik Arama ve İnteraktif Arama ayarlarını kontrol etmek için kullanılır", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "İçerik eklenirken eşitleme ret işlemi, Torrent hash değerlerini kara listeye aldı", + "AppSettingsSummary": "{appName} uygulamasının PVR progranlarına müdahele etmek için gerekli konfigürasyonda kullanılan uygulama ve ayarlar", + "DownloadClientFreeboxSettingsApiUrl": "API URL'si", + "DownloadClientFreeboxSettingsApiUrlHelpText": "Freebox API temel URL'sini API sürümüyle tanımlayın, örneğin '{url}', varsayılan olarak '{defaultApiUrl}' olur", + "DownloadClientFreeboxSettingsAppIdHelpText": "Freebox API'sine erişim oluşturulurken verilen uygulama kimliği (ör. 'app_id')", + "DownloadClientFreeboxSettingsAppToken": "Uygulama Token'ı", + "DownloadClientFreeboxSettingsAppTokenHelpText": "Freebox API'sine erişim oluşturulurken alınan uygulama jetonu (ör. 'app_token')", + "DownloadClientFreeboxSettingsAppId": "Uygulama kimliği", + "DownloadClientFreeboxSettingsHostHelpText": "Freebox'un ana bilgisayar adı veya ana bilgisayar IP adresi, varsayılan olarak '{url}' şeklindedir (yalnızca aynı ağdaysa çalışır)" } From 6000952b767e11fa5ca0bfc73a56f91d72fcfe5e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 20 Apr 2024 09:32:44 +0300 Subject: [PATCH 556/964] Bump version to 1.17.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8591c4b97..feab69426 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.16.2' + majorVersion: '1.17.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 4ff5d11a03eefd84f1287d7f7fb44bc966aee223 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Apr 2024 13:05:55 +0300 Subject: [PATCH 557/964] Bump frontend dependencies --- package.json | 40 +- yarn.lock | 3306 +++++++++++++++++++++++++++----------------------- 2 files changed, 1828 insertions(+), 1518 deletions(-) diff --git a/package.json b/package.json index 25d923a7b..23a772aed 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,10 @@ "@microsoft/signalr": "6.0.25", "@sentry/browser": "7.51.2", "@sentry/integrations": "7.51.2", - "@types/node": "18.15.11", - "@types/react": "18.2.6", - "@types/react-dom": "18.2.4", - "chart.js": "4.3.0", + "@types/node": "18.19.31", + "@types/react": "18.2.79", + "@types/react-dom": "18.2.25", + "chart.js": "4.4.2", "classnames": "2.3.2", "clipboard": "2.0.11", "connected-react-router": "6.9.3", @@ -83,46 +83,46 @@ "redux-thunk": "2.4.2", "reselect": "4.1.7", "stacktrace-js": "2.0.2", - "typescript": "5.0.4" + "typescript": "5.1.6" }, "devDependencies": { - "@babel/core": "7.22.11", - "@babel/eslint-parser": "7.22.11", - "@babel/plugin-proposal-export-default-from": "7.22.5", + "@babel/core": "7.24.4", + "@babel/eslint-parser": "7.24.1", + "@babel/plugin-proposal-export-default-from": "7.24.1", "@babel/plugin-syntax-dynamic-import": "7.8.3", - "@babel/preset-env": "7.22.14", - "@babel/preset-react": "7.22.5", - "@babel/preset-typescript": "7.22.11", + "@babel/preset-env": "7.24.4", + "@babel/preset-react": "7.24.1", + "@babel/preset-typescript": "7.24.1", "@types/lodash": "4.14.194", "@types/react-router-dom": "5.3.3", "@types/react-text-truncate": "0.14.1", "@types/react-window": "1.8.5", "@types/webpack-livereload-plugin": "2.3.3", - "@typescript-eslint/eslint-plugin": "5.59.5", - "@typescript-eslint/parser": "5.59.5", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", "are-you-es5": "2.1.2", "autoprefixer": "10.4.14", "babel-loader": "9.1.3", "babel-plugin-inline-classnames": "2.0.1", "babel-plugin-transform-react-remove-prop-types": "0.4.24", - "core-js": "3.33.0", + "core-js": "3.37.0", "css-loader": "6.7.3", "css-modules-typescript-loader": "4.0.1", - "eslint": "8.45.0", - "eslint-config-prettier": "8.8.0", + "eslint": "8.57.0", + "eslint-config-prettier": "8.10.0", "eslint-plugin-filenames": "1.3.2", - "eslint-plugin-import": "2.27.5", + "eslint-plugin-import": "2.29.1", "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-react": "7.32.2", + "eslint-plugin-react": "7.34.1", "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-simple-import-sort": "10.0.0", + "eslint-plugin-simple-import-sort": "12.1.0", "file-loader": "6.2.0", "filemanager-webpack-plugin": "8.0.0", "fork-ts-checker-webpack-plugin": "8.0.0", "html-webpack-plugin": "5.5.1", "loader-utils": "^3.2.1", "mini-css-extract-plugin": "2.7.5", - "postcss": "8.4.31", + "postcss": "8.4.38", "postcss-color-function": "4.1.0", "postcss-loader": "7.3.0", "postcss-mixins": "9.0.4", diff --git a/yarn.lock b/yarn.lock index 6fb3bee57..c884a8b84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,69 +8,69 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@adobe/css-tools@^4.0.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" - integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== + version "4.3.3" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== -"@babel/core@7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" - integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== +"@babel/core@7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" + integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.11" - "@babel/parser" "^7.22.11" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.4" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.24.4" + "@babel/parser" "^7.24.4" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.11.tgz#cceb8c7989c241a16dd14e12a6cd725618f3f58b" - integrity sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w== +"@babel/eslint-parser@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" + integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.24.1", "@babel/generator@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" + integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== dependencies: - "@babel/types" "^7.22.10" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.22.5": @@ -80,52 +80,52 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" - integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" - integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== +"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" + integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" - integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== +"@babel/helper-define-polyfill-provider@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" + integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -133,18 +133,18 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -153,30 +153,30 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== +"@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.0" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -185,27 +185,27 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -229,76 +229,93 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" - integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== +"@babel/helpers@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" + integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" -"@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.22.11", "@babel/parser@^7.22.5": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" - integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== +"@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" - integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" + integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" - integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" + integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" + integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.24.1" -"@babel/plugin-proposal-export-default-from@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz#825924eda1fad382c3de4db6fe1711b6fa03362f" - integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" + integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-default-from" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-proposal-export-default-from@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" + integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-export-default-from" "^7.24.1" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -333,12 +350,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz#ac3a24b362a04415a017ab96b9b4483d0e2a6e44" - integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== +"@babel/plugin-syntax-export-default-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" + integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -347,19 +364,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== +"@babel/plugin-syntax-import-assertions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" + integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== +"@babel/plugin-syntax-import-attributes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" + integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -375,12 +392,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== +"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -438,12 +455,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== +"@babel/plugin-syntax-typescript@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -453,212 +470,212 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== +"@babel/plugin-transform-arrow-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" + integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-async-generator-functions@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" - integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== +"@babel/plugin-transform-async-generator-functions@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" + integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== +"@babel/plugin-transform-async-to-generator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" + integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-module-imports" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== +"@babel/plugin-transform-block-scoped-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" + integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== +"@babel/plugin-transform-block-scoping@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" + integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== +"@babel/plugin-transform-class-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" + integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-static-block@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" - integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== +"@babel/plugin-transform-class-static-block@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" + integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== +"@babel/plugin-transform-classes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" + integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== +"@babel/plugin-transform-computed-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" + integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/template" "^7.24.0" -"@babel/plugin-transform-destructuring@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== +"@babel/plugin-transform-destructuring@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" + integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-dotall-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== +"@babel/plugin-transform-dotall-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" + integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== +"@babel/plugin-transform-duplicate-keys@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" + integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-dynamic-import@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" - integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== +"@babel/plugin-transform-dynamic-import@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" + integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== +"@babel/plugin-transform-exponentiation-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" + integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-export-namespace-from@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" - integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== +"@babel/plugin-transform-export-namespace-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" + integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== +"@babel/plugin-transform-for-of@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" + integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== +"@babel/plugin-transform-function-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" + integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-json-strings@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" - integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== +"@babel/plugin-transform-json-strings@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" + integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== +"@babel/plugin-transform-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" + integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-logical-assignment-operators@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" - integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== +"@babel/plugin-transform-logical-assignment-operators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" + integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== +"@babel/plugin-transform-member-expression-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" + integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-amd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" - integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== +"@babel/plugin-transform-modules-amd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" + integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-commonjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" - integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== +"@babel/plugin-transform-modules-commonjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== dependencies: - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" - integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== +"@babel/plugin-transform-modules-systemjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" + integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== +"@babel/plugin-transform-modules-umd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" + integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" @@ -668,103 +685,102 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== +"@babel/plugin-transform-new-target@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" + integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" - integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" + integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" - integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== +"@babel/plugin-transform-numeric-separator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" + integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" - integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== +"@babel/plugin-transform-object-rest-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" + integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-parameters" "^7.24.1" -"@babel/plugin-transform-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== +"@babel/plugin-transform-object-super@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" + integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" -"@babel/plugin-transform-optional-catch-binding@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" - integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== +"@babel/plugin-transform-optional-catch-binding@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" + integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.5": - version "7.22.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" - integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== +"@babel/plugin-transform-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" + integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== +"@babel/plugin-transform-parameters@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" + integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== +"@babel/plugin-transform-private-methods@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" + integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-property-in-object@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" - integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== +"@babel/plugin-transform-private-property-in-object@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" + integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== +"@babel/plugin-transform-property-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" + integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-react-display-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== +"@babel/plugin-transform-react-display-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" + integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" @@ -773,136 +789,138 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== +"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== +"@babel/plugin-transform-react-pure-annotations@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" + integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-regenerator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" - integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== +"@babel/plugin-transform-regenerator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" + integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== +"@babel/plugin-transform-reserved-words@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" + integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== +"@babel/plugin-transform-shorthand-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" + integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== +"@babel/plugin-transform-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" + integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== +"@babel/plugin-transform-sticky-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" + integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== +"@babel/plugin-transform-template-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" + integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== +"@babel/plugin-transform-typeof-symbol@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" + integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typescript@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.11.tgz#9f27fb5e51585729374bb767ab6a6d9005a23329" - integrity sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA== +"@babel/plugin-transform-typescript@^7.24.1": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15" + integrity sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-typescript" "^7.24.1" -"@babel/plugin-transform-unicode-escapes@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" - integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== +"@babel/plugin-transform-unicode-escapes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" + integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== +"@babel/plugin-transform-unicode-property-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" + integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== +"@babel/plugin-transform-unicode-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" + integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== +"@babel/plugin-transform-unicode-sets-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" + integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/preset-env@7.22.14": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.14.tgz#1cbb468d899f64fa71c53446f13b7ff8c0005cc1" - integrity sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig== +"@babel/preset-env@7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" + integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/compat-data" "^7.24.4" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-assertions" "^7.24.1" + "@babel/plugin-syntax-import-attributes" "^7.24.1" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -914,59 +932,58 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.11" - "@babel/plugin-transform-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.10" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.11" - "@babel/plugin-transform-classes" "^7.22.6" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.10" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.11" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-for-of" "^7.22.5" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.11" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.11" - "@babel/plugin-transform-modules-systemjs" "^7.22.11" - "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-arrow-functions" "^7.24.1" + "@babel/plugin-transform-async-generator-functions" "^7.24.3" + "@babel/plugin-transform-async-to-generator" "^7.24.1" + "@babel/plugin-transform-block-scoped-functions" "^7.24.1" + "@babel/plugin-transform-block-scoping" "^7.24.4" + "@babel/plugin-transform-class-properties" "^7.24.1" + "@babel/plugin-transform-class-static-block" "^7.24.4" + "@babel/plugin-transform-classes" "^7.24.1" + "@babel/plugin-transform-computed-properties" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.1" + "@babel/plugin-transform-dotall-regex" "^7.24.1" + "@babel/plugin-transform-duplicate-keys" "^7.24.1" + "@babel/plugin-transform-dynamic-import" "^7.24.1" + "@babel/plugin-transform-exponentiation-operator" "^7.24.1" + "@babel/plugin-transform-export-namespace-from" "^7.24.1" + "@babel/plugin-transform-for-of" "^7.24.1" + "@babel/plugin-transform-function-name" "^7.24.1" + "@babel/plugin-transform-json-strings" "^7.24.1" + "@babel/plugin-transform-literals" "^7.24.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" + "@babel/plugin-transform-member-expression-literals" "^7.24.1" + "@babel/plugin-transform-modules-amd" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-modules-systemjs" "^7.24.1" + "@babel/plugin-transform-modules-umd" "^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" - "@babel/plugin-transform-numeric-separator" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.22.11" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.22.12" - "@babel/plugin-transform-parameters" "^7.22.5" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.10" - "@babel/plugin-transform-reserved-words" "^7.22.5" - "@babel/plugin-transform-shorthand-properties" "^7.22.5" - "@babel/plugin-transform-spread" "^7.22.5" - "@babel/plugin-transform-sticky-regex" "^7.22.5" - "@babel/plugin-transform-template-literals" "^7.22.5" - "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.10" - "@babel/plugin-transform-unicode-property-regex" "^7.22.5" - "@babel/plugin-transform-unicode-regex" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" + "@babel/plugin-transform-numeric-separator" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.1" + "@babel/plugin-transform-object-super" "^7.24.1" + "@babel/plugin-transform-optional-catch-binding" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-private-methods" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.1" + "@babel/plugin-transform-property-literals" "^7.24.1" + "@babel/plugin-transform-regenerator" "^7.24.1" + "@babel/plugin-transform-reserved-words" "^7.24.1" + "@babel/plugin-transform-shorthand-properties" "^7.24.1" + "@babel/plugin-transform-spread" "^7.24.1" + "@babel/plugin-transform-sticky-regex" "^7.24.1" + "@babel/plugin-transform-template-literals" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.1" + "@babel/plugin-transform-unicode-escapes" "^7.24.1" + "@babel/plugin-transform-unicode-property-regex" "^7.24.1" + "@babel/plugin-transform-unicode-regex" "^7.24.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.11" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" core-js-compat "^3.31.0" semver "^6.3.1" @@ -979,28 +996,28 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" - integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== +"@babel/preset-react@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" + integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-transform-react-display-name" "^7.22.5" - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-transform-react-display-name" "^7.24.1" + "@babel/plugin-transform-react-jsx" "^7.23.4" "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.24.1" -"@babel/preset-typescript@7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.11.tgz#f218cd0345524ac888aa3dc32f029de5b064b575" - integrity sha512-tWY5wyCZYBGY7IlalfKI1rLiGlIfnwsRHZqlky0HVv8qviwQ1Uo/05M6+s+TcTCVa6Bmoo2uJW5TMFX6Wa4qVg== +"@babel/preset-typescript@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" + integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.11" - "@babel/plugin-transform-typescript" "^7.22.11" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-syntax-jsx" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-typescript" "^7.24.1" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1008,60 +1025,60 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" - integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== +"@babel/template@^7.22.15", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" - integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== +"@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.11" - "@babel/types" "^7.22.11" - debug "^4.1.0" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.4.4": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@csstools/css-parser-algorithms@^2.1.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz#ec4fc764ba45d2bb7ee2774667e056aa95003f3a" - integrity sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA== + version "2.6.1" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz#c45440d1efa2954006748a01697072dae5881bcd" + integrity sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA== "@csstools/css-tokenizer@^2.1.1": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz#9d70e6dcbe94e44c7400a2929928db35c4de32b5" - integrity sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA== + version "2.2.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz#a4b8718ed7fcd2dcd555de16b31ca59ad4b96a06" + integrity sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw== "@csstools/media-query-list-parser@^2.0.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz#0017f99945f6c16dd81a7aacf6821770933c3a5c" - integrity sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw== + version "2.1.9" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz#feb4b7268f998956eb3ded69507869e73d005dda" + integrity sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA== "@csstools/selector-specificity@^2.2.0": version "2.2.0" @@ -1073,22 +1090,22 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1100,10 +1117,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.44.0": - version "8.44.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" - integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@fortawesome/fontawesome-common-types@6.4.0": version "6.4.0" @@ -1143,13 +1160,13 @@ dependencies: prop-types "^15.8.1" -"@humanwhocodes/config-array@^0.11.10": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1157,47 +1174,47 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1330,32 +1347,32 @@ tslib "^1.9.3" "@types/archiver@^5.3.1": - version "5.3.2" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.2.tgz#a9f0bcb0f0b991400e7766d35f6e19d163bdadcc" - integrity sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw== + version "5.3.4" + resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.4.tgz#32172d5a56f165b5b4ac902e366248bf03d3ae84" + integrity sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw== dependencies: "@types/readdir-glob" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.56.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" + integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/history@^4.7.11": version "4.7.11" @@ -1363,9 +1380,9 @@ integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" + integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" @@ -1375,10 +1392,10 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -1391,60 +1408,64 @@ integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node@*": - version "20.5.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" - integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" -"@types/node@18.15.11": - version "18.15.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" - integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== +"@types/node@18.19.31": + version "18.19.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd" + integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/postcss-modules-local-by-default@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#5c141c9bd3a994ae1ebe23d2ae094b24d19538f5" - integrity sha512-0VLab/pcLTLcfbxi6THSIMVYcw9hEUBGvjwwaGpW77mMgRXfGF+a76t7BxTGyLh1y68tBvrffp8UWnqvm76+yg== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.2.tgz#8fee7513dd1558d74713d817c183a33a6dc583f9" + integrity sha512-CtYCcD+L+trB3reJPny+bKWKMzPfxEyQpKIwit7kErnOexf5/faaGpkFy4I5AwbV4hp1sk7/aTg0tt0B67VkLQ== dependencies: postcss "^8.0.0" "@types/postcss-modules-scope@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.1.tgz#f0ad443c2f31f90feacb83bb357692d581388afd" - integrity sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.4.tgz#f82d15ec9023c924b531a49e8087b32646233f41" + integrity sha512-//ygSisVq9kVI0sqx3UPLzWIMCmtSVrzdljtuaAEJtGoGnpjBikZ2sXO5MpH9SnWX9HRfXxHifDAXcQjupWnIQ== dependencies: postcss "^8.0.0" "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" - integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== +"@types/react-dom@18.2.25": + version "18.2.25" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.25.tgz#2946a30081f53e7c8d585eb138277245caedc521" + integrity sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA== dependencies: "@types/react" "*" "@types/react-redux@^7.1.16": - version "7.1.26" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.26.tgz#84149f5614e40274bb70fcbe8f7cae6267d548b1" - integrity sha512-UKPo7Cm7rswYU6PH6CmTNCRv5NYF3HrgKuHEYTK8g/3czYLrUux50gQ2pkxc9c7ZpQZi+PNhgmI8oNIRoiVIxg== + version "7.1.33" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15" + integrity sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" @@ -1482,55 +1503,40 @@ dependencies: "@types/react" "*" -"@types/react@*": - version "18.2.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" - integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== +"@types/react@*", "@types/react@18.2.79": + version "18.2.79" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" + integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@18.2.6": - version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" - integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" "@types/readdir-glob@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.1.tgz#27ac2db283e6aa3d110b14ff9da44fcd1a5c38b1" - integrity sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ== + version "1.1.5" + resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.5.tgz#21a4a98898fc606cb568ad815f2a0eedc24d412a" + integrity sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg== dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/semver@^7.3.12": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + version "0.1.6" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.6.tgz#164e169dd061795b50b83c19e4d3be09f8d3a454" + integrity sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g== "@types/tapable@^1": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" - integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + version "1.0.12" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.12.tgz#bc2cab12e87978eee89fb21576b670350d6d86ab" + integrity sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q== "@types/uglify-js@*": - version "3.17.2" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.2.tgz#a2ba86fd524f6281a7655463338c546f845b29c3" - integrity sha512-9SjrHO54LINgC/6Ehr81NjAxAYvwEZqjUHLjJYvC4Nmr9jbLQCIZbWSvl4vXQkkmR1UAuaKDycau3O1kWGFyXQ== + version "3.17.5" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.5.tgz#905ce03a3cbbf2e31cbefcbc68d15497ee2e17df" + integrity sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ== dependencies: source-map "^0.6.1" @@ -1542,18 +1548,18 @@ "@types/webpack" "^4" "@types/webpack-sources@*": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" - integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + version "3.2.3" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.3.tgz#b667bd13e9fa15a9c26603dce502c7985418c3d8" + integrity sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw== dependencies: "@types/node" "*" "@types/source-list-map" "*" source-map "^0.7.3" "@types/webpack@^4": - version "4.41.33" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" - integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== + version "4.41.38" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.38.tgz#5a40ac81bdd052bf405e8bdcf3e1236f6db6dc26" + integrity sha512-oOW7E931XJU1mVfCnxCVgv8GLFL768pDO5u2Gzk82i8yTIgX6i7cntyZOkZYb/JtYM8252SN9bQp9tgkVDSsRw== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -1562,94 +1568,101 @@ anymatch "^3.0.0" source-map "^0.6.0" -"@typescript-eslint/eslint-plugin@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz#f156827610a3f8cefc56baeaa93cd4a5f32966b4" - integrity sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg== +"@typescript-eslint/eslint-plugin@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.5" - "@typescript-eslint/type-utils" "5.59.5" - "@typescript-eslint/utils" "5.59.5" + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/parser@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.5.tgz#63064f5eafbdbfb5f9dfbf5c4503cdf949852981" - integrity sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw== +"@typescript-eslint/parser@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== dependencies: - "@typescript-eslint/scope-manager" "5.59.5" - "@typescript-eslint/types" "5.59.5" - "@typescript-eslint/typescript-estree" "5.59.5" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz#33ffc7e8663f42cfaac873de65ebf65d2bce674d" - integrity sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@typescript-eslint/types" "5.59.5" - "@typescript-eslint/visitor-keys" "5.59.5" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/type-utils@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz#485b0e2c5b923460bc2ea6b338c595343f06fc9b" - integrity sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg== +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== dependencies: - "@typescript-eslint/typescript-estree" "5.59.5" - "@typescript-eslint/utils" "5.59.5" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.5.tgz#e63c5952532306d97c6ea432cee0981f6d2258c7" - integrity sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/typescript-estree@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz#9b252ce55dd765e972a7a2f99233c439c5101e42" - integrity sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@typescript-eslint/types" "5.59.5" - "@typescript-eslint/visitor-keys" "5.59.5" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/utils@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.5.tgz#15b3eb619bb223302e60413adb0accd29c32bcae" - integrity sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA== +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.5" - "@typescript-eslint/types" "5.59.5" - "@typescript-eslint/typescript-estree" "5.59.5" - eslint-scope "^5.1.1" - semver "^7.3.7" + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" -"@typescript-eslint/visitor-keys@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz#ba5b8d6791a13cf9fea6716af1e7626434b29b9b" - integrity sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA== +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== dependencies: - "@typescript-eslint/types" "5.59.5" - eslint-visitor-keys "^3.3.0" + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" @@ -1664,10 +1677,10 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" @@ -1683,15 +1696,15 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" @@ -1713,58 +1726,58 @@ integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^2.1.1": @@ -1815,9 +1828,9 @@ acorn@^6.0.6: integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== add-px-to-style@1.0.0: version "1.0.0" @@ -1851,7 +1864,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2012,28 +2025,29 @@ arr-union@^2.0.1: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" integrity sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA== -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-flatten@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.6: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-slice@^0.2.3: @@ -2046,47 +2060,83 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== - dependencies: - array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" arrify@^1.0.1: @@ -2107,9 +2157,9 @@ async@^2.6.4: lodash "^4.17.14" async@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== autoprefixer@10.4.14: version "10.4.14" @@ -2123,10 +2173,12 @@ autoprefixer@10.4.14: picocolors "^1.0.0" postcss-value-parser "^4.2.0" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" babel-loader@9.1.3: version "9.1.3" @@ -2141,29 +2193,29 @@ babel-plugin-inline-classnames@2.0.1: resolved "https://registry.yarnpkg.com/babel-plugin-inline-classnames/-/babel-plugin-inline-classnames-2.0.1.tgz#d871490af06781a42f231a1e090bc4133594f168" integrity sha512-Pq/jJ6hTiGiqcMmy2d4CyJcfBDeUHOdQl1t1MDWNaSKR2RxDmShSAx4Zqz6NDmFaiinaRqF8eQoTVgSRGU+McQ== -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" + integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.6.1" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== +babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.31.0" + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" + integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.6.1" babel-plugin-transform-react-remove-prop-types@0.4.24: version "0.4.24" @@ -2204,9 +2256,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bl@^4.0.3: version "4.1.0" @@ -2254,15 +2306,15 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +browserslist@^4.14.5, browserslist@^4.21.5, browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" - node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" @@ -2287,13 +2339,16 @@ bytes@1: resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" integrity sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ== -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -2327,10 +2382,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: - version "1.0.30001591" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz" - integrity sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ== +caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001587: + version "1.0.30001611" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz#4dbe78935b65851c2d2df1868af39f709a93a96e" + integrity sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q== chalk@^1.1.3: version "1.1.3" @@ -2360,17 +2415,17 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chart.js@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.3.0.tgz#ac363030ab3fec572850d2d872956f32a46326a1" - integrity sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g== +chart.js@4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.4.2.tgz#95962fa6430828ed325a480cc2d5f2b4e385ac31" + integrity sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg== dependencies: "@kurkle/color" "^0.3.0" "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -2393,9 +2448,9 @@ classnames@2.3.2: integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" @@ -2538,10 +2593,10 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA== -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== copy-anything@^2.0.1: version "2.0.6" @@ -2550,17 +2605,17 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== +core-js-compat@^3.31.0, core-js-compat@^3.36.1: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" + integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== dependencies: - browserslist "^4.21.10" + browserslist "^4.23.0" -core-js@3.33.0: - version "3.33.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.0.tgz#70366dbf737134761edb017990cf5ce6c6369c40" - integrity sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw== +core-js@3.37.0: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.0.tgz#d8dde58e91d156b2547c19d8a4efd5c7f6c426bb" + integrity sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug== core-js@^2.4.0: version "2.6.12" @@ -2584,9 +2639,9 @@ cosmiconfig@^7.0.1: yaml "^1.10.0" cosmiconfig@^8.1.3: - version "8.3.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.3.tgz#45985f9f39f3c9330288ef642b1dcb7342bd76d7" - integrity sha512-/VY+0IvFoE47hwgKHu8feeBFIb1Z1mcJFiLrNwaJpLoLa9qwLVquMGMr2OUwQmhpJDtsSQSasg/TMv1imec9xA== + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" js-yaml "^4.1.0" @@ -2634,9 +2689,9 @@ css-color-function@~1.3.3: rgb "~0.1.0" css-functions-list@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.0.tgz#8290b7d064bf483f48d6559c10e98dc4d1ad19ee" - integrity sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" + integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== css-loader@6.7.3: version "6.7.3" @@ -2690,28 +2745,55 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== cuint@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2732,16 +2814,16 @@ decamelize@^1.1.0, decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== deep-equal@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761" + integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + object-is "^1.1.5" object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" + regexp.prototype.flags "^1.5.1" deep-is@^0.1.3: version "0.1.4" @@ -2753,11 +2835,21 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -2882,14 +2974,14 @@ dot-case@^3.0.4: tslib "^2.0.3" dotenv@^16.0.3: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== -electron-to-chromium@^1.4.477: - version "1.4.508" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" - integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== +electron-to-chromium@^1.4.668: + version "1.4.745" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.745.tgz#9c202ce9cbf18a5b5e0ca47145fd127cc4dd2290" + integrity sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA== element-class@0.2.2: version "0.2.2" @@ -2914,9 +3006,9 @@ end-of-stream@^1.4.1: once "^1.4.0" enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2927,9 +3019,9 @@ entities@^2.0.0: integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== envinfo@^7.7.3: - version "7.10.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" - integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + version "7.12.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.12.0.tgz#b56723b39c2053d67ea5714f026d05d4f5cc7acd" + integrity sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg== errno@^0.1.1: version "0.1.8" @@ -2959,71 +3051,117 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.20.4, es-abstract@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" + integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: +es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: - has "^1.0.3" + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -3040,9 +3178,9 @@ es6-promise@^4.2.8: integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" @@ -3054,12 +3192,12 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" - integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== +eslint-config-prettier@8.10.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== -eslint-import-resolver-node@^0.3.7: +eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -3068,10 +3206,10 @@ eslint-import-resolver-node@^0.3.7: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.7.4: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== +eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" @@ -3085,26 +3223,28 @@ eslint-plugin-filenames@1.3.2: lodash.snakecase "4.1.1" lodash.upperfirst "4.3.1" -eslint-plugin-import@2.27.5: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== +eslint-plugin-import@2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" eslint-plugin-prettier@4.2.1: version "4.2.1" @@ -3118,33 +3258,36 @@ eslint-plugin-react-hooks@4.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@7.32.2: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== +eslint-plugin-react@7.34.1: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.0" - string.prototype.matchall "^4.0.8" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" -eslint-plugin-simple-import-sort@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351" - integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw== +eslint-plugin-simple-import-sort@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.0.tgz#8186ad55474d2f5c986a2f1bf70625a981e30d05" + integrity sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig== -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3152,7 +3295,7 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: +eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== @@ -3165,32 +3308,33 @@ eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@8.45.0: - version "8.45.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" - integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== +eslint@8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.1.0" - "@eslint/js" "8.44.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.6.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -3213,7 +3357,7 @@ eslint@8.45.0: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^9.6.0: +espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== @@ -3294,9 +3438,9 @@ fast-diff@^1.1.2: integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3320,9 +3464,9 @@ fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -3414,18 +3558,23 @@ find-up@^6.3.0: path-exists "^5.0.0" flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== focus-lock@^0.11.6: version "0.11.6" @@ -3460,9 +3609,9 @@ fork-ts-checker-webpack-plugin@8.0.0: tapable "^2.2.1" fraction.js@^4.2.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs-constants@^1.0.0: version "1.0.0" @@ -3479,9 +3628,9 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: universalify "^2.0.0" fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" @@ -3493,12 +3642,12 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -3518,28 +3667,30 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + es-errors "^1.3.0" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-node-dimensions@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz#fb7b4bb57060fb4247dd51c9d690dfbec56b0823" integrity sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -3604,9 +3755,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -3653,11 +3804,6 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -3695,36 +3841,36 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" he@^1.2.0: version "1.2.0" @@ -3829,9 +3975,9 @@ ieee754@^1.1.13: integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== image-size@~0.5.0: version "0.5.5" @@ -3844,9 +3990,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== "immutable@^3.8.1 || ^4.0.0", immutable@^4.0.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" - integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + version "4.3.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" @@ -3897,13 +4043,13 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + es-errors "^1.3.0" + hasown "^2.0.0" side-channel "^1.0.4" interpret@^3.1.1: @@ -3918,7 +4064,7 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -is-arguments@^1.0.4: +is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -3926,20 +4072,26 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -3967,14 +4119,21 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" -is-date-object@^1.0.1: +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -3986,11 +4145,25 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -3998,10 +4171,15 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -4042,7 +4220,7 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-regex@^1.0.4, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -4050,12 +4228,17 @@ is-regex@^1.0.4, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -4071,12 +4254,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" @@ -4085,6 +4273,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -4120,6 +4316,17 @@ isstream@^0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jdu@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jdu/-/jdu-1.0.0.tgz#28f1e388501785ae0a1d93e93ed0b14dd41e51ce" @@ -4135,9 +4342,9 @@ jest-worker@^27.4.5: supports-color "^8.0.0" jiti@^1.18.2: - version "1.19.3" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" - integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== jquery@3.7.0: version "3.7.0" @@ -4228,9 +4435,9 @@ just-curry-it@^3.1.0: integrity sha512-Q8206k8pTY7krW32cdmPsP+DqqLgWx/hYPSj9/+7SYqSqz7UuwPbfSe07lQtvuuaVyiSJveXk0E5RydOuWwsEg== keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -4465,6 +4672,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4479,11 +4691,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -4609,6 +4816,13 @@ mini-css-extract-plugin@2.7.5: dependencies: schema-utils "^4.0.0" +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -4657,9 +4871,9 @@ minipass@^4.2.4: integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" - integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== mkdirp@^0.5.6: version "0.5.6" @@ -4693,15 +4907,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" @@ -4709,11 +4918,10 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== needle@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" - integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049" + integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== dependencies: - debug "^3.2.6" iconv-lite "^0.6.3" sax "^1.2.4" @@ -4742,10 +4950,10 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-package-data@^2.5.0: version "2.5.0" @@ -4799,68 +5007,79 @@ object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.fromentries@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.hasown@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" -object.values@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== +object.hasown@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" once@^1.3.0, once@^1.4.0: version "1.4.0" @@ -4999,11 +5218,11 @@ path-parse@^1.0.7: integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.6.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + version "1.10.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== dependencies: - lru-cache "^9.1.1 || ^10.0.0" + lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@^1.7.0: @@ -5077,6 +5296,11 @@ portfinder@^1.0.17: debug "^3.2.7" mkdirp "^0.5.6" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-color-function@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-color-function/-/postcss-color-function-4.1.0.tgz#b6f9355e07b12fcc5c34dab957834769b03d8f57" @@ -5133,23 +5357,23 @@ postcss-mixins@9.0.4: sugarss "^4.0.1" postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== postcss-modules-local-by-default@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== dependencies: postcss-selector-parser "^6.0.4" @@ -5178,9 +5402,9 @@ postcss-safe-parser@^6.0.0: integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.12, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -5215,14 +5439,14 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== +postcss@8.4.38, postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: - nanoid "^3.3.6" + nanoid "^3.3.7" picocolors "^1.0.0" - source-map-js "^1.0.2" + source-map-js "^1.2.0" postcss@^6.0.23: version "6.0.23" @@ -5233,15 +5457,6 @@ postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23: - version "8.4.29" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" - integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - prefix-style@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06" @@ -5297,9 +5512,9 @@ psl@^1.1.33: integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@6.11.1: version "6.11.1" @@ -5309,11 +5524,11 @@ qs@6.11.1: side-channel "^1.0.4" qs@^6.4.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + version "6.12.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" + integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" querystringify@^2.1.1: version "2.2.0" @@ -5724,10 +5939,23 @@ redux@4.2.1, redux@^4.0.0, redux@^4.1.1: dependencies: "@babel/runtime" "^7.9.2" +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -5742,9 +5970,9 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" @@ -5753,14 +5981,15 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpu-core@^5.3.1: version "5.3.2" @@ -5849,21 +6078,21 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -5907,13 +6136,13 @@ run-sequence@2.2.1: fancy-log "^1.3.2" plugin-error "^0.1.2" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -5932,13 +6161,13 @@ safe-json-parse@~1.0.1: resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" integrity sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" "safer-buffer@>= 2.1.2 < 3.0.0": @@ -5947,15 +6176,20 @@ safe-regex-test@^1.0.0: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass@^1.58.3: - version "1.66.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" - integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== + version "1.75.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.75.0.tgz#91bbe87fb02dfcc34e052ddd6ab80f60d392be6c" + integrity sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -6007,25 +6241,47 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@^7.3.4, semver@^7.3.5, semver@^7.3.8, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -6055,14 +6311,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^4.0.1: version "4.1.0" @@ -6083,10 +6340,10 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-support@~0.5.20: version "0.5.21" @@ -6120,9 +6377,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -6133,9 +6390,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== stack-generator@^2.0.5: version "2.0.10" @@ -6188,46 +6445,51 @@ string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.8: - version "4.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" - integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== +string.prototype.matchall@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - side-channel "^1.0.4" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@0.10: version "0.10.31" @@ -6406,9 +6668,9 @@ svg-tags@^1.0.0: integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== table@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -6432,7 +6694,7 @@ tar-stream@^2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -terser-webpack-plugin@5.3.9, terser-webpack-plugin@^5.3.7: +terser-webpack-plugin@5.3.9: version "5.3.9" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== @@ -6443,10 +6705,21 @@ terser-webpack-plugin@5.3.9, terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" -terser@^5.10.0, terser@^5.16.8: - version "5.19.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" - integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== +terser-webpack-plugin@^5.3.7: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.10.0, terser@^5.16.8, terser@^5.26.0: + version "5.30.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.3.tgz#f1bb68ded42408c316b548e3ec2526d7dd03f4d2" + integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -6469,9 +6742,9 @@ tiny-emitter@^2.0.0: integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tiny-lr@^1.1.1: version "1.1.1" @@ -6541,6 +6814,11 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + ts-loader@9.4.2: version "9.4.2" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" @@ -6551,10 +6829,10 @@ ts-loader@9.4.2: micromatch "^4.0.0" semver "^7.3.4" -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.2" @@ -6570,7 +6848,7 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -6580,13 +6858,6 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -6614,44 +6885,49 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typed-styles@^0.0.7: version "0.0.7" @@ -6680,10 +6956,10 @@ typescript-plugin-css-modules@5.0.1: stylus "^0.59.0" tsconfig-paths "^4.1.2" -typescript@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== +typescript@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== unbox-primitive@^1.0.2: version "1.0.2" @@ -6695,6 +6971,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -6724,14 +7005,14 @@ universalify@^0.2.0: integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -6761,9 +7042,9 @@ url-parse@^1.5.3: requires-port "^1.0.0" use-callback-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" - integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + version "1.3.2" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== dependencies: tslib "^2.0.0" @@ -6811,9 +7092,9 @@ warning@^4.0.2, warning@^4.0.3: loose-envify "^1.0.0" watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -6853,11 +7134,12 @@ webpack-livereload-plugin@3.0.2: tiny-lr "^1.1.1" webpack-merge@^5.7.3: - version "5.9.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-sources@^3.2.3: @@ -6928,16 +7210,44 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" which@^1.3.1: version "1.3.1" From 478a18596864bc74c35a406b8bce7c3b15aa71f7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Apr 2024 13:08:56 +0300 Subject: [PATCH 558/964] Convert createDimensionsSelector to typescript --- frontend/src/App/State/AppState.ts | 9 +++++++++ ...DimensionsSelector.js => createDimensionsSelector.ts} | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) rename frontend/src/Store/Selectors/{createDimensionsSelector.js => createDimensionsSelector.ts} (69%) diff --git a/frontend/src/App/State/AppState.ts b/frontend/src/App/State/AppState.ts index 2490f739f..716fd0711 100644 --- a/frontend/src/App/State/AppState.ts +++ b/frontend/src/App/State/AppState.ts @@ -42,7 +42,16 @@ export interface CustomFilter { filers: PropertyFilter[]; } +export interface AppSectionState { + dimensions: { + isSmallScreen: boolean; + width: number; + height: number; + }; +} + interface AppState { + app: AppSectionState; commands: CommandAppState; history: HistoryAppState; indexerHistory: IndexerHistoryAppState; diff --git a/frontend/src/Store/Selectors/createDimensionsSelector.js b/frontend/src/Store/Selectors/createDimensionsSelector.ts similarity index 69% rename from frontend/src/Store/Selectors/createDimensionsSelector.js rename to frontend/src/Store/Selectors/createDimensionsSelector.ts index ce26b2e2c..b9602cb02 100644 --- a/frontend/src/Store/Selectors/createDimensionsSelector.js +++ b/frontend/src/Store/Selectors/createDimensionsSelector.ts @@ -1,8 +1,9 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createDimensionsSelector() { return createSelector( - (state) => state.app.dimensions, + (state: AppState) => state.app.dimensions, (dimensions) => { return dimensions; } From 64be68a22d38e7ac24cdc0611e63ad0be37df0ff Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 19 Mar 2024 16:19:19 +0200 Subject: [PATCH 559/964] Bump dotnet to 6.0.29 --- azure-pipelines.yml | 2 +- src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj | 2 +- src/NzbDrone.Core/Prowlarr.Core.csproj | 4 ++-- .../Prowlarr.Integration.Test.csproj | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index feab69426..0099c4e8d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,7 +15,7 @@ variables: buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' sentryOrg: 'servarr' sentryUrl: 'https://sentry.servarr.com' - dotnetVersion: '6.0.417' + dotnetVersion: '6.0.421' nodeVersion: '20.X' innoVersion: '6.2.2' windowsImage: 'windows-2022' diff --git a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj index dbfd06861..13bc15cbc 100644 --- a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj @@ -3,7 +3,7 @@ net6.0 - + diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 29ef56865..50fdb89e8 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -4,9 +4,9 @@ - + - + diff --git a/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj b/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj index ef7cc21f3..a6f817f63 100644 --- a/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj +++ b/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj @@ -4,7 +4,7 @@ Library - + From e26fa2dbf4b1256400699125f3cb39fa97375c9a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Apr 2024 19:22:21 +0300 Subject: [PATCH 560/964] Fixed: (Anidex) Support season and episode for TV searches --- src/NzbDrone.Core/Indexers/Definitions/Anidex.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Anidex.cs b/src/NzbDrone.Core/Indexers/Definitions/Anidex.cs index 874f87091..fc4add880 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Anidex.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Anidex.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Indexers.Definitions { TvSearchParams = new List { - TvSearchParam.Q + TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep }, MusicSearchParams = new List { @@ -117,7 +117,7 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedTvSearchString}", searchCriteria.Categories)); return pageableRequests; } From 73cdaf3d4487ac84cc6e3faaa45c569de3838a54 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 22 Apr 2024 08:07:21 +0300 Subject: [PATCH 561/964] Bump NUnit and Microsoft.NET.Test.Sdk --- src/Directory.Build.props | 4 ++-- src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 27d2dd813..391434a51 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -106,8 +106,8 @@ - - + + diff --git a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj index 2b6c7e54b..59dcf031a 100644 --- a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj @@ -7,7 +7,7 @@ - + From a85406e3b7871fac37b9bb506d2d83ba15848d4e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 24 Apr 2024 09:48:07 +0300 Subject: [PATCH 562/964] Fixed: (BroadcasTheNet) Append wildcard when searching for single episodes Some results include the episode title after SxxEyy and the wildcard helps to find those too. --- .../BroadcastheNet/BroadcastheNetRequestGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs index 781e5527d..74d7d7251 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet/BroadcastheNetRequestGenerator.cs @@ -81,7 +81,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet else if (searchCriteria.Season > 0 && int.TryParse(searchCriteria.Episode, out var episode) && episode > 0) { // Standard (S/E) Episode - parameters.Name = $"S{searchCriteria.Season:00}E{episode:00}"; + parameters.Name = $"S{searchCriteria.Season:00}E{episode:00}%"; parameters.Category = "Episode"; pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset)); } From 742dd5ff54a9fb95d66d96e2c7933b1d62aacd2d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 24 Apr 2024 10:22:05 +0300 Subject: [PATCH 563/964] Update BTN tests --- .../BroadcastheNetRequestGeneratorFixture.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/BroadcastheNetTests/BroadcastheNetRequestGeneratorFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/BroadcastheNetTests/BroadcastheNetRequestGeneratorFixture.cs index 10a4c8145..39d5a6f61 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/BroadcastheNetTests/BroadcastheNetRequestGeneratorFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/BroadcastheNetTests/BroadcastheNetRequestGeneratorFixture.cs @@ -114,7 +114,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests query.Tvrage.Should().BeNull(); query.Search.Should().BeNull(); query.Category.Should().Be("Episode"); - query.Name.Should().Be("S01E03"); + query.Name.Should().Be("S01E03%"); } [Test] @@ -249,7 +249,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests query.Tvrage.Should().BeNull(); query.Search.Should().Be("Malcolm%in%the%Middle"); query.Category.Should().Be("Episode"); - query.Name.Should().Be("S02E03"); + query.Name.Should().Be("S02E03%"); } [Test] From 1da3954879184098d7605b13d428a62c6b2986f4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 17 Jan 2024 10:41:03 +0200 Subject: [PATCH 564/964] New: (GazelleGames) Freeleech only option --- .../Indexers/Definitions/GazelleGames.cs | 21 ++++++++++++++++--- src/NzbDrone.Core/Localization/Core/en.json | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs index 0599be0d6..2f51ff2cc 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs @@ -324,6 +324,11 @@ namespace NzbDrone.Core.Indexers.Definitions categoryMappings.ForEach(category => parameters.Add("artistcheck[]", category)); } + if (_settings.FreeleechOnly) + { + parameters.Add("freetorrent", "1"); + } + if (searchCriteria.MinSize is > 0) { var minSize = searchCriteria.MinSize.Value / 1024L / 1024L; @@ -404,6 +409,15 @@ namespace NzbDrone.Core.Indexers.Definitions foreach (var torrent in torrents) { + Enum.TryParse(torrent.Value.FreeTorrent, true, out GazelleGamesFreeTorrent freeTorrent); + var downloadVolumeFactor = freeTorrent is GazelleGamesFreeTorrent.FreeLeech or GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1; + + // Skip non-freeleech results when freeleech only is set + if (_settings.FreeleechOnly && downloadVolumeFactor != 0.0) + { + continue; + } + var torrentId = torrent.Key; var infoUrl = GetInfoUrl(group.Key, torrentId); @@ -412,8 +426,6 @@ namespace NzbDrone.Core.Indexers.Definitions categories = _categories.MapTrackerCatToNewznab(torrent.Value.CategoryId.ToString()).ToArray(); } - Enum.TryParse(torrent.Value.FreeTorrent, true, out GazelleGamesFreeTorrent freeTorrent); - var release = new TorrentInfo { Guid = infoUrl, @@ -428,7 +440,7 @@ namespace NzbDrone.Core.Indexers.Definitions Peers = torrent.Value.Leechers + torrent.Value.Seeders, PublishDate = torrent.Value.Time.ToUniversalTime(), Scene = torrent.Value.Scene == 1, - DownloadVolumeFactor = freeTorrent is GazelleGamesFreeTorrent.FreeLeech or GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1, + DownloadVolumeFactor = downloadVolumeFactor, UploadVolumeFactor = freeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1, MinimumSeedTime = 288000 // Minimum of 3 days and 8 hours (80 hours in total) }; @@ -543,6 +555,9 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(3, Label = "IndexerGazelleGamesSettingsSearchGroupNames", Type = FieldType.Checkbox, HelpText = "IndexerGazelleGamesSettingsSearchGroupNamesHelpText")] public bool SearchGroupNames { get; set; } + [FieldDefinition(4, Label = "IndexerSettingsFreeleechOnly", HelpText = "IndexerGazelleGamesSettingsFreeleechOnlyHelpText", Type = FieldType.Checkbox, Advanced = true)] + public bool FreeleechOnly { get; set; } + public string Passkey { get; set; } public override NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index f8ef93533..4fbfbf10a 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -336,6 +336,7 @@ "IndexerFlags": "Indexer Flags", "IndexerGazelleGamesSettingsApiKeyHelpText": "API Key from the Site (Found in Settings => Access Settings)", "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Must have User and Torrents permissions", + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Search freeleech releases only", "IndexerGazelleGamesSettingsSearchGroupNames": "Search Group Names", "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Search releases by group names", "IndexerHDBitsSettingsCodecs": "Codecs", From 0261201360ae7eb7d8feb1751cf3afeb3deb7184 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 24 Apr 2024 10:53:14 +0300 Subject: [PATCH 565/964] Fixed: (GazelleGames) Update categories Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> --- .../Indexers/Definitions/GazelleGames.cs | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs index 2f51ff2cc..e3f9513ae 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/GazelleGames.cs @@ -114,6 +114,24 @@ namespace NzbDrone.Core.Indexers.Definitions // Amstrad caps.Categories.AddCategoryMapping("Amstrad CPC", NewznabStandardCategory.ConsoleOther, "Amstrad CPC"); + // Bandai + caps.Categories.AddCategoryMapping("Bandai WonderSwan", NewznabStandardCategory.ConsoleOther, "Bandai WonderSwan"); + caps.Categories.AddCategoryMapping("Bandai WonderSwan Color", NewznabStandardCategory.ConsoleOther, "Bandai WonderSwan Color"); + + // Commodore + caps.Categories.AddCategoryMapping("Commodore 64", NewznabStandardCategory.ConsoleOther, "Commodore 64"); + caps.Categories.AddCategoryMapping("Commodore 128", NewznabStandardCategory.ConsoleOther, "Commodore 128"); + caps.Categories.AddCategoryMapping("Commodore Amiga", NewznabStandardCategory.ConsoleOther, "Commodore Amiga"); + caps.Categories.AddCategoryMapping("Amiga CD32", NewznabStandardCategory.ConsoleOther, "Amiga CD32"); + caps.Categories.AddCategoryMapping("Commodore Plus-4", NewznabStandardCategory.ConsoleOther, "Commodore Plus-4"); + caps.Categories.AddCategoryMapping("Commodore VIC-20", NewznabStandardCategory.ConsoleOther, "Commodore VIC-20"); + + // NEC + caps.Categories.AddCategoryMapping("NEC PC-98", NewznabStandardCategory.ConsoleOther, "NEC PC-98"); + caps.Categories.AddCategoryMapping("NEC PC-FX", NewznabStandardCategory.ConsoleOther, "NEC PC-FX"); + caps.Categories.AddCategoryMapping("NEC SuperGrafx", NewznabStandardCategory.ConsoleOther, "NEC SuperGrafx"); + caps.Categories.AddCategoryMapping("NEC TurboGrafx-16", NewznabStandardCategory.ConsoleOther, "NEC TurboGrafx-16"); + // Sinclair caps.Categories.AddCategoryMapping("ZX Spectrum", NewznabStandardCategory.ConsoleOther, "ZX Spectrum"); @@ -137,16 +155,9 @@ namespace NzbDrone.Core.Indexers.Definitions // Other caps.Categories.AddCategoryMapping("3DO", NewznabStandardCategory.ConsoleOther, "3DO"); - caps.Categories.AddCategoryMapping("Bandai WonderSwan", NewznabStandardCategory.ConsoleOther, "Bandai WonderSwan"); - caps.Categories.AddCategoryMapping("Bandai WonderSwan Color", NewznabStandardCategory.ConsoleOther, "Bandai WonderSwan Color"); caps.Categories.AddCategoryMapping("Casio Loopy", NewznabStandardCategory.ConsoleOther, "Casio Loopy"); caps.Categories.AddCategoryMapping("Casio PV-1000", NewznabStandardCategory.ConsoleOther, "Casio PV-1000"); caps.Categories.AddCategoryMapping("Colecovision", NewznabStandardCategory.ConsoleOther, "Colecovision"); - caps.Categories.AddCategoryMapping("Commodore 64", NewznabStandardCategory.ConsoleOther, "Commodore 64"); - caps.Categories.AddCategoryMapping("Commodore 128", NewznabStandardCategory.ConsoleOther, "Commodore 128"); - caps.Categories.AddCategoryMapping("Commodore Amiga", NewznabStandardCategory.ConsoleOther, "Commodore Amiga"); - caps.Categories.AddCategoryMapping("Commodore Plus-4", NewznabStandardCategory.ConsoleOther, "Commodore Plus-4"); - caps.Categories.AddCategoryMapping("Commodore VIC-20", NewznabStandardCategory.ConsoleOther, "Commodore VIC-20"); caps.Categories.AddCategoryMapping("Emerson Arcadia 2001", NewznabStandardCategory.ConsoleOther, "Emerson Arcadia 2001"); caps.Categories.AddCategoryMapping("Entex Adventure Vision", NewznabStandardCategory.ConsoleOther, "Entex Adventure Vision"); caps.Categories.AddCategoryMapping("Epoch Super Casette Vision", NewznabStandardCategory.ConsoleOther, "Epoch Super Casette Vision"); @@ -161,13 +172,11 @@ namespace NzbDrone.Core.Indexers.Definitions caps.Categories.AddCategoryMapping("Mattel Intellivision", NewznabStandardCategory.ConsoleOther, "Mattel Intellivision"); caps.Categories.AddCategoryMapping("Memotech MTX", NewznabStandardCategory.ConsoleOther, "Memotech MTX"); caps.Categories.AddCategoryMapping("Miles Gordon Sam Coupe", NewznabStandardCategory.ConsoleOther, "Miles Gordon Sam Coupe"); - caps.Categories.AddCategoryMapping("NEC PC-98", NewznabStandardCategory.ConsoleOther, "NEC PC-98"); - caps.Categories.AddCategoryMapping("NEC PC-FX", NewznabStandardCategory.ConsoleOther, "NEC PC-FX"); - caps.Categories.AddCategoryMapping("NEC SuperGrafx", NewznabStandardCategory.ConsoleOther, "NEC SuperGrafx"); - caps.Categories.AddCategoryMapping("NEC TurboGrafx-16", NewznabStandardCategory.ConsoleOther, "NEC TurboGrafx-16"); caps.Categories.AddCategoryMapping("Nokia N-Gage", NewznabStandardCategory.ConsoleOther, "Nokia N-Gage"); + caps.Categories.AddCategoryMapping("Oculus Quest", NewznabStandardCategory.ConsoleOther, "Oculus Quest"); caps.Categories.AddCategoryMapping("Ouya", NewznabStandardCategory.ConsoleOther, "Ouya"); caps.Categories.AddCategoryMapping("Philips Videopac+", NewznabStandardCategory.ConsoleOther, "Philips Videopac+"); + caps.Categories.AddCategoryMapping("Philips CD-i", NewznabStandardCategory.ConsoleOther, "Philips CD-i"); caps.Categories.AddCategoryMapping("Phone/PDA", NewznabStandardCategory.ConsoleOther, "Phone/PDA"); caps.Categories.AddCategoryMapping("RCA Studio II", NewznabStandardCategory.ConsoleOther, "RCA Studio II"); caps.Categories.AddCategoryMapping("Sharp X1", NewznabStandardCategory.ConsoleOther, "Sharp X1"); From ab3dc765b42989c7147a6085d6ddb13200604b96 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 25 Apr 2024 11:18:33 +0300 Subject: [PATCH 566/964] Database corruption message linking to wiki --- src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs b/src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs index 82b4065f7..a8403187a 100644 --- a/src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs +++ b/src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs @@ -16,12 +16,12 @@ namespace NzbDrone.Core.Datastore } public CorruptDatabaseException(string message, Exception innerException, params object[] args) - : base(message, innerException, args) + : base(innerException, message, args) { } public CorruptDatabaseException(string message, Exception innerException) - : base(message, innerException) + : base(innerException, message) { } } From 77a982a7dadea51b95db3b813fa31f7272509165 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 25 Apr 2024 14:50:30 +0300 Subject: [PATCH 567/964] Fixed: Retrying download on not suppressed HTTP errors --- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index a8280f3ff..6234fe7c3 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -38,6 +38,7 @@ namespace NzbDrone.Core.Indexers { { Result.HasHttpServerError: true } => PredicateResult.True(), { Result.StatusCode: HttpStatusCode.RequestTimeout } => PredicateResult.True(), + { Exception: HttpException { Response.HasHttpServerError: true } } => PredicateResult.True(), _ => PredicateResult.False() }, Delay = RateLimit, From b223e9b0cca53aa4362a2abb09e44e51d16cbada Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Fri, 7 Apr 2017 22:09:49 +0200 Subject: [PATCH 568/964] Should not empty install folder, MirrorFolder will take care of it. (cherry picked from commit cd450a44bf34da3720f4a1551acd2f0ce2aa313d) --- src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs b/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs index 1b2f4d90d..5ea53453b 100644 --- a/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs +++ b/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs @@ -122,9 +122,6 @@ namespace NzbDrone.Update.UpdateEngine try { - _logger.Info("Emptying installation folder"); - _diskProvider.EmptyFolder(installationFolder); - _logger.Info("Copying new files to target folder"); _diskTransferService.MirrorFolder(_appFolderInfo.GetUpdatePackageFolder(), installationFolder); From b29bc923fc870b9f2c0582ca20db0d16adb541d5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 25 Apr 2024 18:42:28 +0300 Subject: [PATCH 569/964] Fixed: Don't reset sorting, columns and selected filter on clear releases Fixes #2112 --- frontend/src/Store/Actions/releaseActions.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/frontend/src/Store/Actions/releaseActions.js b/frontend/src/Store/Actions/releaseActions.js index bdb3ce2df..fd2fe441b 100644 --- a/frontend/src/Store/Actions/releaseActions.js +++ b/frontend/src/Store/Actions/releaseActions.js @@ -401,7 +401,16 @@ export const actionHandlers = handleThunks({ export const reducers = createHandleActions({ [CLEAR_RELEASES]: (state) => { - return Object.assign({}, state, defaultState); + const { + sortKey, + sortDirection, + customFilters, + selectedFilterKey, + columns, + ...otherDefaultState + } = defaultState; + + return Object.assign({}, state, otherDefaultState); }, [UPDATE_RELEASE]: (state, { payload }) => { From 6aef48c6e733725e77d7e918311abe7db5fd0c7b Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 27 Apr 2024 18:11:43 +0000 Subject: [PATCH 570/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: GkhnGRBZ Co-authored-by: Havok Dan Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: fordas Co-authored-by: maodun96 <435795439@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 73 ++++++++++--------- src/NzbDrone.Core/Localization/Core/fi.json | 5 +- .../Localization/Core/pt_BR.json | 3 +- src/NzbDrone.Core/Localization/Core/tr.json | 66 ++++++++++++++--- .../Localization/Core/zh_CN.json | 3 +- 5 files changed, 99 insertions(+), 51 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 1b0dc3041..954dfbb87 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -29,10 +29,10 @@ "View": "Vista", "Updates": "Actualizaciones", "UpdateUiNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de interfaz de usuario '{uiFolder}' no es modificable por el usuario '{userName}'.", - "UpdateStartupTranslocationHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de arranque '{startupFolder}' está en una carpeta de \"App Translocation\".", + "UpdateStartupTranslocationHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de arranque '{startupFolder}' está en una carpeta de translocación de aplicaciones.", "UpdateStartupNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de arranque '{startupFolder}' no tiene permisos de escritura para el usuario '{userName}'.", "UnselectAll": "Desmarcar todo", - "UI": "UI", + "UI": "Interfaz", "Tasks": "Tareas", "Tags": "Etiquetas", "System": "Sistema", @@ -167,7 +167,7 @@ "URLBase": "URL base", "Uptime": "Tiempo de actividad", "UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización", - "UpdateMechanismHelpText": "Usar el actualizador incorporado de {appName} o un script", + "UpdateMechanismHelpText": "Usar el actualizador integrado de {appName} o un script", "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones", "UnableToLoadTags": "No se pueden cargar las Etiquetas", "UnableToLoadNotifications": "No se pueden cargar las Notificaciones", @@ -214,7 +214,7 @@ "LogLevel": "Nivel de Registro", "LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de {appName} al arrancar la app.", "Interval": "Intervalo", - "IndexerFlags": "Banderas del indexador", + "IndexerFlags": "Indicadores del indexador", "IncludeHealthWarningsHelpText": "Incluir Alertas de Salud", "IllRestartLater": "Lo reiniciaré más tarde", "IgnoredAddresses": "Ignorar direcciones", @@ -250,12 +250,12 @@ "UnableToLoadGeneralSettings": "No se han podido cargar los ajustes Generales", "UnableToLoadBackups": "No se pudo cargar las copias de seguridad", "UnableToAddANewNotificationPleaseTryAgain": "No se ha podido añadir una nueva notificación, prueba otra vez.", - "UnableToAddANewIndexerPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.", + "UnableToAddANewIndexerPleaseTryAgain": "No se pudo añadir un nuevo indexador, por favor inténtalo de nuevo.", "UnableToAddANewDownloadClientPleaseTryAgain": "No se ha podido añadir un nuevo gestor de descargas, prueba otra vez.", "TagIsNotUsedAndCanBeDeleted": "La etiqueta no se usa y puede ser borrada", "StartTypingOrSelectAPathBelow": "Comienza a escribir o selecciona una ruta debajo", "Restore": "Restaurar", - "ProwlarrSupportsAnyIndexer": "{appName} soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.", + "ProwlarrSupportsAnyIndexer": "{appName} soporta muchos indexadores junto a cualquier indexador que utilice el estándar Newznab/Torznab usando 'Newznab genérico' (para usenet) o 'Torznab genérico' (para torrents). Busca y selecciona tu indexador a continuación.", "ProwlarrSupportsAnyDownloadClient": "{appName} soporta cualquier gestor de descargas indicado debajo.", "NoUpdatesAreAvailable": "No hay actualizaciones disponibles", "NoTagsHaveBeenAddedYet": "Ninguna etiqueta ha sido añadida aún", @@ -271,9 +271,9 @@ "UILanguage": "Lenguaje de UI", "Priority": "Prioridad", "InteractiveSearch": "Búsqueda Interactiva", - "IndexerPriorityHelpText": "Prioridad del Indexer de 1 (La más alta) a 50 (La más baja). Por defecto: 25.", + "IndexerPriorityHelpText": "Prioridad del indexador de 1 (la más alta) a 50 (la más baja). Predeterminado: 25.", "IndexerPriority": "Prioridad del indexador", - "EditIndexer": "Editar Indexer", + "EditIndexer": "Editar indexador", "Disabled": "Deshabilitado", "AutomaticSearch": "Búsqueda Automática", "AddIndexer": "Añadir Indexador", @@ -284,8 +284,8 @@ "MovieIndexScrollBottom": "Indice de Películas: Desplazar hacia abajo", "CloseCurrentModal": "Cerrar esta Ventana Modal", "AcceptConfirmationModal": "Aceptar Confirmación de esta Ventana Modal", - "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexers no disponible por errores durando más de 6 horas: {indexerNames}", - "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Ningún indexer está disponible por errores durando más de 6 horas", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexadores no disponibles debido a errores durante más de 6 horas: {indexerNames}", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Ningún indexador está disponible debido a errores durante más de 6 horas", "Reddit": "Reddit", "UnableToAddANewAppProfilePleaseTryAgain": "No se ha podido añadir un nuevo perfil de calidad, prueba otra vez.", "DeleteIndexerProxyMessageText": "¿Seguro que quieres eliminar el proxy indexador '{name}'?", @@ -301,15 +301,15 @@ "Today": "Hoy", "Tomorrow": "Mañana", "Torrent": "Torrents", - "UnableToAddANewIndexerProxyPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.", + "UnableToAddANewIndexerProxyPleaseTryAgain": "No se pudo añadir un nuevo proxy de indexador, por favor inténtalo de nuevo.", "Wiki": "Wiki", "Yesterday": "Ayer", "ApplicationStatusCheckAllClientMessage": "Las listas no están disponibles debido a errores", "ApplicationStatusCheckSingleClientMessage": "Listas no disponibles debido a errores: {0}", "AllIndexersHiddenDueToFilter": "Todos los indexadores están ocultas debido al filtro aplicado.", "DeleteApplicationMessageText": "Seguro que quieres eliminar la notificación '{name}'?", - "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Los indexers no están disponibles debido a errores", - "IndexerProxyStatusUnavailableHealthCheckMessage": "Indexers no disponibles debido a errores: {indexerProxyNames}", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Ningún indexador disponible debido a errores", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxies de indexador no disponibles debido a errores: {indexerProxyNames}", "NoLinks": "Sin enlaces", "AddDownloadClient": "Añadir Cliente de Descarga", "CouldNotConnectSignalR": "No se pudo conectar a SignalR, la interfaz de usuario no se actualiza", @@ -342,13 +342,13 @@ "Encoding": "Codificación", "GrabReleases": "Capturar Lanzamiento(s)", "Link": "Enlace", - "MappedDrivesRunningAsService": "Las unidades de red asignadas no están disponibles cuando se ejecutan como un servicio de Windows. Consulte las preguntas frecuentes para obtener más información", + "MappedDrivesRunningAsService": "Las unidades de red asignadas no están disponibles cuando se ejecutan como un servicio de Windows. Consulta las preguntas frecuentes para obtener más información", "No": "No", - "Notification": "Notificaciones", + "Notification": "Notificación", "Notifications": "Notificaciones", "UnableToLoadIndexers": "No se pueden cargar los indexadores", "Yes": "Sí", - "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API", + "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación que llamó a la API", "InstanceName": "Nombre de la Instancia", "InstanceNameHelpText": "Nombre de la instancia en la pestaña y para la aplicación Syslog", "Database": "Base de datos", @@ -374,9 +374,9 @@ "Theme": "Tema", "ApplyTagsHelpTextAdd": "Añadir: Añade las etiquetas a la lista de etiquetas existente", "DeleteSelectedApplicationsMessageText": "¿Está seguro de querer eliminar {count} aplicación(es) de seleccionada(s)?", - "DeleteSelectedDownloadClients": "Borrar Cliente de Descarga(s)", - "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", - "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", + "DeleteSelectedDownloadClients": "Borrar cliente(s) de descarga", + "DeleteSelectedIndexersMessageText": "¿Estás seguro que quieres eliminar {count} indexador(es) seleccionado(s)?", + "DeleteSelectedDownloadClientsMessageText": "¿Estás seguro que quieres eliminar {count} cliente(s) de descarga seleccionado(s)?", "ApplyTagsHelpTextHowToApplyApplications": "Cómo aplicar etiquetas a las aplicaciones seleccionadas", "SelectIndexers": "Seleccionar Indexadores", "ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados", @@ -386,7 +386,7 @@ "DownloadClientPriorityHelpText": "Priorizar varios Clientes de Descarga. Round-Robin se utiliza para clientes con la misma prioridad.", "Season": "Temporada", "More": "Más", - "Track": "Rastro", + "Track": "Pista", "Year": "Año", "UpdateAvailableHealthCheckMessage": "La nueva actualización está disponible", "Genre": "Género", @@ -402,17 +402,17 @@ "ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {length} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración", "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {indexerNames}.", "Episode": "Episodio", - "ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.", - "ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", + "ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puedes pulsar en recargar abajo.", + "ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para restaurar su funcionalidad.", "RecentChanges": "Cambios recientes", - "WhatsNew": "Que es lo nuevo?", - "minutes": "Minutos", + "WhatsNew": "¿Qué hay nuevo?", + "minutes": "minutos", "Album": "Álbum", "Artist": "Artista", "DeleteAppProfileMessageText": "¿Estás seguro de que quieres eliminar el perfil de la aplicación '{name}'?", "AddConnection": "Añadir Conexión", - "NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a fallos", - "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {notificationNames}", + "NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a errores", + "NotificationStatusSingleClientHealthCheckMessage": "Notificaciones no disponibles debido a errores: {notificationNames}", "EditIndexerImplementation": "Editar Indexador - {implementationName}", "AuthBasic": "Básico (ventana emergente del navegador)", "AuthForm": "Formularios (Página de inicio de sesión)", @@ -496,7 +496,7 @@ "InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración", "DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)", - "EnableRssHelpText": "Habilitar feed RSS para el Indexador", + "EnableRssHelpText": "Habilitar canal RSS para el Indexador", "days": "días", "ElapsedTime": "Tiempo transcurrido", "GrabTitle": "Capturar título", @@ -505,17 +505,17 @@ "Redirect": "Redirección", "RssQueries": "Consultas RSS", "SeedRatio": "Proporción de Semillado", - "RssFeed": "Feed RSS", + "RssFeed": "Canal RSS", "SearchType": "Tipo de búsqueda", "RepeatSearch": "Repetir búsqueda", "SeedRatioHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto", "SeedTime": "Tiempo de Semillado", "SearchTypes": "Tipos de búsquedas", "DeleteIndexerProxy": "Eliminar proxy indexador", - "OnGrabHelpText": "Al Capturar lanzamiento", - "SeedTimeHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto", + "OnGrabHelpText": "Al capturar lanzamiento", + "SeedTimeHelpText": "El tiempo que un torrent debería ser sembrado antes de detenerse, si está vacío usa el valor predeterminado", "IndexerTagsHelpTextWarning": "Las etiquetas deben utilizarse con precaución, ya que pueden tener efectos no deseados. Un indexador con una etiqueta solo se sincronizará con aplicaciones que tengan la misma etiqueta.", - "TVSearchTypes": "Tipos de búsquedas", + "TVSearchTypes": "Tipos de búsqueda de TV", "DownloadClientAriaSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación de Aria2 predeterminada", "IndexerNoDefCheckMessage": "Los indexadores no tienen definición y no funcionarán: {0}. Por favor elimínelos y (o) vuelva a añadirlos a {appName}", "IndexerProxy": "Proxy del Indexador", @@ -524,10 +524,10 @@ "IndexerRss": "RSS del Indexador", "IndexerSettingsSummary": "Configurar varios ajustes globales del Indexador, incluyendo Proxies.", "IndexerName": "Nombre del Indexador", - "IndexerVipExpiringHealthCheckMessage": "Las ventajas VIP de los indexadores expiran pronto: {indexerNames}", + "IndexerVipExpiringHealthCheckMessage": "Las ventajas VIP del indexador expiran pronto: {indexerNames}", "IndexerProxies": "Proxies del Indexador", "IndexerHistoryLoadError": "Error al cargar el historial del Indexador", - "IndexerVipExpiredHealthCheckMessage": "Las ventajas VIP del Indexador han caducado: {indexerNames}", + "IndexerVipExpiredHealthCheckMessage": "Las ventajas VIP del indexador han expirado: {indexerNames}", "IndexerQuery": "Consulta dedl Indexador", "IndexerSite": "Sitio del Indexador", "IndexerStatus": "Estado del indexador", @@ -613,7 +613,7 @@ "IndexerHDBitsSettingsPasskeyHelpText": "Clave de acceso desde los Detalles de Usuario", "IndexerSettingsPasskey": "Clave de Acceso", "BlackholeFolderHelpText": "La carpeta en donde {appName} se almacenaran los {extension} file", - "CustomFilter": "Filtros personalizados", + "CustomFilter": "Filtro personalizado", "LabelIsRequired": "Se requiere etiqueta", "TorrentBlackholeSaveMagnetFiles": "Guardar archivos magnet", "TorrentBlackholeTorrentFolder": "Carpeta de torrent", @@ -702,7 +702,7 @@ "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Buscar solo lanzamientos freeleech", "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Buscar solo freeleech (UL limitada)", "IndexerFileListSettingsFreeleechOnlyHelpText": "Buscar solo lanzamientos freeleech", - "IndexerFileListSettingsPasskeyHelpText": "Clave de acceso del sitio (esto es la cadena alfanumérica en la url del tracket mostrada en tu cliente de descarga)", + "IndexerFileListSettingsPasskeyHelpText": "Clave de acceso del sitio (Esto es la cadena alfanumérica en la url del tracker mostrada en tu cliente de descarga)", "IndexerFileListSettingsUsernameHelpText": "Usuario del sitio", "IndexerHDBitsSettingsMediums": "Medios", "IndexerHDBitsSettingsCodecs": "Códecs", @@ -749,5 +749,6 @@ "IndexerSettingsVipExpiration": "Expiración del VIP", "XmlRpcPath": "Ruta RPC de XML", "NotificationsTelegramSettingsIncludeAppName": "Incluir {appName} en el título", - "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente prefija el título del mensaje con {appName} para diferenciar las notificaciones de las diferentes aplicaciones" + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente prefija el título del mensaje con {appName} para diferenciar las notificaciones de las diferentes aplicaciones", + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Busca solo lanzamientos freeleech" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 84401634d..63dd34ebf 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -668,7 +668,7 @@ "DownloadClientFreeboxSettingsPortHelpText": "Freebox-liittymän portti. Oletus on \"{port}\".", "DownloadClientPneumaticSettingsNzbFolder": "NZB-kansio", "DownloadClientQbittorrentSettingsSequentialOrder": "Peräkkäinen järjestys", - "CustomFilter": "Omat suodattimet", + "CustomFilter": "Oma suodatin", "DownloadClientFreeboxSettingsAppIdHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä käytettävä App ID -sovellustunniste.", "DownloadClientFreeboxSettingsAppToken": "Sovellustietue", "DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä vaatii vähintään NzbGet-version 16.0.", @@ -680,5 +680,6 @@ "TorrentBlackholeSaveMagnetFilesHelpText": "Tallenna magnet-linkki, jos .torrent-tiedostoa ei ole käytettävissä (hyödyllinen vain lataustyökalun tukiessa tiedostoon tallennettuja magnet-linkkejä).", "TorrentBlackholeTorrentFolder": "Torrent-kansio", "TorrentBlackholeSaveMagnetFilesExtension": "Tallennettujen magnet-tiedostojen pääte", - "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Magnet-linkeille käytettävä tiedostopääte. Oletus on \".magnet\"." + "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Magnet-linkeille käytettävä tiedostopääte. Oletus on \".magnet\".", + "LabelIsRequired": "Nimi on pakollinen" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index b83df3dc1..e50598538 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -749,5 +749,6 @@ "IndexerMTeamTpSettingsApiKeyHelpText": "Chave API do Site (Encontrada no Painel de Controle do Usuário => Segurança => Laboratório)", "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech", "NotificationsTelegramSettingsIncludeAppName": "Incluir {appName} no Título", - "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente, prefixe o título da mensagem com {appName} para diferenciar notificações de diferentes aplicativos" + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente, prefixe o título da mensagem com {appName} para diferenciar notificações de diferentes aplicativos", + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index d71d04b90..d1eb99965 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -55,7 +55,7 @@ "MoreInfo": "Daha fazla bilgi", "LastWriteTime": "Son Yazma Zamanı", "Language": "Dil", - "History": "Tarih", + "History": "Geçmiş", "HideAdvanced": "Gelişmiş'i Gizle", "Health": "Sağlık", "General": "Genel", @@ -65,7 +65,7 @@ "CustomFilters": "Özel Filtreler", "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut kodları", "Analytics": "Analiz", - "All": "Herşey", + "All": "Hepsi", "Added": "Eklendi", "Add": "Ekle", "Branch": "Şube", @@ -94,10 +94,10 @@ "PortNumber": "Port numarası", "RestoreBackup": "Yedeği Geri Yükle", "Rss": "RSS", - "Save": "Kayıt etmek", + "Save": "Kaydet", "SaveSettings": "Ayarları kaydet", "ScriptPath": "Komut Dosyası Yolu", - "Test": "Ölçek", + "Test": "Sına", "TestAll": "Tümünü Test Et", "UnableToAddANewApplicationPleaseTryAgain": "Yeni bir bildirim eklenemiyor, lütfen tekrar deneyin.", "YesCancel": "Evet İptal", @@ -132,9 +132,9 @@ "Reload": "Tekrar yükle", "RemovedFromTaskQueue": "Görev kuyruğundan kaldırıldı", "SendAnonymousUsageData": "Anonim Kullanım Verilerini Gönderin", - "Age": "Yaş", + "Age": "Yıl", "AllIndexersHiddenDueToFilter": "Uygulanan filtre nedeniyle tüm dizin oluşturucular gizlendi.", - "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Bu, tarayıcınızla ilgili bilgileri, kullandığınız {appName} Web arayüz sayfalarını, hata raporlamasının yanı sıra işletim sistemi ve çalışma zamanı sürümünü içerir. Bu bilgileri, özellikleri ve hata düzeltmelerini önceliklendirmek için kullanacağız.", + "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Buna, tarayıcınız, hangi {appName} WebUI sayfalarını kullandığınız, hata raporlamanın yanı sıra işletim sistemi ve çalışma zamanı sürümü hakkındaki bilgiler de dahildir. Bu bilgiyi özelliklere ve hata düzeltmelerine öncelik vermek için kullanacağız.", "ApiKey": "API Anahtarı", "AppDataDirectory": "Uygulama Veri Dizini", "NoUpdatesAreAvailable": "Güncelleme yok", @@ -172,7 +172,7 @@ "Docker": "Liman işçisi", "Donations": "Bağışlar", "DownloadClient": "İstemciyi İndir", - "DownloadClients": "İstemcileri İndir", + "DownloadClients": "İndirme İstemcileri", "EnableAutomaticSearch": "Otomatik Aramayı Etkinleştir", "EnableInteractiveSearchHelpText": "Etkileşimli arama kullanıldığında kullanılacak", "FocusSearchBox": "Arama Kutusuna Odaklan", @@ -349,8 +349,8 @@ "minutes": "Dakika", "WhatsNew": "Ne var ne yok?", "ConnectionLostReconnect": "{appName} otomatik bağlanmayı deneyecek veya aşağıda yeniden yükle seçeneğini işaretleyebilirsiniz.", - "NotificationStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", - "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {notificationNames}", + "NotificationStatusAllClientHealthCheckMessage": "Arızalar nedeniyle tüm bildirimler kullanılamıyor", + "NotificationStatusSingleClientHealthCheckMessage": "Arızalar nedeniyle bildirimler kullanılamıyor: {notificationNames}", "Applications": "Uygulamalar", "AuthBasic": "Temel (Tarayıcı Açılır Penceresi)", "AuthForm": "Formlar (Giriş Sayfası)", @@ -372,7 +372,7 @@ "EditIndexerProxyImplementation": "Koşul Ekle - {implementationName}", "AddCustomFilter": "Özel Filtre Ekleyin", "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", - "EditDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", + "EditDownloadClientImplementation": "İndirme İstemcisini Düzenle - {implementationName}", "ApplicationURL": "Uygulama URL'si", "AuthenticationRequired": "Kimlik Doğrulama Gerekli", "ApplyChanges": "Değişiklikleri Uygula", @@ -434,5 +434,49 @@ "DownloadClientFreeboxSettingsAppToken": "Uygulama Token'ı", "DownloadClientFreeboxSettingsAppTokenHelpText": "Freebox API'sine erişim oluşturulurken alınan uygulama jetonu (ör. 'app_token')", "DownloadClientFreeboxSettingsAppId": "Uygulama kimliği", - "DownloadClientFreeboxSettingsHostHelpText": "Freebox'un ana bilgisayar adı veya ana bilgisayar IP adresi, varsayılan olarak '{url}' şeklindedir (yalnızca aynı ağdaysa çalışır)" + "DownloadClientFreeboxSettingsHostHelpText": "Freebox'un ana bilgisayar adı veya ana bilgisayar IP adresi, varsayılan olarak '{url}' şeklindedir (yalnızca aynı ağdaysa çalışır)", + "Duration": "Süre", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent'in yapılandırılmış içerik düzenini mi, torrentteki orijinal düzeni mi kullanacağınızı yoksa her zaman bir alt klasör oluşturup oluşturmayacağınızı (qBittorrent 4.3.2+)", + "DownloadClientQbittorrentSettingsInitialStateHelpText": "Torrentlerin başlangıç durumu qBittorrent'e eklendi. Zorunlu Torrentlerin seed kısıtlamalarına uymadığını unutmayın", + "DownloadClientRTorrentSettingsUrlPath": "URL Yolu", + "DownloadClientRTorrentSettingsUrlPathHelpText": "XMLRPC uç noktasının yolu, bkz. {url}. RuTorrent kullanılırken bu genellikle RPC2 veya [ruTorrent yolu]{url2} olur.", + "DownloadClientSettingsInitialState": "Başlangıç Durumu", + "DownloadClientSettingsUrlBaseHelpText": "{clientName} URL'sine {url} gibi bir önek ekler", + "DownloadClientSettingsInitialStateHelpText": "{clientName} dosyasına eklenen torrentler için başlangıç durumu", + "DownloadClientQbittorrentSettingsFirstAndLastFirst": "İlk ve Son İlk", + "DownloadClientRTorrentSettingsAddStoppedHelpText": "Etkinleştirme, durdurulmuş durumdaki rTorrent'e torrentler ve magnet ekleyecektir. Bu magnet dosyalarını bozabilir.", + "DownloadClientSettingsAddPaused": "Ekleme Durduruldu", + "DownloadClientSettingsDestinationHelpText": "İndirme hedefini manuel olarak belirtir, varsayılanı kullanmak için boş bırakın", + "DownloadClientSettingsUseSslHelpText": "{clientName} ile bağlantı kurulurken güvenli bağlantıyı kullan", + "DownloadClientTransmissionSettingsDirectoryHelpText": "İndirilenlerin yerleştirileceği isteğe bağlı konum, varsayılan İletim konumunu kullanmak için boş bırakın", + "DownloadClientPneumaticSettingsStrmFolder": "Strm Klasörü", + "DownloadClientPneumaticSettingsStrmFolderHelpText": "Bu klasördeki .strm dosyaları drone ile içe aktarılacak", + "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Önce ilk ve son parçaları indirin (qBittorrent 4.1.0+)", + "DownloadClientQbittorrentSettingsSequentialOrder": "Sıralı Sıra", + "DownloadClientRTorrentSettingsDirectoryHelpText": "İndirilenlerin yerleştirileceği isteğe bağlı konum, varsayılan rTorrent konumunu kullanmak için boş bırakın", + "DownloadClientTransmissionSettingsUrlBaseHelpText": "{clientName} rpc URL'sine bir önek ekler, örneğin {url}, varsayılan olarak '{defaultUrl}' olur", + "DownloadClientQbittorrentSettingsContentLayout": "İçerik Düzeni", + "DownloadClientPneumaticSettingsNzbFolder": "Nzb Klasörü", + "DownloadClientNzbgetSettingsAddPausedHelpText": "Bu seçenek en az NzbGet sürüm 16.0'ı gerektirir", + "DownloadClientPneumaticSettingsNzbFolderHelpText": "Bu klasöre XBMC'den erişilmesi gerekecek", + "DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Sıralı olarak indirin (qBittorrent 4.1.0+)", + "DownloadClientQbittorrentSettingsUseSslHelpText": "Güvenli bir bağlantı kullanın. qBittorrent'te Seçenekler -> Web Kullanıcı Arayüzü -> 'HTTP yerine HTTPS kullan' bölümüne bakın.", + "DownloadClientRTorrentSettingsAddStopped": "Ekleme Durduruldu", + "Label": "Etiket", + "EditSelectedDownloadClients": "Seçilen İndirme İstemcilerini Düzenle", + "EditSelectedIndexers": "Seçili Dizin Oluşturucuları Düzenle", + "NoIndexersFound": "Dizin oluşturucu bulunamadı", + "NoHistoryFound": "Geçmiş bulunamadı", + "ManageDownloadClients": "İndirme İstemcilerini Yönet", + "InstanceNameHelpText": "Sekmedeki örnek adı ve Syslog uygulaması adı için", + "LabelIsRequired": "Etiket gerekli", + "ManageClients": "İstemcileri Yönet", + "Implementation": "Uygula", + "NotificationsEmailSettingsUseEncryptionHelpText": "Sunucuda yapılandırılmışsa şifrelemeyi kullanmayı mı tercih edeceğiniz, şifrelemeyi her zaman SSL (yalnızca Bağlantı Noktası 465) veya StartTLS (başka herhangi bir bağlantı noktası) aracılığıyla mı kullanacağınız veya hiçbir zaman şifrelemeyi kullanmama tercihlerini belirler", + "Menu": "Menü", + "NotificationsEmailSettingsUseEncryption": "Şifreleme Kullan", + "InvalidUILanguage": "Kullanıcı arayüzünüz geçersiz bir dile ayarlanmış, düzeltin ve ayarlarınızı kaydedin", + "InstanceName": "Örnek isim", + "NoDownloadClientsFound": "İndirme istemcisi bulunamadı", + "NotificationTriggersHelpText": "Bu bildirimi hangi olayların tetikleyeceğini seçin" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 3d5092bc9..af96c24de 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -604,5 +604,6 @@ "DownloadClientQbittorrentSettingsContentLayout": "内容布局", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局,使用种子的原始布局或始终创建子文件夹(qBittorrent 4.3.2+)", "DownloadClientAriaSettingsDirectoryHelpText": "可选的下载位置,留空使用 Aria2 默认位置", - "ManageClients": "管理客户端" + "ManageClients": "管理客户端", + "CustomFilter": "自定义过滤器" } From 15fabbe7d087b3696a14795d9bb7c7cd2ee04628 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 28 Apr 2024 12:50:04 +0300 Subject: [PATCH 571/964] Bump version to 1.17.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0099c4e8d..fcf411854 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.17.0' + majorVersion: '1.17.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From eee21de79585c0a8306491d2eafaa7fd627ccb0e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 30 Jan 2024 21:10:17 +0200 Subject: [PATCH 572/964] Fixed: Handle download redirects to magnet links --- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index 6234fe7c3..26d1bae96 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -27,6 +27,7 @@ namespace NzbDrone.Core.Indexers where TSettings : IIndexerSettings, new() { protected const int MaxNumResultsPerQuery = 1000; + private const int MaxRedirects = 5; protected readonly IIndexerHttpClient _httpClient; protected readonly IEventAggregator _eventAggregator; @@ -239,11 +240,47 @@ namespace NzbDrone.Core.Indexers request.RateLimit = RateLimit; } + request.AllowAutoRedirect = false; + byte[] fileData; try { var response = await _httpClient.ExecuteProxiedAsync(request, Definition); + + if (response.StatusCode is HttpStatusCode.MovedPermanently or HttpStatusCode.Found or HttpStatusCode.SeeOther) + { + var autoRedirectChain = new List { request.Url.ToString() }; + + do + { + var redirectUrl = response.RedirectUrl; + + _logger.Debug("Download request is being redirected to: {0}", redirectUrl); + + if (redirectUrl.IsNullOrWhiteSpace()) + { + throw new WebException("Remote website tried to redirect without providing a location."); + } + + if (redirectUrl.StartsWith("magnet:")) + { + return await Download(new Uri(redirectUrl)); + } + + request.Url = new HttpUri(redirectUrl); + autoRedirectChain.Add(request.Url.ToString()); + + if (autoRedirectChain.Count > MaxRedirects) + { + throw new WebException($"Too many download redirections were attempted for {autoRedirectChain.Join(" -> ")}", WebExceptionStatus.ProtocolError); + } + + response = await _httpClient.ExecuteProxiedAsync(request, Definition); + } + while (response.StatusCode is HttpStatusCode.MovedPermanently or HttpStatusCode.Found or HttpStatusCode.SeeOther); + } + fileData = response.ResponseData; _logger.Debug("Downloaded for release finished ({0} bytes from {1})", fileData.Length, link.AbsoluteUri); @@ -287,10 +324,7 @@ namespace NzbDrone.Core.Indexers protected virtual Task GetDownloadRequest(Uri link) { - var requestBuilder = new HttpRequestBuilder(link.AbsoluteUri) - { - AllowAutoRedirect = FollowRedirect - }; + var requestBuilder = new HttpRequestBuilder(link.AbsoluteUri); if (Cookies != null) { From ab7debb34b98a65512c174f62526797d359e451e Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 18 Apr 2024 21:40:22 -0700 Subject: [PATCH 573/964] Improve paths longer than 256 on Windows failing to hardlink (cherry picked from commit a97fbcc40a6247bf59678425cf460588fd4dbecd) --- src/NzbDrone.Windows/Disk/DiskProvider.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Windows/Disk/DiskProvider.cs b/src/NzbDrone.Windows/Disk/DiskProvider.cs index ebdf026e1..f0661e245 100644 --- a/src/NzbDrone.Windows/Disk/DiskProvider.cs +++ b/src/NzbDrone.Windows/Disk/DiskProvider.cs @@ -170,6 +170,11 @@ namespace NzbDrone.Windows.Disk { try { + if (source.Length > 256 && !source.StartsWith(@"\\?\")) + { + source = @"\\?\" + source; + } + return CreateHardLink(destination, source, IntPtr.Zero); } catch (Exception ex) From 5a6b1313e8147c0b37bca00fae2c2cdb06674e4d Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 27 Apr 2024 18:04:50 -0700 Subject: [PATCH 574/964] Validate that folders in paths don't start or end with a space (cherry picked from commit 316b5cbf75b45ef9a25f96ce1f2fbed25ad94296) --- .../PathExtensionFixture.cs | 28 +++++++++++++++- .../Extensions/PathExtensions.cs | 33 +++++++++++++++++-- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Common.Test/PathExtensionFixture.cs b/src/NzbDrone.Common.Test/PathExtensionFixture.cs index a33a53c01..344c6faf3 100644 --- a/src/NzbDrone.Common.Test/PathExtensionFixture.cs +++ b/src/NzbDrone.Common.Test/PathExtensionFixture.cs @@ -3,6 +3,7 @@ using System.IO; using FluentAssertions; using Moq; using NUnit.Framework; +using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; using NzbDrone.Test.Common; @@ -34,7 +35,7 @@ namespace NzbDrone.Common.Test [TestCase(@"\\Testserver\\Test\", @"\\Testserver\Test")] [TestCase(@"\\Testserver\Test\file.ext", @"\\Testserver\Test\file.ext")] [TestCase(@"\\Testserver\Test\file.ext\\", @"\\Testserver\Test\file.ext")] - [TestCase(@"\\Testserver\Test\file.ext \\", @"\\Testserver\Test\file.ext")] + [TestCase(@"\\Testserver\Test\file.ext ", @"\\Testserver\Test\file.ext")] [TestCase(@"//CAPITAL//lower// ", @"\\CAPITAL\lower")] public void Clean_Path_Windows(string dirty, string clean) { @@ -315,5 +316,30 @@ namespace NzbDrone.Common.Test result[2].Should().Be(@"TV"); result[3].Should().Be(@"Series Title"); } + + [TestCase(@"C:\Test\")] + [TestCase(@"C:\Test")] + [TestCase(@"C:\Test\TV\")] + [TestCase(@"C:\Test\TV")] + public void IsPathValid_should_be_true(string path) + { + path.AsOsAgnostic().IsPathValid(PathValidationType.CurrentOs).Should().BeTrue(); + } + + [TestCase(@"C:\Test \")] + [TestCase(@"C:\Test ")] + [TestCase(@"C:\ Test\")] + [TestCase(@"C:\ Test")] + [TestCase(@"C:\Test \TV")] + [TestCase(@"C:\ Test\TV")] + [TestCase(@"C:\Test \TV\")] + [TestCase(@"C:\ Test\TV\")] + [TestCase(@" C:\Test\TV\")] + [TestCase(@" C:\Test\TV")] + + public void IsPathValid_should_be_false(string path) + { + path.AsOsAgnostic().IsPathValid(PathValidationType.CurrentOs).Should().BeFalse(); + } } } diff --git a/src/NzbDrone.Common/Extensions/PathExtensions.cs b/src/NzbDrone.Common/Extensions/PathExtensions.cs index 0c72a07f4..4816c9f27 100644 --- a/src/NzbDrone.Common/Extensions/PathExtensions.cs +++ b/src/NzbDrone.Common/Extensions/PathExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text.RegularExpressions; using NzbDrone.Common.Disk; using NzbDrone.Common.EnsureThat; @@ -28,6 +29,12 @@ namespace NzbDrone.Common.Extensions public static string CleanFilePath(this string path) { + if (path.IsNotNullOrWhiteSpace()) + { + // Trim trailing spaces before checking if the path is valid so validation doesn't fail for something we can fix. + path = path.TrimEnd(' '); + } + Ensure.That(path, () => path).IsNotNullOrWhiteSpace(); Ensure.That(path, () => path).IsValidPath(PathValidationType.AnyOs); @@ -36,10 +43,10 @@ namespace NzbDrone.Common.Extensions // UNC if (!info.FullName.Contains('/') && info.FullName.StartsWith(@"\\")) { - return info.FullName.TrimEnd('/', '\\', ' '); + return info.FullName.TrimEnd('/', '\\'); } - return info.FullName.TrimEnd('/').Trim('\\', ' '); + return info.FullName.TrimEnd('/').Trim('\\'); } public static bool PathNotEquals(this string firstPath, string secondPath, StringComparison? comparison = null) @@ -143,6 +150,23 @@ namespace NzbDrone.Common.Extensions return false; } + if (path.Trim() != path) + { + return false; + } + + var directoryInfo = new DirectoryInfo(path); + + while (directoryInfo != null) + { + if (directoryInfo.Name.Trim() != directoryInfo.Name) + { + return false; + } + + directoryInfo = directoryInfo.Parent; + } + if (validationType == PathValidationType.AnyOs) { return IsPathValidForWindows(path) || IsPathValidForNonWindows(path); @@ -253,6 +277,11 @@ namespace NzbDrone.Common.Extensions return processName; } + public static string CleanPath(this string path) + { + return Path.Join(path.Split(Path.DirectorySeparatorChar).Select(s => s.Trim()).ToArray()); + } + public static string GetAppDataPath(this IAppFolderInfo appFolderInfo) { return appFolderInfo.AppDataFolder; From 615f5899cc034de45021e2ef168daf568b6c9a24 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 28 Apr 2024 14:57:30 +0300 Subject: [PATCH 575/964] Fixed: (TorrentDay) Update base urls and MST Co-authored-by: garfield69 --- src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs index b8510edf7..9371c8aa0 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs @@ -20,16 +20,21 @@ namespace NzbDrone.Core.Indexers.Definitions public override string Name => "TorrentDay"; public override string[] IndexerUrls => new[] { - "https://torrentday.cool/", "https://tday.love/", + "https://torrentday.cool/", "https://secure.torrentday.com/", "https://classic.torrentday.com/", "https://www.torrentday.com/", + "https://www.torrentday.me/", "https://torrentday.it/", "https://td.findnemo.net/", "https://td.getcrazy.me/", "https://td.venom.global/", - "https://td.workisboring.net/" + "https://td.workisboring.net/", + "https://tday.findnemo.net/", + "https://tday.getcrazy.me/", + "https://tday.venom.global/", + "https://tday.workisboring.net/" }; public override string Description => "TorrentDay (TD) is a Private site for TV / MOVIES / GENERAL"; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; @@ -266,7 +271,7 @@ namespace NzbDrone.Core.Indexers.Definitions DownloadVolumeFactor = downloadMultiplier, UploadVolumeFactor = 1, MinimumRatio = 1, - MinimumSeedTime = 172800 // 48 hours + MinimumSeedTime = 259200 // 72 hours }; torrentInfos.Add(release); From 938848be6556d3281ef2fc3b2b61042c3bccc714 Mon Sep 17 00:00:00 2001 From: Uruk Date: Sun, 28 Apr 2024 16:29:41 +0200 Subject: [PATCH 576/964] (ci): update action version --- .github/workflows/labeler.yml | 2 +- .github/workflows/lock.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 857cfb4a7..ab2292824 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -9,4 +9,4 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@v4 + - uses: actions/labeler@v5 diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index cf38066c5..1d50cb1f1 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -9,7 +9,7 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v4 + - uses: dessant/lock-threads@v5 with: github-token: ${{ github.token }} issue-inactive-days: '90' From 858f85c50d4492cdeb3ab893d870ab3896e7a751 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 28 Apr 2024 23:49:21 +0300 Subject: [PATCH 577/964] Fix translations for proxy validation --- .../IndexerProxies/FlareSolverr/FlareSolverr.cs | 8 ++++---- src/NzbDrone.Core/IndexerProxies/HttpIndexerProxyBase.cs | 8 ++++---- src/NzbDrone.Core/Localization/Core/en.json | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs index 6e9d101a1..5107bf151 100644 --- a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs +++ b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs @@ -190,16 +190,16 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr if (response.StatusCode != HttpStatusCode.OK) { - _logger.Error("Proxy Health Check failed: {0}", response.StatusCode); - failures.Add(new NzbDroneValidationFailure("Host", string.Format(_localizationService.GetLocalizedString("ProxyCheckBadRequestMessage"), response.StatusCode))); + _logger.Error("Proxy validation failed: {0}", response.StatusCode); + failures.Add(new NzbDroneValidationFailure("Host", _localizationService.GetLocalizedString("ProxyValidationBadRequest", new Dictionary { { "statusCode", response.StatusCode } }))); } var result = JsonConvert.DeserializeObject(response.Content); } catch (Exception ex) { - _logger.Error(ex, "Proxy Health Check failed"); - failures.Add(new NzbDroneValidationFailure("Host", string.Format(_localizationService.GetLocalizedString("ProxyCheckFailedToTestMessage"), request.Url.Host))); + _logger.Error(ex, "Proxy validation failed"); + failures.Add(new NzbDroneValidationFailure("Host", _localizationService.GetLocalizedString("ProxyValidationUnableToConnect", new Dictionary { { "exceptionMessage", ex.Message } }))); } return new ValidationResult(failures); diff --git a/src/NzbDrone.Core/IndexerProxies/HttpIndexerProxyBase.cs b/src/NzbDrone.Core/IndexerProxies/HttpIndexerProxyBase.cs index b82251d6e..d7c9acc23 100644 --- a/src/NzbDrone.Core/IndexerProxies/HttpIndexerProxyBase.cs +++ b/src/NzbDrone.Core/IndexerProxies/HttpIndexerProxyBase.cs @@ -41,14 +41,14 @@ namespace NzbDrone.Core.IndexerProxies // We only care about 400 responses, other error codes can be ignored if (response.StatusCode == HttpStatusCode.BadRequest) { - _logger.Error("Proxy Health Check failed: {0}", response.StatusCode); - failures.Add(new NzbDroneValidationFailure("Host", string.Format("Failed to test proxy. StatusCode: {0}", response.StatusCode))); + _logger.Error("Proxy validation failed: {0}", response.StatusCode); + failures.Add(new NzbDroneValidationFailure("Host", _localizationService.GetLocalizedString("ProxyValidationBadRequest", new Dictionary { { "statusCode", response.StatusCode } }))); } } catch (Exception ex) { - _logger.Error(ex, "Proxy Health Check failed"); - failures.Add(new NzbDroneValidationFailure("Host", string.Format("Failed to test proxy: {0}", ex.Message))); + _logger.Error(ex, "Proxy validation failed"); + failures.Add(new NzbDroneValidationFailure("Host", _localizationService.GetLocalizedString("ProxyValidationUnableToConnect", new Dictionary { { "exceptionMessage", ex.Message } }))); } return new ValidationResult(failures); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 4fbfbf10a..0fe36c444 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -543,6 +543,8 @@ "ProxyResolveIpHealthCheckMessage": "Failed to resolve the IP Address for the Configured Proxy Host {proxyHostName}", "ProxyType": "Proxy Type", "ProxyUsernameHelpText": "You only need to enter a username and password if one is required. Leave them blank otherwise.", + "ProxyValidationBadRequest": "Failed to test proxy. Status code: {statusCode}", + "ProxyValidationUnableToConnect": "Unable to connect to proxy: {exceptionMessage}. Check the log surrounding this error for details", "Public": "Public", "Publisher": "Publisher", "Query": "Query", From 3e0af062c12728686c362489ff717feca69def60 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 28 Apr 2024 22:42:05 +0300 Subject: [PATCH 578/964] Parameter binding for API requests --- src/Prowlarr.Api.V1/Commands/CommandController.cs | 2 +- src/Prowlarr.Api.V1/Config/ConfigController.cs | 2 +- src/Prowlarr.Api.V1/Config/HostConfigController.cs | 2 +- src/Prowlarr.Api.V1/Config/UiConfigController.cs | 2 +- src/Prowlarr.Api.V1/CustomFilters/CustomFilterController.cs | 4 ++-- src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs | 4 ++-- src/Prowlarr.Api.V1/ProviderControllerBase.cs | 2 +- src/Prowlarr.Api.V1/Search/SearchController.cs | 4 ++-- src/Prowlarr.Api.V1/Tags/TagController.cs | 4 ++-- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Prowlarr.Api.V1/Commands/CommandController.cs b/src/Prowlarr.Api.V1/Commands/CommandController.cs index cbca618a3..f74192f55 100644 --- a/src/Prowlarr.Api.V1/Commands/CommandController.cs +++ b/src/Prowlarr.Api.V1/Commands/CommandController.cs @@ -50,7 +50,7 @@ namespace Prowlarr.Api.V1.Commands [RestPostById] [Consumes("application/json")] [Produces("application/json")] - public ActionResult StartCommand(CommandResource commandResource) + public ActionResult StartCommand([FromBody] CommandResource commandResource) { var commandType = _knownTypes.GetImplementations(typeof(Command)) diff --git a/src/Prowlarr.Api.V1/Config/ConfigController.cs b/src/Prowlarr.Api.V1/Config/ConfigController.cs index 120a69352..83e3cd666 100644 --- a/src/Prowlarr.Api.V1/Config/ConfigController.cs +++ b/src/Prowlarr.Api.V1/Config/ConfigController.cs @@ -35,7 +35,7 @@ namespace Prowlarr.Api.V1.Config [RestPutById] [Consumes("application/json")] [Produces("application/json")] - public virtual ActionResult SaveConfig(TResource resource) + public virtual ActionResult SaveConfig([FromBody] TResource resource) { var dictionary = resource.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) diff --git a/src/Prowlarr.Api.V1/Config/HostConfigController.cs b/src/Prowlarr.Api.V1/Config/HostConfigController.cs index 427fc8db3..1600c6664 100644 --- a/src/Prowlarr.Api.V1/Config/HostConfigController.cs +++ b/src/Prowlarr.Api.V1/Config/HostConfigController.cs @@ -125,7 +125,7 @@ namespace Prowlarr.Api.V1.Config [RestPutById] [Consumes("application/json")] [Produces("application/json")] - public ActionResult SaveHostConfig(HostConfigResource resource) + public ActionResult SaveHostConfig([FromBody] HostConfigResource resource) { var dictionary = resource.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) diff --git a/src/Prowlarr.Api.V1/Config/UiConfigController.cs b/src/Prowlarr.Api.V1/Config/UiConfigController.cs index a22852863..b96b07444 100644 --- a/src/Prowlarr.Api.V1/Config/UiConfigController.cs +++ b/src/Prowlarr.Api.V1/Config/UiConfigController.cs @@ -35,7 +35,7 @@ namespace Prowlarr.Api.V1.Config [RestPutById] [Consumes("application/json")] [Produces("application/json")] - public override ActionResult SaveConfig(UiConfigResource resource) + public override ActionResult SaveConfig([FromBody] UiConfigResource resource) { var dictionary = resource.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) diff --git a/src/Prowlarr.Api.V1/CustomFilters/CustomFilterController.cs b/src/Prowlarr.Api.V1/CustomFilters/CustomFilterController.cs index b4a578c09..6a924c6a8 100644 --- a/src/Prowlarr.Api.V1/CustomFilters/CustomFilterController.cs +++ b/src/Prowlarr.Api.V1/CustomFilters/CustomFilterController.cs @@ -32,7 +32,7 @@ namespace Prowlarr.Api.V1.CustomFilters [RestPostById] [Consumes("application/json")] [Produces("application/json")] - public ActionResult AddCustomFilter(CustomFilterResource resource) + public ActionResult AddCustomFilter([FromBody] CustomFilterResource resource) { var customFilter = _customFilterService.Add(resource.ToModel()); @@ -42,7 +42,7 @@ namespace Prowlarr.Api.V1.CustomFilters [RestPutById] [Consumes("application/json")] [Produces("application/json")] - public ActionResult UpdateCustomFilter(CustomFilterResource resource) + public ActionResult UpdateCustomFilter([FromBody] CustomFilterResource resource) { _customFilterService.Update(resource.ToModel()); return Accepted(resource.Id); diff --git a/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs b/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs index 180bc5809..2a473e4bb 100644 --- a/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs +++ b/src/Prowlarr.Api.V1/Profiles/App/AppProfileController.cs @@ -23,7 +23,7 @@ namespace Prowlarr.Api.V1.Profiles.App [RestPostById] [Consumes("application/json")] [Produces("application/json")] - public ActionResult Create(AppProfileResource resource) + public ActionResult Create([FromBody] AppProfileResource resource) { var model = resource.ToModel(); model = _appProfileService.Add(model); @@ -41,7 +41,7 @@ namespace Prowlarr.Api.V1.Profiles.App [RestPutById] [Consumes("application/json")] [Produces("application/json")] - public ActionResult Update(AppProfileResource resource) + public ActionResult Update([FromBody] AppProfileResource resource) { var model = resource.ToModel(); diff --git a/src/Prowlarr.Api.V1/ProviderControllerBase.cs b/src/Prowlarr.Api.V1/ProviderControllerBase.cs index 80976c3ae..324a50972 100644 --- a/src/Prowlarr.Api.V1/ProviderControllerBase.cs +++ b/src/Prowlarr.Api.V1/ProviderControllerBase.cs @@ -232,7 +232,7 @@ namespace Prowlarr.Api.V1 [HttpPost("action/{name}")] [Consumes("application/json")] [Produces("application/json")] - public IActionResult RequestAction(string name, [FromBody] TProviderResource resource) + public IActionResult RequestAction([FromRoute] string name, [FromBody] TProviderResource resource) { var providerDefinition = GetDefinition(resource, false, false, false); diff --git a/src/Prowlarr.Api.V1/Search/SearchController.cs b/src/Prowlarr.Api.V1/Search/SearchController.cs index 23fb2ab47..5ded6865b 100644 --- a/src/Prowlarr.Api.V1/Search/SearchController.cs +++ b/src/Prowlarr.Api.V1/Search/SearchController.cs @@ -55,7 +55,7 @@ namespace Prowlarr.Api.V1.Search [HttpPost] [Consumes("application/json")] [Produces("application/json")] - public async Task> GrabRelease(ReleaseResource release) + public async Task> GrabRelease([FromBody] ReleaseResource release) { ValidateResource(release); @@ -89,7 +89,7 @@ namespace Prowlarr.Api.V1.Search [HttpPost("bulk")] [Consumes("application/json")] [Produces("application/json")] - public async Task> GrabReleases(List releases) + public async Task> GrabReleases([FromBody] List releases) { releases.ForEach(release => ValidateResource(release)); diff --git a/src/Prowlarr.Api.V1/Tags/TagController.cs b/src/Prowlarr.Api.V1/Tags/TagController.cs index 740fb9741..ed3aeebb9 100644 --- a/src/Prowlarr.Api.V1/Tags/TagController.cs +++ b/src/Prowlarr.Api.V1/Tags/TagController.cs @@ -37,7 +37,7 @@ namespace Prowlarr.Api.V1.Tags [RestPostById] [Consumes("application/json")] [Produces("application/json")] - public ActionResult Create(TagResource resource) + public ActionResult Create([FromBody] TagResource resource) { return Created(_tagService.Add(resource.ToModel()).Id); } @@ -45,7 +45,7 @@ namespace Prowlarr.Api.V1.Tags [RestPutById] [Consumes("application/json")] [Produces("application/json")] - public ActionResult Update(TagResource resource) + public ActionResult Update([FromBody] TagResource resource) { _tagService.Update(resource.ToModel()); return Accepted(resource.Id); From b3098f2e4c79181da71c05186f19f63a314f0f21 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 29 Apr 2024 14:32:46 +0300 Subject: [PATCH 579/964] Use newer Node.js task for in pipelines --- azure-pipelines.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fcf411854..fc8758ed6 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -166,10 +166,10 @@ stages: pool: vmImage: $(imageName) steps: - - task: NodeTool@0 + - task: UseNode@1 displayName: Set Node.js version inputs: - versionSpec: $(nodeVersion) + version: $(nodeVersion) - checkout: self submodules: true fetchDepth: 1 @@ -1075,10 +1075,10 @@ stages: pool: vmImage: $(imageName) steps: - - task: NodeTool@0 + - task: UseNode@1 displayName: Set Node.js version inputs: - versionSpec: $(nodeVersion) + version: $(nodeVersion) - checkout: self submodules: true fetchDepth: 1 From 1877ccb51341e92fee8361f374ef4ce4d90cab31 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 29 Apr 2024 14:35:43 +0300 Subject: [PATCH 580/964] Update Pull Request Labeler config for v5 --- .github/labeler.yml | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index 21aacef8c..74160b634 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,19 +1,31 @@ 'Area: API': - - src/Prowlarr.Api.V1/**/* + - changed-files: + - any-glob-to-any-file: + - src/Prowlarr.Api.V1/**/* 'Area: Db-migration': - - src/NzbDrone.Core/Datastore/Migration/* + - changed-files: + - any-glob-to-any-file: + - src/NzbDrone.Core/Datastore/Migration/* 'Area: Download Clients': - - src/NzbDrone.Core/Download/Clients/**/* + - changed-files: + - any-glob-to-any-file: + - src/NzbDrone.Core/Download/Clients/**/* 'Area: Indexer': - - src/NzbDrone.Core/Indexers/**/* + - changed-files: + - any-glob-to-any-file: + - src/NzbDrone.Core/Indexers/**/* 'Area: Notifications': - - src/NzbDrone.Core/Notifications/**/* + - changed-files: + - any-glob-to-any-file: + - src/NzbDrone.Core/Notifications/**/* 'Area: UI': - - frontend/**/* - - package.json - - yarn.lock + - changed-files: + - any-glob-to-any-file: + - frontend/**/* + - package.json + - yarn.lock \ No newline at end of file From ae79d456649361e1003035416aac182aa6aadd98 Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Tue, 27 Feb 2024 00:30:32 -0500 Subject: [PATCH 581/964] Update Sentry SDK add features Co-authored-by: Stefan Jandl (cherry picked from commit 6377c688fc7b35749d608bf62796446bb5bcb11b) --- package.json | 4 +- src/Directory.Build.props | 38 +++++- .../SentryTargetFixture.cs | 3 +- .../Instrumentation/NzbDroneLogger.cs | 6 +- .../Instrumentation/Sentry/SentryTarget.cs | 42 +++++- src/NzbDrone.Common/Prowlarr.Common.csproj | 2 +- yarn.lock | 121 ++++++++++-------- 7 files changed, 147 insertions(+), 69 deletions(-) diff --git a/package.json b/package.json index 23a772aed..bb99c1d7f 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,8 @@ "@fortawesome/react-fontawesome": "0.2.0", "@juggle/resize-observer": "3.4.0", "@microsoft/signalr": "6.0.25", - "@sentry/browser": "7.51.2", - "@sentry/integrations": "7.51.2", + "@sentry/browser": "7.100.0", + "@sentry/integrations": "7.100.0", "@types/node": "18.19.31", "@types/react": "18.2.79", "@types/react-dom": "18.2.25", diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 391434a51..3608b0efa 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -99,9 +99,33 @@ $(MSBuildProjectName.Replace('Prowlarr','NzbDrone')) - - - false + + + + + + + + + + + + + + + + + + true + + + + true + + true @@ -110,9 +134,17 @@ + + + + + + false + + diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs index 7392c3b85..b60fe2e54 100644 --- a/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs +++ b/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs @@ -4,6 +4,7 @@ using System.Linq; using FluentAssertions; using NLog; using NUnit.Framework; +using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Instrumentation.Sentry; using NzbDrone.Test.Common; @@ -26,7 +27,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests [SetUp] public void Setup() { - _subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111"); + _subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111", Mocker.GetMock().Object); } private LogEventInfo GivenLogEvent(LogLevel level, Exception ex, string message) diff --git a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs index 669c71823..f390d8028 100644 --- a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs +++ b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs @@ -41,7 +41,7 @@ namespace NzbDrone.Common.Instrumentation RegisterDebugger(); } - RegisterSentry(updateApp); + RegisterSentry(updateApp, appFolderInfo); if (updateApp) { @@ -62,7 +62,7 @@ namespace NzbDrone.Common.Instrumentation LogManager.ReconfigExistingLoggers(); } - private static void RegisterSentry(bool updateClient) + private static void RegisterSentry(bool updateClient, IAppFolderInfo appFolderInfo) { string dsn; @@ -77,7 +77,7 @@ namespace NzbDrone.Common.Instrumentation : "https://e38306161ff945999adf774a16e933c3@sentry.servarr.com/30"; } - var target = new SentryTarget(dsn) + var target = new SentryTarget(dsn, appFolderInfo) { Name = "sentryTarget", Layout = "${message}" diff --git a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs index fb0fa1ce5..843f904a6 100644 --- a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs +++ b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs @@ -106,7 +106,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry public bool FilterEvents { get; set; } public bool SentryEnabled { get; set; } - public SentryTarget(string dsn) + public SentryTarget(string dsn, IAppFolderInfo appFolderInfo) { _sdk = SentrySdk.Init(o => { @@ -114,9 +114,33 @@ namespace NzbDrone.Common.Instrumentation.Sentry o.AttachStacktrace = true; o.MaxBreadcrumbs = 200; o.Release = $"{BuildInfo.AppName}@{BuildInfo.Release}"; - o.BeforeSend = x => SentryCleanser.CleanseEvent(x); - o.BeforeBreadcrumb = x => SentryCleanser.CleanseBreadcrumb(x); + o.SetBeforeSend(x => SentryCleanser.CleanseEvent(x)); + o.SetBeforeBreadcrumb(x => SentryCleanser.CleanseBreadcrumb(x)); o.Environment = BuildInfo.Branch; + + // Crash free run statistics (sends a ping for healthy and for crashes sessions) + o.AutoSessionTracking = true; + + // Caches files in the event device is offline + // Sentry creates a 'sentry' sub directory, no need to concat here + o.CacheDirectoryPath = appFolderInfo.GetAppDataPath(); + + // default environment is production + if (!RuntimeInfo.IsProduction) + { + if (RuntimeInfo.IsDevelopment) + { + o.Environment = "development"; + } + else if (RuntimeInfo.IsTesting) + { + o.Environment = "testing"; + } + else + { + o.Environment = "other"; + } + } }); InitializeScope(); @@ -134,7 +158,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry { SentrySdk.ConfigureScope(scope => { - scope.User = new User + scope.User = new SentryUser { Id = HashUtil.AnonymousToken() }; @@ -317,13 +341,21 @@ namespace NzbDrone.Common.Instrumentation.Sentry } } + var level = LoggingLevelMap[logEvent.Level]; var sentryEvent = new SentryEvent(logEvent.Exception) { - Level = LoggingLevelMap[logEvent.Level], + Level = level, Logger = logEvent.LoggerName, Message = logEvent.FormattedMessage }; + if (level is SentryLevel.Fatal && logEvent.Exception is not null) + { + // Usages of 'fatal' here indicates the process will crash. In Sentry this is represented with + // the 'unhandled' exception flag + logEvent.Exception.SetSentryMechanism("Logger.Fatal", "Logger.Fatal was called", false); + } + sentryEvent.SetExtras(extras); sentryEvent.SetFingerprint(fingerPrint); diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index 5210a351a..d90f7738e 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -11,7 +11,7 @@ - + diff --git a/yarn.lock b/yarn.lock index c884a8b84..cec16a2db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1283,68 +1283,86 @@ resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a" integrity sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg== -"@sentry-internal/tracing@7.51.2": - version "7.51.2" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.51.2.tgz#17833047646426ca71445327018ffcb33506a699" - integrity sha512-OBNZn7C4CyocmlSMUPfkY9ORgab346vTHu5kX35PgW5XR51VD2nO5iJCFbyFcsmmRWyCJcZzwMNARouc2V4V8A== +"@sentry-internal/feedback@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.100.0.tgz#38d8d4cb8ac3e6e24d91b13878bd6208a55bcab3" + integrity sha512-SMW2QhNKOuSjw8oPtvryDlJjiwrNyAKljbgtMk057os/fd8QMp38Yt1ImqLCM4B2rTQZ6REJ6hRGRTRcfqoG+w== dependencies: - "@sentry/core" "7.51.2" - "@sentry/types" "7.51.2" - "@sentry/utils" "7.51.2" - tslib "^1.9.3" + "@sentry/core" "7.100.0" + "@sentry/types" "7.100.0" + "@sentry/utils" "7.100.0" -"@sentry/browser@7.51.2": - version "7.51.2" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.51.2.tgz#c01758a54c613be45df58ab503805737256f51a4" - integrity sha512-FQFEaTFbvYHPQE2emFjNoGSy+jXplwzoM/XEUBRjrGo62lf8BhMvWnPeG3H3UWPgrWA1mq0amvHRwXUkwofk0g== +"@sentry-internal/replay-canvas@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.100.0.tgz#b462346832631ed5a9446686419113ff331bd984" + integrity sha512-DePinj5IgNiC4RZv0yX0DLccMZebfFdKl3zHwDeLBeZqtMz9VrPzchv57IWP+5MI1+iuOn+WOg4oTNBUG6hFRw== dependencies: - "@sentry-internal/tracing" "7.51.2" - "@sentry/core" "7.51.2" - "@sentry/replay" "7.51.2" - "@sentry/types" "7.51.2" - "@sentry/utils" "7.51.2" - tslib "^1.9.3" + "@sentry/core" "7.100.0" + "@sentry/replay" "7.100.0" + "@sentry/types" "7.100.0" + "@sentry/utils" "7.100.0" -"@sentry/core@7.51.2": - version "7.51.2" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.51.2.tgz#f2c938de334f9bf26f4416079168275832423964" - integrity sha512-p8ZiSBxpKe+rkXDMEcgmdoyIHM/1bhpINLZUFPiFH8vzomEr7sgnwRhyrU8y/ADnkPeNg/2YF3QpDpk0OgZJUA== +"@sentry-internal/tracing@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.100.0.tgz#01f0925a287a6e5d0becd731ab361cabbd27c007" + integrity sha512-qf4W1STXky9WOQYoPSw2AmCBDK4FzvAyq5yeD2sLU7OCUEfbRUcN0lQljUvmWRKv/jTIAyeU5icDLJPZuR50nA== dependencies: - "@sentry/types" "7.51.2" - "@sentry/utils" "7.51.2" - tslib "^1.9.3" + "@sentry/core" "7.100.0" + "@sentry/types" "7.100.0" + "@sentry/utils" "7.100.0" -"@sentry/integrations@7.51.2": - version "7.51.2" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.51.2.tgz#fce58b9ced601c7f93344b508c67c69a9c883f3d" - integrity sha512-ZnSptbuDQOoQ13mFX9vvLDfXlbMGjenW2fMIssi9+08B7fD6qxmetkYnWmBK+oEipjoGA//0240Fj8FUvZr0Qg== +"@sentry/browser@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.100.0.tgz#adf57f660baa6190a7e1709605f73b94818ee04b" + integrity sha512-XpM0jEVe6DJWXjMSOjtJxsSNR/XnJKrlcuyoI4Re3qLG+noEF5QLc0r3VJkySXPRFnmdW05sLswQ6a/n9Sijmg== dependencies: - "@sentry/types" "7.51.2" - "@sentry/utils" "7.51.2" + "@sentry-internal/feedback" "7.100.0" + "@sentry-internal/replay-canvas" "7.100.0" + "@sentry-internal/tracing" "7.100.0" + "@sentry/core" "7.100.0" + "@sentry/replay" "7.100.0" + "@sentry/types" "7.100.0" + "@sentry/utils" "7.100.0" + +"@sentry/core@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.100.0.tgz#5b28c7b3e41e45e4d50e3bdea5d35434fd78e86b" + integrity sha512-eWRPuP0Zdj4a2F7SybqNjf13LGOVgGwvW6sojweQp9oxGAfCPp/EMDGBhlpYbMJeLbzmqzJ4ZFHIedaiEC+7kg== + dependencies: + "@sentry/types" "7.100.0" + "@sentry/utils" "7.100.0" + +"@sentry/integrations@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.100.0.tgz#6620cce950dce7c1f3e63d5b047b320a7d25b3c7" + integrity sha512-aO9wgnqlbav7FECKNcgTxQSGGSsMeYH9mV0cniuu520cDAhmVxtA+PqlnS3nsJZJj4cKjX6MWA2SbBG0szKmkw== + dependencies: + "@sentry/core" "7.100.0" + "@sentry/types" "7.100.0" + "@sentry/utils" "7.100.0" localforage "^1.8.1" - tslib "^1.9.3" -"@sentry/replay@7.51.2": - version "7.51.2" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.51.2.tgz#1f54e92b472ab87dfdb4e8cd6b8c8252600fe7b0" - integrity sha512-W8YnSxkK9LTUXDaYciM7Hn87u57AX9qvH8jGcxZZnvpKqHlDXOpSV8LRtBkARsTwgLgswROImSifY0ic0lyCWg== +"@sentry/replay@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.100.0.tgz#4f2e35155626ab286692ade3e31da282c73bd402" + integrity sha512-6Yo56J+x+eedaMXri8pPlFxXOofnSXVdsUuFj+kJ7lC/qHrwIbgC5g1ONEK/WlYwpVH4gA0aNnCa5AOkMu+ZTg== dependencies: - "@sentry/core" "7.51.2" - "@sentry/types" "7.51.2" - "@sentry/utils" "7.51.2" + "@sentry-internal/tracing" "7.100.0" + "@sentry/core" "7.100.0" + "@sentry/types" "7.100.0" + "@sentry/utils" "7.100.0" -"@sentry/types@7.51.2": - version "7.51.2" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.51.2.tgz#cb742f374d9549195f62c462c915adeafed31d65" - integrity sha512-/hLnZVrcK7G5BQoD/60u9Qak8c9AvwV8za8TtYPJDUeW59GrqnqOkFji7RVhI7oH1OX4iBxV+9pAKzfYE6A6SA== +"@sentry/types@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.100.0.tgz#a16f60d78613bd9810298e9e8d80134be58b24f8" + integrity sha512-c+RHwZwpKeBk7h8sUX4nQcelxBz8ViCojifnbEe3tcn8O15HOLvZqRKgLLOiff3MoErxiv4oxs0sPbEFRm/IvA== -"@sentry/utils@7.51.2": - version "7.51.2" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.51.2.tgz#2a52ac2cfb00ffd128248981279c0a561b39eccb" - integrity sha512-EcjBU7qG4IG+DpIPvdgIBcdIofROMawKoRUNKraeKzH/waEYH9DzCaqp/mzc5/rPBhpDB4BShX9xDDSeH+8c0A== +"@sentry/utils@7.100.0": + version "7.100.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.100.0.tgz#a9d36c01eede117c3e17b0350d399a87934e9c66" + integrity sha512-LAhZMEGq3C125prZN/ShqeXpRfdfgJkl9RAKjfq8cmMFsF7nsF72dEHZgIwrZ0lgNmtaWAB83AwJcyN83RwOxQ== dependencies: - "@sentry/types" "7.51.2" - tslib "^1.9.3" + "@sentry/types" "7.100.0" "@types/archiver@^5.3.1": version "5.3.4" @@ -6848,11 +6866,6 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" From 440618f2b6aa7ec05b9e7f07689558864e515b9e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 1 May 2024 21:19:05 +0300 Subject: [PATCH 582/964] Fixed: Initialize databases after app folder migrations Co-authored-by: Mark McDowall --- src/NzbDrone.Host/Bootstrap.cs | 3 --- src/NzbDrone.Host/Startup.cs | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index 5f3bfe0b4..5f4a750e2 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -24,7 +24,6 @@ using NzbDrone.Common.Instrumentation; using NzbDrone.Common.Instrumentation.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Datastore.Extensions; -using Prowlarr.Http.ClientSchema; using PostgresOptions = NzbDrone.Core.Datastore.PostgresOptions; namespace NzbDrone.Host @@ -148,8 +147,6 @@ namespace NzbDrone.Host .AddNzbDroneLogger() .AddDatabase() .AddStartupContext(context); - - SchemaBuilder.Initialize(c); }) .ConfigureServices(services => { diff --git a/src/NzbDrone.Host/Startup.cs b/src/NzbDrone.Host/Startup.cs index f0d96c04f..026a19b95 100644 --- a/src/NzbDrone.Host/Startup.cs +++ b/src/NzbDrone.Host/Startup.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using DryIoc; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.DataProtection; @@ -26,6 +27,7 @@ using NzbDrone.SignalR; using Prowlarr.Api.V1.System; using Prowlarr.Http; using Prowlarr.Http.Authentication; +using Prowlarr.Http.ClientSchema; using Prowlarr.Http.ErrorManagement; using Prowlarr.Http.Frontend; using Prowlarr.Http.Middleware; @@ -208,6 +210,7 @@ namespace NzbDrone.Host } public void Configure(IApplicationBuilder app, + IContainer container, IStartupContext startupContext, Lazy mainDatabaseFactory, Lazy logDatabaseFactory, @@ -238,6 +241,7 @@ namespace NzbDrone.Host _ = logDatabaseFactory.Value; dbTarget.Register(); + SchemaBuilder.Initialize(container); if (OsInfo.IsNotWindows) { From cb673ddc42df406ad9779481a7b5ae13e41f0649 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 2 May 2024 22:35:20 +0300 Subject: [PATCH 583/964] New: Host column in history and more info --- frontend/src/History/Details/HistoryDetails.js | 10 ++++++++++ frontend/src/History/HistoryRow.js | 15 +++++++++++++++ frontend/src/Store/Actions/historyActions.js | 6 ++++++ 3 files changed, 31 insertions(+) diff --git a/frontend/src/History/Details/HistoryDetails.js b/frontend/src/History/Details/HistoryDetails.js index e0ae06eb1..461ccc2d1 100644 --- a/frontend/src/History/Details/HistoryDetails.js +++ b/frontend/src/History/Details/HistoryDetails.js @@ -21,6 +21,7 @@ function HistoryDetails(props) { limit, offset, source, + host, url } = data; @@ -86,6 +87,15 @@ function HistoryDetails(props) { null } + { + data ? + : + null + } + { data ? + { + data.host ? + data.host : + null + } + + ); + } + if (name === 'elapsedTime') { return ( translate('Host'), + isSortable: false, + isVisible: false + }, { name: 'elapsedTime', label: () => translate('ElapsedTime'), From d2e9621de946b9f01268d92f7533d7920286bae0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 May 2024 11:38:40 +0300 Subject: [PATCH 584/964] Bump version to 1.17.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fc8758ed6..916bac55f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.17.1' + majorVersion: '1.17.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 04bb0c51b1b45fcc7f99d07ad4723ef7a55ca89b Mon Sep 17 00:00:00 2001 From: Jared Date: Sun, 28 Apr 2024 01:06:26 +0000 Subject: [PATCH 585/964] New: Optionally use Environment Variables for settings in config.xml (cherry picked from commit d051dac12c8b797761a0d1f3b4aa84cff47ed13d) --- .../ConfigFileProviderTest.cs | 22 ++++ .../ServiceFactoryFixture.cs | 6 + src/NzbDrone.Common/Options/AppOptions.cs | 8 ++ src/NzbDrone.Common/Options/AuthOptions.cs | 9 ++ src/NzbDrone.Common/Options/LogOptions.cs | 14 +++ src/NzbDrone.Common/Options/ServerOptions.cs | 12 ++ src/NzbDrone.Common/Options/UpdateOptions.cs | 9 ++ .../Configuration/ConfigFileProvider.cs | 104 ++++++++++++------ src/NzbDrone.Host.Test/ContainerFixture.cs | 6 + src/NzbDrone.Host/Bootstrap.cs | 23 +++- 10 files changed, 175 insertions(+), 38 deletions(-) create mode 100644 src/NzbDrone.Common/Options/AppOptions.cs create mode 100644 src/NzbDrone.Common/Options/AuthOptions.cs create mode 100644 src/NzbDrone.Common/Options/LogOptions.cs create mode 100644 src/NzbDrone.Common/Options/ServerOptions.cs create mode 100644 src/NzbDrone.Common/Options/UpdateOptions.cs diff --git a/src/NzbDrone.Common.Test/ConfigFileProviderTest.cs b/src/NzbDrone.Common.Test/ConfigFileProviderTest.cs index dd32e187d..e9d4aa3b0 100644 --- a/src/NzbDrone.Common.Test/ConfigFileProviderTest.cs +++ b/src/NzbDrone.Common.Test/ConfigFileProviderTest.cs @@ -1,10 +1,12 @@ using System.Collections.Generic; using FluentAssertions; +using Microsoft.Extensions.Options; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; +using NzbDrone.Common.Options; using NzbDrone.Core.Authentication; using NzbDrone.Core.Configuration; using NzbDrone.Test.Common; @@ -43,6 +45,26 @@ namespace NzbDrone.Common.Test Mocker.GetMock() .Setup(v => v.WriteAllText(configFile, It.IsAny())) .Callback((p, t) => _configFileContents = t); + + Mocker.GetMock>() + .Setup(v => v.Value) + .Returns(new AuthOptions()); + + Mocker.GetMock>() + .Setup(v => v.Value) + .Returns(new AppOptions()); + + Mocker.GetMock>() + .Setup(v => v.Value) + .Returns(new ServerOptions()); + + Mocker.GetMock>() + .Setup(v => v.Value) + .Returns(new LogOptions()); + + Mocker.GetMock>() + .Setup(v => v.Value) + .Returns(new UpdateOptions()); } [Test] diff --git a/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs b/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs index 9c348316f..5ed08a3db 100644 --- a/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs +++ b/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs @@ -10,6 +10,7 @@ using NUnit.Framework; using NzbDrone.Common.Composition.Extensions; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Instrumentation.Extensions; +using NzbDrone.Common.Options; using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore.Extensions; using NzbDrone.Core.Lifecycle; @@ -33,6 +34,11 @@ namespace NzbDrone.Common.Test container.RegisterInstance(new Mock().Object); container.RegisterInstance(new Mock>().Object); + container.RegisterInstance(new Mock>().Object); + container.RegisterInstance(new Mock>().Object); + container.RegisterInstance(new Mock>().Object); + container.RegisterInstance(new Mock>().Object); + container.RegisterInstance(new Mock>().Object); var serviceProvider = container.GetServiceProvider(); diff --git a/src/NzbDrone.Common/Options/AppOptions.cs b/src/NzbDrone.Common/Options/AppOptions.cs new file mode 100644 index 000000000..74cdf1d29 --- /dev/null +++ b/src/NzbDrone.Common/Options/AppOptions.cs @@ -0,0 +1,8 @@ +namespace NzbDrone.Common.Options; + +public class AppOptions +{ + public string InstanceName { get; set; } + public string Theme { get; set; } + public bool? LaunchBrowser { get; set; } +} diff --git a/src/NzbDrone.Common/Options/AuthOptions.cs b/src/NzbDrone.Common/Options/AuthOptions.cs new file mode 100644 index 000000000..2b63308d3 --- /dev/null +++ b/src/NzbDrone.Common/Options/AuthOptions.cs @@ -0,0 +1,9 @@ +namespace NzbDrone.Common.Options; + +public class AuthOptions +{ + public string ApiKey { get; set; } + public bool? Enabled { get; set; } + public string Method { get; set; } + public string Required { get; set; } +} diff --git a/src/NzbDrone.Common/Options/LogOptions.cs b/src/NzbDrone.Common/Options/LogOptions.cs new file mode 100644 index 000000000..c36533cb4 --- /dev/null +++ b/src/NzbDrone.Common/Options/LogOptions.cs @@ -0,0 +1,14 @@ +namespace NzbDrone.Common.Options; + +public class LogOptions +{ + public string Level { get; set; } + public bool? FilterSentryEvents { get; set; } + public int? Rotate { get; set; } + public bool? Sql { get; set; } + public string ConsoleLevel { get; set; } + public bool? AnalyticsEnabled { get; set; } + public string SyslogServer { get; set; } + public int? SyslogPort { get; set; } + public string SyslogLevel { get; set; } +} diff --git a/src/NzbDrone.Common/Options/ServerOptions.cs b/src/NzbDrone.Common/Options/ServerOptions.cs new file mode 100644 index 000000000..d21e12b2a --- /dev/null +++ b/src/NzbDrone.Common/Options/ServerOptions.cs @@ -0,0 +1,12 @@ +namespace NzbDrone.Common.Options; + +public class ServerOptions +{ + public string UrlBase { get; set; } + public string BindAddress { get; set; } + public int? Port { get; set; } + public bool? EnableSsl { get; set; } + public int? SslPort { get; set; } + public string SslCertPath { get; set; } + public string SslCertPassword { get; set; } +} diff --git a/src/NzbDrone.Common/Options/UpdateOptions.cs b/src/NzbDrone.Common/Options/UpdateOptions.cs new file mode 100644 index 000000000..a8eaad8fb --- /dev/null +++ b/src/NzbDrone.Common/Options/UpdateOptions.cs @@ -0,0 +1,9 @@ +namespace NzbDrone.Common.Options; + +public class UpdateOptions +{ + public string Mechanism { get; set; } + public bool? Automatically { get; set; } + public string ScriptPath { get; set; } + public string Branch { get; set; } +} diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index e2163d524..66f092e0f 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -10,6 +10,7 @@ using NzbDrone.Common.Cache; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; +using NzbDrone.Common.Options; using NzbDrone.Core.Authentication; using NzbDrone.Core.Configuration.Events; using NzbDrone.Core.Datastore; @@ -53,13 +54,13 @@ namespace NzbDrone.Core.Configuration string SyslogServer { get; } int SyslogPort { get; } string SyslogLevel { get; } + string Theme { get; } string PostgresHost { get; } int PostgresPort { get; } string PostgresUser { get; } string PostgresPassword { get; } string PostgresMainDb { get; } string PostgresLogDb { get; } - string Theme { get; } } public class ConfigFileProvider : IConfigFileProvider @@ -72,6 +73,11 @@ namespace NzbDrone.Core.Configuration private readonly IDiskProvider _diskProvider; private readonly ICached _cache; private readonly PostgresOptions _postgresOptions; + private readonly AuthOptions _authOptions; + private readonly AppOptions _appOptions; + private readonly ServerOptions _serverOptions; + private readonly UpdateOptions _updateOptions; + private readonly LogOptions _logOptions; private readonly string _configFile; private static readonly Regex HiddenCharacterRegex = new Regex("[^a-z0-9]", RegexOptions.Compiled | RegexOptions.IgnoreCase); @@ -82,13 +88,23 @@ namespace NzbDrone.Core.Configuration ICacheManager cacheManager, IEventAggregator eventAggregator, IDiskProvider diskProvider, - IOptions postgresOptions) + IOptions postgresOptions, + IOptions authOptions, + IOptions appOptions, + IOptions serverOptions, + IOptions updateOptions, + IOptions logOptions) { _cache = cacheManager.GetCache(GetType()); _eventAggregator = eventAggregator; _diskProvider = diskProvider; _configFile = appFolderInfo.GetConfigPath(); _postgresOptions = postgresOptions.Value; + _authOptions = authOptions.Value; + _appOptions = appOptions.Value; + _serverOptions = serverOptions.Value; + _updateOptions = updateOptions.Value; + _logOptions = logOptions.Value; } public Dictionary GetConfigDictionary() @@ -144,7 +160,7 @@ namespace NzbDrone.Core.Configuration { const string defaultValue = "*"; - var bindAddress = GetValue("BindAddress", defaultValue); + var bindAddress = _serverOptions.BindAddress ?? GetValue("BindAddress", defaultValue); if (string.IsNullOrWhiteSpace(bindAddress)) { return defaultValue; @@ -154,19 +170,19 @@ namespace NzbDrone.Core.Configuration } } - public int Port => GetValueInt("Port", DEFAULT_PORT); + public int Port => _serverOptions.Port ?? GetValueInt("Port", DEFAULT_PORT); - public int SslPort => GetValueInt("SslPort", DEFAULT_SSL_PORT); + public int SslPort => _serverOptions.SslPort ?? GetValueInt("SslPort", DEFAULT_SSL_PORT); - public bool EnableSsl => GetValueBoolean("EnableSsl", false); + public bool EnableSsl => _serverOptions.EnableSsl ?? GetValueBoolean("EnableSsl", false); - public bool LaunchBrowser => GetValueBoolean("LaunchBrowser", true); + public bool LaunchBrowser => _appOptions.LaunchBrowser ?? GetValueBoolean("LaunchBrowser", true); public string ApiKey { get { - var apiKey = GetValue("ApiKey", GenerateApiKey()); + var apiKey = _authOptions.ApiKey ?? GetValue("ApiKey", GenerateApiKey()); if (apiKey.IsNullOrWhiteSpace()) { @@ -182,7 +198,7 @@ namespace NzbDrone.Core.Configuration { get { - var enabled = GetValueBoolean("AuthenticationEnabled", false, false); + var enabled = _authOptions.Enabled ?? GetValueBoolean("AuthenticationEnabled", false, false); if (enabled) { @@ -190,37 +206,44 @@ namespace NzbDrone.Core.Configuration return AuthenticationType.Basic; } - return GetValueEnum("AuthenticationMethod", AuthenticationType.None); + return Enum.TryParse(_authOptions.Method, out var enumValue) + ? enumValue + : GetValueEnum("AuthenticationMethod", AuthenticationType.None); } } - public AuthenticationRequiredType AuthenticationRequired => GetValueEnum("AuthenticationRequired", AuthenticationRequiredType.Enabled); + public AuthenticationRequiredType AuthenticationRequired => + Enum.TryParse(_authOptions.Required, out var enumValue) + ? enumValue + : GetValueEnum("AuthenticationRequired", AuthenticationRequiredType.Enabled); - public bool AnalyticsEnabled => GetValueBoolean("AnalyticsEnabled", true, persist: false); + public bool AnalyticsEnabled => _logOptions.AnalyticsEnabled ?? GetValueBoolean("AnalyticsEnabled", true, persist: false); - // TODO: Change back to "master" for the first stable release. - public string Branch => GetValue("Branch", "master").ToLowerInvariant(); + public string Branch => _updateOptions.Branch ?? GetValue("Branch", "master").ToLowerInvariant(); + + public string LogLevel => _logOptions.Level ?? GetValue("LogLevel", "info").ToLowerInvariant(); + public string ConsoleLogLevel => _logOptions.ConsoleLevel ?? GetValue("ConsoleLogLevel", string.Empty, persist: false); + + public string Theme => _appOptions.Theme ?? GetValue("Theme", "auto", persist: false); - public string LogLevel => GetValue("LogLevel", "info").ToLowerInvariant(); - public string ConsoleLogLevel => GetValue("ConsoleLogLevel", string.Empty, persist: false); public string PostgresHost => _postgresOptions?.Host ?? GetValue("PostgresHost", string.Empty, persist: false); public string PostgresUser => _postgresOptions?.User ?? GetValue("PostgresUser", string.Empty, persist: false); public string PostgresPassword => _postgresOptions?.Password ?? GetValue("PostgresPassword", string.Empty, persist: false); public string PostgresMainDb => _postgresOptions?.MainDb ?? GetValue("PostgresMainDb", "prowlarr-main", persist: false); public string PostgresLogDb => _postgresOptions?.LogDb ?? GetValue("PostgresLogDb", "prowlarr-log", persist: false); public int PostgresPort => (_postgresOptions?.Port ?? 0) != 0 ? _postgresOptions.Port : GetValueInt("PostgresPort", 5432, persist: false); - public string Theme => GetValue("Theme", "auto", persist: false); - public bool LogSql => GetValueBoolean("LogSql", false, persist: false); - public int LogRotate => GetValueInt("LogRotate", 50, persist: false); - public bool FilterSentryEvents => GetValueBoolean("FilterSentryEvents", true, persist: false); - public string SslCertPath => GetValue("SslCertPath", ""); - public string SslCertPassword => GetValue("SslCertPassword", ""); + + public bool LogSql => _logOptions.Sql ?? GetValueBoolean("LogSql", false, persist: false); + public int LogRotate => _logOptions.Rotate ?? GetValueInt("LogRotate", 50, persist: false); + public bool FilterSentryEvents => _logOptions.FilterSentryEvents ?? GetValueBoolean("FilterSentryEvents", true, persist: false); + public string SslCertPath => _serverOptions.SslCertPath ?? GetValue("SslCertPath", ""); + public string SslCertPassword => _serverOptions.SslCertPassword ?? GetValue("SslCertPassword", ""); public string UrlBase { get { - var urlBase = GetValue("UrlBase", "").Trim('/'); + var urlBase = _serverOptions.UrlBase ?? GetValue("UrlBase", "").Trim('/'); if (urlBase.IsNullOrWhiteSpace()) { @@ -232,19 +255,36 @@ namespace NzbDrone.Core.Configuration } public string UiFolder => BuildInfo.IsDebug ? Path.Combine("..", "UI") : "UI"; - public string InstanceName => GetValue("InstanceName", BuildInfo.AppName); - public bool UpdateAutomatically => GetValueBoolean("UpdateAutomatically", false, false); + public string InstanceName + { + get + { + var instanceName = _appOptions.InstanceName ?? GetValue("InstanceName", BuildInfo.AppName); - public UpdateMechanism UpdateMechanism => GetValueEnum("UpdateMechanism", UpdateMechanism.BuiltIn, false); + if (instanceName.ContainsIgnoreCase(BuildInfo.AppName)) + { + return instanceName; + } - public string UpdateScriptPath => GetValue("UpdateScriptPath", "", false); + return BuildInfo.AppName; + } + } - public string SyslogServer => GetValue("SyslogServer", "", persist: false); + public bool UpdateAutomatically => _updateOptions.Automatically ?? GetValueBoolean("UpdateAutomatically", false, false); - public int SyslogPort => GetValueInt("SyslogPort", 514, persist: false); + public UpdateMechanism UpdateMechanism => + Enum.TryParse(_updateOptions.Mechanism, out var enumValue) + ? enumValue + : GetValueEnum("UpdateMechanism", UpdateMechanism.BuiltIn, false); - public string SyslogLevel => GetValue("SyslogLevel", LogLevel, false).ToLowerInvariant(); + public string UpdateScriptPath => _updateOptions.ScriptPath ?? GetValue("UpdateScriptPath", "", false); + + public string SyslogServer => _logOptions.SyslogServer ?? GetValue("SyslogServer", "", persist: false); + + public int SyslogPort => _logOptions.SyslogPort ?? GetValueInt("SyslogPort", 514, persist: false); + + public string SyslogLevel => _logOptions.SyslogLevel ?? GetValue("SyslogLevel", LogLevel, persist: false).ToLowerInvariant(); public int GetValueInt(string key, int defaultValue, bool persist = true) { @@ -277,13 +317,13 @@ namespace NzbDrone.Core.Configuration return valueHolder.First().Value.Trim(); } - //Save the value + // Save the value if (persist) { SetValue(key, defaultValue); } - //return the default value + // return the default value return defaultValue.ToString(); }); } diff --git a/src/NzbDrone.Host.Test/ContainerFixture.cs b/src/NzbDrone.Host.Test/ContainerFixture.cs index 874c3e576..c04a0e705 100644 --- a/src/NzbDrone.Host.Test/ContainerFixture.cs +++ b/src/NzbDrone.Host.Test/ContainerFixture.cs @@ -12,6 +12,7 @@ using NzbDrone.Common; using NzbDrone.Common.Composition.Extensions; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Instrumentation.Extensions; +using NzbDrone.Common.Options; using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore.Extensions; using NzbDrone.Core.Download; @@ -46,6 +47,11 @@ namespace NzbDrone.App.Test container.RegisterInstance(new Mock().Object); container.RegisterInstance(new Mock().Object); container.RegisterInstance>(new Mock>().Object); + container.RegisterInstance>(new Mock>().Object); + container.RegisterInstance>(new Mock>().Object); + container.RegisterInstance>(new Mock>().Object); + container.RegisterInstance>(new Mock>().Object); + container.RegisterInstance>(new Mock>().Object); _container = container.GetServiceProvider(); } diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index 5f4a750e2..b446dbc4c 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -22,6 +22,7 @@ using NzbDrone.Common.Exceptions; using NzbDrone.Common.Extensions; using NzbDrone.Common.Instrumentation; using NzbDrone.Common.Instrumentation.Extensions; +using NzbDrone.Common.Options; using NzbDrone.Core.Configuration; using NzbDrone.Core.Datastore.Extensions; using PostgresOptions = NzbDrone.Core.Datastore.PostgresOptions; @@ -97,6 +98,11 @@ namespace NzbDrone.Host .ConfigureServices(services => { services.Configure(config.GetSection("Prowlarr:Postgres")); + services.Configure(config.GetSection("Prowlarr:App")); + services.Configure(config.GetSection("Prowlarr:Auth")); + services.Configure(config.GetSection("Prowlarr:Server")); + services.Configure(config.GetSection("Prowlarr:Log")); + services.Configure(config.GetSection("Prowlarr:Update")); }).Build(); break; @@ -124,12 +130,12 @@ namespace NzbDrone.Host { var config = GetConfiguration(context); - var bindAddress = config.GetValue(nameof(ConfigFileProvider.BindAddress), "*"); - var port = config.GetValue(nameof(ConfigFileProvider.Port), ConfigFileProvider.DEFAULT_PORT); - var sslPort = config.GetValue(nameof(ConfigFileProvider.SslPort), ConfigFileProvider.DEFAULT_SSL_PORT); - var enableSsl = config.GetValue(nameof(ConfigFileProvider.EnableSsl), false); - var sslCertPath = config.GetValue(nameof(ConfigFileProvider.SslCertPath)); - var sslCertPassword = config.GetValue(nameof(ConfigFileProvider.SslCertPassword)); + var bindAddress = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.BindAddress)}") ?? config.GetValue(nameof(ConfigFileProvider.BindAddress), "*"); + var port = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.Port)}") ?? config.GetValue(nameof(ConfigFileProvider.Port), ConfigFileProvider.DEFAULT_PORT); + var sslPort = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.SslPort)}") ?? config.GetValue(nameof(ConfigFileProvider.SslPort), ConfigFileProvider.DEFAULT_SSL_PORT); + var enableSsl = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.EnableSsl)}") ?? config.GetValue(nameof(ConfigFileProvider.EnableSsl), false); + var sslCertPath = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.SslCertPath)}") ?? config.GetValue(nameof(ConfigFileProvider.SslCertPath)); + var sslCertPassword = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.SslCertPassword)}") ?? config.GetValue(nameof(ConfigFileProvider.SslCertPassword)); var urls = new List { BuildUrl("http", bindAddress, port) }; @@ -151,6 +157,11 @@ namespace NzbDrone.Host .ConfigureServices(services => { services.Configure(config.GetSection("Prowlarr:Postgres")); + services.Configure(config.GetSection("Prowlarr:App")); + services.Configure(config.GetSection("Prowlarr:Auth")); + services.Configure(config.GetSection("Prowlarr:Server")); + services.Configure(config.GetSection("Prowlarr:Log")); + services.Configure(config.GetSection("Prowlarr:Update")); services.Configure(x => { //Double the default multipart body length from 128 MB to 256 MB From 83c6751847f75ff487f0d88128c130fa06294323 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 28 Apr 2024 09:25:42 -0700 Subject: [PATCH 586/964] Forward X-Forwarded-Host header (cherry picked from commit 3fbe4361386e9fb8dafdf82ad9f00f02bec746cc) --- src/NzbDrone.Host/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Host/Startup.cs b/src/NzbDrone.Host/Startup.cs index 026a19b95..9c30fc88c 100644 --- a/src/NzbDrone.Host/Startup.cs +++ b/src/NzbDrone.Host/Startup.cs @@ -58,7 +58,7 @@ namespace NzbDrone.Host services.Configure(options => { - options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); }); From 634016ae1bfce61640c6e98704ff7920ba5cc4a4 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 5 May 2024 08:39:35 +0000 Subject: [PATCH 587/964] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: GkhnGRBZ Co-authored-by: Havok Dan Co-authored-by: Michael5564445 Co-authored-by: Weblate Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/es.json | 4 +- .../Localization/Core/pt_BR.json | 4 +- src/NzbDrone.Core/Localization/Core/tr.json | 89 +++++++++++-------- src/NzbDrone.Core/Localization/Core/uk.json | 2 +- 4 files changed, 60 insertions(+), 39 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 954dfbb87..e68d9d83b 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -750,5 +750,7 @@ "XmlRpcPath": "Ruta RPC de XML", "NotificationsTelegramSettingsIncludeAppName": "Incluir {appName} en el título", "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente prefija el título del mensaje con {appName} para diferenciar las notificaciones de las diferentes aplicaciones", - "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Busca solo lanzamientos freeleech" + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Busca solo lanzamientos freeleech", + "ProxyValidationBadRequest": "Fallo al probar el proxy. Código de estado: {statusCode}", + "ProxyValidationUnableToConnect": "No se pudo conectar al proxy: {exceptionMessage}. Comprueba el registro de este error para más detalles" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index e50598538..4888197c8 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -750,5 +750,7 @@ "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech", "NotificationsTelegramSettingsIncludeAppName": "Incluir {appName} no Título", "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente, prefixe o título da mensagem com {appName} para diferenciar notificações de diferentes aplicativos", - "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech" + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech", + "ProxyValidationBadRequest": "Falha ao testar o proxy. Código de status: {statusCode}", + "ProxyValidationUnableToConnect": "Não foi possível conectar-se ao proxy: {exceptionMessage}. Verifique o log em torno deste erro para obter detalhes" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index d1eb99965..845ad62cc 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -6,21 +6,21 @@ "Connections": "Bağlantılar", "Connect": "Bağlan", "Clear": "Temizle", - "Sort": "Çeşitle", + "Sort": "Sınıflandır", "SetTags": "Etiketleri Ayarla", - "Scheduled": "Tarifeli", + "Scheduled": "Planlı", "ProxyResolveIpHealthCheckMessage": "{proxyHostName} Yapılandırılmış Proxy Ana Bilgisayarının IP Adresi çözülemedi", "ProxyFailedToTestHealthCheckMessage": "Proxy ile test edilemedi: {url}", "ProxyBadRequestHealthCheckMessage": "Proxy ile test edilemedi. DurumKodu: {statusCode}", "Proxy": "Proxy", - "Logging": "Logging", + "Logging": "Loglama", "LogFiles": "Log dosyaları", "Host": "Ana bilgisayar", "GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analitikler ve güncellemeler", "Folder": "Klasör", "Files": "Dosyalar", "Filename": "Dosya adı", - "AppDataLocationHealthCheckMessage": "Güncellemede AppData'nın silinmesini önlemek için güncelleme mümkün olmayacak", + "AppDataLocationHealthCheckMessage": "Güncelleme sırasında AppData'nın silinmesini önlemek için güncelleme yapılmayacaktır", "Actions": "Eylemler", "About": "Hakkında", "View": "Görünüm", @@ -37,17 +37,17 @@ "System": "Sistem", "Style": "Tarz", "Status": "Durum", - "Size": "Ölçü", + "Size": "Boyut", "ShowAdvanced": "Gelişmiş'i Göster", "Settings": "Ayarlar", - "SelectAll": "Hepsini seç", + "SelectAll": "Hepsini Seç", "Security": "Güvenlik", "Search": "Ara", "SaveChanges": "Değişiklikleri Kaydet", "ReleaseStatus": "Yayın Durumu", - "ReleaseBranchCheckOfficialBranchMessage": "Dal {0} geçerli bir {appName} sürüm dalı değil, güncelleme almayacaksınız", + "ReleaseBranchCheckOfficialBranchMessage": "{0} şubesi geçerli bir {appName} sürüm dalı değil; güncelleme almayacaksınız", "Refresh": "Yenile", - "Queue": "Sıra", + "Queue": "Sırada", "Protocol": "Protokol", "Options": "Seçenekler", "NoChanges": "Değişiklikler yok", @@ -64,7 +64,7 @@ "Edit": "Düzenle", "CustomFilters": "Özel Filtreler", "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut kodları", - "Analytics": "Analiz", + "Analytics": "Analitik", "All": "Hepsi", "Added": "Eklendi", "Add": "Ekle", @@ -85,7 +85,7 @@ "Backups": "Yedeklemeler", "BindAddress": "Bind Adresi", "BypassProxyForLocalAddresses": "Yerel Adresler için Proxy'yi Atla", - "DeleteNotificationMessageText": "'{0}' bildirimini silmek istediğinizden emin misiniz?", + "DeleteNotificationMessageText": "'{name}' bildirimini silmek istediğinizden emin misiniz?", "EnableSslHelpText": " Etkili olması için yönetici olarak yeniden çalıştırmayı gerektirir", "Fixed": "Sabit", "PendingChangesMessage": "Kaydedilmemiş değişiklikleriniz var, bu sayfadan ayrılmak istediğinizden emin misiniz?", @@ -109,9 +109,9 @@ "DatabaseMigration": "DB Geçişi", "DeleteApplicationMessageText": "'{0}' bildirimini silmek istediğinizden emin misiniz?", "DeleteBackup": "Yedeklemeyi Sil", - "DeleteBackupMessageText": "'{0}' yedeğini silmek istediğinizden emin misiniz?", + "DeleteBackupMessageText": "'{name}' yedeğini silmek istediğinizden emin misiniz?", "DeleteDownloadClient": "İndirme İstemcisini Sil", - "DeleteDownloadClientMessageText": "İndirme istemcisini '{0}' silmek istediğinizden emin misiniz?", + "DeleteDownloadClientMessageText": "'{name}' indirme istemcisini silmek istediğinizden emin misiniz?", "DownloadClientSettings": "İstemci Ayarlarını İndir", "EnableAutomaticSearchHelpText": "Kullanıcı arayüzü veya {appName} tarafından otomatik aramalar yapıldığında kullanılacaktır", "ForMoreInformationOnTheIndividualDownloadClients": "Bireysel indirme istemcileri hakkında daha fazla bilgi için bilgi düğmelerine tıklayın.", @@ -124,7 +124,7 @@ "MovieIndexScrollBottom": "Film Dizini: Alta Kaydırma", "MovieIndexScrollTop": "Film Dizini: Yukarı Kaydırma", "NoLinks": "Bağlantı Yok", - "PackageVersion": "Paket Sürümü", + "PackageVersion": "Paket Versiyonu", "PageSize": "Sayfa boyutu", "PageSizeHelpText": "Her sayfada gösterilecek öğe sayısı", "ProxyBypassFilterHelpText": "Ayırıcı olarak \",\" ve \"*\" kullanın. alt alan adları için joker karakter olarak", @@ -146,11 +146,11 @@ "ApplicationStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan uygulamalar: {0}", "ApplyTags": "Etiketleri Uygula", "RssIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor", - "Interval": "Aralık", + "Interval": "Periyot", "Logs": "Kütükler", "Authentication": "Doğrulama", "AuthenticationMethodHelpText": "{appName}'a erişmek için Kullanıcı Adı ve Şifre gerektir", - "BackupIntervalHelpText": "Otomatik yedeklemeler arasındaki aralık", + "BackupIntervalHelpText": "Otomatik yedeklemeler arasındaki zaman aralığı", "BackupNow": "Şimdi yedekle", "BackupRetentionHelpText": "Saklama süresinden daha eski olan otomatik yedeklemeler otomatik olarak temizlenecektir", "BeforeUpdate": "Güncellemeden önce", @@ -166,7 +166,7 @@ "ConnectionLost": "Bağlantı koptu", "DeleteIndexerProxyMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?", "DeleteNotification": "Bildirimi Sil", - "DeleteTagMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?", + "DeleteTagMessageText": "'{label}' etiketini silmek istediğinizden emin misiniz?", "Disabled": "Devre dışı", "Discord": "Uyuşmazlık", "Docker": "Liman işçisi", @@ -182,10 +182,10 @@ "HomePage": "Ana Sayfa", "IllRestartLater": "Daha sonra yeniden başlayacağım", "IncludeHealthWarningsHelpText": "Sağlık Uyarılarını Dahil Et", - "IndexerFlags": "Dizin Oluşturucu Bayrakları", + "IndexerFlags": "Dizinleyici Bayrakları", "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "6 saatten uzun süren arızalar nedeniyle tüm dizinleyiciler kullanılamıyor", "IndexerLongTermStatusUnavailableHealthCheckMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {indexerNames}", - "IndexerPriority": "Dizin Oluşturucu Önceliği", + "IndexerPriority": "Dizinleyici Önceliği", "IndexerPriorityHelpText": "1 (En Yüksek) ila 50 (En Düşük) arasında Dizin Oluşturucu Önceliği. Varsayılan: 25.", "IndexerStatusAllUnavailableHealthCheckMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", "IndexerStatusUnavailableHealthCheckMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {indexerNames}", @@ -224,7 +224,7 @@ "SSLCertPathHelpText": "Pfx dosyasının yolu", "SSLPort": "SSL Bağlantı Noktası", "StartTypingOrSelectAPathBelow": "Yazmaya başlayın veya aşağıdan bir yol seçin", - "StartupDirectory": "Başlangıç dizini", + "StartupDirectory": "Başlangıç Dizini", "SuggestTranslationChange": "Çeviri değişikliği önerin", "SystemTimeCheckMessage": "Sistem saati 1 günden fazla kapalı. Zamanlanan görevler, saat düzeltilene kadar doğru çalışmayabilir", "TableOptionsColumnsMessage": "Hangi sütunların görünür olduğunu ve hangi sırada görüneceklerini seçin", @@ -247,8 +247,8 @@ "UnableToLoadNotifications": "Bildirimler yüklenemiyor", "UnableToLoadUISettings": "UI ayarları yüklenemiyor", "Yesterday": "Dün", - "AcceptConfirmationModal": "Onay Modelini Kabul Et", - "AddIndexer": "Dizin Oluşturucu Ekle", + "AcceptConfirmationModal": "Onay Modunu Kabul Et", + "AddIndexer": "Dizinleyici Ekle", "AddDownloadClient": "İndirme İstemcisi Ekle", "AddingTag": "Etiket ekleniyor", "CouldNotConnectSignalR": "SignalR'ye bağlanılamadı, kullanıcı arayüzü güncellenmeyecek", @@ -256,7 +256,7 @@ "DownloadClientStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle indirilemeyen istemciler: {downloadClientNames}", "Enabled": "Etkin", "IgnoredAddresses": "Yoksayılan Adresler", - "Indexer": "Dizin oluşturucu", + "Indexer": "Dizinleyici", "DownloadClientStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm indirme istemcileri kullanılamıyor", "EditIndexer": "Dizinleyiciyi Düzenle", "Enable": "etkinleştirme", @@ -271,7 +271,7 @@ "ExistingTag": "Mevcut etiket", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", "IndexerProxyStatusUnavailableHealthCheckMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {indexerProxyNames}", - "Indexers": "Dizin oluşturucular", + "Indexers": "Dizinleyiciler", "Name": "İsim", "New": "Yeni", "NoBackupsAreAvailable": "Kullanılabilir yedek yok", @@ -285,7 +285,7 @@ "TagsHelpText": "En az bir eşleşen etikete sahip filmler için geçerlidir", "UILanguage": "UI Dili", "UpdateScriptPathHelpText": "Çıkarılan bir güncelleme paketini alan ve güncelleme işleminin geri kalanını işleyen özel bir komut dosyasına giden yol", - "Uptime": "Uptime", + "Uptime": "Çalışma süresi", "URLBase": "URL Tabanı", "UrlBaseHelpText": "Ters proxy desteği için varsayılan boştur", "Usenet": "Usenet", @@ -305,32 +305,32 @@ "UnableToLoadGeneralSettings": "Genel ayarlar yüklenemiyor", "Automatic": "Otomatik", "AutomaticSearch": "Otomatik Arama", - "Backup": "Yedek", + "Backup": "Yedekler", "Cancel": "Vazgeç", "Level": "Seviye", "Time": "Zaman", "MaintenanceRelease": "Bakım Sürümü: hata düzeltmeleri ve diğer iyileştirmeler. Daha fazla ayrıntı için Github İşlem Geçmişine bakın", "HistoryCleanupDaysHelpText": "Otomatik temizlemeyi devre dışı bırakmak için 0'a ayarlayın", "HistoryCleanupDaysHelpTextWarning": "Geri dönüşüm kutusundaki, seçilen gün sayısından daha eski olan dosyalar otomatik olarak temizlenecektir", - "Filters": "Filtre", + "Filters": "Filtreler", "OnGrab": "Yakalandığında", "OnHealthIssue": "Sağlık Sorunu Hakkında", "TestAllIndexers": "Tüm Dizinleyicileri Test Et", "GrabReleases": "Bırakma", "No": "Hayır", - "NetCore": ".NET Çekirdeği", + "NetCore": ".NET", "UnableToLoadIndexers": "Dizinleyiciler yüklenemiyor", "Yes": "Evet", "Link": "Bağlantılar", "MappedDrivesRunningAsService": "Eşlenen ağ sürücüleri, bir Windows Hizmeti olarak çalışırken kullanılamaz. Daha fazla bilgi için lütfen SSS bölümüne bakın", "Ended": "Bitti", - "LastDuration": "lastDuration", + "LastDuration": "Yürütme Süresi", "LastExecution": "Son Yürütme", "NextExecution": "Sonraki Yürütme", - "Queued": "Sıraya alındı", + "Queued": "Kuyruğa alındı", "ApplicationLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm dizinleyiciler kullanılamıyor", "ApplicationLongTermStatusCheckSingleClientMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {0}", - "Remove": "Kaldırmak", + "Remove": "Kaldır", "Replace": "Değiştir", "TheLatestVersionIsAlreadyInstalled": "{appName}'ın en son sürümü zaten kurulu", "ApplyTagsHelpTextAdd": "Ekle: Etiketleri mevcut etiket listesine ekleyin", @@ -377,7 +377,7 @@ "AuthenticationRequired": "Kimlik Doğrulama Gerekli", "ApplyChanges": "Değişiklikleri Uygula", "CountDownloadClientsSelected": "{count} indirme istemcisi seçildi", - "CountIndexersSelected": "{count} dizin oluşturucu seçildi", + "CountIndexersSelected": "{count} dizinleyici seçildi", "AuthenticationRequiredWarning": "Kimlik doğrulaması olmadan uzaktan erişimi engellemek için, {appName}'da artık kimlik doğrulamanın etkinleştirilmesini gerektiriyor. İsteğe bağlı olarak yerel adresler için kimlik doğrulamayı devre dışı bırakabilirsiniz.", "Clone": "Klon", "Category": "Kategori", @@ -420,7 +420,7 @@ "Database": "Veri tabanı", "DefaultNameCopiedProfile": "{name} - Kopyala", "DeleteSelectedDownloadClientsMessageText": "Seçilen {count} indirme istemcisini silmek istediğinizden emin misiniz?", - "DeleteSelectedIndexersMessageText": "Seçilen {count} dizin oluşturucuyu silmek istediğinizden emin misiniz?", + "DeleteSelectedIndexersMessageText": "Seçilen {count} dizinleyiciyi silmek istediğinizden emin misiniz?", "DownloadClientFreeboxSettingsPortHelpText": "Freebox arayüzüne erişim için kullanılan bağlantı noktası, varsayılan olarak '{port}' şeklindedir", "ApiKeyValidationHealthCheckMessage": "Lütfen API anahtarınızı en az {length} karakter sayısı kadar güncelleyiniz. Bunu ayarlar veya yapılandırma dosyası üzerinden yapabilirsiniz", "AppProfileInUse": "Kullanımda Olan Uygulama Profili", @@ -431,7 +431,7 @@ "DownloadClientFreeboxSettingsApiUrl": "API URL'si", "DownloadClientFreeboxSettingsApiUrlHelpText": "Freebox API temel URL'sini API sürümüyle tanımlayın, örneğin '{url}', varsayılan olarak '{defaultApiUrl}' olur", "DownloadClientFreeboxSettingsAppIdHelpText": "Freebox API'sine erişim oluşturulurken verilen uygulama kimliği (ör. 'app_id')", - "DownloadClientFreeboxSettingsAppToken": "Uygulama Token'ı", + "DownloadClientFreeboxSettingsAppToken": "Uygulama Jetonu", "DownloadClientFreeboxSettingsAppTokenHelpText": "Freebox API'sine erişim oluşturulurken alınan uygulama jetonu (ör. 'app_token')", "DownloadClientFreeboxSettingsAppId": "Uygulama kimliği", "DownloadClientFreeboxSettingsHostHelpText": "Freebox'un ana bilgisayar adı veya ana bilgisayar IP adresi, varsayılan olarak '{url}' şeklindedir (yalnızca aynı ağdaysa çalışır)", @@ -464,8 +464,8 @@ "DownloadClientRTorrentSettingsAddStopped": "Ekleme Durduruldu", "Label": "Etiket", "EditSelectedDownloadClients": "Seçilen İndirme İstemcilerini Düzenle", - "EditSelectedIndexers": "Seçili Dizin Oluşturucuları Düzenle", - "NoIndexersFound": "Dizin oluşturucu bulunamadı", + "EditSelectedIndexers": "Seçili Dizinleyicileri Düzenle", + "NoIndexersFound": "Dizinleyici bulunamadı", "NoHistoryFound": "Geçmiş bulunamadı", "ManageDownloadClients": "İndirme İstemcilerini Yönet", "InstanceNameHelpText": "Sekmedeki örnek adı ve Syslog uygulaması adı için", @@ -478,5 +478,22 @@ "InvalidUILanguage": "Kullanıcı arayüzünüz geçersiz bir dile ayarlanmış, düzeltin ve ayarlarınızı kaydedin", "InstanceName": "Örnek isim", "NoDownloadClientsFound": "İndirme istemcisi bulunamadı", - "NotificationTriggersHelpText": "Bu bildirimi hangi olayların tetikleyeceğini seçin" + "NotificationTriggersHelpText": "Bu bildirimi hangi olayların tetikleyeceğini seçin", + "Theme": "Tema", + "OnHealthRestored": "Sağlığın İyileştirilmesi Hakkında", + "NotificationsTelegramSettingsIncludeAppName": "{appName}'i Başlığa dahil et", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Farklı uygulamalardan gelen bildirimleri ayırt etmek için isteğe bağlı olarak mesaj başlığının önüne {appName} ekleyin", + "UseSsl": "SSL kullan", + "OnApplicationUpdate": "Uygulama Güncellemesinde", + "TorrentBlackholeSaveMagnetFiles": "Magnet Dosyalarını Kaydet", + "SecretToken": "Gizlilik Jetonu", + "TorrentBlackholeSaveMagnetFilesExtension": "Magnet Dosya Uzantısını Kaydet", + "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Magnet bağlantıları için kullanılacak uzantı, varsayılan olarak '.magnet'tir", + "TorrentBlackholeSaveMagnetFilesHelpText": ".torrent dosyası yoksa magnet bağlantısını kaydedin (yalnızca indirme istemcisi bir dosyaya kaydedilen magnetleri destekliyorsa kullanışlıdır)", + "TorrentBlackholeTorrentFolder": "Torrent Klasörü", + "PasswordConfirmation": "Şifre onayı", + "StopSelecting": "Düzenlemeden Çık", + "Started": "Başlatıldı", + "UsenetBlackholeNzbFolder": "Nzb Klasörü", + "XmlRpcPath": "XML RPC Yolu" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 3df8eb6a4..89c43bc22 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -12,7 +12,7 @@ "ApiKey": "API Ключ", "Added": "Додано", "AddIndexer": "Додати Індексер", - "AddingTag": "Додавання тегу", + "AddingTag": "Додавання тега", "AppDataDirectory": "Каталог AppData", "AppDataLocationHealthCheckMessage": "Оновлення буде неможливим, щоб запобігти видаленню AppData під час оновлення", "Apply": "Застосувати", From 68b895d2ad074de2a3b267039c1cfe4797fc18be Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 6 May 2024 18:22:27 +0300 Subject: [PATCH 588/964] Fixed: Don't share settings for same cached definition in CardigannRequestGenerator --- .../Indexers/Definitions/Cardigann/Cardigann.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/Cardigann.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/Cardigann.cs index 9f6bf21a4..45553786f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/Cardigann.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/Cardigann.cs @@ -4,8 +4,10 @@ using System.Linq; using System.Threading.Tasks; using FluentValidation.Results; using NLog; +using NzbDrone.Common; using NzbDrone.Common.Cache; using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; using NzbDrone.Core.Configuration; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerVersions; @@ -47,7 +49,8 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann public override IIndexerRequestGenerator GetRequestGenerator() { - var generator = _generatorCache.Get(Settings.DefinitionFile, () => + var cacheKey = $"{Settings.DefinitionFile}.{HashUtil.ComputeSha256Hash(Settings.ToJson())}"; + var generator = _generatorCache.Get(cacheKey, () => new CardigannRequestGenerator(_configService, _definitionService.GetCachedDefinition(Settings.DefinitionFile), _logger, From dd21d9b521b37ce92f85a6aac3989a60ccf5e67b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 7 May 2024 00:11:20 +0300 Subject: [PATCH 589/964] Fixed: Allow decimals for Seed Ratio --- frontend/src/Components/Form/FormInputGroup.js | 1 + .../src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx | 1 + src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs | 2 +- src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/Components/Form/FormInputGroup.js b/frontend/src/Components/Form/FormInputGroup.js index cb14fd944..5b3b42de2 100644 --- a/frontend/src/Components/Form/FormInputGroup.js +++ b/frontend/src/Components/Form/FormInputGroup.js @@ -256,6 +256,7 @@ FormInputGroup.propTypes = { name: PropTypes.string.isRequired, value: PropTypes.any, values: PropTypes.arrayOf(PropTypes.any), + isFloat: PropTypes.bool, type: PropTypes.string.isRequired, kind: PropTypes.oneOf(kinds.all), min: PropTypes.number, diff --git a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx index 9e2f3e0e9..2ffbfebfe 100644 --- a/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx +++ b/frontend/src/Indexer/Index/Select/Edit/EditIndexerModalContent.tsx @@ -224,6 +224,7 @@ function EditIndexerModalContent(props: EditIndexerModalContentProps) { name="seedRatio" value={seedRatio} helpText={translate('SeedRatioHelpText')} + isFloat={true} onChange={onInputChange} /> diff --git a/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs b/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs index fd5d4c813..9e07cbb42 100644 --- a/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs +++ b/src/NzbDrone.Core/Indexers/IndexerTorrentBaseSettings.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Indexers [FieldDefinition(1, Type = FieldType.Number, Label = "IndexerSettingsAppsMinimumSeeders", HelpText = "IndexerSettingsAppsMinimumSeedersHelpText", Advanced = true)] public int? AppMinimumSeeders { get; set; } - [FieldDefinition(2, Type = FieldType.Textbox, Label = "IndexerSettingsSeedRatio", HelpText = "IndexerSettingsSeedRatioHelpText")] + [FieldDefinition(2, Type = FieldType.Number, Label = "IndexerSettingsSeedRatio", HelpText = "IndexerSettingsSeedRatioHelpText")] public double? SeedRatio { get; set; } [FieldDefinition(3, Type = FieldType.Number, Label = "IndexerSettingsSeedTime", Unit = "minutes", HelpText = "IndexerSettingsSeedTimeHelpText", Advanced = true)] diff --git a/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs b/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs index c5154335d..959b5357b 100644 --- a/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs +++ b/src/Prowlarr.Http/ClientSchema/SchemaBuilder.cs @@ -162,7 +162,7 @@ namespace Prowlarr.Http.ClientSchema field.Hidden = fieldAttribute.Hidden.ToString().FirstCharToLower(); } - if (fieldAttribute.Type is FieldType.Number && propertyInfo.PropertyType == typeof(double)) + if (fieldAttribute.Type is FieldType.Number && (propertyInfo.PropertyType == typeof(double) || propertyInfo.PropertyType == typeof(double?))) { field.IsFloat = true; } From 649a03e5a09fe8a2d25da49281c45141d0320a18 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 7 May 2024 16:52:02 +0000 Subject: [PATCH 590/964] New: Config file setting to disable log database (#2123) Co-authored-by: sillock1 --- .../ServiceFactoryFixture.cs | 1 + src/NzbDrone.Common/Options/LogOptions.cs | 1 + .../Configuration/ConfigFileProvider.cs | 2 ++ .../Extensions/CompositionExtensions.cs | 12 ++++++++++++ .../Update/History/UpdateHistoryService.cs | 7 +++++-- .../Update/RecentUpdateProvider.cs | 2 +- src/NzbDrone.Host/Bootstrap.cs | 19 +++++++++++++++++++ src/NzbDrone.Host/Startup.cs | 8 ++++++-- src/Prowlarr.Api.V1/Logs/LogController.cs | 10 +++++++++- .../Update/UpdateController.cs | 10 +++++++++- src/Prowlarr.Http/PagingResource.cs | 2 +- 11 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs b/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs index 5ed08a3db..237febe74 100644 --- a/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs +++ b/src/NzbDrone.Common.Test/ServiceFactoryFixture.cs @@ -30,6 +30,7 @@ namespace NzbDrone.Common.Test .AddNzbDroneLogger() .AutoAddServices(Bootstrap.ASSEMBLIES) .AddDummyDatabase() + .AddDummyLogDatabase() .AddStartupContext(new StartupContext("first", "second")); container.RegisterInstance(new Mock().Object); diff --git a/src/NzbDrone.Common/Options/LogOptions.cs b/src/NzbDrone.Common/Options/LogOptions.cs index c36533cb4..1529bb1d0 100644 --- a/src/NzbDrone.Common/Options/LogOptions.cs +++ b/src/NzbDrone.Common/Options/LogOptions.cs @@ -11,4 +11,5 @@ public class LogOptions public string SyslogServer { get; set; } public int? SyslogPort { get; set; } public string SyslogLevel { get; set; } + public bool? DbEnabled { get; set; } } diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index 66f092e0f..bd4faa4bc 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -54,6 +54,7 @@ namespace NzbDrone.Core.Configuration string SyslogServer { get; } int SyslogPort { get; } string SyslogLevel { get; } + bool LogDbEnabled { get; } string Theme { get; } string PostgresHost { get; } int PostgresPort { get; } @@ -233,6 +234,7 @@ namespace NzbDrone.Core.Configuration public string PostgresLogDb => _postgresOptions?.LogDb ?? GetValue("PostgresLogDb", "prowlarr-log", persist: false); public int PostgresPort => (_postgresOptions?.Port ?? 0) != 0 ? _postgresOptions.Port : GetValueInt("PostgresPort", 5432, persist: false); + public bool LogDbEnabled => _logOptions.DbEnabled ?? GetValueBoolean("LogDbEnabled", true, persist: false); public bool LogSql => _logOptions.Sql ?? GetValueBoolean("LogSql", false, persist: false); public int LogRotate => _logOptions.Rotate ?? GetValueInt("LogRotate", 50, persist: false); public bool FilterSentryEvents => _logOptions.FilterSentryEvents ?? GetValueBoolean("FilterSentryEvents", true, persist: false); diff --git a/src/NzbDrone.Core/Datastore/Extensions/CompositionExtensions.cs b/src/NzbDrone.Core/Datastore/Extensions/CompositionExtensions.cs index c5e31f92c..67e251805 100644 --- a/src/NzbDrone.Core/Datastore/Extensions/CompositionExtensions.cs +++ b/src/NzbDrone.Core/Datastore/Extensions/CompositionExtensions.cs @@ -8,6 +8,12 @@ namespace NzbDrone.Core.Datastore.Extensions public static IContainer AddDatabase(this IContainer container) { container.RegisterDelegate(f => new MainDatabase(f.Create()), Reuse.Singleton); + + return container; + } + + public static IContainer AddLogDatabase(this IContainer container) + { container.RegisterDelegate(f => new LogDatabase(f.Create(MigrationType.Log)), Reuse.Singleton); return container; @@ -16,6 +22,12 @@ namespace NzbDrone.Core.Datastore.Extensions public static IContainer AddDummyDatabase(this IContainer container) { container.RegisterInstance(new MainDatabase(null)); + + return container; + } + + public static IContainer AddDummyLogDatabase(this IContainer container) + { container.RegisterInstance(new LogDatabase(null)); return container; diff --git a/src/NzbDrone.Core/Update/History/UpdateHistoryService.cs b/src/NzbDrone.Core/Update/History/UpdateHistoryService.cs index 09cf70602..7be7349e1 100644 --- a/src/NzbDrone.Core/Update/History/UpdateHistoryService.cs +++ b/src/NzbDrone.Core/Update/History/UpdateHistoryService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using NLog; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Core.Configuration; using NzbDrone.Core.Lifecycle; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Update.History.Events; @@ -18,13 +19,15 @@ namespace NzbDrone.Core.Update.History { private readonly IUpdateHistoryRepository _repository; private readonly IEventAggregator _eventAggregator; + private readonly IConfigFileProvider _configFileProvider; private readonly Logger _logger; private Version _prevVersion; - public UpdateHistoryService(IUpdateHistoryRepository repository, IEventAggregator eventAggregator, Logger logger) + public UpdateHistoryService(IUpdateHistoryRepository repository, IEventAggregator eventAggregator, IConfigFileProvider configFileProvider, Logger logger) { _repository = repository; _eventAggregator = eventAggregator; + _configFileProvider = configFileProvider; _logger = logger; } @@ -58,7 +61,7 @@ namespace NzbDrone.Core.Update.History public void Handle(ApplicationStartedEvent message) { - if (BuildInfo.Version.Major == 10) + if (BuildInfo.Version.Major == 10 || !_configFileProvider.LogDbEnabled) { // Don't save dev versions, they change constantly return; diff --git a/src/NzbDrone.Core/Update/RecentUpdateProvider.cs b/src/NzbDrone.Core/Update/RecentUpdateProvider.cs index 4796a68e2..a038311e2 100644 --- a/src/NzbDrone.Core/Update/RecentUpdateProvider.cs +++ b/src/NzbDrone.Core/Update/RecentUpdateProvider.cs @@ -29,7 +29,7 @@ namespace NzbDrone.Core.Update { var branch = _configFileProvider.Branch; var version = BuildInfo.Version; - var prevVersion = _updateHistoryService.PreviouslyInstalled(); + var prevVersion = _configFileProvider.LogDbEnabled ? _updateHistoryService.PreviouslyInstalled() : null; return _updatePackageProvider.GetRecentUpdates(branch, version, prevVersion); } } diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index b446dbc4c..3d4e82964 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -94,6 +94,15 @@ namespace NzbDrone.Host .AddStartupContext(startupContext) .Resolve() .Route(appMode); + + if (config.GetValue(nameof(ConfigFileProvider.LogDbEnabled), true)) + { + c.AddLogDatabase(); + } + else + { + c.AddDummyLogDatabase(); + } }) .ConfigureServices(services => { @@ -136,6 +145,7 @@ namespace NzbDrone.Host var enableSsl = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.EnableSsl)}") ?? config.GetValue(nameof(ConfigFileProvider.EnableSsl), false); var sslCertPath = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.SslCertPath)}") ?? config.GetValue(nameof(ConfigFileProvider.SslCertPath)); var sslCertPassword = config.GetValue($"Prowlarr:Server:{nameof(ServerOptions.SslCertPassword)}") ?? config.GetValue(nameof(ConfigFileProvider.SslCertPassword)); + var logDbEnabled = config.GetValue($"Prowlarr:Log:{nameof(LogOptions.DbEnabled)}") ?? config.GetValue(nameof(ConfigFileProvider.LogDbEnabled), true); var urls = new List { BuildUrl("http", bindAddress, port) }; @@ -153,6 +163,15 @@ namespace NzbDrone.Host .AddNzbDroneLogger() .AddDatabase() .AddStartupContext(context); + + if (logDbEnabled) + { + c.AddLogDatabase(); + } + else + { + c.AddDummyLogDatabase(); + } }) .ConfigureServices(services => { diff --git a/src/NzbDrone.Host/Startup.cs b/src/NzbDrone.Host/Startup.cs index 9c30fc88c..10ea61e15 100644 --- a/src/NzbDrone.Host/Startup.cs +++ b/src/NzbDrone.Host/Startup.cs @@ -238,9 +238,13 @@ namespace NzbDrone.Host // instantiate the databases to initialize/migrate them _ = mainDatabaseFactory.Value; - _ = logDatabaseFactory.Value; - dbTarget.Register(); + if (configFileProvider.LogDbEnabled) + { + _ = logDatabaseFactory.Value; + dbTarget.Register(); + } + SchemaBuilder.Initialize(container); if (OsInfo.IsNotWindows) diff --git a/src/Prowlarr.Api.V1/Logs/LogController.cs b/src/Prowlarr.Api.V1/Logs/LogController.cs index f93f99ba6..b2886d2f1 100644 --- a/src/Prowlarr.Api.V1/Logs/LogController.cs +++ b/src/Prowlarr.Api.V1/Logs/LogController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; using NzbDrone.Core.Instrumentation; using Prowlarr.Http; using Prowlarr.Http.Extensions; @@ -10,16 +11,23 @@ namespace Prowlarr.Api.V1.Logs public class LogController : Controller { private readonly ILogService _logService; + private readonly IConfigFileProvider _configFileProvider; - public LogController(ILogService logService) + public LogController(ILogService logService, IConfigFileProvider configFileProvider) { _logService = logService; + _configFileProvider = configFileProvider; } [HttpGet] [Produces("application/json")] public PagingResource GetLogs([FromQuery] PagingRequestResource paging, string level) { + if (!_configFileProvider.LogDbEnabled) + { + return new PagingResource(); + } + var pagingResource = new PagingResource(paging); var pageSpec = pagingResource.MapToPagingSpec(); diff --git a/src/Prowlarr.Api.V1/Update/UpdateController.cs b/src/Prowlarr.Api.V1/Update/UpdateController.cs index 077a6f6f8..eac25fccf 100644 --- a/src/Prowlarr.Api.V1/Update/UpdateController.cs +++ b/src/Prowlarr.Api.V1/Update/UpdateController.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Core.Configuration; using NzbDrone.Core.Update; using NzbDrone.Core.Update.History; using Prowlarr.Http; @@ -13,11 +14,13 @@ namespace Prowlarr.Api.V1.Update { private readonly IRecentUpdateProvider _recentUpdateProvider; private readonly IUpdateHistoryService _updateHistoryService; + private readonly IConfigFileProvider _configFileProvider; - public UpdateController(IRecentUpdateProvider recentUpdateProvider, IUpdateHistoryService updateHistoryService) + public UpdateController(IRecentUpdateProvider recentUpdateProvider, IUpdateHistoryService updateHistoryService, IConfigFileProvider configFileProvider) { _recentUpdateProvider = recentUpdateProvider; _updateHistoryService = updateHistoryService; + _configFileProvider = configFileProvider; } [HttpGet] @@ -45,6 +48,11 @@ namespace Prowlarr.Api.V1.Update installed.Installed = true; } + if (!_configFileProvider.LogDbEnabled) + { + return resources; + } + var installDates = _updateHistoryService.InstalledSince(resources.Last().ReleaseDate) .DistinctBy(v => v.Version) .ToDictionary(v => v.Version); diff --git a/src/Prowlarr.Http/PagingResource.cs b/src/Prowlarr.Http/PagingResource.cs index 97907cd66..d21b5bf42 100644 --- a/src/Prowlarr.Http/PagingResource.cs +++ b/src/Prowlarr.Http/PagingResource.cs @@ -21,7 +21,7 @@ namespace Prowlarr.Http public string SortKey { get; set; } public SortDirection SortDirection { get; set; } public int TotalRecords { get; set; } - public List Records { get; set; } + public List Records { get; set; } = new (); public PagingResource() { From 16254cf5f915602e398312a2300bde3f8a99c34c Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 27 Mar 2023 16:49:12 -0700 Subject: [PATCH 591/964] New: Option to select download client when multiple of the same type are configured (cherry picked from commit 07f0fbf9a51d54e44681fd0f74df4e048bff561a) --- .../DescriptionList/DescriptionListItem.js | 4 +- .../src/DownloadClient/DownloadProtocol.ts | 7 + frontend/src/Helpers/Props/icons.js | 2 + .../src/Search/Mobile/SearchIndexOverview.css | 39 ++ .../Mobile/SearchIndexOverview.css.d.ts | 4 + .../src/Search/Mobile/SearchIndexOverview.js | 234 ---------- .../src/Search/Mobile/SearchIndexOverview.tsx | 262 +++++++++++ .../SelectDownloadClientModal.tsx | 31 ++ .../SelectDownloadClientModalContent.tsx | 74 +++ .../SelectDownloadClientRow.css | 6 + .../SelectDownloadClientRow.css.d.ts | 7 + .../SelectDownloadClientRow.tsx | 32 ++ .../OverrideMatch/OverrideMatchData.css | 17 + .../OverrideMatch/OverrideMatchData.css.d.ts | 9 + .../OverrideMatch/OverrideMatchData.tsx | 35 ++ .../OverrideMatch/OverrideMatchModal.tsx | 45 ++ .../OverrideMatchModalContent.css | 49 ++ .../OverrideMatchModalContent.css.d.ts | 11 + .../OverrideMatchModalContent.tsx | 150 ++++++ frontend/src/Search/SearchIndexConnector.js | 10 + .../Search/Table/SearchIndexItemConnector.js | 7 +- frontend/src/Search/Table/SearchIndexRow.css | 30 ++ .../src/Search/Table/SearchIndexRow.css.d.ts | 3 + frontend/src/Search/Table/SearchIndexRow.js | 431 ------------------ frontend/src/Search/Table/SearchIndexRow.tsx | 395 ++++++++++++++++ .../createEnabledDownloadClientsSelector.ts | 22 + frontend/src/Utilities/Number/formatBytes.js | 4 +- src/NzbDrone.Core/Localization/Core/en.json | 8 + src/Prowlarr.Api.V1/Search/ReleaseResource.cs | 4 + .../Search/SearchController.cs | 2 +- 30 files changed, 1259 insertions(+), 675 deletions(-) create mode 100644 frontend/src/DownloadClient/DownloadProtocol.ts delete mode 100644 frontend/src/Search/Mobile/SearchIndexOverview.js create mode 100644 frontend/src/Search/Mobile/SearchIndexOverview.tsx create mode 100644 frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientModal.tsx create mode 100644 frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientModalContent.tsx create mode 100644 frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.css create mode 100644 frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.css.d.ts create mode 100644 frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.tsx create mode 100644 frontend/src/Search/OverrideMatch/OverrideMatchData.css create mode 100644 frontend/src/Search/OverrideMatch/OverrideMatchData.css.d.ts create mode 100644 frontend/src/Search/OverrideMatch/OverrideMatchData.tsx create mode 100644 frontend/src/Search/OverrideMatch/OverrideMatchModal.tsx create mode 100644 frontend/src/Search/OverrideMatch/OverrideMatchModalContent.css create mode 100644 frontend/src/Search/OverrideMatch/OverrideMatchModalContent.css.d.ts create mode 100644 frontend/src/Search/OverrideMatch/OverrideMatchModalContent.tsx delete mode 100644 frontend/src/Search/Table/SearchIndexRow.js create mode 100644 frontend/src/Search/Table/SearchIndexRow.tsx create mode 100644 frontend/src/Store/Selectors/createEnabledDownloadClientsSelector.ts diff --git a/frontend/src/Components/DescriptionList/DescriptionListItem.js b/frontend/src/Components/DescriptionList/DescriptionListItem.js index aac01a6b5..931557045 100644 --- a/frontend/src/Components/DescriptionList/DescriptionListItem.js +++ b/frontend/src/Components/DescriptionList/DescriptionListItem.js @@ -10,6 +10,7 @@ class DescriptionListItem extends Component { render() { const { + className, titleClassName, descriptionClassName, title, @@ -17,7 +18,7 @@ class DescriptionListItem extends Component { } = this.props; return ( -
+
@@ -35,6 +36,7 @@ class DescriptionListItem extends Component { } DescriptionListItem.propTypes = { + className: PropTypes.string, titleClassName: PropTypes.string, descriptionClassName: PropTypes.string, title: PropTypes.string, diff --git a/frontend/src/DownloadClient/DownloadProtocol.ts b/frontend/src/DownloadClient/DownloadProtocol.ts new file mode 100644 index 000000000..090a1a087 --- /dev/null +++ b/frontend/src/DownloadClient/DownloadProtocol.ts @@ -0,0 +1,7 @@ +enum DownloadProtocol { + Unknown = 'unknown', + Usenet = 'usenet', + Torrent = 'torrent', +} + +export default DownloadProtocol; diff --git a/frontend/src/Helpers/Props/icons.js b/frontend/src/Helpers/Props/icons.js index 834452242..773748996 100644 --- a/frontend/src/Helpers/Props/icons.js +++ b/frontend/src/Helpers/Props/icons.js @@ -43,6 +43,7 @@ import { faChevronCircleRight as fasChevronCircleRight, faChevronCircleUp as fasChevronCircleUp, faCircle as fasCircle, + faCircleDown as fasCircleDown, faCloud as fasCloud, faCloudDownloadAlt as fasCloudDownloadAlt, faCog as fasCog, @@ -141,6 +142,7 @@ export const CHECK_INDETERMINATE = fasMinus; export const CHECK_CIRCLE = fasCheckCircle; export const CHECK_SQUARE = fasSquareCheck; export const CIRCLE = fasCircle; +export const CIRCLE_DOWN = fasCircleDown; export const CIRCLE_OUTLINE = farCircle; export const CLEAR = fasTrashAlt; export const CLIPBOARD = fasCopy; diff --git a/frontend/src/Search/Mobile/SearchIndexOverview.css b/frontend/src/Search/Mobile/SearchIndexOverview.css index 4e184bd0a..e29ff1ef9 100644 --- a/frontend/src/Search/Mobile/SearchIndexOverview.css +++ b/frontend/src/Search/Mobile/SearchIndexOverview.css @@ -47,3 +47,42 @@ $hoverScale: 1.05; right: 0; white-space: nowrap; } + +.downloadLink { + composes: link from '~Components/Link/Link.css'; + + margin: 0 2px; + width: 22px; + color: var(--textColor); + text-align: center; +} + +.manualDownloadContent { + position: relative; + display: inline-block; + margin: 0 2px; + width: 22px; + height: 20.39px; + vertical-align: middle; + line-height: 20.39px; + + &:hover { + color: var(--iconButtonHoverColor); + } +} + +.interactiveIcon { + position: absolute; + top: 4px; + left: 0; + /* width: 100%; */ + text-align: center; +} + +.downloadIcon { + position: absolute; + top: 7px; + left: 8px; + /* width: 100%; */ + text-align: center; +} diff --git a/frontend/src/Search/Mobile/SearchIndexOverview.css.d.ts b/frontend/src/Search/Mobile/SearchIndexOverview.css.d.ts index 266cf7fca..68256eb25 100644 --- a/frontend/src/Search/Mobile/SearchIndexOverview.css.d.ts +++ b/frontend/src/Search/Mobile/SearchIndexOverview.css.d.ts @@ -4,9 +4,13 @@ interface CssExports { 'actions': string; 'container': string; 'content': string; + 'downloadIcon': string; + 'downloadLink': string; 'indexerRow': string; 'info': string; 'infoRow': string; + 'interactiveIcon': string; + 'manualDownloadContent': string; 'title': string; 'titleRow': string; } diff --git a/frontend/src/Search/Mobile/SearchIndexOverview.js b/frontend/src/Search/Mobile/SearchIndexOverview.js deleted file mode 100644 index 1a14ae66c..000000000 --- a/frontend/src/Search/Mobile/SearchIndexOverview.js +++ /dev/null @@ -1,234 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import TextTruncate from 'react-text-truncate'; -import Label from 'Components/Label'; -import IconButton from 'Components/Link/IconButton'; -import Link from 'Components/Link/Link'; -import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; -import { icons, kinds } from 'Helpers/Props'; -import ProtocolLabel from 'Indexer/Index/Table/ProtocolLabel'; -import CategoryLabel from 'Search/Table/CategoryLabel'; -import Peers from 'Search/Table/Peers'; -import dimensions from 'Styles/Variables/dimensions'; -import formatAge from 'Utilities/Number/formatAge'; -import formatBytes from 'Utilities/Number/formatBytes'; -import titleCase from 'Utilities/String/titleCase'; -import translate from 'Utilities/String/translate'; -import styles from './SearchIndexOverview.css'; - -const columnPadding = parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = parseInt(dimensions.movieIndexColumnPaddingSmallScreen); - -function getContentHeight(rowHeight, isSmallScreen) { - const padding = isSmallScreen ? columnPaddingSmallScreen : columnPadding; - - return rowHeight - padding; -} - -function getDownloadIcon(isGrabbing, isGrabbed, grabError) { - if (isGrabbing) { - return icons.SPINNER; - } else if (isGrabbed) { - return icons.DOWNLOADING; - } else if (grabError) { - return icons.DOWNLOADING; - } - - return icons.DOWNLOAD; -} - -function getDownloadKind(isGrabbed, grabError) { - if (isGrabbed) { - return kinds.SUCCESS; - } - - if (grabError) { - return kinds.DANGER; - } - - return kinds.DEFAULT; -} - -function getDownloadTooltip(isGrabbing, isGrabbed, grabError) { - if (isGrabbing) { - return ''; - } else if (isGrabbed) { - return translate('AddedToDownloadClient'); - } else if (grabError) { - return grabError; - } - - return translate('AddToDownloadClient'); -} - -class SearchIndexOverview extends Component { - - // - // Listeners - - onGrabPress = () => { - const { - guid, - indexerId, - onGrabPress - } = this.props; - - onGrabPress({ - guid, - indexerId - }); - }; - - // - // Render - - render() { - const { - title, - infoUrl, - protocol, - downloadUrl, - magnetUrl, - categories, - seeders, - leechers, - indexerFlags, - size, - age, - ageHours, - ageMinutes, - indexer, - rowHeight, - isSmallScreen, - isGrabbed, - isGrabbing, - grabError - } = this.props; - - const contentHeight = getContentHeight(rowHeight, isSmallScreen); - - return ( -
-
-
-
-
- - - -
- -
- - - { - downloadUrl || magnetUrl ? - : - null - } -
-
-
- {indexer} -
-
- - - { - protocol === 'torrent' && - - } - - - - - - - - { - indexerFlags.length ? - indexerFlags - .sort((a, b) => a.localeCompare(b)) - .map((flag, index) => { - return ( - - ); - }) : - null - } -
-
-
-
- ); - } -} - -SearchIndexOverview.propTypes = { - guid: PropTypes.string.isRequired, - categories: PropTypes.arrayOf(PropTypes.object).isRequired, - protocol: PropTypes.string.isRequired, - age: PropTypes.number.isRequired, - ageHours: PropTypes.number.isRequired, - ageMinutes: PropTypes.number.isRequired, - publishDate: PropTypes.string.isRequired, - title: PropTypes.string.isRequired, - infoUrl: PropTypes.string.isRequired, - downloadUrl: PropTypes.string, - magnetUrl: PropTypes.string, - indexerId: PropTypes.number.isRequired, - indexer: PropTypes.string.isRequired, - size: PropTypes.number.isRequired, - files: PropTypes.number, - grabs: PropTypes.number, - seeders: PropTypes.number, - leechers: PropTypes.number, - indexerFlags: PropTypes.arrayOf(PropTypes.string).isRequired, - rowHeight: PropTypes.number.isRequired, - showRelativeDates: PropTypes.bool.isRequired, - shortDateFormat: PropTypes.string.isRequired, - longDateFormat: PropTypes.string.isRequired, - timeFormat: PropTypes.string.isRequired, - isSmallScreen: PropTypes.bool.isRequired, - onGrabPress: PropTypes.func.isRequired, - isGrabbing: PropTypes.bool.isRequired, - isGrabbed: PropTypes.bool.isRequired, - grabError: PropTypes.string -}; - -SearchIndexOverview.defaultProps = { - isGrabbing: false, - isGrabbed: false -}; - -export default SearchIndexOverview; diff --git a/frontend/src/Search/Mobile/SearchIndexOverview.tsx b/frontend/src/Search/Mobile/SearchIndexOverview.tsx new file mode 100644 index 000000000..8d0e6ebff --- /dev/null +++ b/frontend/src/Search/Mobile/SearchIndexOverview.tsx @@ -0,0 +1,262 @@ +import React, { useCallback, useMemo, useState } from 'react'; +import { useSelector } from 'react-redux'; +import TextTruncate from 'react-text-truncate'; +import Icon from 'Components/Icon'; +import Label from 'Components/Label'; +import IconButton from 'Components/Link/IconButton'; +import Link from 'Components/Link/Link'; +import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; +import DownloadProtocol from 'DownloadClient/DownloadProtocol'; +import { icons, kinds } from 'Helpers/Props'; +import ProtocolLabel from 'Indexer/Index/Table/ProtocolLabel'; +import { IndexerCategory } from 'Indexer/Indexer'; +import OverrideMatchModal from 'Search/OverrideMatch/OverrideMatchModal'; +import CategoryLabel from 'Search/Table/CategoryLabel'; +import Peers from 'Search/Table/Peers'; +import createEnabledDownloadClientsSelector from 'Store/Selectors/createEnabledDownloadClientsSelector'; +import dimensions from 'Styles/Variables/dimensions'; +import formatDateTime from 'Utilities/Date/formatDateTime'; +import formatAge from 'Utilities/Number/formatAge'; +import formatBytes from 'Utilities/Number/formatBytes'; +import titleCase from 'Utilities/String/titleCase'; +import translate from 'Utilities/String/translate'; +import styles from './SearchIndexOverview.css'; + +const columnPadding = parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = parseInt( + dimensions.movieIndexColumnPaddingSmallScreen +); + +function getDownloadIcon( + isGrabbing: boolean, + isGrabbed: boolean, + grabError?: string +) { + if (isGrabbing) { + return icons.SPINNER; + } else if (isGrabbed) { + return icons.DOWNLOADING; + } else if (grabError) { + return icons.DOWNLOADING; + } + + return icons.DOWNLOAD; +} + +function getDownloadKind(isGrabbed: boolean, grabError?: string) { + if (isGrabbed) { + return kinds.SUCCESS; + } + + if (grabError) { + return kinds.DANGER; + } + + return kinds.DEFAULT; +} + +function getDownloadTooltip( + isGrabbing: boolean, + isGrabbed: boolean, + grabError?: string +) { + if (isGrabbing) { + return ''; + } else if (isGrabbed) { + return translate('AddedToDownloadClient'); + } else if (grabError) { + return grabError; + } + + return translate('AddToDownloadClient'); +} + +interface SearchIndexOverviewProps { + guid: string; + protocol: DownloadProtocol; + age: number; + ageHours: number; + ageMinutes: number; + publishDate: string; + title: string; + infoUrl: string; + downloadUrl?: string; + magnetUrl?: string; + indexerId: number; + indexer: string; + categories: IndexerCategory[]; + size: number; + seeders?: number; + leechers?: number; + indexerFlags: string[]; + isGrabbing: boolean; + isGrabbed: boolean; + grabError?: string; + longDateFormat: string; + timeFormat: string; + rowHeight: number; + isSmallScreen: boolean; + onGrabPress(...args: unknown[]): void; +} + +function SearchIndexOverview(props: SearchIndexOverviewProps) { + const { + guid, + indexerId, + protocol, + categories, + age, + ageHours, + ageMinutes, + publishDate, + title, + infoUrl, + downloadUrl, + magnetUrl, + indexer, + size, + seeders, + leechers, + indexerFlags = [], + isGrabbing = false, + isGrabbed = false, + grabError, + longDateFormat, + timeFormat, + rowHeight, + isSmallScreen, + onGrabPress, + } = props; + + const [isOverrideModalOpen, setIsOverrideModalOpen] = useState(false); + + const { items: downloadClients } = useSelector( + createEnabledDownloadClientsSelector(protocol) + ); + + const onGrabPressWrapper = useCallback(() => { + onGrabPress({ + guid, + indexerId, + }); + }, [guid, indexerId, onGrabPress]); + + const onOverridePress = useCallback(() => { + setIsOverrideModalOpen(true); + }, [setIsOverrideModalOpen]); + + const onOverrideModalClose = useCallback(() => { + setIsOverrideModalOpen(false); + }, [setIsOverrideModalOpen]); + + const contentHeight = useMemo(() => { + const padding = isSmallScreen ? columnPaddingSmallScreen : columnPadding; + + return rowHeight - padding; + }, [rowHeight, isSmallScreen]); + + return ( + <> +
+
+
+
+
+ + + +
+ +
+ + + {downloadClients.length > 1 ? ( + +
+ + + +
+ + ) : null} + + {downloadUrl || magnetUrl ? ( + + ) : null} +
+
+
{indexer}
+
+ + + {protocol === 'torrent' && ( + + )} + + + + + + + + {indexerFlags.length + ? indexerFlags + .sort((a, b) => a.localeCompare(b)) + .map((flag, index) => { + return ( + + ); + }) + : null} +
+
+
+
+ + + + ); +} + +export default SearchIndexOverview; diff --git a/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientModal.tsx b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientModal.tsx new file mode 100644 index 000000000..81bf86e59 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientModal.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import Modal from 'Components/Modal/Modal'; +import DownloadProtocol from 'DownloadClient/DownloadProtocol'; +import { sizes } from 'Helpers/Props'; +import SelectDownloadClientModalContent from './SelectDownloadClientModalContent'; + +interface SelectDownloadClientModalProps { + isOpen: boolean; + protocol: DownloadProtocol; + modalTitle: string; + onDownloadClientSelect(downloadClientId: number): void; + onModalClose(): void; +} + +function SelectDownloadClientModal(props: SelectDownloadClientModalProps) { + const { isOpen, protocol, modalTitle, onDownloadClientSelect, onModalClose } = + props; + + return ( + + + + ); +} + +export default SelectDownloadClientModal; diff --git a/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientModalContent.tsx b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientModalContent.tsx new file mode 100644 index 000000000..63e15808f --- /dev/null +++ b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientModalContent.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import { useSelector } from 'react-redux'; +import Alert from 'Components/Alert'; +import Form from 'Components/Form/Form'; +import Button from 'Components/Link/Button'; +import LoadingIndicator from 'Components/Loading/LoadingIndicator'; +import ModalBody from 'Components/Modal/ModalBody'; +import ModalContent from 'Components/Modal/ModalContent'; +import ModalFooter from 'Components/Modal/ModalFooter'; +import ModalHeader from 'Components/Modal/ModalHeader'; +import DownloadProtocol from 'DownloadClient/DownloadProtocol'; +import { kinds } from 'Helpers/Props'; +import createEnabledDownloadClientsSelector from 'Store/Selectors/createEnabledDownloadClientsSelector'; +import translate from 'Utilities/String/translate'; +import SelectDownloadClientRow from './SelectDownloadClientRow'; + +interface SelectDownloadClientModalContentProps { + protocol: DownloadProtocol; + modalTitle: string; + onDownloadClientSelect(downloadClientId: number): void; + onModalClose(): void; +} + +function SelectDownloadClientModalContent( + props: SelectDownloadClientModalContentProps +) { + const { modalTitle, protocol, onDownloadClientSelect, onModalClose } = props; + + const { isFetching, isPopulated, error, items } = useSelector( + createEnabledDownloadClientsSelector(protocol) + ); + + return ( + + + {translate('SelectDownloadClientModalTitle', { modalTitle })} + + + + {isFetching ? : null} + + {!isFetching && error ? ( + + {translate('DownloadClientsLoadError')} + + ) : null} + + {isPopulated && !error ? ( +
+ {items.map((downloadClient) => { + const { id, name, priority } = downloadClient; + + return ( + + ); + })} + + ) : null} +
+ + + + +
+ ); +} + +export default SelectDownloadClientModalContent; diff --git a/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.css b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.css new file mode 100644 index 000000000..6525db977 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.css @@ -0,0 +1,6 @@ +.downloadClient { + display: flex; + justify-content: space-between; + padding: 8px; + border-bottom: 1px solid var(--borderColor); +} diff --git a/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.css.d.ts b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.css.d.ts new file mode 100644 index 000000000..10c2d3948 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.css.d.ts @@ -0,0 +1,7 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'downloadClient': string; +} +export const cssExports: CssExports; +export default cssExports; diff --git a/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.tsx b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.tsx new file mode 100644 index 000000000..6f98d60b4 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/DownloadClient/SelectDownloadClientRow.tsx @@ -0,0 +1,32 @@ +import React, { useCallback } from 'react'; +import Link from 'Components/Link/Link'; +import translate from 'Utilities/String/translate'; +import styles from './SelectDownloadClientRow.css'; + +interface SelectSeasonRowProps { + id: number; + name: string; + priority: number; + onDownloadClientSelect(downloadClientId: number): unknown; +} + +function SelectDownloadClientRow(props: SelectSeasonRowProps) { + const { id, name, priority, onDownloadClientSelect } = props; + + const onSeasonSelectWrapper = useCallback(() => { + onDownloadClientSelect(id); + }, [id, onDownloadClientSelect]); + + return ( + +
{name}
+
{translate('PrioritySettings', { priority })}
+ + ); +} + +export default SelectDownloadClientRow; diff --git a/frontend/src/Search/OverrideMatch/OverrideMatchData.css b/frontend/src/Search/OverrideMatch/OverrideMatchData.css new file mode 100644 index 000000000..bd4d2f788 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/OverrideMatchData.css @@ -0,0 +1,17 @@ +.link { + composes: link from '~Components/Link/Link.css'; + + width: 100%; +} + +.placeholder { + display: inline-block; + margin: -2px 0; + width: 100%; + outline: 2px dashed var(--dangerColor); + outline-offset: -2px; +} + +.optional { + outline: 2px dashed var(--gray); +} diff --git a/frontend/src/Search/OverrideMatch/OverrideMatchData.css.d.ts b/frontend/src/Search/OverrideMatch/OverrideMatchData.css.d.ts new file mode 100644 index 000000000..dd3ac4575 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/OverrideMatchData.css.d.ts @@ -0,0 +1,9 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'link': string; + 'optional': string; + 'placeholder': string; +} +export const cssExports: CssExports; +export default cssExports; diff --git a/frontend/src/Search/OverrideMatch/OverrideMatchData.tsx b/frontend/src/Search/OverrideMatch/OverrideMatchData.tsx new file mode 100644 index 000000000..82d6bd812 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/OverrideMatchData.tsx @@ -0,0 +1,35 @@ +import classNames from 'classnames'; +import React from 'react'; +import Link from 'Components/Link/Link'; +import styles from './OverrideMatchData.css'; + +interface OverrideMatchDataProps { + value?: string | number | JSX.Element | JSX.Element[]; + isDisabled?: boolean; + isOptional?: boolean; + onPress: () => void; +} + +function OverrideMatchData(props: OverrideMatchDataProps) { + const { value, isDisabled = false, isOptional, onPress } = props; + + return ( + + {(value == null || (Array.isArray(value) && value.length === 0)) && + !isDisabled ? ( + +   + + ) : ( + value + )} + + ); +} + +export default OverrideMatchData; diff --git a/frontend/src/Search/OverrideMatch/OverrideMatchModal.tsx b/frontend/src/Search/OverrideMatch/OverrideMatchModal.tsx new file mode 100644 index 000000000..16d62ea7c --- /dev/null +++ b/frontend/src/Search/OverrideMatch/OverrideMatchModal.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import Modal from 'Components/Modal/Modal'; +import DownloadProtocol from 'DownloadClient/DownloadProtocol'; +import { sizes } from 'Helpers/Props'; +import OverrideMatchModalContent from './OverrideMatchModalContent'; + +interface OverrideMatchModalProps { + isOpen: boolean; + title: string; + indexerId: number; + guid: string; + protocol: DownloadProtocol; + isGrabbing: boolean; + grabError?: string; + onModalClose(): void; +} + +function OverrideMatchModal(props: OverrideMatchModalProps) { + const { + isOpen, + title, + indexerId, + guid, + protocol, + isGrabbing, + grabError, + onModalClose, + } = props; + + return ( + + + + ); +} + +export default OverrideMatchModal; diff --git a/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.css b/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.css new file mode 100644 index 000000000..a5b4b8d52 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.css @@ -0,0 +1,49 @@ +.label { + composes: label from '~Components/Label.css'; + + cursor: pointer; +} + +.item { + display: block; + margin-bottom: 5px; + margin-left: 50px; +} + +.footer { + composes: modalFooter from '~Components/Modal/ModalFooter.css'; + + display: flex; + justify-content: space-between; + overflow: hidden; +} + +.error { + margin-right: 20px; + color: var(--dangerColor); + word-break: break-word; +} + +.buttons { + display: flex; +} + +@media only screen and (max-width: $breakpointSmall) { + .item { + margin-left: 0; + } + + .footer { + display: block; + } + + .error { + margin-right: 0; + margin-bottom: 10px; + } + + .buttons { + justify-content: space-between; + flex-grow: 1; + } +} diff --git a/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.css.d.ts b/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.css.d.ts new file mode 100644 index 000000000..79c77d6b5 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.css.d.ts @@ -0,0 +1,11 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'buttons': string; + 'error': string; + 'footer': string; + 'item': string; + 'label': string; +} +export const cssExports: CssExports; +export default cssExports; diff --git a/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.tsx b/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.tsx new file mode 100644 index 000000000..fbe0ec450 --- /dev/null +++ b/frontend/src/Search/OverrideMatch/OverrideMatchModalContent.tsx @@ -0,0 +1,150 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import DescriptionList from 'Components/DescriptionList/DescriptionList'; +import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem'; +import Button from 'Components/Link/Button'; +import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton'; +import ModalBody from 'Components/Modal/ModalBody'; +import ModalContent from 'Components/Modal/ModalContent'; +import ModalFooter from 'Components/Modal/ModalFooter'; +import ModalHeader from 'Components/Modal/ModalHeader'; +import DownloadProtocol from 'DownloadClient/DownloadProtocol'; +import usePrevious from 'Helpers/Hooks/usePrevious'; +import { grabRelease } from 'Store/Actions/releaseActions'; +import { fetchDownloadClients } from 'Store/Actions/settingsActions'; +import createEnabledDownloadClientsSelector from 'Store/Selectors/createEnabledDownloadClientsSelector'; +import translate from 'Utilities/String/translate'; +import SelectDownloadClientModal from './DownloadClient/SelectDownloadClientModal'; +import OverrideMatchData from './OverrideMatchData'; +import styles from './OverrideMatchModalContent.css'; + +type SelectType = 'select' | 'downloadClient'; + +interface OverrideMatchModalContentProps { + indexerId: number; + title: string; + guid: string; + protocol: DownloadProtocol; + isGrabbing: boolean; + grabError?: string; + onModalClose(): void; +} + +function OverrideMatchModalContent(props: OverrideMatchModalContentProps) { + const modalTitle = translate('ManualGrab'); + const { + indexerId, + title, + guid, + protocol, + isGrabbing, + grabError, + onModalClose, + } = props; + + const [downloadClientId, setDownloadClientId] = useState(null); + const [selectModalOpen, setSelectModalOpen] = useState( + null + ); + const previousIsGrabbing = usePrevious(isGrabbing); + + const dispatch = useDispatch(); + const { items: downloadClients } = useSelector( + createEnabledDownloadClientsSelector(protocol) + ); + + const onSelectModalClose = useCallback(() => { + setSelectModalOpen(null); + }, [setSelectModalOpen]); + + const onSelectDownloadClientPress = useCallback(() => { + setSelectModalOpen('downloadClient'); + }, [setSelectModalOpen]); + + const onDownloadClientSelect = useCallback( + (downloadClientId: number) => { + setDownloadClientId(downloadClientId); + setSelectModalOpen(null); + }, + [setDownloadClientId, setSelectModalOpen] + ); + + const onGrabPress = useCallback(() => { + dispatch( + grabRelease({ + indexerId, + guid, + downloadClientId, + }) + ); + }, [indexerId, guid, downloadClientId, dispatch]); + + useEffect(() => { + if (!isGrabbing && previousIsGrabbing) { + onModalClose(); + } + }, [isGrabbing, previousIsGrabbing, onModalClose]); + + useEffect( + () => { + dispatch(fetchDownloadClients()); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); + + return ( + + + {translate('OverrideGrabModalTitle', { title })} + + + + + {downloadClients.length > 1 ? ( + downloadClient.id === downloadClientId + )?.name ?? translate('Default') + } + onPress={onSelectDownloadClientPress} + /> + } + /> + ) : null} + + + + +
{grabError}
+ +
+ + + + {translate('GrabRelease')} + +
+
+ + +
+ ); +} + +export default OverrideMatchModalContent; diff --git a/frontend/src/Search/SearchIndexConnector.js b/frontend/src/Search/SearchIndexConnector.js index e3302e73c..78a9866b2 100644 --- a/frontend/src/Search/SearchIndexConnector.js +++ b/frontend/src/Search/SearchIndexConnector.js @@ -4,6 +4,7 @@ import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import withScrollPosition from 'Components/withScrollPosition'; import { bulkGrabReleases, cancelFetchReleases, clearReleases, fetchReleases, setReleasesFilter, setReleasesSort, setReleasesTableOption } from 'Store/Actions/releaseActions'; +import { fetchDownloadClients } from 'Store/Actions/Settings/downloadClients'; import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector'; import createReleaseClientSideCollectionItemsSelector from 'Store/Selectors/createReleaseClientSideCollectionItemsSelector'; import SearchIndex from './SearchIndex'; @@ -55,12 +56,20 @@ function createMapDispatchToProps(dispatch, props) { dispatchClearReleases() { dispatch(clearReleases()); + }, + + dispatchFetchDownloadClients() { + dispatch(fetchDownloadClients()); } }; } class SearchIndexConnector extends Component { + componentDidMount() { + this.props.dispatchFetchDownloadClients(); + } + componentWillUnmount() { this.props.dispatchCancelFetchReleases(); this.props.dispatchClearReleases(); @@ -85,6 +94,7 @@ SearchIndexConnector.propTypes = { onBulkGrabPress: PropTypes.func.isRequired, dispatchCancelFetchReleases: PropTypes.func.isRequired, dispatchClearReleases: PropTypes.func.isRequired, + dispatchFetchDownloadClients: PropTypes.func.isRequired, items: PropTypes.arrayOf(PropTypes.object) }; diff --git a/frontend/src/Search/Table/SearchIndexItemConnector.js b/frontend/src/Search/Table/SearchIndexItemConnector.js index 490214529..4cc7fb20c 100644 --- a/frontend/src/Search/Table/SearchIndexItemConnector.js +++ b/frontend/src/Search/Table/SearchIndexItemConnector.js @@ -2,7 +2,6 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; -import { executeCommand } from 'Store/Actions/commandActions'; function createReleaseSelector() { return createSelector( @@ -37,10 +36,6 @@ function createMapStateToProps() { ); } -const mapDispatchToProps = { - dispatchExecuteCommand: executeCommand -}; - class SearchIndexItemConnector extends Component { // @@ -71,4 +66,4 @@ SearchIndexItemConnector.propTypes = { component: PropTypes.elementType.isRequired }; -export default connect(createMapStateToProps, mapDispatchToProps)(SearchIndexItemConnector); +export default connect(createMapStateToProps, null)(SearchIndexItemConnector); diff --git a/frontend/src/Search/Table/SearchIndexRow.css b/frontend/src/Search/Table/SearchIndexRow.css index 37b59a35d..b36ec4071 100644 --- a/frontend/src/Search/Table/SearchIndexRow.css +++ b/frontend/src/Search/Table/SearchIndexRow.css @@ -67,3 +67,33 @@ color: var(--textColor); } + +.manualDownloadContent { + position: relative; + display: inline-block; + margin: 0 2px; + width: 22px; + height: 20.39px; + vertical-align: middle; + line-height: 20.39px; + + &:hover { + color: var(--iconButtonHoverColor); + } +} + +.interactiveIcon { + position: absolute; + top: 4px; + left: 0; + /* width: 100%; */ + text-align: center; +} + +.downloadIcon { + position: absolute; + top: 7px; + left: 8px; + /* width: 100%; */ + text-align: center; +} diff --git a/frontend/src/Search/Table/SearchIndexRow.css.d.ts b/frontend/src/Search/Table/SearchIndexRow.css.d.ts index 6d625f58a..7552b96f9 100644 --- a/frontend/src/Search/Table/SearchIndexRow.css.d.ts +++ b/frontend/src/Search/Table/SearchIndexRow.css.d.ts @@ -6,12 +6,15 @@ interface CssExports { 'category': string; 'cell': string; 'checkInput': string; + 'downloadIcon': string; 'downloadLink': string; 'externalLinks': string; 'files': string; 'grabs': string; 'indexer': string; 'indexerFlags': string; + 'interactiveIcon': string; + 'manualDownloadContent': string; 'peers': string; 'protocol': string; 'size': string; diff --git a/frontend/src/Search/Table/SearchIndexRow.js b/frontend/src/Search/Table/SearchIndexRow.js deleted file mode 100644 index 613605e02..000000000 --- a/frontend/src/Search/Table/SearchIndexRow.js +++ /dev/null @@ -1,431 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import Icon from 'Components/Icon'; -import IconButton from 'Components/Link/IconButton'; -import Link from 'Components/Link/Link'; -import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; -import VirtualTableRowCell from 'Components/Table/Cells/VirtualTableRowCell'; -import VirtualTableSelectCell from 'Components/Table/Cells/VirtualTableSelectCell'; -import Popover from 'Components/Tooltip/Popover'; -import { icons, kinds, tooltipPositions } from 'Helpers/Props'; -import ProtocolLabel from 'Indexer/Index/Table/ProtocolLabel'; -import formatDateTime from 'Utilities/Date/formatDateTime'; -import formatAge from 'Utilities/Number/formatAge'; -import formatBytes from 'Utilities/Number/formatBytes'; -import titleCase from 'Utilities/String/titleCase'; -import translate from 'Utilities/String/translate'; -import CategoryLabel from './CategoryLabel'; -import Peers from './Peers'; -import ReleaseLinks from './ReleaseLinks'; -import styles from './SearchIndexRow.css'; - -function getDownloadIcon(isGrabbing, isGrabbed, grabError) { - if (isGrabbing) { - return icons.SPINNER; - } else if (isGrabbed) { - return icons.DOWNLOADING; - } else if (grabError) { - return icons.DOWNLOADING; - } - - return icons.DOWNLOAD; -} - -function getDownloadKind(isGrabbed, grabError) { - if (isGrabbed) { - return kinds.SUCCESS; - } - - if (grabError) { - return kinds.DANGER; - } - - return kinds.DEFAULT; -} - -function getDownloadTooltip(isGrabbing, isGrabbed, grabError) { - if (isGrabbing) { - return ''; - } else if (isGrabbed) { - return translate('AddedToDownloadClient'); - } else if (grabError) { - return grabError; - } - - return translate('AddToDownloadClient'); -} - -class SearchIndexRow extends Component { - - // - // Lifecycle - - constructor(props, context) { - super(props, context); - - this.state = { - isConfirmGrabModalOpen: false - }; - } - - // - // Listeners - - onGrabPress = () => { - const { - guid, - indexerId, - onGrabPress - } = this.props; - - onGrabPress({ - guid, - indexerId - }); - }; - - onSavePress = () => { - const { - downloadUrl, - fileName, - onSavePress - } = this.props; - - onSavePress({ - downloadUrl, - fileName - }); - }; - - // - // Render - - render() { - const { - guid, - protocol, - downloadUrl, - magnetUrl, - categories, - age, - ageHours, - ageMinutes, - publishDate, - title, - infoUrl, - indexer, - size, - files, - grabs, - seeders, - leechers, - imdbId, - tmdbId, - tvdbId, - tvMazeId, - indexerFlags, - columns, - isGrabbing, - isGrabbed, - grabError, - longDateFormat, - timeFormat, - isSelected, - onSelectedChange - } = this.props; - - return ( - <> - { - columns.map((column) => { - const { - isVisible - } = column; - - if (!isVisible) { - return null; - } - - if (column.name === 'select') { - return ( - - ); - } - - if (column.name === 'protocol') { - return ( - - - - ); - } - - if (column.name === 'age') { - return ( - - {formatAge(age, ageHours, ageMinutes)} - - ); - } - - if (column.name === 'sortTitle') { - return ( - - -
- {title} -
- -
- ); - } - - if (column.name === 'indexer') { - return ( - - {indexer} - - ); - } - - if (column.name === 'size') { - return ( - - {formatBytes(size)} - - ); - } - - if (column.name === 'files') { - return ( - - {files} - - ); - } - - if (column.name === 'grabs') { - return ( - - {grabs} - - ); - } - - if (column.name === 'peers') { - return ( - - { - protocol === 'torrent' && - - } - - ); - } - - if (column.name === 'category') { - return ( - - - - ); - } - - if (column.name === 'indexerFlags') { - return ( - - { - !!indexerFlags.length && - - } - title={translate('IndexerFlags')} - body={ -
    - { - indexerFlags.map((flag, index) => { - return ( -
  • - {titleCase(flag)} -
  • - ); - }) - } -
- } - position={tooltipPositions.LEFT} - /> - } -
- ); - } - - if (column.name === 'actions') { - return ( - - - - { - downloadUrl ? - : - null - } - - { - magnetUrl ? - : - null - } - - { - imdbId || tmdbId || tvdbId || tvMazeId ? ( - - } - title={translate('Links')} - body={ - - } - kind={kinds.INVERSE} - position={tooltipPositions.TOP} - /> - ) : null - } - - ); - } - - return null; - }) - } - - ); - } -} - -SearchIndexRow.propTypes = { - guid: PropTypes.string.isRequired, - categories: PropTypes.arrayOf(PropTypes.object).isRequired, - protocol: PropTypes.string.isRequired, - age: PropTypes.number.isRequired, - ageHours: PropTypes.number.isRequired, - ageMinutes: PropTypes.number.isRequired, - publishDate: PropTypes.string.isRequired, - title: PropTypes.string.isRequired, - fileName: PropTypes.string.isRequired, - infoUrl: PropTypes.string.isRequired, - downloadUrl: PropTypes.string, - magnetUrl: PropTypes.string, - indexerId: PropTypes.number.isRequired, - indexer: PropTypes.string.isRequired, - size: PropTypes.number.isRequired, - files: PropTypes.number, - grabs: PropTypes.number, - seeders: PropTypes.number, - leechers: PropTypes.number, - imdbId: PropTypes.number, - tmdbId: PropTypes.number, - tvdbId: PropTypes.number, - tvMazeId: PropTypes.number, - indexerFlags: PropTypes.arrayOf(PropTypes.string).isRequired, - columns: PropTypes.arrayOf(PropTypes.object).isRequired, - onGrabPress: PropTypes.func.isRequired, - onSavePress: PropTypes.func.isRequired, - isGrabbing: PropTypes.bool.isRequired, - isGrabbed: PropTypes.bool.isRequired, - grabError: PropTypes.string, - longDateFormat: PropTypes.string.isRequired, - timeFormat: PropTypes.string.isRequired, - isSelected: PropTypes.bool, - onSelectedChange: PropTypes.func.isRequired -}; - -SearchIndexRow.defaultProps = { - isGrabbing: false, - isGrabbed: false -}; - -export default SearchIndexRow; diff --git a/frontend/src/Search/Table/SearchIndexRow.tsx b/frontend/src/Search/Table/SearchIndexRow.tsx new file mode 100644 index 000000000..daf8e4afb --- /dev/null +++ b/frontend/src/Search/Table/SearchIndexRow.tsx @@ -0,0 +1,395 @@ +import React, { useCallback, useState } from 'react'; +import { useSelector } from 'react-redux'; +import Icon from 'Components/Icon'; +import IconButton from 'Components/Link/IconButton'; +import Link from 'Components/Link/Link'; +import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; +import VirtualTableRowCell from 'Components/Table/Cells/VirtualTableRowCell'; +import VirtualTableSelectCell from 'Components/Table/Cells/VirtualTableSelectCell'; +import Column from 'Components/Table/Column'; +import Popover from 'Components/Tooltip/Popover'; +import DownloadProtocol from 'DownloadClient/DownloadProtocol'; +import { icons, kinds, tooltipPositions } from 'Helpers/Props'; +import ProtocolLabel from 'Indexer/Index/Table/ProtocolLabel'; +import { IndexerCategory } from 'Indexer/Indexer'; +import OverrideMatchModal from 'Search/OverrideMatch/OverrideMatchModal'; +import createEnabledDownloadClientsSelector from 'Store/Selectors/createEnabledDownloadClientsSelector'; +import { SelectStateInputProps } from 'typings/props'; +import formatDateTime from 'Utilities/Date/formatDateTime'; +import formatAge from 'Utilities/Number/formatAge'; +import formatBytes from 'Utilities/Number/formatBytes'; +import titleCase from 'Utilities/String/titleCase'; +import translate from 'Utilities/String/translate'; +import CategoryLabel from './CategoryLabel'; +import Peers from './Peers'; +import ReleaseLinks from './ReleaseLinks'; +import styles from './SearchIndexRow.css'; + +function getDownloadIcon( + isGrabbing: boolean, + isGrabbed: boolean, + grabError?: string +) { + if (isGrabbing) { + return icons.SPINNER; + } else if (isGrabbed) { + return icons.DOWNLOADING; + } else if (grabError) { + return icons.DOWNLOADING; + } + + return icons.DOWNLOAD; +} + +function getDownloadKind(isGrabbed: boolean, grabError?: string) { + if (isGrabbed) { + return kinds.SUCCESS; + } + + if (grabError) { + return kinds.DANGER; + } + + return kinds.DEFAULT; +} + +function getDownloadTooltip( + isGrabbing: boolean, + isGrabbed: boolean, + grabError?: string +) { + if (isGrabbing) { + return ''; + } else if (isGrabbed) { + return translate('AddedToDownloadClient'); + } else if (grabError) { + return grabError; + } + + return translate('AddToDownloadClient'); +} + +interface SearchIndexRowProps { + guid: string; + protocol: DownloadProtocol; + age: number; + ageHours: number; + ageMinutes: number; + publishDate: string; + title: string; + fileName: string; + infoUrl: string; + downloadUrl?: string; + magnetUrl?: string; + indexerId: number; + indexer: string; + categories: IndexerCategory[]; + size: number; + files?: number; + grabs?: number; + seeders?: number; + leechers?: number; + imdbId?: string; + tmdbId?: number; + tvdbId?: number; + tvMazeId?: number; + indexerFlags: string[]; + isGrabbing: boolean; + isGrabbed: boolean; + grabError?: string; + longDateFormat: string; + timeFormat: string; + columns: Column[]; + isSelected?: boolean; + onSelectedChange(result: SelectStateInputProps): void; + onGrabPress(...args: unknown[]): void; + onSavePress(...args: unknown[]): void; +} + +function SearchIndexRow(props: SearchIndexRowProps) { + const { + guid, + indexerId, + protocol, + categories, + age, + ageHours, + ageMinutes, + publishDate, + title, + fileName, + infoUrl, + downloadUrl, + magnetUrl, + indexer, + size, + files, + grabs, + seeders, + leechers, + imdbId, + tmdbId, + tvdbId, + tvMazeId, + indexerFlags = [], + isGrabbing = false, + isGrabbed = false, + grabError, + longDateFormat, + timeFormat, + columns, + isSelected, + onSelectedChange, + onGrabPress, + onSavePress, + } = props; + + const [isOverrideModalOpen, setIsOverrideModalOpen] = useState(false); + + const { items: downloadClients } = useSelector( + createEnabledDownloadClientsSelector(protocol) + ); + + const onGrabPressWrapper = useCallback(() => { + onGrabPress({ + guid, + indexerId, + }); + }, [guid, indexerId, onGrabPress]); + + const onSavePressWrapper = useCallback(() => { + onSavePress({ + downloadUrl, + fileName, + }); + }, [downloadUrl, fileName, onSavePress]); + + const onOverridePress = useCallback(() => { + setIsOverrideModalOpen(true); + }, [setIsOverrideModalOpen]); + + const onOverrideModalClose = useCallback(() => { + setIsOverrideModalOpen(false); + }, [setIsOverrideModalOpen]); + + return ( + <> + {columns.map((column) => { + const { name, isVisible } = column; + + if (!isVisible) { + return null; + } + + if (name === 'select') { + return ( + + ); + } + + if (name === 'protocol') { + return ( + + + + ); + } + + if (name === 'age') { + return ( + + {formatAge(age, ageHours, ageMinutes)} + + ); + } + + if (name === 'sortTitle') { + return ( + + +
{title}
+ +
+ ); + } + + if (name === 'indexer') { + return ( + + {indexer} + + ); + } + + if (name === 'size') { + return ( + + {formatBytes(size)} + + ); + } + + if (name === 'files') { + return ( + + {files} + + ); + } + + if (name === 'grabs') { + return ( + + {grabs} + + ); + } + + if (name === 'peers') { + return ( + + {protocol === 'torrent' && ( + + )} + + ); + } + + if (name === 'category') { + return ( + + + + ); + } + + if (name === 'indexerFlags') { + return ( + + {!!indexerFlags.length && ( + } + title={translate('IndexerFlags')} + body={ +
    + {indexerFlags.map((flag, index) => { + return
  • {titleCase(flag)}
  • ; + })} +
+ } + position={tooltipPositions.LEFT} + /> + )} +
+ ); + } + + if (name === 'actions') { + return ( + + + + {downloadClients.length > 1 ? ( + +
+ + + +
+ + ) : null} + + {downloadUrl ? ( + + ) : null} + + {magnetUrl ? ( + + ) : null} + + {imdbId || tmdbId || tvdbId || tvMazeId ? ( + + } + title={translate('Links')} + body={ + + } + position={tooltipPositions.TOP} + /> + ) : null} +
+ ); + } + + return null; + })} + + + + ); +} + +export default SearchIndexRow; diff --git a/frontend/src/Store/Selectors/createEnabledDownloadClientsSelector.ts b/frontend/src/Store/Selectors/createEnabledDownloadClientsSelector.ts new file mode 100644 index 000000000..ac31e5210 --- /dev/null +++ b/frontend/src/Store/Selectors/createEnabledDownloadClientsSelector.ts @@ -0,0 +1,22 @@ +import { createSelector } from 'reselect'; +import { DownloadClientAppState } from 'App/State/SettingsAppState'; +import DownloadProtocol from 'DownloadClient/DownloadProtocol'; +import createSortedSectionSelector from 'Store/Selectors/createSortedSectionSelector'; +import sortByName from 'Utilities/Array/sortByName'; + +export default function createEnabledDownloadClientsSelector( + protocol: DownloadProtocol +) { + return createSelector( + createSortedSectionSelector('settings.downloadClients', sortByName), + (downloadClients: DownloadClientAppState) => { + const { isFetching, isPopulated, error, items } = downloadClients; + + const clients = items.filter( + (item) => item.protocol === protocol && item.enable + ); + + return { isFetching, isPopulated, error, items: clients }; + } + ); +} diff --git a/frontend/src/Utilities/Number/formatBytes.js b/frontend/src/Utilities/Number/formatBytes.js index 2fb3eebe6..d4d389357 100644 --- a/frontend/src/Utilities/Number/formatBytes.js +++ b/frontend/src/Utilities/Number/formatBytes.js @@ -7,10 +7,10 @@ function formatBytes(input) { return ''; } - return filesize(size, { + return `${filesize(size, { base: 2, round: 1 - }); + })}`; } export default formatBytes; diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 0fe36c444..794f46c20 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -143,6 +143,7 @@ "DatabaseMigration": "Database Migration", "Date": "Date", "Dates": "Dates", + "Default": "Default", "DefaultCategory": "Default Category", "DefaultNameCopiedProfile": "{name} - Copy", "Delete": "Delete", @@ -286,6 +287,7 @@ "GeneralSettingsSummary": "Port, SSL, username/password, proxy, analytics, and updates", "Genre": "Genre", "GoToApplication": "Go to application", + "GrabRelease": "Grab Release", "GrabReleases": "Grab Release(s)", "GrabTitle": "Grab Title", "Grabbed": "Grabbed", @@ -448,6 +450,7 @@ "ManageClients": "Manage Clients", "ManageDownloadClients": "Manage Download Clients", "Manual": "Manual", + "ManualGrab": "Manual Grab", "MappedCategories": "Mapped Categories", "MappedDrivesRunningAsService": "Mapped network drives are not available when running as a Windows Service. Please see the FAQ for more information", "MassEditor": "Mass Editor", @@ -508,9 +511,12 @@ "OnHealthIssueHelpText": "On Health Issue", "OnHealthRestored": "On Health Restored", "OnHealthRestoredHelpText": "On Health Restored", + "Open": "Open", "OpenBrowserOnStart": "Open browser on start", "OpenThisModal": "Open This Modal", "Options": "Options", + "OverrideAndAddToDownloadClient": "Override and add to download client", + "OverrideGrabModalTitle": "Override and Grab - {title}", "PackSeedTime": "Pack Seed Time", "PackSeedTimeHelpText": "The time a pack (season or discography) torrent should be seeded before stopping, empty is app's default", "PackageVersion": "Package Version", @@ -527,6 +533,7 @@ "PortNumber": "Port Number", "Presets": "Presets", "Priority": "Priority", + "PrioritySettings": "Priority: {priority}", "Privacy": "Privacy", "Private": "Private", "Protocol": "Protocol", @@ -612,6 +619,7 @@ "SeedTimeHelpText": "The time a torrent should be seeded before stopping, empty is app's default", "Seeders": "Seeders", "SelectAll": "Select All", + "SelectDownloadClientModalTitle": "{modalTitle} - Select Download Client", "SelectIndexers": "Select Indexers", "SelectedCountOfCountReleases": "Selected {selectedCount} of {itemCount} releases", "SemiPrivate": "Semi-Private", diff --git a/src/Prowlarr.Api.V1/Search/ReleaseResource.cs b/src/Prowlarr.Api.V1/Search/ReleaseResource.cs index 77f68ca16..50cf66bd1 100644 --- a/src/Prowlarr.Api.V1/Search/ReleaseResource.cs +++ b/src/Prowlarr.Api.V1/Search/ReleaseResource.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.Json.Serialization; using NzbDrone.Core.Indexers; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; @@ -55,6 +56,9 @@ namespace Prowlarr.Api.V1.Search return $"{Title}{extension}"; } } + + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] + public int? DownloadClientId { get; set; } } public static class ReleaseResourceMapper diff --git a/src/Prowlarr.Api.V1/Search/SearchController.cs b/src/Prowlarr.Api.V1/Search/SearchController.cs index 5ded6865b..c73ae00f3 100644 --- a/src/Prowlarr.Api.V1/Search/SearchController.cs +++ b/src/Prowlarr.Api.V1/Search/SearchController.cs @@ -74,7 +74,7 @@ namespace Prowlarr.Api.V1.Search try { - await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null); + await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, release.DownloadClientId); } catch (ReleaseDownloadException ex) { From 9561371a47f118bd161652a9243a51fb4ba23667 Mon Sep 17 00:00:00 2001 From: Servarr Date: Wed, 8 May 2024 00:20:03 +0000 Subject: [PATCH 592/964] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index fac0ac6f4..421c00356 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -5919,6 +5919,11 @@ "type": "string", "nullable": true, "readOnly": true + }, + "downloadClientId": { + "type": "integer", + "format": "int32", + "nullable": true } }, "additionalProperties": false From 076a4f2574a4bd83665182933340505080e45b77 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 9 May 2024 23:14:26 +0300 Subject: [PATCH 593/964] Fix class name for AppIndexerMapRepository --- src/NzbDrone.Core/Applications/AppIndexerMapRepository.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Applications/AppIndexerMapRepository.cs b/src/NzbDrone.Core/Applications/AppIndexerMapRepository.cs index ff966b196..349e50622 100644 --- a/src/NzbDrone.Core/Applications/AppIndexerMapRepository.cs +++ b/src/NzbDrone.Core/Applications/AppIndexerMapRepository.cs @@ -10,9 +10,9 @@ namespace NzbDrone.Core.Applications void DeleteAllForApp(int appId); } - public class TagRepository : BasicRepository, IAppIndexerMapRepository + public class AppIndexerMapRepository : BasicRepository, IAppIndexerMapRepository { - public TagRepository(IMainDatabase database, IEventAggregator eventAggregator) + public AppIndexerMapRepository(IMainDatabase database, IEventAggregator eventAggregator) : base(database, eventAggregator) { } From 596efe8fb0f99a4ece555c0f3ce6e5b44ba883ca Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 3 May 2024 20:53:03 -0700 Subject: [PATCH 594/964] New: Dark theme for login screen (cherry picked from commit cae134ec7b331d1c906343716472f3d043614b2c) --- frontend/src/App/App.js | 9 +- frontend/src/App/ApplyTheme.js | 50 ---------- frontend/src/App/ApplyTheme.tsx | 37 ++++++++ frontend/src/Styles/Themes/dark.js | 6 +- frontend/src/Styles/Themes/index.js | 2 +- frontend/src/Styles/Themes/light.js | 6 +- frontend/src/login.html | 93 +++++++++++++++---- frontend/src/typings/UiSettings.ts | 1 + .../Frontend/Mappers/HtmlMapperBase.cs | 2 +- .../Frontend/Mappers/LoginHtmlMapper.cs | 13 +++ 10 files changed, 137 insertions(+), 82 deletions(-) delete mode 100644 frontend/src/App/ApplyTheme.js create mode 100644 frontend/src/App/ApplyTheme.tsx diff --git a/frontend/src/App/App.js b/frontend/src/App/App.js index 1eea6e082..eea9b7d38 100644 --- a/frontend/src/App/App.js +++ b/frontend/src/App/App.js @@ -12,11 +12,10 @@ function App({ store, history }) { - - - - - + + + + diff --git a/frontend/src/App/ApplyTheme.js b/frontend/src/App/ApplyTheme.js deleted file mode 100644 index bd4d6a6c8..000000000 --- a/frontend/src/App/ApplyTheme.js +++ /dev/null @@ -1,50 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Fragment, useCallback, useEffect } from 'react'; -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import themes from 'Styles/Themes'; - -function createMapStateToProps() { - return createSelector( - (state) => state.settings.ui.item.theme || window.Prowlarr.theme, - ( - theme - ) => { - return { - theme - }; - } - ); -} - -function ApplyTheme({ theme, children }) { - // Update the CSS Variables - - const updateCSSVariables = useCallback(() => { - const arrayOfVariableKeys = Object.keys(themes[theme]); - const arrayOfVariableValues = Object.values(themes[theme]); - - // Loop through each array key and set the CSS Variables - arrayOfVariableKeys.forEach((cssVariableKey, index) => { - // Based on our snippet from MDN - document.documentElement.style.setProperty( - `--${cssVariableKey}`, - arrayOfVariableValues[index] - ); - }); - }, [theme]); - - // On Component Mount and Component Update - useEffect(() => { - updateCSSVariables(theme); - }, [updateCSSVariables, theme]); - - return {children}; -} - -ApplyTheme.propTypes = { - theme: PropTypes.string.isRequired, - children: PropTypes.object.isRequired -}; - -export default connect(createMapStateToProps)(ApplyTheme); diff --git a/frontend/src/App/ApplyTheme.tsx b/frontend/src/App/ApplyTheme.tsx new file mode 100644 index 000000000..392c49049 --- /dev/null +++ b/frontend/src/App/ApplyTheme.tsx @@ -0,0 +1,37 @@ +import React, { Fragment, ReactNode, useCallback, useEffect } from 'react'; +import { useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import themes from 'Styles/Themes'; +import AppState from './State/AppState'; + +interface ApplyThemeProps { + children: ReactNode; +} + +function createThemeSelector() { + return createSelector( + (state: AppState) => state.settings.ui.item.theme || window.Prowlarr.theme, + (theme) => { + return theme; + } + ); +} + +function ApplyTheme({ children }: ApplyThemeProps) { + const theme = useSelector(createThemeSelector()); + + const updateCSSVariables = useCallback(() => { + Object.entries(themes[theme]).forEach(([key, value]) => { + document.documentElement.style.setProperty(`--${key}`, value); + }); + }, [theme]); + + // On Component Mount and Component Update + useEffect(() => { + updateCSSVariables(); + }, [updateCSSVariables, theme]); + + return {children}; +} + +export default ApplyTheme; diff --git a/frontend/src/Styles/Themes/dark.js b/frontend/src/Styles/Themes/dark.js index 79911686f..a7cbb6de0 100644 --- a/frontend/src/Styles/Themes/dark.js +++ b/frontend/src/Styles/Themes/dark.js @@ -188,7 +188,7 @@ module.exports = { // Charts chartBackgroundColor: '#262626', - failedColors: ['#ffbeb2', '#feb4a6', '#fdab9b', '#fca290', '#fb9984', '#fa8f79', '#f9856e', '#f77b66', '#f5715d', '#f36754', '#f05c4d', '#ec5049', '#e74545', '#e13b42', '#da323f', '#d3293d', '#ca223c', '#c11a3b', '#b8163a', '#ae123a'], - chartColorsDiversified: ['#90caf9', '#f4d166', '#ff8a65', '#ce93d8', '#80cba9', '#ffab91', '#8097ea', '#bcaaa4', '#a57583', '#e4e498', '#9e96af', '#c6ab81', '#6972c6', '#619fc6', '#81ad81', '#f48fb1', '#82afca', '#b5b071', '#8b959b', '#7ec0b4'], - chartColors: ['#f4d166', '#f6c760', '#f8bc58', '#f8b252', '#f7a84a', '#f69e41', '#f49538', '#f38b2f', '#f28026', '#f0751e', '#eb6c1c', '#e4641e', '#de5d1f', '#d75521', '#cf4f22', '#c64a22', '#bc4623', '#b24223', '#a83e24', '#9e3a26'] + failedColors: ['#ffbeb2', '#feb4a6', '#fdab9b', '#fca290', '#fb9984', '#fa8f79', '#f9856e', '#f77b66', '#f5715d', '#f36754', '#f05c4d', '#ec5049', '#e74545', '#e13b42', '#da323f', '#d3293d', '#ca223c', '#c11a3b', '#b8163a', '#ae123a'].join(','), + chartColorsDiversified: ['#90caf9', '#f4d166', '#ff8a65', '#ce93d8', '#80cba9', '#ffab91', '#8097ea', '#bcaaa4', '#a57583', '#e4e498', '#9e96af', '#c6ab81', '#6972c6', '#619fc6', '#81ad81', '#f48fb1', '#82afca', '#b5b071', '#8b959b', '#7ec0b4'].join(','), + chartColors: ['#f4d166', '#f6c760', '#f8bc58', '#f8b252', '#f7a84a', '#f69e41', '#f49538', '#f38b2f', '#f28026', '#f0751e', '#eb6c1c', '#e4641e', '#de5d1f', '#d75521', '#cf4f22', '#c64a22', '#bc4623', '#b24223', '#a83e24', '#9e3a26'].join(',') }; diff --git a/frontend/src/Styles/Themes/index.js b/frontend/src/Styles/Themes/index.js index d93c5dd8c..4dec39164 100644 --- a/frontend/src/Styles/Themes/index.js +++ b/frontend/src/Styles/Themes/index.js @@ -2,7 +2,7 @@ import * as dark from './dark'; import * as light from './light'; const defaultDark = window.matchMedia('(prefers-color-scheme: dark)').matches; -const auto = defaultDark ? { ...dark } : { ...light }; +const auto = defaultDark ? dark : light; export default { auto, diff --git a/frontend/src/Styles/Themes/light.js b/frontend/src/Styles/Themes/light.js index 8a6d123b2..f88070a0f 100644 --- a/frontend/src/Styles/Themes/light.js +++ b/frontend/src/Styles/Themes/light.js @@ -188,7 +188,7 @@ module.exports = { // Charts chartBackgroundColor: '#fff', - failedColors: ['#ffbeb2', '#feb4a6', '#fdab9b', '#fca290', '#fb9984', '#fa8f79', '#f9856e', '#f77b66', '#f5715d', '#f36754', '#f05c4d', '#ec5049', '#e74545', '#e13b42', '#da323f', '#d3293d', '#ca223c', '#c11a3b', '#b8163a', '#ae123a'], - chartColorsDiversified: ['#90caf9', '#f4d166', '#ff8a65', '#ce93d8', '#80cba9', '#ffab91', '#8097ea', '#bcaaa4', '#a57583', '#e4e498', '#9e96af', '#c6ab81', '#6972c6', '#619fc6', '#81ad81', '#f48fb1', '#82afca', '#b5b071', '#8b959b', '#7ec0b4'], - chartColors: ['#f4d166', '#f6c760', '#f8bc58', '#f8b252', '#f7a84a', '#f69e41', '#f49538', '#f38b2f', '#f28026', '#f0751e', '#eb6c1c', '#e4641e', '#de5d1f', '#d75521', '#cf4f22', '#c64a22', '#bc4623', '#b24223', '#a83e24', '#9e3a26'] + failedColors: ['#ffbeb2', '#feb4a6', '#fdab9b', '#fca290', '#fb9984', '#fa8f79', '#f9856e', '#f77b66', '#f5715d', '#f36754', '#f05c4d', '#ec5049', '#e74545', '#e13b42', '#da323f', '#d3293d', '#ca223c', '#c11a3b', '#b8163a', '#ae123a'].join(','), + chartColorsDiversified: ['#90caf9', '#f4d166', '#ff8a65', '#ce93d8', '#80cba9', '#ffab91', '#8097ea', '#bcaaa4', '#a57583', '#e4e498', '#9e96af', '#c6ab81', '#6972c6', '#619fc6', '#81ad81', '#f48fb1', '#82afca', '#b5b071', '#8b959b', '#7ec0b4'].join(','), + chartColors: ['#f4d166', '#f6c760', '#f8bc58', '#f8b252', '#f7a84a', '#f69e41', '#f49538', '#f38b2f', '#f28026', '#f0751e', '#eb6c1c', '#e4641e', '#de5d1f', '#d75521', '#cf4f22', '#c64a22', '#bc4623', '#b24223', '#a83e24', '#9e3a26'].join(',') }; diff --git a/frontend/src/login.html b/frontend/src/login.html index c3773b641..54535dc5d 100644 --- a/frontend/src/login.html +++ b/frontend/src/login.html @@ -57,8 +57,8 @@