1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-06 19:39:55 -04:00

Compare commits

...

38 Commits

Author SHA1 Message Date
Bogdan
957be99401 Fixed: Bump media info revision for DV HDR10Plus 2023-12-16 02:41:34 +02:00
Bogdan
4bcde25e29 Improve messaging for accepted Custom Formats scoring upgrades
Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>

Closes #9496
2023-12-16 00:38:05 +02:00
Bogdan
1d70f36e7d New: 3D and HDR metadata for Trakt connection 2023-12-15 17:13:47 +02:00
Bogdan
cc0a448bc8 New: Rate limiting for Trakt connection 2023-12-15 17:13:47 +02:00
Bogdan
c9e977baea Simplify mapping in Trakt connection 2023-12-15 17:13:47 +02:00
Mark McDowall
6cb9a46cd4 Fixed: Imported movies updating on Calendar
(cherry picked from commit 5a3bc49392b700650a34536ff3794bce614f64a4)

Closes #9491
2023-12-15 16:50:06 +02:00
Agneev Mukherjee
eef379277a Enable browser navigation buttons for PWA
(cherry picked from commit da9a60691f363323565a293ed9eaeb6349ceccb6)

Closes #9487
2023-12-15 16:36:28 +02:00
Chad A Simmons
41fef47684 New: Support for DV HDR10Plus from media info 2023-12-15 03:36:32 +02:00
Weblate
fcda6faf3d Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: ROSERAT Ugo <roserat.ugo@gmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: SHUAI.W <x@ousui.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/lv/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2023-12-13 16:41:49 +02:00
Bogdan
79bbf9c50b Fixed: Movie status label in add movie search results 2023-12-12 21:55:41 +02:00
Bogdan
43d2f2804b New: IMDb ratings and genres in add movie search results 2023-12-12 21:55:09 +02:00
Qstick
fa62f3f66a Fixed: Correctly handle Migration when PG Host has ".db"
(cherry picked from commit 97ee24507f4306e3b62c3d00cd3ade6a09d1b957)

Closes #9478
2023-12-12 15:36:21 +02:00
Bogdan
229d91fe40 Implement DatabaseConnectionInfo
Co-authored-by: Qstick <qstick@gmail.com>
2023-12-12 15:36:14 +02:00
Bogdan
2673d1eee4 Fixed: Movie poster in search results after adding
Fixes #8029
2023-12-11 19:30:31 +02:00
Bogdan
e59fd1118f Fixed: Downloading status post-adding movie 2023-12-11 19:27:05 +02:00
Bogdan
c1fd33b152 Fix categories for NZBFinder 2023-12-10 15:50:19 +02:00
Bogdan
2f58c8676f Bump dotnet to 6.0.25 2023-12-10 15:35:59 +02:00
Fossil
defc448304 Update NZBFinder categories and remove OZnzb & NZB-Tortuga from default definitions (#9474)
NZB Finder will consolidate WEBDL & X265 into SD,HD,UHD so removed 2080 and 2090 categories.

OZnzb and NZB Tortuga are dead so removed it from the presets list.
2023-12-10 15:14:13 +02:00
Bogdan
3ec3358728 Bump version to 5.2.5 2023-12-10 13:47:06 +02:00
Weblate
d4072cdfe2 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Jurriaan Den Toonder <jur.den.toonder@gmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/uk/
Translation: Servarr/Radarr
2023-12-08 18:00:35 +02:00
Weblate
136a030c07 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Hajiroxx <luypanda@163.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2023-12-08 16:03:26 +02:00
Weblate
6d89ae89a4 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Augusto Poletti <augustpolet@gmail.com>
Co-authored-by: Dominika Matějková <dominika.matejkova@outlook.cz>
Co-authored-by: VisoTC <szlytlyt@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: 米大饭 <1246333567@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2023-12-06 16:01:05 +02:00
Servarr
98e4273b7a Automated API Docs update 2023-12-06 16:00:42 +02:00
Bogdan
ecf9983ea6 Fix minimum availability label in movie table row 2023-12-06 14:35:55 +02:00
Bogdan
a059a700eb New: Minimum Availability in bulk manage import lists
Fixes #9461
2023-12-06 14:35:20 +02:00
Taloth Saldono
ced624c2ff Small helper in UI to access Radarr API more easily
(cherry picked from commit 090cdc364ef335fbfea8cf540696af813f6ecea4)
2023-12-06 13:16:02 +02:00
Bogdan
7c32061e17 Add existing flag for Discover Movie Posters 2023-12-06 13:12:49 +02:00
Bogdan
bc4847cdc7 New: Improve fields selection for Discord connection 2023-12-06 11:03:57 +02:00
Bogdan
65d79dd078 Fixed: Progress bar for collection movies in queue 2023-12-04 13:17:29 +02:00
Bogdan
238ddbbe1f Fixed: Improve Required Flags selection for indexers 2023-12-04 12:53:33 +02:00
Bogdan
3f444406da Fixed: (PassThePopcorn) Support for half leech releases 2023-12-04 12:34:22 +02:00
Bogdan
d7aaa1cdc2 Fixed: Cleanup orphaned movies 2023-12-03 22:02:56 +02:00
Mark McDowall
263534717d Always validate Custom Script path
(cherry picked from commit c922cc5dc617dd776d4523cbf62376821c5a4ad9)
2023-12-03 20:03:07 +02:00
Weblate
073d15160d Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: David Molero <contact@dolvem.com>
Co-authored-by: Patatra <patrice.chevreau@gmail.com>
Co-authored-by: Zalhera <tobias.bechen@gmail.com>
Co-authored-by: liimee <git.taaa@fedora.email>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/id/
Translation: Servarr/Radarr
2023-12-01 04:03:43 +02:00
Stevie Robinson
c5075e5d49 Fixed Custom Format Deletion confirmation message
(cherry picked from commit b76bf373717edff8e475fde31fbaec86c65903fe)

Closes #9410
2023-11-26 08:43:02 +02:00
Weblate
fc345047ee Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Appoxo <appoxo@appoxo.de>
Co-authored-by: Charlie <zola@zipmail.pw>
Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translation: Servarr/Radarr
2023-11-26 08:28:12 +02:00
Weblate
bffab87da7 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translation: Servarr/Radarr
2023-11-26 08:26:37 +02:00
Bogdan
a8a9d3b833 Bump version to 5.2.4 2023-11-26 07:05:58 +02:00
95 changed files with 959 additions and 392 deletions

View File

@@ -9,13 +9,13 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '5.2.3'
majorVersion: '5.2.5'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
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'

View File

@@ -85,8 +85,13 @@
margin-top: 20px;
}
.studio,
.genres {
margin-left: 5px;
}
.links {
margin-left: 8px;
margin-left: 5px;
pointer-events: all;
}

View File

@@ -5,6 +5,7 @@ interface CssExports {
'certification': string;
'content': string;
'exclusionIcon': string;
'genres': string;
'icons': string;
'links': string;
'overlay': string;
@@ -14,6 +15,7 @@ interface CssExports {
'runtime': string;
'searchResult': string;
'statusContainer': string;
'studio': string;
'title': string;
'titleContainer': string;
'titleRow': string;

View File

@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Icon from 'Components/Icon';
import ImdbRating from 'Components/ImdbRating';
import Label from 'Components/Label';
import Link from 'Components/Link/Link';
import TmdbRating from 'Components/TmdbRating';
@@ -61,6 +62,7 @@ class AddNewMovieSearchResult extends Component {
titleSlug,
year,
studio,
genres,
status,
overview,
ratings,
@@ -76,6 +78,7 @@ class AddNewMovieSearchResult extends Component {
hasFile,
isAvailable,
movieFile,
queueItem,
runtime,
movieRuntimeFormat,
certification
@@ -197,13 +200,46 @@ class AddNewMovieSearchResult extends Component {
/>
</Label>
{
ratings.imdb ?
<Label size={sizes.LARGE}>
<ImdbRating
ratings={ratings}
iconSize={13}
/>
</Label> :
null
}
{
!!studio &&
<Label size={sizes.LARGE}>
{studio}
<Icon
name={icons.STUDIO}
size={13}
/>
<span className={styles.studio}>
{studio}
</span>
</Label>
}
{
genres.length > 0 ?
<Label size={sizes.LARGE}>
<Icon
name={icons.GENRE}
size={13}
/>
<span className={styles.genres}>
{genres.slice(0, 3).join(', ')}
</span>
</Label> :
null
}
<Tooltip
anchor={
<Label
@@ -215,15 +251,15 @@ class AddNewMovieSearchResult extends Component {
/>
<span className={styles.links}>
Links
{translate('Links')}
</span>
</Label>
}
tooltip={
<MovieDetailsLinks
tmdbId={tmdbId}
youTubeTrailerId={youTubeTrailerId}
imdbId={imdbId}
youTubeTrailerId={youTubeTrailerId}
/>
}
canFlip={true}
@@ -237,6 +273,7 @@ class AddNewMovieSearchResult extends Component {
hasMovieFiles={hasFile}
monitored={monitored}
isAvailable={isAvailable}
queueItem={queueItem}
id={id}
useLabel={true}
colorImpairedMode={colorImpairedMode}
@@ -273,6 +310,7 @@ AddNewMovieSearchResult.propTypes = {
titleSlug: PropTypes.string.isRequired,
year: PropTypes.number.isRequired,
studio: PropTypes.string,
genres: PropTypes.arrayOf(PropTypes.string),
status: PropTypes.string.isRequired,
overview: PropTypes.string,
ratings: PropTypes.object.isRequired,
@@ -283,15 +321,19 @@ AddNewMovieSearchResult.propTypes = {
isExclusionMovie: PropTypes.bool.isRequired,
isSmallScreen: PropTypes.bool.isRequired,
id: PropTypes.number,
queueItems: PropTypes.arrayOf(PropTypes.object),
monitored: PropTypes.bool.isRequired,
hasFile: PropTypes.bool.isRequired,
isAvailable: PropTypes.bool.isRequired,
movieFile: PropTypes.object,
queueItem: PropTypes.object,
colorImpairedMode: PropTypes.bool,
runtime: PropTypes.number.isRequired,
movieRuntimeFormat: PropTypes.string.isRequired,
certification: PropTypes.string
};
AddNewMovieSearchResult.defaultProps = {
genres: []
};
export default AddNewMovieSearchResult;

View File

@@ -10,14 +10,18 @@ function createMapStateToProps() {
createExistingMovieSelector(),
createExclusionMovieSelector(),
createDimensionsSelector(),
(state) => state.queue.details.items,
(state, { internalId }) => internalId,
(state) => state.settings.ui.item.movieRuntimeFormat,
(isExistingMovie, isExclusionMovie, dimensions, internalId, movieRuntimeFormat) => {
(isExistingMovie, isExclusionMovie, dimensions, queueItems, internalId, movieRuntimeFormat) => {
const queueItem = queueItems.find((item) => internalId > 0 && item.movieId === internalId);
return {
existingMovieId: internalId,
isExistingMovie,
isExclusionMovie,
isSmallScreen: dimensions.isSmallScreen,
queueItem,
movieRuntimeFormat
};
}

View File

@@ -55,7 +55,7 @@ class CalendarConnector extends Component {
gotoCalendarToday
} = this.props;
registerPagePopulator(this.repopulate);
registerPagePopulator(this.repopulate, ['movieFileUpdated', 'movieFileDeleted']);
if (useCurrentPage) {
fetchCalendar();

View File

@@ -6,6 +6,7 @@ import * as commandNames from 'Commands/commandNames';
import withScrollPosition from 'Components/withScrollPosition';
import { executeCommand } from 'Store/Actions/commandActions';
import { saveMovieCollections, setMovieCollectionsFilter, setMovieCollectionsSort } from 'Store/Actions/movieCollectionActions';
import { clearQueueDetails, fetchQueueDetails } from 'Store/Actions/queueActions';
import { fetchRootFolders } from 'Store/Actions/rootFolderActions';
import scrollPositions from 'Store/scrollPositions';
import createCollectionClientSideCollectionItemsSelector from 'Store/Selectors/createCollectionClientSideCollectionItemsSelector';
@@ -38,6 +39,12 @@ function createMapDispatchToProps(dispatch, props) {
dispatchFetchRootFolders() {
dispatch(fetchRootFolders());
},
dispatchFetchQueueDetails() {
dispatch(fetchQueueDetails());
},
dispatchClearQueueDetails() {
dispatch(clearQueueDetails());
},
onUpdateSelectedPress(payload) {
dispatch(saveMovieCollections(payload));
},
@@ -63,10 +70,12 @@ class CollectionConnector extends Component {
componentDidMount() {
registerPagePopulator(this.repopulate);
this.props.dispatchFetchRootFolders();
this.props.dispatchFetchQueueDetails();
}
componentWillUnmount() {
unregisterPagePopulator(this.repopulate);
this.props.dispatchClearQueueDetails();
}
//
@@ -99,7 +108,9 @@ CollectionConnector.propTypes = {
isSmallScreen: PropTypes.bool.isRequired,
view: PropTypes.string.isRequired,
onUpdateSelectedPress: PropTypes.func.isRequired,
dispatchFetchRootFolders: PropTypes.func.isRequired
dispatchFetchRootFolders: PropTypes.func.isRequired,
dispatchFetchQueueDetails: PropTypes.func.isRequired,
dispatchClearQueueDetails: PropTypes.func.isRequired
};
export default withScrollPosition(

View File

@@ -70,6 +70,7 @@ class CollectionMovie extends Component {
hasFile,
folder,
isAvailable,
movieFile,
isExistingMovie,
posterWidth,
posterHeight,
@@ -131,6 +132,8 @@ class CollectionMovie extends Component {
id ?
<div className={styles.overlayStatus}>
<MovieIndexProgressBar
movieId={id}
movieFile={movieFile}
monitored={monitored}
hasFile={hasFile}
status={status}
@@ -180,6 +183,7 @@ CollectionMovie.propTypes = {
hasFile: PropTypes.bool,
folder: PropTypes.string,
isAvailable: PropTypes.bool,
movieFile: PropTypes.object,
images: PropTypes.arrayOf(PropTypes.object).isRequired,
posterWidth: PropTypes.number.isRequired,
posterHeight: PropTypes.number.isRequired,

View File

@@ -187,6 +187,8 @@ class SignalRConnector extends Component {
repopulatePage('movieFileUpdated');
} else if (body.action === 'deleted') {
this.props.dispatchRemoveItem({ section, id: body.resource.id });
repopulatePage('movieFileDeleted');
}
};

View File

@@ -15,5 +15,5 @@
"start_url": "../../../../",
"theme_color": "#3a3f51",
"background_color": "#3a3f51",
"display": "standalone"
"display": "minimal-ui"
}

View File

@@ -0,0 +1,120 @@
import createAjaxRequest from 'Utilities/createAjaxRequest';
// This file contains some helpers for power users in a browser console
let hasWarned = false;
function checkActivationWarning() {
if (!hasWarned) {
console.log('Activated RadarrApi console helpers.');
console.warn('Be warned: There will be no further confirmation checks.');
hasWarned = true;
}
}
function attachAsyncActions(promise) {
promise.filter = function() {
const args = arguments;
const res = this.then((d) => d.filter(...args));
attachAsyncActions(res);
return res;
};
promise.map = function() {
const args = arguments;
const res = this.then((d) => d.map(...args));
attachAsyncActions(res);
return res;
};
promise.all = function() {
const res = this.then((d) => Promise.all(d));
attachAsyncActions(res);
return res;
};
promise.forEach = function(action) {
const res = this.then((d) => Promise.all(d.map(action)));
attachAsyncActions(res);
return res;
};
}
class ResourceApi {
constructor(api, url) {
this.api = api;
this.url = url;
}
single(id) {
return this.api.fetch(`${this.url}/${id}`);
}
all() {
return this.api.fetch(this.url);
}
filter(pred) {
return this.all().filter(pred);
}
update(resource) {
return this.api.fetch(`${this.url}/${resource.id}`, { method: 'PUT', data: resource });
}
delete(resource) {
if (typeof resource === 'object' && resource !== null && resource.id) {
resource = resource.id;
}
if (!resource || !Number.isInteger(resource)) {
throw Error('Invalid resource', resource);
}
return this.api.fetch(`${this.url}/${resource}`, { method: 'DELETE' });
}
fetch(url, options) {
return this.api.fetch(`${this.url}${url}`, options);
}
}
class ConsoleApi {
constructor() {
this.movie = new ResourceApi(this, '/movie');
}
resource(url) {
return new ResourceApi(this, url);
}
fetch(url, options) {
checkActivationWarning();
options = options || {};
const req = {
url,
method: options.method || 'GET'
};
if (options.data) {
req.dataType = 'json';
req.data = JSON.stringify(options.data);
}
const promise = createAjaxRequest(req).request;
promise.fail((xhr) => {
console.error(`Failed to fetch ${url}`, xhr);
});
attachAsyncActions(promise);
return promise;
}
}
window.RadarrApi = new ConsoleApi();
export default ConsoleApi;

View File

@@ -68,6 +68,19 @@ $hoverScale: 1.05;
color: var(--white);
}
.existing {
position: absolute;
top: 0;
left: 0;
z-index: 1;
width: 0;
height: 0;
border-width: 25px 25px 0 0;
border-style: solid;
border-color: #37bc9b transparent transparent;
color: var(--white);
}
.controls {
position: absolute;
bottom: 10px;

View File

@@ -7,6 +7,7 @@ interface CssExports {
'controls': string;
'editorSelect': string;
'excluded': string;
'existing': string;
'externalLinks': string;
'link': string;
'overlayTitle': string;

View File

@@ -159,6 +159,14 @@ class DiscoverMoviePoster extends Component {
/>
}
{
isExisting &&
<div
className={styles.existing}
title={translate('Existing')}
/>
}
<Link
className={styles.link}
style={elementStyle}

View File

@@ -26,7 +26,7 @@ import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
import { SelectStateInputProps } from 'typings/props';
import formatRuntime from 'Utilities/Date/formatRuntime';
import formatBytes from 'Utilities/Number/formatBytes';
import titleCase from 'Utilities/String/titleCase';
import firstCharToUpper from 'Utilities/String/firstCharToUpper';
import translate from 'Utilities/String/translate';
import MovieIndexProgressBar from '../ProgressBar/MovieIndexProgressBar';
import MovieStatusCell from './MovieStatusCell';
@@ -286,7 +286,7 @@ function MovieIndexRow(props: MovieIndexRowProps) {
if (name === 'minimumAvailability') {
return (
<VirtualTableRowCell key={name} className={styles[name]}>
{titleCase(minimumAvailability)}
{translate(firstCharToUpper(minimumAvailability))}
</VirtualTableRowCell>
);
}

View File

@@ -152,7 +152,7 @@ class CustomFormat extends Component {
isOpen={this.state.isDeleteCustomFormatModalOpen}
kind={kinds.DANGER}
title={translate('DeleteCustomFormat')}
message={translate('DeleteCustomFormatMessageText', { name })}
message={translate('DeleteCustomFormatMessageText', { customFormatName: name })}
confirmLabel={translate('Delete')}
isSpinning={isDeleting}
onConfirm={this.onConfirmDeleteCustomFormat}

View File

@@ -15,6 +15,7 @@ interface SavePayload {
enabled?: boolean;
enableAuto?: boolean;
qualityProfileId?: number;
minimumAvailability?: string;
rootFolderPath?: string;
}
@@ -58,6 +59,7 @@ function ManageImportListsEditModalContent(
const [qualityProfileId, setQualityProfileId] = useState<string | number>(
NO_CHANGE
);
const [minimumAvailability, setMinimumAvailability] = useState(NO_CHANGE);
const [rootFolderPath, setRootFolderPath] = useState(NO_CHANGE);
const save = useCallback(() => {
@@ -79,6 +81,11 @@ function ManageImportListsEditModalContent(
payload.qualityProfileId = qualityProfileId as number;
}
if (minimumAvailability !== NO_CHANGE) {
hasChanges = true;
payload.minimumAvailability = minimumAvailability as string;
}
if (rootFolderPath !== NO_CHANGE) {
hasChanges = true;
payload.rootFolderPath = rootFolderPath;
@@ -93,6 +100,7 @@ function ManageImportListsEditModalContent(
enabled,
enableAuto,
qualityProfileId,
minimumAvailability,
rootFolderPath,
onSavePress,
onModalClose,
@@ -110,6 +118,9 @@ function ManageImportListsEditModalContent(
case 'qualityProfileId':
setQualityProfileId(value);
break;
case 'minimumAvailability':
setMinimumAvailability(value);
break;
case 'rootFolderPath':
setRootFolderPath(value);
break;
@@ -164,6 +175,19 @@ function ManageImportListsEditModalContent(
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('MinimumAvailability')}</FormLabel>
<FormInputGroup
type={inputTypes.AVAILABILITY_SELECT}
name="minimumAvailability"
value={minimumAvailability}
includeNoChange={true}
includeNoChangeDisabled={false}
onChange={onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('RootFolder')}</FormLabel>

View File

@@ -1,5 +1,6 @@
import React from 'react';
import Modal from 'Components/Modal/Modal';
import { sizes } from 'Helpers/Props';
import ManageImportListsModalContent from './ManageImportListsModalContent';
interface ManageImportListsModalProps {
@@ -11,7 +12,7 @@ function ManageImportListsModal(props: ManageImportListsModalProps) {
const { isOpen, onModalClose } = props;
return (
<Modal isOpen={isOpen} onModalClose={onModalClose}>
<Modal isOpen={isOpen} size={sizes.EXTRA_LARGE} onModalClose={onModalClose}>
<ManageImportListsModalContent onModalClose={onModalClose} />
</Modal>
);

View File

@@ -52,6 +52,12 @@ const COLUMNS = [
isSortable: true,
isVisible: true,
},
{
name: 'minimumAvailability',
label: () => translate('MinimumAvailability'),
isSortable: true,
isVisible: true,
},
{
name: 'rootFolderPath',
label: () => translate('RootFolder'),

View File

@@ -2,6 +2,7 @@
.tags,
.enabled,
.enableAuto,
.minimumAvailability,
.qualityProfileId,
.rootFolderPath,
.implementation {

View File

@@ -4,6 +4,7 @@ interface CssExports {
'enableAuto': string;
'enabled': string;
'implementation': string;
'minimumAvailability': string;
'name': string;
'qualityProfileId': string;
'rootFolderPath': string;

View File

@@ -7,6 +7,7 @@ import TableRow from 'Components/Table/TableRow';
import TagListConnector from 'Components/TagListConnector';
import { createQualityProfileSelectorForHook } from 'Store/Selectors/createQualityProfileSelector';
import { SelectStateInputProps } from 'typings/props';
import firstCharToUpper from 'Utilities/String/firstCharToUpper';
import translate from 'Utilities/String/translate';
import styles from './ManageImportListsModalRow.css';
@@ -15,6 +16,7 @@ interface ManageImportListsModalRowProps {
name: string;
rootFolderPath: string;
qualityProfileId: number;
minimumAvailability: string;
implementation: string;
tags: number[];
enabled: boolean;
@@ -30,6 +32,7 @@ function ManageImportListsModalRow(props: ManageImportListsModalRowProps) {
isSelected,
name,
rootFolderPath,
minimumAvailability,
qualityProfileId,
implementation,
enabled,
@@ -69,6 +72,10 @@ function ManageImportListsModalRow(props: ManageImportListsModalRowProps) {
{qualityProfile?.name ?? translate('None')}
</TableRowCell>
<TableRowCell className={styles.minimumAvailability}>
{translate(firstCharToUpper(minimumAvailability))}
</TableRowCell>
<TableRowCell className={styles.rootFolderPath}>
{rootFolderPath}
</TableRowCell>

View File

@@ -130,7 +130,10 @@ export const actionHandlers = handleThunks({
promise.done((data) => {
const updatedItem = _.cloneDeep(data);
updatedItem.internalId = updatedItem.id;
updatedItem.id = updatedItem.tmdbId;
delete updatedItem.images;
const actions = [
updateItem({ section: 'movies', ...data }),
updateItem({ section: 'addMovie', ...updatedItem }),

View File

@@ -4,6 +4,8 @@ import { render } from 'react-dom';
import createAppStore from 'Store/createAppStore';
import App from './App/App';
import 'Diag/ConsoleApi';
export async function bootstrap() {
const history = createBrowserHistory();
const store = createAppStore(history);

View File

@@ -15,6 +15,7 @@ interface ImportList extends ModelBase {
enabled: boolean;
enableAuto: boolean;
qualityProfileId: number;
minimumAvailability: string;
rootFolderPath: string;
name: string;
fields: Field[];

View File

@@ -28,7 +28,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.16.8",

View File

@@ -4,17 +4,17 @@
<DefineConstants Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64' or '$(RuntimeIdentifier)' == 'linux-musl-arm64'">ISMUSL</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.1" />
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NLog" Version="5.2.3" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.3" />
<PackageReference Include="Npgsql" Version="7.0.4" />
<PackageReference Include="Npgsql" Version="7.0.6" />
<PackageReference Include="Sentry" Version="3.23.1" />
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageReference Include="SharpZipLib" Version="1.3.3" />
<PackageReference Include="System.Text.Json" Version="6.0.8" />
<PackageReference Include="System.Text.Json" Version="6.0.9" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" />

View File

@@ -15,6 +15,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo.MediaInfoFormatterTests
[TestCase(HdrFormat.Hdr10Plus, "HDR10Plus")]
[TestCase(HdrFormat.DolbyVision, "DV")]
[TestCase(HdrFormat.DolbyVisionHdr10, "DV HDR10")]
[TestCase(HdrFormat.DolbyVisionHdr10Plus, "DV HDR10Plus")]
[TestCase(HdrFormat.DolbyVisionHlg, "DV HLG")]
[TestCase(HdrFormat.DolbyVisionSdr, "DV SDR")]
public void should_format_video_dynamic_range_type(HdrFormat format, string expectedVideoDynamicRangeType)

View File

@@ -116,6 +116,8 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo
[TestCase(10, "bt2020", "smpte2084", "FFMpegCore.HdrDynamicMetadataSpmte2094", null, HdrFormat.Hdr10Plus)]
[TestCase(10, "bt2020", "smpte2084", "FFMpegCore.DoviConfigurationRecordSideData", null, HdrFormat.DolbyVision)]
[TestCase(10, "bt2020", "smpte2084", "FFMpegCore.DoviConfigurationRecordSideData", 1, HdrFormat.DolbyVisionHdr10)]
[TestCase(10, "bt2020", "smpte2084", "FFMpegCore.DoviConfigurationRecordSideData,FFMpegCore.HdrDynamicMetadataSpmte2094", 1, HdrFormat.DolbyVisionHdr10Plus)]
[TestCase(10, "bt2020", "smpte2084", "FFMpegCore.DoviConfigurationRecordSideData,FFMpegCore.HdrDynamicMetadataSpmte2094", 6, HdrFormat.DolbyVisionHdr10Plus)]
[TestCase(10, "bt2020", "smpte2084", "FFMpegCore.DoviConfigurationRecordSideData", 2, HdrFormat.DolbyVisionSdr)]
[TestCase(10, "bt2020", "smpte2084", "FFMpegCore.DoviConfigurationRecordSideData", 4, HdrFormat.DolbyVisionHlg)]
public void should_detect_hdr_correctly(int bitDepth, string colourPrimaries, string transferFunction, string sideDataTypes, int? doviConfigId, HdrFormat expected)

View File

@@ -48,13 +48,14 @@ namespace NzbDrone.Core.Test.NotificationTests
Subject.Definition = _traktDefinition;
}
private void GiventValidMediaInfo(Quality quality, string audioChannels, string audioFormat, string scanType)
private void GiventValidMediaInfo(Quality quality, string audioChannels, string audioFormat, string scanType, HdrFormat hdrFormat = HdrFormat.None)
{
_downloadMessage.MovieFile.MediaInfo = new MediaInfoModel
{
AudioChannelPositions = audioChannels,
AudioFormat = audioFormat,
ScanType = scanType
ScanType = scanType,
VideoHdrFormat = hdrFormat
};
_downloadMessage.MovieFile.Quality.Quality = quality;
@@ -72,7 +73,7 @@ namespace NzbDrone.Core.Test.NotificationTests
[Test]
public void should_add_collection_movie_if_valid_mediainfo()
{
GiventValidMediaInfo(Quality.Bluray1080p, "5.1", "DTS", "Progressive");
GiventValidMediaInfo(Quality.Bluray2160p, "5.1", "DTS", "Progressive", HdrFormat.DolbyVisionHdr10);
Subject.OnDownload(_downloadMessage);
@@ -80,15 +81,16 @@ namespace NzbDrone.Core.Test.NotificationTests
.Verify(v => v.AddToCollection(It.Is<TraktCollectMoviesResource>(t =>
t.Movies.First().Audio == "dts" &&
t.Movies.First().AudioChannels == "5.1" &&
t.Movies.First().Resolution == "hd_1080p" &&
t.Movies.First().MediaType == "bluray"),
t.Movies.First().Resolution == "uhd_4k" &&
t.Movies.First().MediaType == "bluray" &&
t.Movies.First().Hdr == "hdr10"),
It.IsAny<string>()), Times.Once());
}
[Test]
public void should_format_audio_channels_to_one_decimal_when_adding_collection_movie()
{
GiventValidMediaInfo(Quality.Bluray1080p, "2.0", "DTS", "Progressive");
GiventValidMediaInfo(Quality.Bluray2160p, "2.0", "DTS", "Progressive", HdrFormat.DolbyVisionHdr10);
Subject.OnDownload(_downloadMessage);
@@ -96,8 +98,9 @@ namespace NzbDrone.Core.Test.NotificationTests
.Verify(v => v.AddToCollection(It.Is<TraktCollectMoviesResource>(t =>
t.Movies.First().Audio == "dts" &&
t.Movies.First().AudioChannels == "2.0" &&
t.Movies.First().Resolution == "hd_1080p" &&
t.Movies.First().MediaType == "bluray"),
t.Movies.First().Resolution == "uhd_4k" &&
t.Movies.First().MediaType == "bluray" &&
t.Movies.First().Hdr == "hdr10"),
It.IsAny<string>()), Times.Once());
}
}

View File

@@ -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);
}
}
}

View File

@@ -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; }
}
}

View File

@@ -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, connectionInfo.DatabaseType);
break;
}
case MigrationType.Log:
{
connectionString = _connectionStringFactory.LogDbConnectionString;
CreateLog(connectionString, migrationContext);
connectionInfo = _connectionStringFactory.LogDbConnection;
CreateLog(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType);
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();
@@ -107,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)
{
@@ -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);
_migrationController.Migrate(connectionString, migrationContext, databaseType);
return;
}
catch (Exception ex)
{
if (--retryCount > 0)
{
System.Threading.Thread.Sleep(5000);
continue;
}
@@ -162,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)
{
@@ -186,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)
{

View File

@@ -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())

View File

@@ -78,7 +78,12 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return false;
}
_logger.Debug("New item has a better custom format score");
_logger.Debug("New item's custom formats [{0}] ({1}) improve on [{2}] ({3}), accepting",
newCustomFormats.ConcatToString(),
newFormatScore,
currentCustomFormats.ConcatToString(),
currentFormatScore);
return true;
}

View File

@@ -0,0 +1,25 @@
using Dapper;
using NzbDrone.Core.Datastore;
namespace NzbDrone.Core.Housekeeping.Housekeepers
{
public class CleanupOrphanedMovies : IHousekeepingTask
{
private readonly IMainDatabase _database;
public CleanupOrphanedMovies(IMainDatabase database)
{
_database = database;
}
public void Clean()
{
using var mapper = _database.OpenConnection();
mapper.Execute(@"DELETE FROM ""Movies""
WHERE ""Id"" IN (
SELECT ""Movies"".""Id"" FROM ""Movies""
LEFT OUTER JOIN ""MovieMetadata"" ON ""Movies"".""MovieMetadataId"" = ""MovieMetadata"".""Id""
WHERE ""MovieMetadata"".""Id"" IS NULL)");
}
}
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using FluentValidation;
using NzbDrone.Core.Annotations;
@@ -28,15 +29,15 @@ namespace NzbDrone.Core.Indexers.FileList
BaseUrl = "https://filelist.io";
MinimumSeeders = IndexerDefaults.MINIMUM_SEEDERS;
Categories = new int[]
Categories = new[]
{
(int)FileListCategories.Movie_HD,
(int)FileListCategories.Movie_SD,
(int)FileListCategories.Movie_4K
};
MultiLanguages = new List<int>();
RequiredFlags = new List<int>();
MultiLanguages = Array.Empty<int>();
RequiredFlags = Array.Empty<int>();
}
[FieldDefinition(0, Label = "Username", Privacy = PrivacyLevel.UserName)]
@@ -57,7 +58,7 @@ namespace NzbDrone.Core.Indexers.FileList
[FieldDefinition(5, Type = FieldType.Number, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
public int MinimumSeeders { get; set; }
[FieldDefinition(6, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
[FieldDefinition(6, Type = FieldType.Select, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
public IEnumerable<int> RequiredFlags { get; set; }
[FieldDefinition(7)]

View File

@@ -31,8 +31,8 @@ namespace NzbDrone.Core.Indexers.HDBits
Categories = new[] { (int)HdBitsCategory.Movie };
Codecs = Array.Empty<int>();
Mediums = Array.Empty<int>();
MultiLanguages = new List<int>();
RequiredFlags = new List<int>();
MultiLanguages = Array.Empty<int>();
RequiredFlags = Array.Empty<int>();
}
[FieldDefinition(0, Label = "API URL", Advanced = true, HelpText = "Do not change this unless you know what you're doing. Since your API key will be sent to that host.")]
@@ -59,7 +59,7 @@ namespace NzbDrone.Core.Indexers.HDBits
[FieldDefinition(7, Type = FieldType.Number, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
public int MinimumSeeders { get; set; }
[FieldDefinition(8, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
[FieldDefinition(8, Type = FieldType.Select, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
public IEnumerable<int> RequiredFlags { get; set; }
[FieldDefinition(9)]

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using FluentValidation;
@@ -33,8 +34,8 @@ namespace NzbDrone.Core.Indexers.IPTorrents
{
BaseUrl = string.Empty;
MinimumSeeders = IndexerDefaults.MINIMUM_SEEDERS;
MultiLanguages = new List<int>();
RequiredFlags = new List<int>();
MultiLanguages = Array.Empty<int>();
RequiredFlags = Array.Empty<int>();
}
[FieldDefinition(0, Label = "Feed URL", HelpText = "The full RSS feed url generated by IPTorrents, using only the categories you selected (HD, SD, x264, etc ...)")]
@@ -46,7 +47,7 @@ namespace NzbDrone.Core.Indexers.IPTorrents
[FieldDefinition(2, Type = FieldType.Number, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
public int MinimumSeeders { get; set; }
[FieldDefinition(3, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
[FieldDefinition(3, Type = FieldType.Select, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
public IEnumerable<int> RequiredFlags { get; set; }
[FieldDefinition(4)]

View File

@@ -48,13 +48,11 @@ namespace NzbDrone.Core.Indexers.Newznab
{
yield return GetDefinition("DOGnzb", GetSettings("https://api.dognzb.cr"));
yield return GetDefinition("DrunkenSlug", GetSettings("https://drunkenslug.com"));
yield return GetDefinition("Nzb-Tortuga", GetSettings("https://www.nzb-tortuga.com"));
yield return GetDefinition("Nzb.su", GetSettings("https://api.nzb.su"));
yield return GetDefinition("NZBCat", GetSettings("https://nzb.cat"));
yield return GetDefinition("NZBFinder.ws", GetSettings("https://nzbfinder.ws", categories: new[] { 2030, 2040, 2045, 2050, 2060, 2070, 2080, 2090 }));
yield return GetDefinition("NZBFinder.ws", GetSettings("https://nzbfinder.ws", categories: new[] { 2030, 2040, 2045, 2050, 2060, 2070 }));
yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info"));
yield return GetDefinition("nzbplanet.net", GetSettings("https://api.nzbplanet.net"));
yield return GetDefinition("OZnzb.com", GetSettings("https://api.oznzb.com"));
yield return GetDefinition("SimplyNZBs", GetSettings("https://simplynzbs.com"));
yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api"));
yield return GetDefinition("Usenet Crawler", GetSettings("https://www.usenet-crawler.com"));

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
@@ -55,7 +56,7 @@ namespace NzbDrone.Core.Indexers.Newznab
{
ApiPath = "/api";
Categories = new[] { 2000, 2010, 2020, 2030, 2040, 2045, 2050, 2060 };
MultiLanguages = new List<int>();
MultiLanguages = Array.Empty<int>();
}
[FieldDefinition(0, Label = "URL")]

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using FluentValidation;
@@ -28,8 +29,8 @@ namespace NzbDrone.Core.Indexers.Nyaa
BaseUrl = "";
AdditionalParameters = "&cats=1_0&filter=1";
MinimumSeeders = IndexerDefaults.MINIMUM_SEEDERS;
MultiLanguages = new List<int>();
RequiredFlags = new List<int>();
MultiLanguages = Array.Empty<int>();
RequiredFlags = Array.Empty<int>();
}
[FieldDefinition(0, Label = "Website URL")]
@@ -44,7 +45,7 @@ namespace NzbDrone.Core.Indexers.Nyaa
[FieldDefinition(3, Type = FieldType.Number, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
public int MinimumSeeders { get; set; }
[FieldDefinition(4, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
[FieldDefinition(4, Type = FieldType.Select, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
public IEnumerable<int> RequiredFlags { get; set; }
[FieldDefinition(5)]

View File

@@ -59,9 +59,14 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn
flags |= IndexerFlags.PTP_Approved;
}
if (torrent.FreeleechType == "Freeleech")
switch (torrent.FreeleechType?.ToUpperInvariant())
{
flags |= IndexerFlags.G_Freeleech;
case "FREELEECH":
flags |= IndexerFlags.G_Freeleech;
break;
case "HALF LEECH":
flags |= IndexerFlags.G_Halfleech;
break;
}
if (torrent.Scene)

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using FluentValidation;
using NzbDrone.Core.Annotations;
@@ -26,9 +27,9 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn
public PassThePopcornSettings()
{
BaseUrl = "https://passthepopcorn.me";
MinimumSeeders = 0;
MultiLanguages = new List<int>();
RequiredFlags = new List<int>();
MinimumSeeders = IndexerDefaults.MINIMUM_SEEDERS;
MultiLanguages = Array.Empty<int>();
RequiredFlags = Array.Empty<int>();
}
[FieldDefinition(0, Label = "URL", Advanced = true, HelpText = "Do not change this unless you know what you're doing. Since your cookie will be sent to that host.")]
@@ -49,7 +50,7 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn
[FieldDefinition(5)]
public SeedCriteriaSettings SeedCriteria { get; set; } = new SeedCriteriaSettings();
[FieldDefinition(6, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
[FieldDefinition(6, Type = FieldType.Select, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
public IEnumerable<int> RequiredFlags { get; set; }
public NzbDroneValidationResult Validate()

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using FluentValidation;
using NzbDrone.Core.Annotations;
@@ -25,8 +26,8 @@ namespace NzbDrone.Core.Indexers.TorrentPotato
{
BaseUrl = "http://127.0.0.1";
MinimumSeeders = IndexerDefaults.MINIMUM_SEEDERS;
MultiLanguages = new List<int>();
RequiredFlags = new List<int>();
MultiLanguages = Array.Empty<int>();
RequiredFlags = Array.Empty<int>();
}
[FieldDefinition(0, Label = "API URL", HelpText = "URL to TorrentPotato api.")]
@@ -47,7 +48,7 @@ namespace NzbDrone.Core.Indexers.TorrentPotato
[FieldDefinition(5)]
public SeedCriteriaSettings SeedCriteria { get; set; } = new SeedCriteriaSettings();
[FieldDefinition(6, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", Advanced = true)]
[FieldDefinition(6, Type = FieldType.Select, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", Advanced = true)]
public IEnumerable<int> RequiredFlags { get; set; }
public NzbDroneValidationResult Validate()

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using FluentValidation;
using NzbDrone.Core.Annotations;
@@ -26,8 +27,8 @@ namespace NzbDrone.Core.Indexers.TorrentRss
BaseUrl = string.Empty;
AllowZeroSize = false;
MinimumSeeders = IndexerDefaults.MINIMUM_SEEDERS;
MultiLanguages = new List<int>();
RequiredFlags = new List<int>();
MultiLanguages = Array.Empty<int>();
RequiredFlags = Array.Empty<int>();
}
[FieldDefinition(0, Label = "Full RSS Feed URL")]
@@ -48,7 +49,7 @@ namespace NzbDrone.Core.Indexers.TorrentRss
[FieldDefinition(5)]
public SeedCriteriaSettings SeedCriteria { get; set; } = new SeedCriteriaSettings();
[FieldDefinition(6, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
[FieldDefinition(6, Type = FieldType.Select, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
public IEnumerable<int> RequiredFlags { get; set; }
public NzbDroneValidationResult Validate()

View File

@@ -58,7 +58,7 @@ namespace NzbDrone.Core.Indexers.Torznab
[FieldDefinition(9)]
public SeedCriteriaSettings SeedCriteria { get; set; } = new ();
[FieldDefinition(10, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
[FieldDefinition(10, Type = FieldType.Select, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
public IEnumerable<int> RequiredFlags { get; set; }
public override NzbDroneValidationResult Validate()

View File

@@ -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;

View File

@@ -1096,7 +1096,7 @@
"DeleteRemotePathMappingMessageText": "Esteu segur que voleu suprimir aquesta assignació remota de camins?",
"DeleteImportListExclusionMessageText": "Esteu segur que voleu suprimir aquesta exclusió de la llista d'importació?",
"DeleteConditionMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?",
"DeleteCustomFormatMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
"DeleteCustomFormatMessageText": "Esteu segur que voleu suprimir l'indexador '{customFormatName}'?",
"DeleteDelayProfileMessageText": "Esteu segur que voleu suprimir aquest perfil de retard?",
"DeleteFormatMessageText": "Esteu segur que voleu suprimir l'etiqueta de format {0} ?",
"RemoveSelectedItemQueueMessageText": "Esteu segur que voleu eliminar {0} de la cua?",
@@ -1159,5 +1159,7 @@
"FormatAgeMinute": "Minuts",
"FormatAgeMinutes": "Minuts",
"FormatAgeHour": "Hores",
"BlocklistLoadError": "No es pot carregar la llista de bloqueig"
"BlocklistLoadError": "No es pot carregar la llista de bloqueig",
"AutoRedownloadFailed": "La baixada ha fallat",
"InteractiveSearchModalHeader": "Cerca interactiva"
}

View File

@@ -10,7 +10,7 @@
"AddRemotePathMapping": "Přidat mapování vzdálených cest",
"Date": "datum",
"About": "O aplikaci",
"AddIndexer": "Přidat indexátor",
"AddIndexer": "Přidat indexer",
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "Filmy odstraněné z disku jsou automaticky sledovány v {appName}u",
"AvailabilityDelay": "Zpoždění dostupnosti",
"Certification": "Osvědčení",
@@ -37,13 +37,13 @@
"Real": "Nemovitý",
"ClickToChangeMovie": "Kliknutím změníte film",
"ConnectSettings": "Nastavení připojení",
"CopyUsingHardlinksHelpText": "Hardlinks použijte, když se pokoušíte kopírovat soubory z torrentů, které se stále používají",
"CopyUsingHardlinksHelpText": "Pevné odkazy umožňují {appName} importovat odesílané torrenty do složky s filmem, aniž by zabíraly další místo na disku nebo kopírovaly celý obsah souboru. Pevné odkazy budou fungovat pouze v případě, že zdroj a cíl jsou na stejném svazku",
"CustomFormatsSettings": "Nastavení vlastních formátů",
"CutoffFormatScoreHelpText": "Jakmile je dosaženo tohoto skóre vlastního formátu, {appName} již nebude stahovat filmy",
"DeleteEmptyFolders": "Odstraňte prázdné složky",
"DeleteEmptyFoldersHelpText": "Během skenování disku a při mazání filmových souborů odstraňte prázdné složky s filmy",
"DeleteFilesLabel": "Smažte {0} filmové soubory",
"DeleteNotificationMessageText": "Opravdu chcete smazat oznámení „{0}“?",
"DeleteNotificationMessageText": "Opravdu chcete smazat oznámení '{name}'?",
"DeleteRestrictionHelpText": "Opravdu chcete toto omezení smazat?",
"DeleteTagMessageText": "Opravdu chcete smazat značku „{0}“?",
"DetailedProgressBar": "Podrobný ukazatel průběhu",
@@ -493,7 +493,7 @@
"ConsideredAvailable": "Považováno za dostupné",
"CopyToClipboard": "Zkopírovat do schránky",
"CopyUsingHardlinksHelpTextWarning": "Zámky souborů mohou občas zabránit přejmenování souborů, které se právě vysazují. Výsev můžete dočasně deaktivovat a použít funkci {appName} pro přejmenování.",
"CouldNotFindResults": "Nelze najít žádné výsledky pro dotaz „{0}“",
"CouldNotFindResults": "Nepodařilo se najít žádné výsledky pro '{term}'",
"CreateGroup": "Vytvořit skupinu",
"Crew": "Osádka",
"CurrentlyInstalled": "Aktuálně nainstalováno",
@@ -515,16 +515,16 @@
"DelayProfile": "Zpožděný profil",
"DelayProfiles": "Profily zpoždění",
"Delete": "Vymazat",
"DeleteBackupMessageText": "Opravdu chcete smazat zálohu „{0}“?",
"DeleteBackupMessageText": "Opravdu chcete odstranit zálohu '{name}'?",
"Deleted": "Smazáno",
"DeleteDelayProfile": "Smazat profil zpoždění",
"DeleteDownloadClientMessageText": "Opravdu chcete odstranit klienta pro stahování „{0}“?",
"DeleteDownloadClientMessageText": "Opravdu chcete odstranit klienta pro stahování '{name}'?",
"DeleteFile": "Smazat soubor",
"DeleteFilesHelpText": "Odstraňte soubory filmu a složku filmu",
"DeleteHeader": "Smazat - {0}",
"DeleteImportListExclusion": "Odstranit vyloučení seznamu importů",
"DeleteIndexer": "Odstranit indexer",
"DeleteIndexerMessageText": "Opravdu chcete odstranit indexer „{0}“?",
"DeleteIndexerMessageText": "Opravdu chcete odstranit indexer '{name}'?",
"DeleteMovieFolderHelpText": "Odstraňte složku filmu a její obsah",
"DeleteNotification": "Smazat oznámení",
"EditMovie": "Upravit film",
@@ -1004,18 +1004,18 @@
"ShowCinemaReleaseHelpText": "Zobrazit datum vydání pod plakátem",
"DeleteRemotePathMapping": "Upravit vzdálené mapování cesty",
"DeleteRemotePathMappingMessageText": "Opravdu chcete toto vzdálené mapování cesty odstranit?",
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (zadáním žádné značky vymažete všechny značky)",
"DeleteConditionMessageText": "Opravdu chcete smazat značku „{0}“?",
"DeleteCustomFormatMessageText": "Opravdu chcete odstranit indexer „{0}“?",
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (prázdné pole vymaže všechny značky)",
"DeleteConditionMessageText": "Opravdu chcete odstranit podmínku '{name}'?",
"DeleteCustomFormatMessageText": "Opravdu chcete odstranit indexer „{customFormatName}“?",
"DeleteDelayProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
"DeleteFormatMessageText": "Opravdu chcete smazat značku formátu {0}?",
"RemoveSelectedItemQueueMessageText": "Opravdu chcete odebrat {0} položku {1} z fronty?",
"RemoveSelectedItemsQueueMessageText": "Opravdu chcete odebrat {0} položku {1} z fronty?",
"ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu",
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexátory",
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexery",
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky",
"DeleteImportListExclusionMessageText": "Opravdu chcete toto vyloučení importního seznamu smazat?",
"DeleteSelectedDownloadClients": "Odstranit staženého klienta",
"DeleteSelectedDownloadClients": "Odstranit klienta pro stahování",
"DeleteSelectedIndexers": "Odstranit indexer",
"ResetAPIKeyMessageText": "Opravdu chcete resetovat klíč API?",
"AddConditionImplementation": "Přidat podmínku - {implementationName}",
@@ -1023,11 +1023,11 @@
"AddConnectionImplementation": "Přidat spojení - {implementationName}",
"AddDownloadClientImplementation": "Přidat klienta pro stahování - {implementationName}",
"AddImportList": "Přidat importované položky",
"AddIndexerImplementation": "Přidat indexátor - {implementationName}",
"AddAutoTag": "Přidat automatické tagy",
"AddIndexerImplementation": "Přidat indexer - {implementationName}",
"AddAutoTag": "Přidat automatickou značku",
"AddCondition": "Přidat podmínku",
"AllTitles": "Všechny názvy",
"AddImportListImplementation": "Přidat importované položky - {implementationName}",
"AddImportListImplementation": "Přidat seznam k importu - {implementationName}",
"ApplicationURL": "URL aplikace",
"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",
"BypassDelayIfHighestQuality": "Obejít v případě nejvyšší kvality",
@@ -1037,7 +1037,7 @@
"AutoTagging": "Automatické označování",
"AutomaticAdd": "Přidat automaticky",
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak použít značky na vybrané klienty pro stahování",
"ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané importní seznamy",
"ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané seznamy k importu",
"AutomaticUpdatesDisabledDocker": "Automatické aktualizace nejsou při použití aktualizačního mechanismu Docker přímo podporovány. Obraz kontejneru je nutné aktualizovat mimo {appName} nebo použít skript",
"BypassDelayIfAboveCustomFormatScore": "Obejít, pokud je vyšší než skóre vlastního formátu",
"AuthenticationRequired": "Vyžadované ověření",
@@ -1055,5 +1055,85 @@
"DiscordUrlInSlackNotification": "Máte nastaveny Discord notifikace v režimu Slack. Nastavte je do režimu Discord pro lepší funkcionalitu. Postižené notifikace: {0}",
"AnnouncedMsg": "Film je oznámen",
"IndexerDownloadClientHelpText": "Zvolte, který klient pro stahování bude použit pro zachytávání z toho indexeru",
"ImportListMissingRoot": "Chybí kořenový adresář pro import seznamu: {rootFolderInfo}"
"ImportListMissingRoot": "Chybí kořenový adresář pro import seznamu: {rootFolderInfo}",
"EditCollection": "Upravit sbírku",
"ApplyTagsHelpTextHowToApplyMovies": "Jak přidat tagy vybraným filmům",
"Default": "Výchozí",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo",
"AutoRedownloadFailed": "Opětovné stažení se nezdařilo",
"AutoRedownloadFailedFromInteractiveSearch": "Opětovné stažení z interaktivního vyhledávání selhalo",
"AutoTaggingRequiredHelpText": "Tato podmínka {0} musí odpovídat, aby se pravidlo automatického označování použilo. V opačném případě postačí jediná shoda s {0}.",
"ClearBlocklist": "Vyčistit blocklist",
"ClearBlocklistMessageText": "Určitě chcete smazat všechny položky z blocklistu?",
"CollectionShowPostersHelpText": "Zobrazit plakáty položek v kolekci",
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude třebaho znovu načíst.",
"CountDownloadClientsSelected": "{count} vybraných klientů ke stahování",
"DefaultNameCopiedProfile": "{name} - Kopírovat",
"DefaultNameCopiedSpecification": "{name} - Kopírovat",
"DelayingDownloadUntil": "Odložení stahování do {date} v {time}",
"DeleteAutoTag": "Odstranění automatické značky",
"DeleteAutoTagHelpText": "Opravdu chcete odstranit automatickou značku '{name}'?",
"DeleteImportList": "Smazat seznam importovaných položek",
"DeleteImportListMessageText": "Opravdu chcete smazat seznam '{name}'?",
"DeleteSelectedDownloadClientsMessageText": "Opravdu chcete smazat {count} vybraných klientů pro stahování?",
"DeleteSelectedIndexersMessageText": "Opravdu chcete smazat {count} vybraný(ch) indexer(ů)?",
"DeletedReasonManual": "Soubor byl smazán pomocí UI",
"DownloadClientTagHelpText": "Tohoto klienta pro stahování používat pouze pro filmy s alespoň jednou odpovídající značkou. Pro použití se všemi filmy ponechte prázdné pole.",
"DownloadIgnored": "Stahování ignorováno",
"EditAutoTag": "Upravit automatickou značku",
"EditConditionImplementation": "Upravit sbírku - {implementationName}",
"EditConnectionImplementation": "Upravit upozornění - {implementationName}",
"EditDownloadClientImplementation": "Upravit klienta pro stahování - {implementationName}",
"EditImportListImplementation": "Upravit seznam k importu - {implementationName}",
"EditIndexerImplementation": "Upravit indexer - {implementationName}",
"FailedToFetchUpdates": "Nepodařilo se načíst aktualizace",
"FailedToUpdateSettings": "Nepodařilo se aktualizovat nastavení",
"FormatAgeDay": "den",
"FormatAgeDays": "dnů",
"FormatAgeHour": "hodina",
"FormatAgeHours": "hodin",
"FormatAgeMinute": "minuta",
"FormatAgeMinutes": "minut",
"FormatDateTime": "{formattedDate} {formattedTime}",
"Complete": "Dokončit",
"CollectionOptions": "Možnosti kolekce",
"Auto": "Auto",
"AppUpdated": "{appName} aktualizován",
"AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}",
"CountIndexersSelected": "{count} vybraných indexerů",
"CollectionShowOverviewsHelpText": "Zobrazit přehledy kolekcí",
"Database": "Databáze",
"Duration": "Trvání",
"CollectionsSelectedInterp": "Vybráno {0} kolekcí",
"CountImportListsSelected": "{count} vybraných seznamů pro import",
"CollectionShowDetailsHelpText": "Zobrazit stav a vlastnosti kolekce",
"AutoTaggingNegateHelpText": "Pokud je zaškrtnuto, pravidlo automatického označování se nepoužije, pokud odpovídá této podmínce {0}.",
"DownloadClientSortingCheckMessage": "Klient pro stahování {downloadClientName} má nastaveno třídění {sortingMode} pro kategorii {appName}. Ve svém klientovi pro stahování byste měli třídění zakázat, abyste se vyhnuli problémům s importem.",
"EditSelectedImportLists": "Upravit vybrané seznamy k importu",
"DeleteRootFolder": "Smazat kořenový adresář",
"DeleteRootFolderMessageText": "Opravdu chcete smazat kořenový adresář s cestou '{path}'?",
"EditSelectedIndexers": "Upravit vybrané indexery",
"DisabledForLocalAddresses": "Zakázáno pro místní adresy",
"BlocklistLoadError": "Nelze načíst černou listinu",
"BlocklistReleaseHelpText": "Zabránit {appName}u v opětovném sebrání tohoto vydání",
"CustomFormatJson": "Vlastní JSON formát",
"DeleteQualityProfileMessageText": "Opravdu chcete smazat profil kvality '{name}'?",
"DeletedReasonMissingFromDisk": "{appName}u se nepodařilo najít soubor na disku, proto byl soubor odpojen od filmu v databázi",
"DeletedReasonUpgrade": "Soubor byl odstraněn pro import lepší verze",
"DeleteSelectedMovieFilesHelpText": "Opravdu chcete smazat vybrané soubory filmů?",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Klient stahování {downloadClientName} je nastaven na odstranění dokončených stahování. To může vést k tomu, že stahování budou z klienta odstraněna dříve, než je bude moci importovat {1}.",
"DownloadClientsLoadError": "Nelze načíst klienty pro stahování",
"EditSelectedMovies": "Upravit vybrané filmy",
"EditSelectedDownloadClients": "Upravit vybrané klienty pro stahování",
"AuthenticationMethod": "Metoda ověřování",
"AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování",
"AuthenticationRequiredPasswordHelpTextWarning": "Vložte nové heslo",
"AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno",
"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.",
"DeleteCondition": "Odstranit podmínku",
"EnableProfile": "Povolit profil",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Automaticky vyhledat a pokusit se o stažení jiného vydání, pokud bylo neúspěšné vydání zachyceno z interaktivního vyhledávání",
"DeleteSelectedImportLists": "Smazat seznam k importu",
"DeleteSelectedImportListsMessageText": "Opravdu chcete smazat {count} vybraných seznamů k importu?"
}

View File

@@ -1010,7 +1010,7 @@
"DeleteImportListExclusionMessageText": "Er du sikker på, at du vil slette denne undtagelse fra importlisten?",
"DeleteFormatMessageText": "Er du sikker på, at du vil slette formattag {0}?",
"DeleteConditionMessageText": "Er du sikker på, at du vil slette listen '{0}'?",
"DeleteCustomFormatMessageText": "Er du sikker på, at du vil slette indeksøren '{0}'?",
"DeleteCustomFormatMessageText": "Er du sikker på, at du vil slette indeksøren '{customFormatName}'?",
"RemoveSelectedItemQueueMessageText": "Er du sikker på, at du vil fjerne {0} element {1} fra køen?",
"RemoveSelectedItemsQueueMessageText": "Er du sikker på, at du vil fjerne {0} element {1} fra køen?",
"ResetAPIKeyMessageText": "Er du sikker på, at du vil nulstille din API-nøgle?",

View File

@@ -3,7 +3,7 @@
"Activity": "Aktivität",
"AddExclusion": "Ausschluss hinzufügen",
"AddMovies": "Filme hinzufügen",
"AddNew": "Hinzufügen",
"AddNew": "Neue hinzufügen",
"AddNewMessage": "Es ist einfach einen neuen Film hinzuzufügen. Gib einfach den Namen des Filmes ein, den du hinzufügen möchtest",
"AddNewTmdbIdMessage": "Du kannst auch mit der TMDb-ID eines Films suchen. Z.B. 'tmdb:71663'",
"Agenda": "Agenda",
@@ -103,7 +103,7 @@
"Queue": "Warteschlange",
"RSSSync": "RSS-Sync",
"Refresh": "Aktualisieren",
"RefreshAndScan": "Aktualisieren",
"RefreshAndScan": "Aktualisieren und scannen",
"ReleaseBranchCheckOfficialBranchMessage": "Zweig {0} ist kein gültiger {appName}-Release-Zweig. Sie erhalten keine Updates",
"RemotePathMappings": "Remote-Pfadzuordnungen",
"RemoveSelected": "Auswahl entfernen",
@@ -165,7 +165,7 @@
"ReleaseStatus": "Releasestatus",
"ReleaseGroup": "Release-Gruppe",
"Ratings": "Bewertung",
"QualitySettingsSummary": "Qualitätgrößen und Bennenung",
"QualitySettingsSummary": "Qualitätsgrößen und Namensgebung",
"Protocol": "Protokoll",
"Progress": "Fortschritt",
"ProfilesSettingsSummary": "Profile für Qualität, Sprache und Verzögerung",
@@ -446,21 +446,21 @@
"PortNumber": "Port Nummer",
"PreferIndexerFlagsHelpText": "Priorisiere Releases mit speziellen Flags",
"PreferredSize": "Bevorzugte Größe",
"Proper": "Proper",
"ProtocolHelpText": "Wählen Sie, welche(s) Protokoll(e) verwendet werden soll(en) und welches Protokoll bei der Wahl zwischen ansonsten gleichwertigen Releases bevorzugt wird",
"ProxyBypassFilterHelpText": "Verwende ',' als Trennzeichen und '*.' als Platzhalter für Subdomains",
"ProxyType": "Proxy Typ",
"ProxyUsernameHelpText": "Nur wenn ein Benutzername und Passwort erforderlich ist, muss es eingegeben werden. Ansonsten leer lassen.",
"PublishedDate": "Veröffentlichungs Datum",
"Proper": "Korrekt",
"ProtocolHelpText": "Wählen Sie aus, welche(s) Protokoll(e) Sie verwenden möchten und welches Protokoll Sie bevorzugen, wenn Sie zwischen ansonsten gleichen Versionen wählen",
"ProxyBypassFilterHelpText": "Verwenden Sie ',' als Trennzeichen und '*.' als Wildcard für Subdomains",
"ProxyType": "Proxy-Typ",
"ProxyUsernameHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.",
"PublishedDate": "Veröffentlichungsdatum",
"QualityCutoffHasNotBeenMet": "Qualitätsschwelle wurde noch nicht erreicht",
"QualitySettings": "Qualitäts Einstellungen",
"QualitySettings": "Qualitätseinstellungen",
"RadarrTags": "{appName} Tags",
"Real": "Echt",
"Reason": "Grund",
"Real": "Real",
"Reason": "Begründung",
"RecycleBinCleanupDaysHelpText": "Auf 0 setzen um das automatische leeren des Papierkorbs zu deaktivieren",
"RecycleBinHelpText": "Gelöschte Filmdateien werden hierher verschoben anstatt sie direkt endgültig zu löschen",
"RecyclingBin": "Papierkorb",
"RecyclingBinCleanup": "Papierkorb aufräumen",
"RecyclingBinCleanup": "Papierkorb leeren",
"RefreshInformationAndScanDisk": "Metadaten aktualisieren und Festplatte scannen",
"RefreshMovie": "Film aktualisieren",
"ReleaseRejected": "Release abgelehnt",
@@ -571,12 +571,12 @@
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich",
"CopyUsingHardlinksHelpTextWarning": "Dateisperren Gelegentlich kann es vorkommen, dass Dateisperren das Umbenennen von Dateien verhindern, die gerade geseeded werden. Sie können das Seeding vorübergehend deaktivieren und die Umbenennungsfunktion von {appName} als Workaround verwenden.",
"IndexerSettings": "Indexer Einstellungen",
"ProxyPasswordHelpText": "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.",
"SendAnonymousUsageData": "Anonyme Nutzungsdaten übertragen",
"AutoRedownloadFailedHelpText": "Automatisch nach einem anderen Release suchen",
"DBMigration": "DB Migration",
"LaunchBrowserHelpText": " Öffne die Startseite von {appName} im Webbrowser nach dem Start.",
"ReadTheWikiForMoreInformation": "Lese das Wiki für mehr Informationen",
"ReadTheWikiForMoreInformation": "Lesen Sie das Wiki für weitere Informationen",
"SetPermissionsLinuxHelpText": "Soll CHMOD ausgeführt werden wenn Datien importiert/umbenannt werden?",
"BackupFolderHelpText": "Relative Pfade befinden sich unter {appName}s AppData Ordner",
"DelayProfile": "Verzögerungsprofil",
@@ -613,7 +613,7 @@
"RSSSyncIntervalHelpTextWarning": "Dies wird alle Indexer betreffen. Bitte folge deren Regeln",
"RSSIsNotSupportedWithThisIndexer": "RSS wird von diesem Indexer nicht unterstützt",
"RemovingTag": "Tag entfernen",
"Queued": "In der Warteschlange",
"Queued": "In Warteschlange",
"Pending": "Ausstehend",
"Paused": "Pausiert",
"NegateHelpText": "Wenn aktiviert wird das eigene Format nicht angewendet solange diese {0} Bedingung zutrifft.",
@@ -838,14 +838,14 @@
"RemoveMovieAndDeleteFiles": "Film entfernen und Dateien löschen",
"ReleasedMsg": "Film wurde veröffentlicht",
"RefreshLists": "Listen aktualisieren",
"RecentChanges": "Neuste Änderungen",
"RecentChanges": "Kürzliche Änderungen",
"RadarrCalendarFeed": "{appName} Kalender Feed",
"QueueIsEmpty": "Warteschlange ist leer",
"QueueIsEmpty": "Die Warteschlange ist leer",
"QualityProfileInUse": "Ein Qualitätsprofil mit zugeordneten Filmen, Listen oder Sammlungen kann nicht gelöscht werden",
"QualityOrLangCutoffHasNotBeenMet": "Qualität oder Sprache haben die Schwelle noch nicht erreicht",
"QualityLimitsHelpText": "Limitierungen werden automatisch an die Filmlänge angepasst.",
"QualitiesHelpText": "Qualitätsprofile oben sind mehr bevorzugt, auch wenn diese nicht angehakt sind. Profile in einer Gruppe sind gleichgestellt. Nur ausgewählte werden gesucht",
"Qualities": "Qualitätsprofile",
"Qualities": "Qualitäten",
"PrioritySettings": "Priorität: {0}",
"PreviewRenameHelpText": "Tipp: Um eine Vorschau der Umbenennung zu bekommen, wähle Abbrechen und klicke auf einen Filmtitel und benutze den",
"Presets": "Voreinstellungen",
@@ -1118,7 +1118,7 @@
"RemoveSelectedItemsQueueMessageText": "Bist du sicher, dass du {0} Einträge aus der Warteschlange entfernen willst?",
"ResetDefinitionTitlesHelpText": "Definitionstitel und Werte zurücksetzen",
"DeleteConditionMessageText": "Bist du sicher, dass du die Bedingung '{0}' löschen willst?",
"DeleteCustomFormatMessageText": "Bist du sicher, dass du das eigene Format '{0}' löschen willst?",
"DeleteCustomFormatMessageText": "Bist du sicher, dass du das eigene Format '{customFormatName}' löschen willst?",
"DeleteDelayProfileMessageText": "Bist du sicher, dass du dieses Verzögerung-Profil löschen willst?",
"DeleteFormatMessageText": "Bist du sicher, dass du das Formatierungstag {0} löschen willst?",
"DeleteImportListExclusionMessageText": "Bist du sicher, dass du diesen Importlisten Ausschluss löschen willst?",
@@ -1178,5 +1178,16 @@
"IMDbId": "TMDb ID",
"DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren",
"AddCondition": "Bedingung hinzufügen",
"AddAutoTag": "Automatisches Tag hinzufügen"
"AddAutoTag": "Automatisches Tag hinzufügen",
"AppUpdated": "{appName} aktualisiert",
"AddConditionImplementation": "Bedingung hinzufügen - {implementationName}",
"AddImportList": "Importliste hinzufügen",
"AddImportListImplementation": "Importliste hinzufügen - {implementationName}",
"QualitiesLoadError": "Qualitäten können nicht geladen werden",
"QueueLoadError": "Die Warteschlange konnte nicht geladen werden",
"QueueFilterHasNoItems": "Der ausgewählte Warteschlangenfilter enthält keine Elemente",
"AddConnectionImplementation": "Verbindung hinzufügen - {implementationName}",
"AddDownloadClientImplementation": "Download-Client hinzufügen - {implementationName}",
"AddIndexerImplementation": "Indexer hinzufügen - {implementationName}",
"AppUpdatedVersion": "{appName} wurde auf die Version `{version}` aktualisiert. Um die neusten Funktionen zu bekommen lade {appName} neu"
}

View File

@@ -1119,7 +1119,7 @@
"DeleteCondition": "Διαγραφή συνθήκης",
"DeleteFormatMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε την ετικέτα μορφής {0};",
"DeleteConditionMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη συνθήκη '{0}';",
"DeleteCustomFormatMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη προσαρμοσμένη μορφή '{0}';",
"DeleteCustomFormatMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη προσαρμοσμένη μορφή '{customFormatName}';",
"DeleteDelayProfileMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε αυτό το Προφίλ χρονοκαθυστέρησης;",
"DeleteImportListExclusionMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την εξαίρεση λίστας εισαγωγής;",
"NoHistoryBlocklist": "Δεν υπάρχει λίστα αποκλεισμού ιστορικού",

View File

@@ -246,7 +246,7 @@
"DeleteCondition": "Delete Condition",
"DeleteConditionMessageText": "Are you sure you want to delete the condition '{name}'?",
"DeleteCustomFormat": "Delete Custom Format",
"DeleteCustomFormatMessageText": "Are you sure you want to delete the custom format '{name}'?",
"DeleteCustomFormatMessageText": "Are you sure you want to delete the custom format '{customFormatName}'?",
"DeleteDelayProfile": "Delete Delay Profile",
"DeleteDelayProfileMessageText": "Are you sure you want to delete this delay profile?",
"DeleteDownloadClient": "Delete Download Client",

View File

@@ -9,7 +9,7 @@
"Import": "Importar",
"iCalLink": "enlace iCal",
"Host": "Host",
"History": "Historia",
"History": "Historial",
"HideAdvanced": "Ocultar Avanzado",
"Health": "Salud",
"GrabSelected": "Capturar Seleccionados",
@@ -28,7 +28,7 @@
"DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {downloadClientNames}",
"DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores",
"DownloadClients": "Gestores de Descargas",
"DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicarse con {downloadClientName}.",
"DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicarse con {downloadClientName}. {errorMessage}",
"DownloadClientCheckNoneAvailableMessage": "Ningún gestor de descargas disponible",
"DiskSpace": "Espacio en Disco",
"Discover": "Descubrir",
@@ -42,7 +42,6 @@
"Crew": "Equipo",
"Connections": "Conexiones",
"Connect": "Conectar",
"CompletedDownloadHandling": "Manipulación de descargas completas",
"Clear": "Borrar",
"ChooseAnotherFolder": "Elige otra Carpeta",
"Cast": "Reparto",
@@ -226,7 +225,7 @@
"OAuthPopupMessage": "Pop-ups bloqueados por su navegador",
"Name": "Nombre",
"MoveFiles": "Mover Archivos",
"Monitored": "Monitoreada",
"Monitored": "Monitorizado",
"Message": "Mensaje",
"Location": "Ubicación",
"Level": "Nivel",
@@ -241,7 +240,6 @@
"ConnectionLost": "Conexión perdida",
"Component": "Componente",
"Columns": "Columnas",
"Close": "Cerrar",
"Cancel": "Cancelar",
"AudioInfo": "Audio Info",
"Apply": "Aplicar",
@@ -340,19 +338,15 @@
"CreateEmptyMovieFolders": "Crear carpetas de películas vacías",
"Conditions": "Condiciones",
"ColonReplacementFormatHelpText": "Cambia la forma en que {appName} reemplaza los dos puntos",
"ColonReplacement": "Reemplazo dos puntos",
"CloneProfile": "Clonar Perfil",
"CloneIndexer": "Clonar Indexer",
"ClientPriority": "Prioridad de Cliente",
"ClickToChangeQuality": "Clic para cambiar la calidad",
"ClickToChangeLanguage": "Clic para cambiar el idioma",
"CheckForFinishedDownloadsInterval": "Intervalo para verificar descargas terminadas",
"ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado",
"ChangeFileDate": "Cambiar Fecha de Archivo",
"ChangeFileDate": "Cambiar fecha de archivo",
"CertificationCountryHelpText": "Seleccionar país para certificaciones de películas",
"CertificationCountry": "País de certificación",
"CertificateValidationHelpText": "Cambiar como de estricta será la validación del certificado HTTPS. No cambiar a menos que entiendas los riesgos.",
"CertificateValidation": "Validación del certificado",
"CertificateValidationHelpText": "Cambiar como es la validacion de la certificacion estricta de HTTPS. No cambiar a menos que entiendas las consecuencias.",
"CertificateValidation": "Validacion de certificado",
"BypassProxyForLocalAddresses": "Omitir Proxy para Direcciones Locales",
"Branch": "Rama",
"BindAddressHelpText": "Dirección IP4 válida, localhost o '*' para todas las interfaces",
@@ -378,7 +372,7 @@
"AllowHardcodedSubs": "Permitir Hardcoded Subs",
"AgeWhenGrabbed": "Antigüedad (cuando se añadió)",
"AddImportExclusionHelpText": "Prevenir que la película sea añadida a {appName} mediante listas",
"AddListExclusion": "Añadir Exclusión De Lista",
"AddListExclusion": "Agregar Lista de Exclusión",
"YesCancel": "Sí, Cancelar",
"WhitelistedSubtitleTags": "Etiquetas de Subtítulos Permitidas",
"WhitelistedHardcodedSubsHelpText": "Las etiquetas de los subtítulos aquí, no se considerarán incrustados",
@@ -395,7 +389,7 @@
"Uptime": "Tiempo de actividad",
"UpgradeAllowedHelpText": "Si está desactivado las calidades no serán actualizadas",
"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",
"UnmonitoredHelpText": "Incluir las peliculas no monitoreadas en el feed de iCal",
"Ungroup": "Desagrupar",
@@ -459,7 +453,7 @@
"ResetAPIKey": "Reajustar API",
"Reset": "Reiniciar",
"RescanMovieFolderAfterRefresh": "Reescanear la Carpeta de Películas después de Actualizar",
"RescanAfterRefreshHelpTextWarning": "{appName} no detectará los cambios automáticamente en los ficheros si no se ajusta a 'Siempre'",
"RescanAfterRefreshHelpTextWarning": "{appName} no detectará automáticamente cambios en los archivos si no se elige 'Siempre'",
"RescanAfterRefreshHelpText": "Reescanear la carpeta de películas después de actualizar la película",
"RequiredHelpText": "Esta condición {0} ha de igualar al formato propio para aplicarse. Si no, una sóla {1} es suficiente.",
"ReplaceIllegalCharactersHelpText": "Reemplazar caracteres ilegales. Si está desactivado, {appName} los eliminará si no",
@@ -585,7 +579,7 @@
"EnableAutoHelpText": "Si se habilita, las Películas en esta lista se añadirán automáticamente a {appName}",
"CutoffFormatScoreHelpText": "Una la vez que la calidad objetivo es cumplida o excedida y esta puntuación de formato propio es alcanzada {appName} dejará de descargar o importar mejoras para estas películas",
"CustomFormatsSettings": "Ajustes de Formatos Propios",
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, los archivos blqoueados impiden renombrar los archivos que siguen seedeando. Puedes desactivar el seedeo temporalmete y usar la función de renombrado de {appName} como alternativa.",
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, los archivos bloqueados impiden renombrar los archivos que siguen seedeando. Puedes desactivar el seedeo temporalmete y usar la función de renombrado de Radarr como alternativa.",
"CopyUsingHardlinksHelpText": "Los Hardlinks permiten a {appName} importar torrents que siguen seedeando a la carpeta de películas sin ocupar espacio extra en el disco o copiando los contenidos al completo del archivo. Los Hardlinks solo funcionarán si el orígen y destino se encuentran en el mismo volumen",
"ConnectSettings": "Conectar Ajustes",
"CleanLibraryLevel": "Limpiar el Nivel de la Librería",
@@ -638,7 +632,7 @@
"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}",
"EnableAutomaticSearchHelpTextWarning": "Se usará cuando se utilice la búsqueda interactiva",
"DownloadWarning": "Alerta de descarga: {0}",
"DownloadWarning": "Alerta de descarga: {warningMessage}",
"Downloading": "Descargando",
"DownloadFailed": "La descarga ha fallado",
"DownloadClientUnavailable": "El gestor de descargas no está disponible",
@@ -650,10 +644,10 @@
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
"Cutoff": "Requisito",
"ClickToChangeMovie": "Clic para cambiar película",
"CheckDownloadClientForDetails": "comprobar el gestor de descargas para más detalles",
"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}",
"CheckDownloadClientForDetails": "Revisar cliente de descarpa para mas detalles",
"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",
"RadarrSupportsCustomConditionsAgainstTheReleasePropertiesBelow": "{appName} soporta condiciones personalizadas contra las propiedades de estrenos abajo.",
@@ -691,7 +685,7 @@
"NoUpdatesAreAvailable": "No hay actualizaciones disponibles",
"NoTagsHaveBeenAddedYet": "No se han añadido etiquetas todavía",
"NoLogFiles": "Sin archivos de registro",
"NoHistory": "Sin historia",
"NoHistory": "Sin historial",
"NoBackupsAreAvailable": "No hay copias de seguridad disponibles",
"MoreDetails": "Más detalles",
"MissingNotMonitored": "No encontrada (No Monitoreada)",
@@ -734,8 +728,6 @@
"DownloadPropersAndRepacks": "Propers y Repacks",
"CustomFormatUnknownConditionOption": "Opción Desconocida '{0}' para condición '{1}'",
"CustomFormatUnknownCondition": "Condición de Formato Personalizado Desconocida '{0}'",
"CopyToClipboard": "Copiar al portapapeles",
"CloneCustomFormat": "Clonar Formato Personalizado",
"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. Se utiliza cuando se toman las versiones como un criterio para las versiones que de otro modo serían iguales, {appName} seguirá utilizando todos los indexadores habilitados para la sincronización y la búsqueda de RSS",
@@ -765,23 +757,23 @@
"ImportErrors": "Errores al importar",
"Existing": "Existente",
"EditRestriction": "Editar Restricción",
"CancelProcessing": "Cancelar Procesamiento",
"CancelProcessing": "Procesando cancelacion",
"AddRestriction": "Añadir Restricción",
"AddMovie": "Añadir Película",
"IndexerLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {indexerNames}",
"IndexerLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas",
"EditMovieFile": "Editar Archivo de Película",
"ListTagsHelpText": "Etiquetas con las que se añadirán los elementos",
"AddToDownloadQueue": "Añadida a cola de descarga",
"AddToDownloadQueue": "Agregar a la cola de descarga",
"Add": "Añadir",
"AddCustomFormat": "Añadir Formato Personalizado",
"AddDelayProfile": "Añadir Perfil de Retraso",
"AddDownloadClient": "Añadir Cliente de Descarga",
"AddedToDownloadQueue": "Añadida a la cola de descargas",
"AddedToDownloadQueue": "Agregado a la cola de descarga",
"AddQualityProfile": "Añadir Perfil de Calidad",
"AddRootFolder": "Añadir Carpeta Raíz",
"AfterManualRefresh": "Tras Refrescar Manualmente",
"AllFiles": "Todos los Archivos",
"AllFiles": "Todos los archivos",
"ImportLibrary": "Importar biblioteca",
"ExcludeTitle": "¿Excluir {0}? Esto evitará que {appName} agregue automáticamente mediante la sincronización de listas.",
"None": "Ninguna",
@@ -963,7 +955,7 @@
"UsenetDisabled": "Usenet deshabilitado",
"Weeks": "Semanas",
"Wiki": "Wiki",
"WouldYouLikeToRestoreBackup": "¿Le gustaría restaurar la copia de seguridad {0}?",
"WouldYouLikeToRestoreBackup": "Te gustaria restaurar la copia de seguridad '{name}'?",
"YesMoveFiles": "Sí, mover los archivos",
"Yesterday": "Ayer",
"MoveFolders2": "¿Le gustaría mover los archivos de película de '{0}' a '{1}'?",
@@ -989,10 +981,10 @@
"BypassDelayIfHighestQuality": "Pasar sí es la calidad más alta",
"UnableToAddRootFolder": "No se han podido cargar las carpetas raiz",
"Blocklist": "Bloqueadas",
"BlocklistRelease": "Bloquear este Estreno",
"BlocklistRelease": "Lista de lanzamientos bloqueados",
"RemoveFromBlocklist": "Eliminar de lista de bloqueados",
"Blocklisted": "Bloqueados",
"BlocklistReleases": "Bloquear este Estreno",
"BlocklistReleases": "Lista de lanzamientos bloqueados",
"RemotePathMappingCheckDownloadPermissions": "{appName} puede ver pero no acceder a la película descargada {path}. Probablemente sea un error de permisos.",
"RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {downloadClientName} informó de la existencia de archivos en {path} pero {appName} no puede ver este directorio. Es posible que tenga que ajustar los permisos de la carpeta.",
"Waiting": "Esperando",
@@ -1094,7 +1086,7 @@
"ShowCinemaReleaseHelpText": "Mostrar la fecha de lanzamiento debajo del cartel",
"DeleteRemotePathMapping": "Editar Mapeo de Ruta Remota",
"DownloadClientTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.",
"DeleteCustomFormatMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
"DeleteCustomFormatMessageText": "Seguro que quieres eliminar el indexer '{customFormatName}'?",
"DeleteDelayProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?",
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{name}'?",
"DeleteFormatMessageText": "¿Está seguro de que desea eliminar la etiqueta de formato {0}?",
@@ -1198,5 +1190,42 @@
"DeletedReasonManual": "El archivo fue borrado por vía UI",
"DeletedReasonMissingFromDisk": "{appName} no ha podido encontrar el archivo en el disco, por lo que se ha desvinculado de la película en la base de datos",
"DeletedReasonUpgrade": "Se ha borrado el archivo para importar una versión mejorada",
"DeleteSelectedMovieFilesHelpText": "¿Está seguro de que desea eliminar los archivos de película seleccionados?"
"DeleteSelectedMovieFilesHelpText": "¿Está seguro de que desea eliminar los archivos de película seleccionados?",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña",
"ClearBlocklist": "Limpiar lista de bloqueadas",
"HistoryLoadError": "No se pudo cargar el historial",
"NoHistoryFound": "No se encontró historial",
"NoHistoryBlocklist": "Sin lista de bloqueo de historial",
"ClearBlocklistMessageText": "¿Estás seguro de que quieres borrar todos los elementos de la lista de bloqueo?",
"ClientPriority": "Prioridad del Cliente",
"ColonReplacement": "Reemplazar dos puntos",
"CloneIndexer": "Clonar Indexer",
"CompletedDownloadHandling": "Manipulación de descargas completas",
"CopyToClipboard": "Copiar al portapapeles",
"CloneCustomFormat": "Clonar formato personalizado",
"CloneProfile": "Clonar Perfil",
"Close": "Cerrar",
"DownloadClientsLoadError": "No se puden cargar los gestores de descargas",
"EditConnectionImplementation": "Editar notificación - {implementationName}",
"EditImportListImplementation": "Añadir lista de importación - {implementationName}",
"EditIndexerImplementation": "Editar indexador - {implementationName}",
"FormatShortTimeSpanHours": "{hours} hora(s)",
"FormatShortTimeSpanMinutes": "{minutes} minuto(s)",
"FormatShortTimeSpanSeconds": "{seconds} segundo(s)",
"FormatTimeSpanDays": "{days}d {time}",
"EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}",
"EnableProfile": "Habilitar perfil",
"FormatAgeDay": "día",
"FormatAgeHour": "hora",
"FormatAgeHours": "horas",
"FormatAgeMinute": "minuto",
"FormatAgeMinutes": "minutos",
"FormatRuntimeHours": "{hours}h",
"FormatRuntimeMinutes": "{minutes}m",
"FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}",
"FormatDateTime": "{formattedDate} {formattedTime}",
"UnknownEventTooltip": "Evento desconocído",
"FormatAgeDays": "días",
"False": "Falso",
"DownloadIgnored": "Descarga ignorada"
}

View File

@@ -1101,7 +1101,7 @@
"DeleteImportListExclusionMessageText": "Haluatko varmasti poistaa poikkeussäännön?",
"CountIndexersSelected": "{0} valittua tietolähdettä",
"DeleteConditionMessageText": "Haluatko varmasti poistaa tunnisteen '{0}'?",
"DeleteCustomFormatMessageText": "Haluatko varmasti poistaa pääkansion '{0}'?",
"DeleteCustomFormatMessageText": "Haluatko varmasti poistaa pääkansion '{customFormatName}'?",
"DeleteDelayProfileMessageText": "Haluatko varmasti poistaa viiveprofiilin?",
"DeleteSelectedImportLists": "Poista tuontilista",
"DeleteSelectedIndexers": "Poista tietolähde",

View File

@@ -1,6 +1,6 @@
{
"IndexerStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs",
"IndexerSearchCheckNoInteractiveMessage": "Aucun indexeur disponible avec la recherche interactive activée, {appName} ne fournira aucun résultat de recherche interactive",
"IndexerSearchCheckNoInteractiveMessage": "Aucun indexeur disponible avec la recherche interactive activée, {appName} ne fournira aucun résultat de recherche interactif",
"IndexerSearchCheckNoAvailableIndexersMessage": "Tous les indexeurs compatibles avec la recherche sont temporairement indisponibles en raison d'erreurs d'indexation récentes",
"IndexerSearchCheckNoAutomaticMessage": "Aucun indexeur disponible avec la recherche automatique activée, {appName} ne fournira aucun résultat de recherche automatique",
"Indexers": "Indexeurs",
@@ -11,7 +11,7 @@
"iCalLink": "Lien iCal",
"Host": "Hôte",
"History": "Historique",
"HideAdvanced": "Masquer param. av.",
"HideAdvanced": "Masquer les Options Avancées",
"Health": "Santé",
"GrabSelected": "Saisir la sélection",
"General": "Général",
@@ -26,7 +26,7 @@
"Edit": "Modifier",
"Downloaded": "Téléchargé",
"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échargement",
"DownloadClientCheckNoneAvailableMessage": "Aucun client de téléchargement n'est disponible",
"Dates": "Dates",
"Date": "Date",
@@ -36,7 +36,7 @@
"Delete": "Supprimer",
"DelayProfiles": "Profils de retard",
"Day": "Jour",
"CustomFormats": "Formats perso.",
"CustomFormats": "Formats personnalisés",
"CustomFilters": "Filtres personnalisés",
"Crew": "Équipe",
"Connections": "Connexions",
@@ -122,7 +122,7 @@
"Protocol": "Protocole",
"Progress": "Progression",
"ProfilesSettingsSummary": "Profils de qualité, de langue, de délai et de release",
"Profiles": "Profiles",
"Profiles": "Profils",
"PreviewRename": "Aperçu Renommer",
"PhysicalRelease": "Sortie physique",
"Path": "Chemin",
@@ -141,14 +141,14 @@
"MountCheckMessage": "Le montage contenant un chemin de film est monté en lecture seule: ",
"MoreInfo": "Plus d'informations",
"Month": "Mois",
"ListsSettingsSummary": "Importer listes, listes d'exclusions",
"ListsSettingsSummary": "Importer des Listes, exclure des listes",
"ListExclusions": "Liste des exclusions",
"IndexersSettingsSummary": "Indexeurs et restrictions de version",
"Grabbed": "Saisie",
"Genres": "Genres",
"Forecast": "Prévision",
"DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins distants",
"DownloadClientCheckUnableToCommunicateMessage": "Impossible de communiquer avec {downloadClientName}.",
"DownloadClientCheckUnableToCommunicateMessage": "Impossible de communiquer avec {downloadClientName}. {errorMessage}",
"DownloadClient": "Client de téléchargement",
"CutoffUnmet": "Limite non satisfaite",
"MonitoredOnly": "Surveillé uniquement",
@@ -157,7 +157,7 @@
"MinimumAvailability": "Disponibilité minimale",
"MinAvailability": "Disponibilité minimale",
"MetadataSettingsSummary": "Créer des fichiers de métadonnées lorsque des films sont importés ou actualisés",
"Metadata": "Metadonnées",
"Metadata": "Métadonnées",
"MediaManagementSettingsSummary": "Paramètres de dénomination et de gestion des fichiers",
"MediaManagement": "Gestion des médias",
"MassMovieSearch": "Recherche de films en masse",
@@ -283,7 +283,7 @@
"RecentFolders": "Dossiers récents",
"QuickImport": "Déplacer automatiquement",
"PosterSize": "Poster taille",
"Posters": "Posters",
"Posters": "Affiches",
"PosterOptions": "Poster options",
"PendingChangesStayReview": "Rester et vérifier les modifications",
"PendingChangesMessage": "Vous avez des modifications non sauvegardées, voulez-vous vraiment quitter cette page ?",
@@ -339,7 +339,7 @@
"IconForCutoffUnmet": "Icône pour la date limite non respectée",
"ICalHttpUrlHelpText": "Copiez cette URL dans votre/vos client(s) ou cliquez pour abonner si votre navigateur est compatible avec webcal",
"ICalFeed": "Flux iCal",
"Hostname": "Hostname",
"Hostname": "Nom d'hôte",
"Group": "Groupe",
"GrabRelease": "Saisir Release",
"Grab": "Saisir",
@@ -347,7 +347,7 @@
"GeneralSettings": "Réglages généraux",
"FollowPerson": "Suivre la personne",
"Folders": "Dossiers",
"Fixed": "Fixé",
"Fixed": "Corrigés",
"FirstDayOfWeek": "Premier jour de la semaine",
"FileNames": "Noms de fichier",
"FileDateHelpText": "Changer la date du fichier lors de l'import/re-scan",
@@ -551,7 +551,7 @@
"UpgradeUntilThisQualityIsMetOrExceeded": "Mise à niveau jusqu'à ce que cette qualité soit atteinte ou dépassée",
"UpgradeAllowedHelpText": "Si désactivé, les qualités ne seront pas améliorées",
"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",
"Unreleased": "Version non disponible",
"UnmonitoredHelpText": "Inclure les films non surveillés dans le flux iCal",
@@ -776,7 +776,7 @@
"Today": "Aujourd'hui",
"ConsideredAvailable": "Considéré comme disponible",
"CouldNotConnectSignalR": "Impossible de se connecter à SignalR, l'interface utilisateur ne sera pas mise à jour",
"ChmodFolderHelpTextWarning": "Fonctionne uniquement si l'utilisateur exécutant {appName} est le propriétaire du fichier. Il est recommandé de vérifier les permissions du client de téléchargement.",
"ChmodFolderHelpTextWarning": "Cela ne fonctionne que si l'utilisateur qui exécute {appName} est le propriétaire du fichier. Il est préférable de s'assurer que le client de téléchargement définit correctement les permissions.",
"ChmodGroupHelpTextWarning": "Fonctionne uniquement si l'utilisateur exécutant {appName} est le propriétaire du fichier. Il est recommandé de vérifier que le client de téléchargement utilise le meme Groupe que {appName}.",
"DefaultDelayProfile": "Ceci est le profil par défaut. Il est appliqué à tous les films qui n'ont pas de profils spécifiques.",
"DeleteTheMovieFolder": "Le dossier '{0}' et son contenu vont être supprimés.",
@@ -812,7 +812,7 @@
"CurrentlyInstalled": "Actuellement installé",
"Custom": "Customisé",
"CustomFormat": "Format personnalisé",
"CustomFormatHelpText": "Raddar met un score pour chaque release en additionnant les scores des formats personnalisés correspondants. Si une nouvelle release permet d'améliorer le score, pour une qualité identique ou supérieure, alors Raddar la téléchargera.",
"CustomFormatHelpText": "{appName} attribue un score pour chaque release en additionnant les scores des formats personnalisés correspondants. Si une nouvelle release permet d'améliorer le score, pour une qualité identique ou supérieure, alors {appName} la téléchargera.",
"Days": "Jours",
"Debug": "Déboguer",
"DefaultCase": "Casse par défaut",
@@ -833,7 +833,7 @@
"EditGroups": "Modifier les groupes",
"EditListExclusion": "Modifier l'exclusion de liste",
"Enabled": "Activé",
"ExcludeTitle": "Exclure {0} ? Raddar n'importeras plus automatiquement ce film des listes de synchronisation.",
"ExcludeTitle": "Exclure {0} ? {appName} n'importera plus automatiquement ce film des listes de synchronisation.",
"FailedToLoadMovieFromAPI": "Erreur lors du chargement du film via l'API",
"FeatureRequests": "Requêtes de nouvelles fonctionnalités",
"FileNameTokens": "Tokens des noms de fichier",
@@ -945,7 +945,7 @@
"SomeResultsHiddenFilter": "Tous les résultats ont été dissimulés par le filtre actuellement appliqué",
"Sunday": "Dimanche",
"TagDetails": "Détails de la balise - {label}",
"TheLogLevelDefault": "Le niveau de journalisation est par défaut «Info» et peut être modifié dans",
"TheLogLevelDefault": "Le niveau de journalisation est par défaut à « Information » et peut être modifié dans les [paramètres généraux](/settings/general)",
"ThisCannotBeCancelled": "Cela ne peut pas être annulé une fois démarré sans désactiver tous vos indexeurs.",
"TorrentDelayTime": "Retard du torrent : {0}",
"TorrentsDisabled": "Torrents désactivés",
@@ -1021,7 +1021,7 @@
"DiscordUrlInSlackNotification": "Vous avez une configuration de notification Discord en tant que notification Slack. Configurez cela comme une notification Discord pour un meilleur fonctionnement. Les notifications affectées sont : {0}",
"RemotePathMappingCheckDockerFolderMissing": "Vous utilisez docker; {downloadClientName} enregistre les téléchargements dans {path} mais ce dossier n'est pas présent dans ce conteneur. Vérifiez vos paramètres de dossier distant et les paramètres de votre conteneur docker.",
"RemotePathMappingCheckRemoteDownloadClient": "Le client de téléchargement distant {downloadClientName} met les téléchargements dans {path} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {downloadClientName} enregistre les téléchargements dans {path} mais ce n'est pas un chemin {osName} valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckFilesWrongOSPath": "Le client de téléchargement distant {downloadClientName} met les téléchargements dans {path} mais il ne s'agit pas d'un chemin {osName} valide. Vérifiez les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckLocalFolderMissing": "Le client de téléchargement distant {downloadClientName} met les téléchargements dans {path} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
"OnApplicationUpdate": "Sur la mise à jour de l'application",
@@ -1034,7 +1034,7 @@
"OriginalLanguage": "Langue originale",
"Rating": "Notation",
"RemotePath": "Chemin distant",
"RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker; {0} signifie les téléchargement dans {1} mais ce n'est pas un dossier valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez Docker ; le client de téléchargement {downloadClientName} a signalé des fichiers dans {path}, mais ce n'est pas un chemin valide pour {osName}. Vérifiez vos mappages de chemins distants et les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckWrongOSPath": "Le client de téléchargement distant {downloadClientName} met les téléchargements dans {path} mais ce chemin {osName} est invalide. Vérifiez vos paramètres de chemins distants et les paramètres de votre client de téléchargement.",
"RemoveCompleted": "Supprimer terminé",
"Database": "Base de données",
@@ -1112,7 +1112,7 @@
"RemoveSelectedItemQueueMessageText": "Êtes-vous sûr de vouloir supprimer 1 élément de la file d'attente ?",
"CountIndexersSelected": "{count} indexeur(s) sélectionné(s)",
"DeleteConditionMessageText": "Voulez-vous vraiment supprimer la condition « {name} » ?",
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer le format personnalisé « {name} » ?",
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer le format personnalisé « {customFormatName} » ?",
"DeleteDelayProfileMessageText": "Êtes-vous sûr de vouloir supprimer ce profil de retard ?",
"ResetAPIKeyMessageText": "Êtes-vous sûr de vouloir réinitialiser votre clé API ?",
"ResetDefinitionTitlesHelpText": "Réinitialiser les titres de définition ainsi que les valeurs",
@@ -1187,7 +1187,7 @@
"ListWillRefreshEveryInterp": "La liste se rafraîchira tous/toutes la/les {0}",
"OverrideGrabNoMovie": "Un film doit être sélectionné",
"OverrideGrabNoLanguage": "Au moins une langue doit être sélectionnée",
"ParseModalHelpTextDetails": "{appName} va tenter de parser le titre et de vous afficher les détails à son sujet",
"ParseModalHelpTextDetails": "{appName} va tenter d'analyser le titre et de vous afficher les détails à son sujet",
"QualitiesLoadError": "Impossible de charger les qualités",
"SelectFolderModalTitle": "{modalTitle} Sélectionner un dossier",
"ShowImdbRatingHelpText": "Affiche la note IMDb sous l'affiche",
@@ -1249,7 +1249,7 @@
"UnableToLoadAutoTagging": "Impossible de charger le marquage automatique",
"DelayingDownloadUntil": "Retarder le téléchargement jusqu'au {date} à {time}",
"DeleteSelectedMovieFilesHelpText": "Voulez-vous vraiment supprimer les fichiers vidéo sélectionnés ?",
"DeletedReasonMissingFromDisk": "Readarr n'a pas pu trouver le fichier sur le disque, il a donc été supprimé dans la base de données",
"DeletedReasonMissingFromDisk": "{appName} n'a pas pu trouver le fichier sur le disque, il a donc été supprimé dans la base de données",
"DeletedReasonUpgrade": "Le fichier a été supprimé pour importer une mise à niveau",
"OrganizeLoadError": "Erreur lors du chargement des aperçus",
"EditImportListImplementation": "Modifier la liste d'importation - {implementationName}",
@@ -1334,5 +1334,17 @@
"MovieDownloadIgnoredTooltip": "Téléchargement de film ignoré",
"SkipRedownloadHelpText": "Empêche {appName} d'essayer de télécharger une version alternative pour cet élément",
"QueueFilterHasNoItems": "Le filtre de file d'attente sélectionné ne contient aucun élément",
"EnableProfile": "Activer profil"
"EnableProfile": "Activer profil",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe",
"ClearBlocklist": "Effacer la liste de blocage",
"ClearBlocklistMessageText": "Êtes-vous sûr de vouloir supprimer tous les éléments de la liste de blocage ?",
"FailedToFetchUpdates": "Échec de la récupération des mises à jour",
"FailedToUpdateSettings": "Échec de la mise à jour des paramètres",
"LogFilesLocation": "Les fichiers journaux sont situés dans : {location}",
"PackageVersionInfo": "{packageVersion} par {packageAuthor}",
"InteractiveSearchModalHeader": "Recherche interactive",
"PreviouslyInstalled": "Installé précédemment",
"WhySearchesCouldBeFailing": "Cliquez ici pour savoir pourquoi les recherches pourraient échouer",
"PasswordConfirmation": "Confirmation du mot de passe",
"UpdaterLogFiles": "Journaux du programme de mise à jour"
}

View File

@@ -1042,7 +1042,7 @@
"DownloadClientTagHelpText": "השתמש באינדקסר זה רק לסרטים שתואמים לתויות. השאר ריק כדי לחפש את כל הסרטים.",
"RemoveSelectedItemsQueueMessageText": "האם אתה בטוח שברצונך להסיר את {0} פריט {1} מהתור?",
"DeleteConditionMessageText": "האם אתה בטוח שברצונך למחוק את התג '{0}'?",
"DeleteCustomFormatMessageText": "האם אתה בטוח שברצונך למחוק את האינדקס '{0}'?",
"DeleteCustomFormatMessageText": "האם אתה בטוח שברצונך למחוק את האינדקס '{customFormatName}'?",
"DeleteDelayProfileMessageText": "האם אתה בטוח שברצונך למחוק פרופיל עיכוב זה?",
"ResetAPIKeyMessageText": "האם אתה בטוח שברצונך לאפס את מפתח ה- API שלך?",
"DeleteSelectedIndexers": "מחק את אינדקס",

View File

@@ -242,7 +242,7 @@
"DeleteDelayProfileMessageText": "Jeste li sigurni da želite obrisati ovaj profil odgode?",
"DeleteFormatMessageText": "Jeste li sigurni da želite obrisati oznaku formata {0}?",
"DeleteImportListExclusionMessageText": "Jeste li sigurni da želite izbrisati ovu uvoznu listu isključenja?",
"DeleteCustomFormatMessageText": "Jeste li sigurni da želite obrisati oznaku formata {0}?",
"DeleteCustomFormatMessageText": "Jeste li sigurni da želite obrisati oznaku formata {customFormatName}?",
"DeleteConditionMessageText": "Jeste li sigurni da želite obrisati oznaku formata {0}?",
"RemoveSelectedItemQueueMessageText": "Jeste li sigurni da želite izbrisati stavku {0} iz reda?",
"RemoveSelectedItemsQueueMessageText": "Jeste li sigurni da želite izbrisati stavku {0} iz reda?",

View File

@@ -1098,7 +1098,7 @@
"CloneCondition": "Feltétel klónozása",
"DeleteCondition": "Feltétel törlése",
"DeleteConditionMessageText": "Biztosan törölni akarod a '{0}' feltételt?",
"DeleteCustomFormatMessageText": "Biztosan törölni akarod a/az '{0}' egyéni formátumot?",
"DeleteCustomFormatMessageText": "Biztosan törölni akarod a/az '{customFormatName}' egyéni formátumot?",
"RemoveSelectedItemsQueueMessageText": "Biztosan el akar távolítani {0} elemet a várólistáról?",
"RemoveSelectedItemQueueMessageText": "Biztosan el akar távolítani 1 elemet a várólistáról?",
"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",

View File

@@ -1,6 +1,6 @@
{
"AuthBasic": "Dasar (Popup Browser)",
"AuthForm": "Formulir (Halaman Login)",
"AuthForm": "Formulir (Halaman Masuk)",
"Authentication": "Autentikasi",
"AuthenticationMethodHelpText": "Perlukan Nama Pengguna dan Sandi untuk mengakses {appName}",
"About": "Tentang",
@@ -15,7 +15,7 @@
"AllMoviesHiddenDueToFilter": "Semua film disembunyikan karena penyaringan yang diterapkan.",
"Apply": "Terapkan",
"AllMoviesInPathHaveBeenImported": "Semua film di {0} telah diimpor",
"AlreadyInYourLibrary": "Sudah ada di pustaka kamu",
"AlreadyInYourLibrary": "Sudah di pustakamu",
"Always": "Selalu",
"AnalyseVideoFiles": "Analisis berkas video",
"Analytics": "Analitik",
@@ -60,7 +60,7 @@
"Info": "Informasi",
"Movie": "Film",
"Blocklisted": "Daftar Blokir",
"Connections": "Koleksi",
"Connections": "Koneksi",
"Indexer": "Pengindeks",
"Actions": "Tindakan",
"Backup": "Cadangan",
@@ -75,7 +75,7 @@
"Hostname": "Hostname",
"IMDb": "IMDb",
"NetCore": ".NET",
"Connection": "Koleksi",
"Connection": "Koneksi",
"ImportCustomFormat": "Tambahkan Format Khusus",
"ConnectionLost": "Koneksi Terputus",
"CopyToClipboard": "Salin ke Papan Klip",
@@ -99,7 +99,7 @@
"ProxyCheckBadRequestMessage": "Gagal menguji proxy. Kode Status: {statusCode}",
"ProxyCheckFailedToTestMessage": "Gagal menguji proxy: {url}",
"Queue": "Antrean",
"LogFiles": "Berkas Log",
"LogFiles": "File Log",
"Metadata": "Metadata",
"Monitored": "Dimonitor",
"NoChange": "Tidak Ada Perubahan",
@@ -116,5 +116,47 @@
"Profiles": "Profil",
"Disabled": "Nonaktif",
"BlocklistReleaseHelpText": "Mencegah {appName} memperoleh rilis ini secara otomatis",
"ConnectionLostReconnect": "{appName} 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.",
"Sunday": "Minggu",
"ConnectSettings": "Pengaturan Koneksi",
"FormatAgeDays": "hari",
"FormatAgeDay": "hari",
"FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}",
"FormatRuntimeMinutes": "{minutes}mnt",
"Week": "Minggu",
"Monday": "Senin",
"Refresh": "Muat Ulang",
"ApplyChanges": "Terapkan Perubahan",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Konfirmasi sandi baru",
"ConnectSettingsSummary": "Notifikasi, koneksi ke server/pemutar media, dan script khusus",
"CouldNotFindResults": "Tidak ditemukan hasil untuk '{term}'",
"Edit": "Edit",
"Files": "File",
"FormatAgeMinutes": "menit",
"FormatTimeSpanDays": "{days}h {time}",
"FormatShortTimeSpanMinutes": "{minutes} menit",
"History": "Riwayat",
"Unmonitored": "Tidak Dimonitor",
"Yesterday": "Kemarin",
"Connect": "Koneksi",
"AllTitles": "Semua Judul",
"Day": "Hari",
"Month": "Bulan",
"AllFiles": "Semua File",
"AddNew": "Tambah",
"Agenda": "Agenda",
"Search": "Cari",
"AuthenticationRequired": "Autentikasi Diperlukan",
"ClickToChangeReleaseGroup": "Klik untuk mengubah rilis grup",
"AuthenticationRequiredWarning": "Untuk mencegah akses jarak jauh tanpa autentikasi, {appName} kini mewajibkan pengaktifkan autentikasi. Kamu dapat menonaktifkan autentikasi dari jaringan lokal.",
"AudioLanguages": "Bahasa Audio",
"Today": "Hari Ini",
"TotalFileSize": "Jumlah Ukuran File",
"AuthenticationMethod": "Metode Autentikasi",
"AuthenticationMethodHelpTextWarning": "Silakan pilih metode autentikasi yang sah",
"AuthenticationRequiredPasswordHelpTextWarning": "Masukkan sandi baru",
"AuthenticationRequiredUsernameHelpTextWarning": "Masukkan nama pengguna baru",
"AutoRedownloadFailed": "Pengunduhan Ulang Gagal",
"ConnectionLostToBackend": "Koneksi {appName} telah terputus dari backend dan perlu dimuat ulang untuk dipulihkan.",
"Links": "Tautan"
}

View File

@@ -1059,7 +1059,7 @@
"ApplyTagsHelpTextReplace": "Sostituire: Sostituisce le etichette con quelle inserite (non inserire nessuna etichette per eliminarle tutte)",
"DownloadClientTagHelpText": "Usa questo indicizzatore per i film con almeno un tag corrispondente. Lascia in bianco per usarlo con tutti i film.",
"DeleteConditionMessageText": "Sei sicuro di voler eliminare la condizione '{0}'?",
"DeleteCustomFormatMessageText": "Sei sicuro di voler eliminare il formato personalizzato '{0}'?",
"DeleteCustomFormatMessageText": "Sei sicuro di voler eliminare il formato personalizzato '{customFormatName}'?",
"DeleteDelayProfileMessageText": "Sei sicuro di voler cancellare questo profilo di ritardo?",
"DeleteFormatMessageText": "Sei sicuro di voler cancellare il formato etichetta {0} ?",
"DeleteImportListExclusionMessageText": "Sei sicuro di voler cancellare questa lista di esclusioni delle importazioni?",

View File

@@ -1001,7 +1001,7 @@
"RssSyncHelpText": "간격 (분)입니다. 사용하지 않으려면 0으로 설정합니다 (모든 자동 릴리스 잡기가 중지됨).",
"File": "파일",
"DeleteRemotePathMapping": "원격 경로 매핑 편집",
"DeleteCustomFormatMessageText": "인덱서 '{0}'을 (를) 삭제 하시겠습니까?",
"DeleteCustomFormatMessageText": "인덱서 '{customFormatName}'을 (를) 삭제 하시겠습니까?",
"DeleteDelayProfileMessageText": "이 지연 프로필을 삭제하시겠습니까?",
"ResetAPIKeyMessageText": "API 키를 재설정하시겠습니까?",
"DeleteConditionMessageText": "'{0}' 태그를 삭제하시겠습니까?",

View File

@@ -1 +1,15 @@
{}
{
"About": "Par",
"AcceptConfirmationModal": "Apstiprināt Apstiprināšanas Modālu",
"Actions": "Darbības",
"Activity": "Aktivitāte",
"Add": "Pievienot",
"AddAutoTag": "Pievienot Automātisko Tagu",
"AddCondition": "Pievienot Nosacījumu",
"AddCustomFormat": "Pievienot Pielāgotu Formātu",
"AddConditionImplementation": "Pievienot Nosacījumu - {implementationName}",
"AddConnection": "Pievienot Savienojumu",
"AddConnectionImplementation": "Pievienot Savienojumu - {implementationName}",
"AddDelayProfile": "Pievienot Aizkaves Profilu",
"AddDownloadClient": "Pievienot Lejupielādes Klientu"
}

View File

@@ -244,7 +244,7 @@
"PreferredProtocol": "Foretrukket Protokoll",
"Reset": "Tilbakestill",
"DeleteConditionMessageText": "Er du sikker på at du vil slette formattaggen {0}?",
"DeleteCustomFormatMessageText": "Er du sikker på at du vil slette formattaggen {0}?",
"DeleteCustomFormatMessageText": "Er du sikker på at du vil slette formattaggen {customFormatName}?",
"DeleteDelayProfileMessageText": "Er du sikker på at du vil slette denne forsinkelsesprofilen?",
"DeleteFormatMessageText": "Er du sikker på at du vil slette formattaggen {0}?",
"DeleteImportListExclusionMessageText": "Er du sikker på at du vil slette denne ekskluderingen av importlister?",

View File

@@ -58,7 +58,7 @@
"AddNewTmdbIdMessage": "Je kunt ook zoeken met het TMDb id van een film. Bijv. tmdb:71663",
"AddNewMessage": "Het is gemakkelijk om een nieuwe film toe te voegen, begin gewoon met de naam te typen van de film die je wilt toevoegen",
"AddNew": "Nieuwe toevoegen",
"AddExclusion": "Uitzondering(en) Toevoegen",
"AddExclusion": "Uitzondering toevoegen",
"AddMovies": "Film(s) Toevoegen",
"Activity": "Activiteit",
"About": "Over",
@@ -303,7 +303,7 @@
"AuthenticationMethodHelpText": "Gebruikersnaam en wachtwoord nodig voor toegang tot {appName}",
"Authentication": "Authenticatie",
"AppDataDirectory": "AppData folder",
"AddImportExclusionHelpText": "Voorkom dat een film wordt toegevoegd door een lijst",
"AddImportExclusionHelpText": "Voorkom dat film wordt toegevoegd aan {appName} door een lijst",
"AgeWhenGrabbed": "Leeftijd (op moment van ophalen)",
"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.",
"AllowHardcodedSubsHelpText": "Gedetecteerde ingebrande ondertiteling zal automatisch worden gedownload",
@@ -311,7 +311,7 @@
"AlreadyInYourLibrary": "Reeds in uw bibliotheek",
"AllowHardcodedSubs": "Sta Ingebrande Ondertiteling Toe",
"YesCancel": "Ja, Annuleren",
"AddListExclusion": "Toevoegen aan Uitzonderingenlijst",
"AddListExclusion": "Lijst uitzondering toevoegen",
"CleanLibraryLevel": "Bibliotheek Opschonen Niveau",
"DeleteTag": "Verwijder Tag",
"DeleteSelectedMovieFiles": "Verwijder Geselecteerde Filmbestanden",
@@ -760,7 +760,7 @@
"Announced": "Aangekondigd",
"Always": "Altijd",
"AllResultsHiddenFilter": "Alle resultaten zijn verborgen door de toegepaste filter",
"AllMoviesInPathHaveBeenImported": "Alle films in {0} zijn geïmporteerd",
"AllMoviesInPathHaveBeenImported": "Alle films in {path} zijn geïmporteerd",
"AllFiles": "Alle bestanden",
"AfterManualRefresh": "Na handmatig verversen",
"AddToDownloadQueue": "Toegevoegd aan downloadwachtrij",
@@ -1106,7 +1106,7 @@
"DeleteSelectedIndexers": "Verwijder Indexeerder",
"ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?",
"DeleteConditionMessageText": "Bent u zeker dat u de lijst '{0}' wilt verwijderen?",
"DeleteCustomFormatMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
"DeleteCustomFormatMessageText": "Bent u zeker dat u de indexeerder '{customFormatName}' wilt verwijderen?",
"DeleteFormatMessageText": "Weet je zeker dat je formaat tag {0} wilt verwijderen?",
"DeleteImportListExclusionMessageText": "Bent u zeker dat u dit van de uitzonderingenlijst wilt verwijderen?",
"RemoveSelectedItemsQueueMessageText": "Weet je zeker dat je {0} van de wachtrij wilt verwijderen?",
@@ -1132,5 +1132,11 @@
"AddIndexerImplementation": "Indexeerder toevoegen - {implementationName}",
"DeleteQualityProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {name} wilt verwijderen?",
"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"
"AppUpdatedVersion": "{appName} is geüpdatet naar versie '{version}', om de laatste wijzigingen door te voeren moet je mogelijk {appName} herstarten",
"AuthenticationRequired": "Verificatie vereist",
"AddImportList": "Importlijst toevoegen",
"AddImportListImplementation": "Importlijst toevoegen - {implementationName}",
"AudioLanguages": "Audiotalen",
"AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode",
"AuthenticationMethod": "Authenticatiemethode"
}

View File

@@ -1092,7 +1092,7 @@
"DeleteSelectedDownloadClients": "Usuń klienta pobierania",
"DeleteSelectedIndexers": "Usuń indeksator",
"DeleteConditionMessageText": "Czy na pewno chcesz usunąć tag „{0}”?",
"DeleteCustomFormatMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?",
"DeleteCustomFormatMessageText": "Czy na pewno chcesz usunąć indeksator „{customFormatName}”?",
"DeleteDelayProfileMessageText": "Czy na pewno chcesz usunąć ten profil opóźnienia?",
"DeleteFormatMessageText": "Czy na pewno chcesz usunąć tag formatu {0}?",
"DeleteImportListExclusionMessageText": "Czy na pewno chcesz usunąć to wykluczenie listy importu?",

View File

@@ -1112,7 +1112,7 @@
"ApplyTagsHelpTextRemove": "Remover: eliminar as etiquetas adicionadas",
"ApplyTagsHelpTextReplace": "Substituir: mudar as etiquetas pelas adicionadas (deixe em branco para limpar todas as etiquetas)",
"DeleteConditionMessageText": "Tem a certeza de que pretende eliminar a condição '{name}'?",
"DeleteCustomFormatMessageText": "Tem a certeza de que pretende eliminar o formato personalizado '{name}'?",
"DeleteCustomFormatMessageText": "Tem a certeza de que pretende eliminar o formato personalizado '{customFormatName}'?",
"DeleteSelectedDownloadClients": "Eliminar cliente de transferências",
"DeleteSelectedImportLists": "Eliminar lista de importação",
"AddAutoTag": "Adicionar Etiqueta Automática",

View File

@@ -182,7 +182,7 @@
"DownloadClientsSettingsSummary": "Clientes de download, gerenciamento de download e mapeamentos de caminhos remotos",
"DownloadClientSettings": "Configurações do cliente de download",
"DownloadClients": "Clientes de download",
"DownloadClientCheckUnableToCommunicateMessage": "Não é possível se comunicar com {downloadClientName}.",
"DownloadClientCheckUnableToCommunicateMessage": "Não foi possível comunicar com {downloadClientName}. {errorMessage}",
"DownloadClientCheckNoneAvailableMessage": "Nenhum cliente de download está disponível",
"DownloadClient": "Cliente de download",
"DoNotUpgradeAutomatically": "Não atualizar automaticamente",
@@ -292,7 +292,7 @@
"ChmodGroupHelpTextWarning": "Isso só funciona se o usuário que está executando o {appName} for o proprietário do arquivo. É melhor garantir que o cliente de download use o mesmo grupo que o {appName}.",
"ChmodGroupHelpText": "Nome ou ID do grupo. Use a ID para sistemas de arquivos remotos.",
"ChmodGroup": "Grupo chmod",
"ChmodFolderHelpTextWarning": "Isso só funciona se o usuário que está executando o {appName} for o proprietário do arquivo. É melhor garantir que o cliente de download defina as permissões corretamente.",
"ChmodFolderHelpTextWarning": "Isso só funciona se o usuário que executa {appName} for o proprietário do arquivo. É melhor garantir que o cliente de download defina as permissões corretamente.",
"ChmodFolderHelpText": "Octal, aplicado durante a importação/renomeação de pastas e arquivos de mídia (sem bits de execução)",
"ChmodFolder": "Fazer chmod de pasta",
"CheckForFinishedDownloadsInterval": "Verifique o intervalo de downloads concluídos",
@@ -588,7 +588,7 @@
"TimeFormat": "Formato da Hora",
"Time": "Tempo",
"ThisCannotBeCancelled": "Isso não pode ser cancelado uma vez iniciado sem desabilitar todos os seus indexadores.",
"TheLogLevelDefault": "O nível de registro é padronizado como \"Informações\" e pode ser alterado em",
"TheLogLevelDefault": "O nível de registro é padronizado como 'Info' e pode ser alterado em [Configurações Gerais](/settings/general)",
"TestAllLists": "Testar todas as listas",
"TestAllIndexers": "Testar todos os indexadores",
"TestAllClients": "Testar todos os clientes",
@@ -908,7 +908,7 @@
"UpdateSelected": "Atualizar Selecionada",
"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",
"UpdateMechanismHelpText": "Usar o atualizador integrado do {appName} ou um script",
"UpdateMechanismHelpText": "Use o atualizador integrado do {appName} ou um script",
"UpdateCheckUINotWritableMessage": "Não é possível instalar a atualização porque a pasta de IU '{startupFolder}' não pode ser gravada pelo usuário '{userName}'.",
"UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{startupFolder}' está em uma pasta de translocação de aplicativo.",
"UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{startupFolder}' não pode ser gravada pelo usuário '{userName}'.",
@@ -1014,7 +1014,7 @@
"RemoveFromBlocklist": "Remover da lista de bloqueio",
"BlocklistReleases": "Lançamentos na lista de bloqueio",
"RemoveSelectedItems": "Remover itens selecionados",
"IndexerTagHelpText": "Usar este indexador apenas para filmes com pelo menos uma tag correspondente. Deixe em branco para usar com todos os filmes.",
"IndexerTagHelpText": "Use este indexador apenas para filmes com pelo menos uma etiqueta correspondente. Deixe em branco para usar com todos os filmes.",
"RemoveSelectedItem": "Remover item selecionado",
"RemoveFailed": "Falha na remoção",
"RemoveCompleted": "Remoção Concluída",
@@ -1119,7 +1119,7 @@
"DeleteRemotePathMappingMessageText": "Tem certeza de que deseja excluir este mapeamento de caminho remoto?",
"DeleteCondition": "Excluir condição",
"CloneCondition": "Clonar Condição",
"DeleteCustomFormatMessageText": "Tem certeza de que deseja excluir o formato personalizado '{name}'?",
"DeleteCustomFormatMessageText": "Tem certeza de que deseja excluir o formato personalizado '{customFormatName}'?",
"DeleteDelayProfileMessageText": "Tem certeza de que deseja excluir este perfil de atraso?",
"DeleteFormatMessageText": "Tem certeza de que deseja excluir a etiqueta de formato {0} ?",
"RemoveSelectedItemQueueMessageText": "Tem certeza de que deseja remover 1 item da fila?",
@@ -1251,7 +1251,7 @@
"Parse": "Analisar",
"ParseModalErrorParsing": "Erro ao analisar, tente novamente.",
"ParseModalHelpText": "Insira um título de lançamento na entrada acima",
"ParseModalHelpTextDetails": "O {appName} tentará analisar o título e mostrar detalhes sobre ele",
"ParseModalHelpTextDetails": "{appName} tentará analisar o título e mostrar detalhes sobre ele",
"QualitiesLoadError": "Não foi possível carregar qualidades",
"SelectDropdown": "Selecionar...",
"SelectFolderModalTitle": "{modalTitle} - Selecione a Pasta",
@@ -1260,7 +1260,7 @@
"True": "Verdadeiro",
"HealthMessagesInfoBox": "Para saber mais sobre a causa dessas mensagens de verificação de integridade, clique no link da wiki (ícone de livro) no final da linha ou verifique os [logs]({link}). Se tiver dificuldade em interpretar essas mensagens, entre em contato com nosso suporte nos links abaixo.",
"DefaultNameCopiedProfile": "{name} - Cópia",
"InvalidUILanguage": "A interface está configurada com um idioma inválido, corrija-o e salve as configurações",
"InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações",
"AuthenticationMethod": "Método de autenticação",
"AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido",
"AuthenticationRequiredPasswordHelpTextWarning": "Digite uma nova senha",
@@ -1334,5 +1334,17 @@
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Procure e tente baixar automaticamente uma versão diferente quando a versão com falha for obtida pela pesquisa interativa",
"AutoRedownloadFailed": "Falha no Novo Download",
"QueueFilterHasNoItems": "O filtro de fila selecionado não possui itens",
"EnableProfile": "Habilitar Perfil"
"EnableProfile": "Habilitar Perfil",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirme a nova senha",
"ClearBlocklist": "Limpar lista de bloqueio",
"ClearBlocklistMessageText": "Tem certeza de que deseja limpar todos os itens da lista de bloqueio?",
"FailedToFetchUpdates": "Falha ao buscar atualizações",
"FailedToUpdateSettings": "Falha ao atualizar as configurações",
"LogFilesLocation": "Os arquivos de log estão localizados em: {location}",
"PasswordConfirmation": "Confirmação Da Senha",
"PackageVersionInfo": "{packageVersion} por {packageAuthor}",
"PreviouslyInstalled": "Instalado anteriormente",
"UpdaterLogFiles": "Arquivos de log do atualizador",
"InteractiveSearchModalHeader": "Pesquisa Interativa",
"WhySearchesCouldBeFailing": "Clique aqui para descobrir por que as pesquisas podem estar falhando"
}

View File

@@ -1014,7 +1014,7 @@
"DeleteFormatMessageText": "Sigur doriți să ștergeți eticheta format {0}?",
"DeleteImportListExclusionMessageText": "Sigur doriți să ștergeți această excludere din lista de importuri?",
"DeleteConditionMessageText": "Sigur doriți să ștergeți eticheta „{0}”?",
"DeleteCustomFormatMessageText": "Sigur doriți să ștergeți indexatorul „{0}”?",
"DeleteCustomFormatMessageText": "Sigur doriți să ștergeți indexatorul „{customFormatName}”?",
"ApplyTagsHelpTextAdd": "Adăugare: adăugați etichetele la lista de etichete existentă",
"ApplyTagsHelpTextHowToApplyIndexers": "Cum se aplică etichete indexatoarelor selectate",
"ApplyTagsHelpTextRemove": "Eliminați: eliminați etichetele introduse",

View File

@@ -1107,7 +1107,7 @@
"ApplyChanges": "Применить изменения",
"DeleteSelectedDownloadClients": "Удалить клиент(ы) загрузки",
"EditSelectedImportLists": "Редактировать выбранные списки импорта",
"DeleteCustomFormatMessageText": "Вы уверены, что хотите удалить пользовательский формат '{name}'?",
"DeleteCustomFormatMessageText": "Вы уверены, что хотите удалить пользовательский формат '{customFormatName}'?",
"DeleteDelayProfileMessageText": "Вы уверены, что хотите удалить этот профиль задержки?",
"DeleteFormatMessageText": "Вы уверены, что хотите удалить тэг {0} ?",
"DeleteImportListExclusionMessageText": "Вы уверены, что хотите удалить это исключение из списка импорта?",

View File

@@ -1004,7 +1004,7 @@
"EditMovies": "แก้ไขภาพยนตร์",
"DeleteRemotePathMapping": "แก้ไขการแมปเส้นทางระยะไกล",
"ApplyTagsHelpTextReplace": "แทนที่: แทนที่แท็กด้วยแท็กที่ป้อน (ป้อนไม่มีแท็กเพื่อล้างแท็กทั้งหมด)",
"DeleteCustomFormatMessageText": "แน่ใจไหมว่าต้องการลบตัวสร้างดัชนี \"{0}\"",
"DeleteCustomFormatMessageText": "แน่ใจไหมว่าต้องการลบตัวสร้างดัชนี \"{customFormatName}\"",
"RemoveSelectedItemQueueMessageText": "แน่ใจไหมว่าต้องการนำ {0} ออกจากคิว",
"RemoveSelectedItemsQueueMessageText": "แน่ใจไหมว่าต้องการนำ {0} ออกจากคิว",
"ResetAPIKeyMessageText": "แน่ใจไหมว่าต้องการรีเซ็ตคีย์ API",

View File

@@ -1092,7 +1092,7 @@
"ShowCinemaReleaseHelpText": "Показати дату випуску під плакатом",
"EditMovies": "Редагувати фільм",
"DeleteRemotePathMapping": "Додати віддалений шлях",
"DeleteCustomFormatMessageText": "Ви впевнені, що хочете видалити тег {0} ?",
"DeleteCustomFormatMessageText": "Ви впевнені, що хочете видалити тег {customFormatName} ?",
"DeleteDelayProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?",
"DeleteFormatMessageText": "Ви впевнені, що хочете видалити тег {0} ?",
"DeleteImportListExclusionMessageText": "Ви впевнені, що хочете видалити це виключення зі списку імпорту?",
@@ -1155,5 +1155,7 @@
"BlocklistLoadError": "Не вдалося завантажити список блокувань",
"BlocklistReleaseHelpText": "Забороняє {appName} знову автоматично захопити цей випуск",
"DelayingDownloadUntil": "Завантаження відкладається до {0} о {1}",
"DeletedReasonUpgrade": "Файл видалено, щоб імпортувати оновлення"
"DeletedReasonUpgrade": "Файл видалено, щоб імпортувати оновлення",
"AutoRedownloadFailed": "Помилка завантаження",
"InteractiveSearchModalHeader": "Інтерактивний пошук"
}

View File

@@ -1,6 +1,6 @@
{
"About": "关于",
"DownloadClientCheckUnableToCommunicateMessage": "无法与{downloadClientName}进行通讯",
"DownloadClientCheckUnableToCommunicateMessage": "无法与{downloadClientName}进行通讯{errorMessage}",
"DownloadClientCheckNoneAvailableMessage": "无可用的下载客户端",
"DownloadClient": "下载客户端",
"Donations": "赞助",
@@ -70,7 +70,7 @@
"AuthForm": "表单(登陆页面)",
"AuthBasic": "基础(浏览器弹出对话框)",
"AppDataDirectory": "AppData目录",
"ApiKey": "API Key",
"ApiKey": "接口密钥 (API Key)",
"Backups": "历史备份",
"BindAddress": "绑定地址",
"BranchUpdate": "更新{appName}的分支",
@@ -131,7 +131,7 @@
"UnableToLoadUISettings": "无法加载UI设置",
"UnableToLoadTheCalendar": "无法加载日历",
"UnableToLoadTags": "无法加载标签",
"ShowSizeOnDisk": "显示用空间",
"ShowSizeOnDisk": "显示用空间",
"ShowRatings": "显示评分",
"ShowPath": "显示路径",
"ShownClickToHide": "显示,点击隐藏",
@@ -394,8 +394,8 @@
"Ended": "已完结",
"Error": "错误",
"EnableSslHelpText": " 重启生效",
"EnableSSL": "启用SSL",
"EnableRSS": "启用RSS",
"EnableSSL": "启用 SSL",
"EnableRSS": "启用 RSS",
"EnableInteractiveSearchHelpTextWarning": "该索引器不支持搜索",
"EnableInteractiveSearchHelpText": "当手动搜索启用时使用",
"EnableInteractiveSearch": "启用手动搜索",
@@ -647,9 +647,9 @@
"DoNotUpgradeAutomatically": "不要自动升级",
"DoneEditingGroups": "完成编辑组",
"DetailedProgressBarHelpText": "在进度条上显示文本",
"DetailedProgressBar": "详细进度条",
"DestinationRelativePath": "目相对路径",
"DestinationPath": "目路径",
"DetailedProgressBar": "详细进度条",
"DestinationRelativePath": "目相对路径",
"DestinationPath": "目路径",
"DeleteRestrictionHelpText": "确定删除该限制?",
"DeleteRestriction": "删除限制",
"DelayProfile": "延时配置",
@@ -710,7 +710,7 @@
"TagIsNotUsedAndCanBeDeleted": "标签未被使用,可删除",
"LastUsed": "上次使用",
"YesMoveFiles": "是,移动文件",
"UpdateMechanismHelpText": "使用 {appName} 内置更新程序或脚本",
"UpdateMechanismHelpText": "使用 {appName} 内置更新程序或脚本",
"SystemTimeCheckMessage": "系统时间相差超过1天。在纠正时间之前计划的任务可能无法正确运行",
"Table": "表格",
"WaitingToImport": "等待导入",
@@ -735,7 +735,7 @@
"ReleaseRejected": "发布被拒绝",
"UnmappedFilesOnly": "仅限未映射的文件",
"Quality": "媒体质量",
"TheLogLevelDefault": "默认的日志等级为Info”,可以被修改在",
"TheLogLevelDefault": "默认的日志等级为 \"Info\", 可以在 [常规设置] 中修改 (/settings/general)",
"RestartReloadNote": "注意:{appName}将在恢复过程中自动重启并重新加载UI。",
"RequiredRestrictionPlaceHolder": "添加新限制",
"PhysicalRelease": "碟片版发布日期",
@@ -790,7 +790,7 @@
"ForMoreInformationOnTheIndividualDownloadClients": "若需要查看有关下载客户端的详细信息,请点击“更多信息”按钮。",
"Crew": "工作人员",
"ChmodGroupHelpTextWarning": "这只在运行{appName}的用户是文件所有者的情况下才有效。最好确保下载客户端使用与{appName}相同的组。",
"ChmodFolderHelpTextWarning": "这只在运行{appName}的用户是文件所有者的情况下才有效。最好确保下载客户端正确设置权限。",
"ChmodFolderHelpTextWarning": "仅当运行 {appName} 程序的用户是文件所有者的情况下才有效。最好确保下载客户端正确设置权限。",
"Runtime": "时长",
"SettingsRuntimeFormat": "时长格式",
"AgeWhenGrabbed": "发布时长",
@@ -982,7 +982,7 @@
"DownloadClientCheckDownloadingToRoot": "下载客户端{downloadClientName}将下载内容放在根文件夹{path}中。您不应该下载到根文件夹。",
"DeleteFileLabel": "删除 {0} 电影文件",
"ImportListMultipleMissingRoots": "导入列表中缺失多个根目录文件夹",
"ImportListMissingRoot": "在导入列表中缺少根目录文件夹",
"ImportListMissingRoot": "在导入列表中缺少根目录文件夹: {rootFolderInfo}",
"BypassDelayIfHighestQuality": "如果达到最高质量,则跳过",
"NotificationTriggersHelpText": "选择触发此通知的事件",
"From": "来自",
@@ -1004,7 +1004,7 @@
"RemoveFromBlocklist": "从黑名单中移除",
"Blocklisted": "黑名单",
"BlocklistReleases": "黑名单版本",
"IndexerTagHelpText": "仅对至少有一个匹配标的电影使用此索引器。留空则适用于所有电影。",
"IndexerTagHelpText": "仅对至少有一个匹配标的电影使用此索引器。留空则适用于所有电影。",
"RemotePathMappingCheckFileRemoved": "文件{path} 在处理的过程中被部分删除。",
"RemotePathMappingCheckFilesGenericPermissions": "下载{1}中客户端{0}报告的文件,但{appName}无法看到此目录。您可能需要调整文件夹的权限。",
"RemotePathMappingCheckGenericPermissions": "下载客户端{downloadClientName}将下载放置在{path}中,但 {appName} 无法看到此目录。您可能需要调整文件夹的权限。",
@@ -1105,7 +1105,7 @@
"DeleteCondition": "删除条件",
"DeleteConditionMessageText": "你确定要删除条件 “{name}” 吗?",
"DeleteDelayProfileMessageText": "你确定要删除此延迟配置吗?",
"DeleteCustomFormatMessageText": "您确定要删除自定义格式“{name}”吗?",
"DeleteCustomFormatMessageText": "您确定要删除自定义格式“{customFormatName}”吗?",
"DeleteRemotePathMappingMessageText": "你确定要删除此远程路径映射吗?",
"ImportScriptPath": "导入脚本路径",
"ImportUsingScript": "使用脚本导入",
@@ -1192,7 +1192,7 @@
"DeleteImportList": "删除导入的列表",
"DisabledForLocalAddresses": "在本地地址上禁用",
"AuthenticationRequired": "需要身份验证",
"AuthenticationRequiredHelpText": "更改身份验证的请求。除非了解风险,否则请勿更改。",
"AuthenticationRequiredHelpText": "修改哪些请求需要认证。除非了解其中的风险,否则不要更改。",
"AutomaticUpdatesDisabledDocker": "不支持在使用 Docker 容器时直接升级。你需要升级 {appName} 容器镜像或使用脚本(script)",
"BypassDelayIfAboveCustomFormatScore": "若高于自定义格式分数则绕过",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "最小自定义格式分数",
@@ -1210,7 +1210,7 @@
"AuthenticationRequiredUsernameHelpTextWarning": "请输入新用户名",
"BypassDelayIfAboveCustomFormatScoreHelpText": "当发布版本的评分高于配置的最小自定义格式评分时,跳过延时",
"BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "绕过首选协议延迟所需的最小自定义格式分数",
"ParseModalHelpTextDetails": "{appName}将尝试解析标题并向您显示有关它的详细信息",
"ParseModalHelpTextDetails": "{appName} 将尝试解析标题并向您显示有关详情",
"AppUpdated": "{appName} 升级",
"DelayingDownloadUntil": "将下载推迟到 {date} 的 {time}",
"DeletedReasonManual": "文件已通过 UI 删除",
@@ -1236,7 +1236,7 @@
"FullColorEventsHelpText": "改变样式,用状态颜色为整个事件着色,而不仅仅是左边缘。不适用于议程",
"HistoryLoadError": "无法加载历史记录",
"InfoUrl": "信息 URL",
"InvalidUILanguage": "您的UI设置的语言无效请纠正它并保存设置",
"InvalidUILanguage": "语言",
"LanguagesLoadError": "无法加载语言",
"MovieDownloadFailedTooltip": "电影下载失败",
"MovieDownloadIgnoredTooltip": "忽略电影下载",
@@ -1277,9 +1277,9 @@
"OrganizeLoadError": "载入预览时出错",
"OrganizeModalHeader": "整理并重命名",
"OrganizeNamingPattern": "命名规则: ` {standardMovieFormat}`",
"OrganizeNothingToRename": "重命名成功!已没有需要重命名的文件。",
"OrganizeNothingToRename": "成功!我的工作完成了,没有文件需要重命名。",
"OrganizeRelativePaths": "所有路径都相对于: `{path}`",
"OrganizeRenamingDisabled": "重命名已禁用,无需重命名",
"OrganizeRenamingDisabled": "重命名功能已禁用,无需重命名任何文件",
"OverrideAndAddToDownloadQueue": "覆盖并添加到下载队列",
"OverrideGrabModalTitle": "覆盖并抓取 - {title}",
"OverrideGrabNoQuality": "必须选择质量",
@@ -1333,5 +1333,18 @@
"AutoRedownloadFailed": "重新下载失败",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "当从交互式搜索中获取失败的版本时,自动搜索并尝试下载其他版本",
"AutoRedownloadFailedFromInteractiveSearch": "从交互式搜索中重新下载失败",
"QueueFilterHasNoItems": "选定的队列过滤器没有项目"
"QueueFilterHasNoItems": "选定的队列过滤器没有项目",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "确认新密码",
"ClearBlocklist": "清空黑名单",
"ClearBlocklistMessageText": "你确定要将黑名单中的所有项目清空吗?",
"PasswordConfirmation": "确认密码",
"InteractiveSearchModalHeader": "交互式搜索",
"UpdaterLogFiles": "更新器日志文件",
"EnableProfile": "启用配置",
"FailedToFetchUpdates": "获取更新失败",
"FailedToUpdateSettings": "更新配置失败",
"WhySearchesCouldBeFailing": "单击此处了解搜索失败的原因",
"LogFilesLocation": "日志文件位于: {location}",
"PackageVersionInfo": "{packageVersion} 由 {packageAuthor} 制作",
"PreviouslyInstalled": "上次安装"
}

View File

@@ -10,6 +10,7 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
DolbyVision,
DolbyVisionHdr10,
DolbyVisionSdr,
DolbyVisionHlg
DolbyVisionHlg,
DolbyVisionHdr10Plus
}
}

View File

@@ -320,6 +320,8 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
return "DV";
case HdrFormat.DolbyVisionHdr10:
return "DV HDR10";
case HdrFormat.DolbyVisionHdr10Plus:
return "DV HDR10Plus";
case HdrFormat.DolbyVisionHlg:
return "DV HLG";
case HdrFormat.DolbyVisionSdr:

View File

@@ -22,7 +22,7 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
private readonly List<FFProbePixelFormat> _pixelFormats;
public const int MINIMUM_MEDIA_INFO_SCHEMA_REVISION = 8;
public const int CURRENT_MEDIA_INFO_SCHEMA_REVISION = 10;
public const int CURRENT_MEDIA_INFO_SCHEMA_REVISION = 11;
private static readonly string[] ValidHdrColourPrimaries = { "bt2020" };
private static readonly string[] HlgTransferFunctions = { "bt2020-10", "arib-std-b67" };
@@ -188,12 +188,14 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
if (TryGetSideData<DoviConfigurationRecordSideData>(sideData, out var dovi))
{
var hasHdr10Plus = TryGetSideData<HdrDynamicMetadataSpmte2094>(sideData, out _);
return dovi.DvBlSignalCompatibilityId switch
{
1 => HdrFormat.DolbyVisionHdr10,
1 => hasHdr10Plus ? HdrFormat.DolbyVisionHdr10Plus : HdrFormat.DolbyVisionHdr10,
2 => HdrFormat.DolbyVisionSdr,
4 => HdrFormat.DolbyVisionHlg,
6 => HdrFormat.DolbyVisionHdr10,
6 => hasHdr10Plus ? HdrFormat.DolbyVisionHdr10Plus : HdrFormat.DolbyVisionHdr10,
_ => HdrFormat.DolbyVision
};
}

View File

@@ -19,7 +19,12 @@ namespace NzbDrone.Core.Movies
public bool ShouldRefresh(MovieMetadata movie)
{
// return false;
if (movie == null)
{
_logger.Warn("Movie metadata does not exist, should not be refreshed.");
return false;
}
if (movie.LastInfoSync < DateTime.UtcNow.AddDays(-180))
{
_logger.Trace("Movie {0} last updated more than 180 days ago, should refresh.", movie.Title);

View File

@@ -336,14 +336,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

View File

@@ -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");
}
}

View File

@@ -442,7 +442,7 @@ namespace NzbDrone.Core.Notifications.Discord
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
};
if (Settings.ManualInteractionFields.Contains((int)DiscordGrabFieldType.Poster))
if (Settings.ManualInteractionFields.Contains((int)DiscordManualInteractionFieldType.Poster))
{
embed.Thumbnail = new DiscordImage
{
@@ -450,7 +450,7 @@ namespace NzbDrone.Core.Notifications.Discord
};
}
if (Settings.ManualInteractionFields.Contains((int)DiscordGrabFieldType.Fanart))
if (Settings.ManualInteractionFields.Contains((int)DiscordManualInteractionFieldType.Fanart))
{
embed.Image = new DiscordImage
{

View File

@@ -19,12 +19,54 @@ namespace NzbDrone.Core.Notifications.Discord
public DiscordSettings()
{
// Set Default Fields
GrabFields = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
ImportFields = new[] { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12 };
ManualInteractionFields = new[] { 0, 1, 2, 3, 5, 6, 7, 8, 9 };
GrabFields = new[]
{
(int)DiscordGrabFieldType.Overview,
(int)DiscordGrabFieldType.Rating,
(int)DiscordGrabFieldType.Genres,
(int)DiscordGrabFieldType.Quality,
(int)DiscordGrabFieldType.Group,
(int)DiscordGrabFieldType.Size,
(int)DiscordGrabFieldType.Links,
(int)DiscordGrabFieldType.Release,
(int)DiscordGrabFieldType.Poster,
(int)DiscordGrabFieldType.Fanart,
(int)DiscordGrabFieldType.Indexer,
(int)DiscordGrabFieldType.CustomFormats,
(int)DiscordGrabFieldType.CustomFormatScore
};
ImportFields = new[]
{
(int)DiscordImportFieldType.Overview,
(int)DiscordImportFieldType.Rating,
(int)DiscordImportFieldType.Genres,
(int)DiscordImportFieldType.Quality,
(int)DiscordImportFieldType.Codecs,
(int)DiscordImportFieldType.Group,
(int)DiscordImportFieldType.Size,
(int)DiscordImportFieldType.Languages,
(int)DiscordImportFieldType.Subtitles,
(int)DiscordImportFieldType.Links,
(int)DiscordImportFieldType.Release,
(int)DiscordImportFieldType.Poster,
(int)DiscordImportFieldType.Fanart
};
ManualInteractionFields = new[]
{
(int)DiscordManualInteractionFieldType.Overview,
(int)DiscordManualInteractionFieldType.Rating,
(int)DiscordManualInteractionFieldType.Genres,
(int)DiscordManualInteractionFieldType.Quality,
(int)DiscordManualInteractionFieldType.Group,
(int)DiscordManualInteractionFieldType.Size,
(int)DiscordManualInteractionFieldType.Links,
(int)DiscordManualInteractionFieldType.DownloadTitle,
(int)DiscordManualInteractionFieldType.Poster,
(int)DiscordManualInteractionFieldType.Fanart
};
}
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; }
@@ -38,13 +80,13 @@ namespace NzbDrone.Core.Notifications.Discord
[FieldDefinition(3, Label = "Author", Advanced = true, HelpText = "Override the embed author that shows for this notification, Blank is instance 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<int> GrabFields { get; set; }
[FieldDefinition(5, Label = "On Import Fields", Advanced = true, SelectOptions = typeof(DiscordImportFieldType), HelpText = "Change the fields that are passed for this 'on import' notification", Type = FieldType.TagSelect)]
[FieldDefinition(5, Label = "On Import Fields", Advanced = true, SelectOptions = typeof(DiscordImportFieldType), HelpText = "Change the fields that are passed for this 'on import' notification", Type = FieldType.Select)]
public IEnumerable<int> ImportFields { get; set; }
[FieldDefinition(6, Label = "On Manual Interaction Fields", Advanced = true, SelectOptions = typeof(DiscordManualInteractionFieldType), HelpText = "Change the fields that are passed for this 'on manual interaction' notification", Type = FieldType.TagSelect)]
[FieldDefinition(6, Label = "On Manual Interaction Fields", Advanced = true, SelectOptions = typeof(DiscordManualInteractionFieldType), HelpText = "Change the fields that are passed for this 'on manual interaction' notification", Type = FieldType.Select)]
public IEnumerable<int> ManualInteractionFields { get; set; }
public NzbDroneValidationResult Validate()

View File

@@ -8,10 +8,16 @@ namespace NzbDrone.Core.Notifications.Trakt.Resource
[JsonProperty(PropertyName = "collected_at")]
public DateTime CollectedAt { get; set; }
public string Resolution { get; set; }
public string Hdr { get; set; }
[JsonProperty(PropertyName = "audio_channels")]
public string AudioChannels { get; set; }
public string Audio { get; set; }
[JsonProperty(PropertyName = "media_type")]
public string MediaType { get; set; }
[JsonProperty(PropertyName = "3d")]
public bool Is3D { get; set; }
}
}

View File

@@ -154,6 +154,7 @@ namespace NzbDrone.Core.Notifications.Trakt
};
var traktResolution = MapResolution(movieFile.Quality.Quality.Resolution, movieFile.MediaInfo?.ScanType);
var hdr = MapHdr(movieFile);
var mediaType = MapMediaType(movieFile.Quality.Quality.Source);
var audio = MapAudio(movieFile);
var audioChannels = MapAudioChannels(movieFile);
@@ -164,9 +165,11 @@ namespace NzbDrone.Core.Notifications.Trakt
Year = movie.Year,
CollectedAt = DateTime.Now,
Resolution = traktResolution,
Hdr = hdr,
MediaType = mediaType,
AudioChannels = audioChannels,
Audio = audio,
Is3D = movieFile.MediaInfo?.VideoMultiViewCount > 1,
Ids = new TraktMovieIdsResource
{
Tmdb = movie.MovieMetadata.Value.TmdbId,
@@ -200,119 +203,76 @@ namespace NzbDrone.Core.Notifications.Trakt
private string MapMediaType(QualitySource source)
{
var traktSource = string.Empty;
switch (source)
var traktSource = source switch
{
case QualitySource.BLURAY:
traktSource = "bluray";
break;
case QualitySource.WEBDL:
traktSource = "digital";
break;
case QualitySource.WEBRIP:
traktSource = "digital";
break;
case QualitySource.DVD:
traktSource = "dvd";
break;
case QualitySource.TV:
traktSource = "dvd";
break;
}
QualitySource.BLURAY => "bluray",
QualitySource.WEBDL => "digital",
QualitySource.WEBRIP => "digital",
QualitySource.DVD => "dvd",
QualitySource.TV => "dvd",
_ => string.Empty
};
return traktSource;
}
private string MapResolution(int resolution, string scanType)
{
var traktResolution = string.Empty;
var scanIdentifier = scanType.IsNotNullOrWhiteSpace() && TraktInterlacedTypes.InterlacedTypes.Contains(scanType) ? "i" : "p";
var scanIdentifier = scanType.IsNotNullOrWhiteSpace() && TraktInterlacedTypes.interlacedTypes.Contains(scanType) ? "i" : "p";
switch (resolution)
var traktResolution = resolution switch
{
case 2160:
traktResolution = "uhd_4k";
break;
case 1080:
traktResolution = $"hd_1080{scanIdentifier}";
break;
case 720:
traktResolution = "hd_720p";
break;
case 576:
traktResolution = $"sd_576{scanIdentifier}";
break;
case 480:
traktResolution = $"sd_480{scanIdentifier}";
break;
}
2160 => "uhd_4k",
1080 => $"hd_1080{scanIdentifier}",
720 => "hd_720p",
576 => $"sd_576{scanIdentifier}",
480 => $"sd_480{scanIdentifier}",
_ => string.Empty
};
return traktResolution;
}
private string MapHdr(MovieFile movieFile)
{
var traktHdr = movieFile.MediaInfo?.VideoHdrFormat switch
{
HdrFormat.DolbyVision or HdrFormat.DolbyVisionSdr => "dolby_vision",
HdrFormat.Hdr10 or HdrFormat.DolbyVisionHdr10 => "hdr10",
HdrFormat.Hdr10Plus or HdrFormat.DolbyVisionHdr10Plus => "hdr10_plus",
HdrFormat.Hlg10 or HdrFormat.DolbyVisionHlg => "hlg",
_ => null
};
return traktHdr;
}
private string MapAudio(MovieFile movieFile)
{
var traktAudioFormat = string.Empty;
var audioCodec = movieFile.MediaInfo != null ? MediaInfoFormatter.FormatAudioCodec(movieFile.MediaInfo, movieFile.SceneName) : string.Empty;
switch (audioCodec)
var traktAudioFormat = audioCodec switch
{
case "AC3":
traktAudioFormat = "dolby_digital";
break;
case "EAC3":
traktAudioFormat = "dolby_digital_plus";
break;
case "TrueHD":
traktAudioFormat = "dolby_truehd";
break;
case "EAC3 Atmos":
traktAudioFormat = "dolby_digital_plus_atmos";
break;
case "TrueHD Atmos":
traktAudioFormat = "dolby_atmos";
break;
case "DTS":
case "DTS-ES":
traktAudioFormat = "dts";
break;
case "DTS-HD MA":
traktAudioFormat = "dts_ma";
break;
case "DTS-HD HRA":
traktAudioFormat = "dts_hr";
break;
case "DTS-X":
traktAudioFormat = "dts_x";
break;
case "MP3":
traktAudioFormat = "mp3";
break;
case "MP2":
traktAudioFormat = "mp2";
break;
case "Vorbis":
traktAudioFormat = "ogg";
break;
case "WMA":
traktAudioFormat = "wma";
break;
case "AAC":
traktAudioFormat = "aac";
break;
case "PCM":
traktAudioFormat = "lpcm";
break;
case "FLAC":
traktAudioFormat = "flac";
break;
case "Opus":
traktAudioFormat = "ogg_opus";
break;
}
"AC3" => "dolby_digital",
"EAC3" => "dolby_digital_plus",
"TrueHD" => "dolby_truehd",
"EAC3 Atmos" => "dolby_digital_plus_atmos",
"TrueHD Atmos" => "dolby_atmos",
"DTS" => "dts",
"DTS-ES" => "dts",
"DTS-HD MA" => "dts_ma",
"DTS-HD HRA" => "dts_hr",
"DTS-X" => "dts_x",
"MP3" => "mp3",
"MP2" => "mp2",
"Vorbis" => "ogg",
"WMA" => "wma",
"AAC" => "aac",
"PCM" => "lpcm",
"FLAC" => "flac",
"Opus" => "ogg_opus",
_ => string.Empty
};
return traktAudioFormat;
}

View File

@@ -5,16 +5,9 @@ namespace NzbDrone.Core.Notifications.Trakt
{
public static class TraktInterlacedTypes
{
private static HashSet<string> _interlacedTypes;
static TraktInterlacedTypes()
public static readonly HashSet<string> InterlacedTypes = new (StringComparer.OrdinalIgnoreCase)
{
_interlacedTypes = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
"Interlaced", "MBAFF", "PAFF"
};
}
public static HashSet<string> interlacedTypes => _interlacedTypes;
"Interlaced", "MBAFF", "PAFF"
};
}
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Net.Http;
using NLog;
using NzbDrone.Common.Extensions;
@@ -76,6 +77,7 @@ namespace NzbDrone.Core.Notifications.Trakt
{
var request = new HttpRequestBuilder(RenewUri)
.AddQueryParam("refresh_token", refreshToken)
.WithRateLimit(2)
.Build();
return _httpClient.Get<TraktAuthRefreshResource>(request)?.Resource ?? null;
@@ -85,6 +87,7 @@ namespace NzbDrone.Core.Notifications.Trakt
{
var request = new HttpRequestBuilder(URL).Resource(resource).Build();
request.RateLimit = TimeSpan.FromSeconds(2);
request.Headers.Accept = HttpAccept.Json.Value;
request.Method = method;

View File

@@ -360,7 +360,7 @@ namespace NzbDrone.Core.Organizer
new Dictionary<string, int>(FileNameBuilderTokenEqualityComparer.Instance)
{
{ MediaInfoVideoDynamicRangeToken, 5 },
{ MediaInfoVideoDynamicRangeTypeToken, 10 }
{ MediaInfoVideoDynamicRangeTypeToken, 11 }
};
private void AddMediaInfoTokens(Dictionary<string, Func<TokenMatch, string>> tokenHandlers, MovieFile movieFile)

View File

@@ -7,7 +7,7 @@
<PackageReference Include="Diacritical.Net" Version="1.0.4" />
<PackageReference Include="Equ" Version="2.3.0" />
<PackageReference Include="MailKit" Version="3.6.0" />
<PackageReference Include="Npgsql" Version="7.0.4" />
<PackageReference Include="Npgsql" Version="7.0.6" />
<PackageReference Include="Servarr.FFMpegCore" Version="4.7.0-26" />
<PackageReference Include="Servarr.FFprobe" Version="5.1.4.112" />
<PackageReference Include="System.Memory" Version="4.5.5" />
@@ -24,7 +24,7 @@
<PackageReference Include="NLog" Version="5.2.3" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="MonoTorrent" Version="2.0.7" />
<PackageReference Include="System.Text.Json" Version="6.0.8" />
<PackageReference Include="System.Text.Json" Version="6.0.9" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />

View File

@@ -7,7 +7,7 @@
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.5.0" />
<PackageReference Include="DryIoc.dll" Version="5.4.1" />
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -4,7 +4,7 @@
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.21" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.25" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />

View File

@@ -4,7 +4,7 @@
<TargetFrameworks>net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.1" />
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
<PackageReference Include="NLog" Version="5.2.3" />
</ItemGroup>

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic;
using NzbDrone.Core.ImportLists;
using NzbDrone.Core.Movies;
namespace Radarr.Api.V3.ImportLists
{
@@ -9,6 +10,7 @@ namespace Radarr.Api.V3.ImportLists
public bool? EnableAuto { get; set; }
public string RootFolderPath { get; set; }
public int? QualityProfileId { get; set; }
public MovieStatusType? MinimumAvailability { get; set; }
}
public class ImportListBulkResourceMapper : ProviderBulkResourceMapper<ImportListBulkResource, ImportListDefinition>
@@ -26,6 +28,7 @@ namespace Radarr.Api.V3.ImportLists
existing.EnableAuto = resource.EnableAuto ?? existing.EnableAuto;
existing.RootFolderPath = resource.RootFolderPath ?? existing.RootFolderPath;
existing.QualityProfileId = resource.QualityProfileId ?? existing.QualityProfileId;
existing.MinimumAvailability = resource.MinimumAvailability ?? existing.MinimumAvailability;
});
return existingDefinitions;

View File

@@ -214,7 +214,15 @@ namespace Radarr.Api.V3.Movies
};
}
translations.TryGetValue(movie.Id, out var translation);
if (!translations.TryGetValue(movie.Id, out var translation))
{
translation = new MovieTranslation
{
Title = movie.Title,
Language = Language.English
};
}
return translation;
}

View File

@@ -10094,6 +10094,9 @@
"type": "integer",
"format": "int32",
"nullable": true
},
"minimumAvailability": {
"$ref": "#/components/schemas/MovieStatusType"
}
},
"additionalProperties": false

View File

@@ -1207,10 +1207,10 @@
resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
"@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"