1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-05 13:21:25 -05:00

Compare commits

...

36 Commits

Author SHA1 Message Date
Mark McDowall
6f23c465ee Don't send session information to Sentry
(cherry picked from commit fae24e98fb9230c2f3701caef457332952c6723f)
2024-12-28 03:32:11 +02:00
Bogdan
af60cca9ae Fixed: Advanced settings for Metadata consumers 2024-12-23 12:15:04 +02:00
Mark McDowall
d34d23a052 Fixed: Movies updated during Import List Sync not reflected in the UI
(cherry picked from commit 1c30ecd66dd0fd1dafaf9ab0e41a11a54eaac132)

Closes #10794
2024-12-23 12:08:25 +02:00
Bogdan
0a0da42543 Bump version to 5.17.1 2024-12-22 13:23:52 +02:00
Bogdan
e5419f6f06 Bump System.Memory
Closes #10791
2024-12-21 11:20:28 +02:00
Bogdan
88d9c08f1a Bump MailKit to 4.8.0 and Microsoft.Data.SqlClient to 2.1.7
Closes #10790
2024-12-21 11:15:14 +02:00
Bogdan
6b4259757c Add test for do not prefer repacks/propers 2024-12-20 20:33:18 +02:00
Mark McDowall
f1d7c56d94 Fixed: Custom Format score bypassing upgrades not being allowed
(cherry picked from commit ebe23104d4b29a3c900a982fb84e75c27ed531ab)

Co-authored-by: CeruleanRed <toni.suta@gmail.com>
2024-12-20 20:33:18 +02:00
Mark McDowall
c81b2e80ee Convert MediaInfo to TypeScript
(cherry picked from commit 4e4bf3507f20c0f8581c66804f8ef406c41952d8)

Closes #10753
2024-12-20 15:37:16 +02:00
Mark McDowall
5efefd804b Upgrade @typescript-eslint packages to 8.181.1
(cherry picked from commit ed10b63fa0c161cac7e0a2084e53785ab1798208)
2024-12-17 13:15:06 +02:00
Mark McDowall
38f9543526 Upgrade Font Awesome to 6.7.1
(cherry picked from commit 016b5718386593c030f14fcac307c93ee1ceeca6)
2024-12-17 13:11:07 +02:00
Mark McDowall
aae68e681e Upgrade babel to 7.26.0
(cherry picked from commit bfcd017012730c97eb587ae2d2e91f72ee7a1de3)
2024-12-17 13:08:36 +02:00
Bogdan
1d21bbf78f Bump version to 5.17.0 2024-12-16 20:24:54 +02:00
Stevie Robinson
99c3c8ce5b Replace URLs in translations with tokens
(cherry picked from commit 98d60e1a8e9abce6b31b3cdd745eff0fed181458)
2024-12-16 15:40:58 +02:00
Weblate
85171e40a5 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/da/
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/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2024-12-16 15:28:28 +02:00
Bogdan
86b656d323 Use minor version for core-js in babel/preset-env 2024-12-16 12:40:37 +02:00
Bogdan
5ae5d1043a Improve opening add movie modal for Discover Overview 2024-12-16 01:25:03 +02:00
Mark McDowall
b801aa0935 New: Add metadata links to telegram messages
Co-authored-by: Ivar Stangeby <istangeby@gmail.com>

Fixed errors sending Telegram notifications when links aren't available

(cherry picked from commit 4eab168267db716a9e897a992e3a7f6889571f9f)
(cherry picked from commit 4d7a3d0909437268b4ad0a0dbeb59d45b4435118)

Closes #10242
Closes #10489
2024-12-15 15:20:16 +02:00
Stevie Robinson
b2b5aa1f79 New: Optionally as Instance Name to Telegram notifications
(cherry picked from commit 36633b5d08c19158f185c0fa5faabbaec607fcb5)

Closes #10757
2024-12-15 14:43:23 +02:00
Mark McDowall
8c6ba9a543 Fixed: Augmenting languages from indexer for release with stale indexer ID
(cherry picked from commit cb7489ce8fe933920ea04297bd2941496a0c07c6)

Closes #10768
2024-12-15 14:43:23 +02:00
Mark McDowall
4e024c51d3 Fixed: Movies without tags bypassing tags on Download Client
(cherry picked from commit c0e264cfc520ee387bfc882c95a5822c655e0d9b)

Closes #10765
2024-12-15 14:43:23 +02:00
Mark McDowall
e4106f0ede Upgrade TypeScript and core-js
(cherry picked from commit 148480909917f69ff3b2ca547ccb4716dd56606e)

Closes #10763
2024-12-15 14:43:20 +02:00
Bogdan
9032ac20ff Bump version to 5.16.3 2024-12-15 10:04:38 +02:00
Bogdan
23fce4bf2e Fixed: Refresh backup list on deletion
(cherry picked from commit 3b00112447361b19c04851a510e63f812597a043)
2024-12-15 05:29:12 +02:00
Mark McDowall
64fd8552f8 Fixed: Error getting processes in some cases
(cherry picked from commit b552d4e9f7ca7388404aa0d52566010a54cb0244)
2024-12-15 05:28:39 +02:00
Weblate
e016410c10 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Rodion <rodyon009@gmail.com>
Co-authored-by: Tomer Horowitz <tomerh2001@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: farebyting <farelbyting@gmail.com>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: hhjuhl <hans@kopula.dk>
Co-authored-by: kaisernet <afimark7@gmail.com>
Co-authored-by: keysuck <joshkkim@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/da/
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/he/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2024-12-14 02:33:47 +02:00
Bogdan
bea943adf8 New: Tooltip with extra genres on search and collections 2024-12-13 19:17:59 +02:00
Bogdan
9780d20f8a Improve is visible property check for discover movies 2024-12-13 19:14:41 +02:00
Bogdan
62722d45b0 Fixed: Using all movie genres for collection filters 2024-12-13 19:13:55 +02:00
Bogdan
27dd8e8cd5 New: Tooltip with extra genres on movie details page 2024-12-12 21:59:19 +02:00
Bogdan
6c47ede76b Fixed: Refreshing movie genres 2024-12-12 21:58:54 +02:00
Mark McDowall
7b9562bb38 Update React
(cherry picked from commit 4491df3ae7530f2167beebc3548dd01fd2cc1a12)

Towards #10703
2024-12-12 21:01:19 +02:00
Stevie Robinson
8b0b7c1cb0 New: Reactive search button on Wanted pages
(cherry picked from commit e8c3aa20bd92701a16dcd97c5e103b79b3683105)

Closes #10750
2024-12-12 20:42:55 +02:00
Mark McDowall
7ebd341cd6 Sync TimeSpanConverter with upstream
(cherry picked from commit 1374240321f08d1400faf95e84217e4b7a2d116b)

Closes #10756
2024-12-09 14:03:12 +02:00
Bogdan
6c85f166ff Bump version to 5.16.2 2024-12-08 11:22:50 +02:00
Servarr
45aabce107 Automated API Docs update 2024-12-04 14:09:02 +02:00
89 changed files with 1869 additions and 1359 deletions

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '5.16.1'
majorVersion: '5.17.1'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'

View File

@@ -187,7 +187,7 @@ module.exports = (env) => {
loose: true,
debug: false,
useBuiltIns: 'entry',
corejs: 3
corejs: '3.39'
}
]
]

View File

@@ -91,6 +91,10 @@
margin-left: 5px;
}
.genres {
pointer-events: all;
}
.links {
margin-left: 5px;
pointer-events: all;

View File

@@ -10,6 +10,7 @@ import { icons, kinds, sizes, tooltipPositions } from 'Helpers/Props';
import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import MovieStatusLabel from 'Movie/Details/MovieStatusLabel';
import MovieIndexProgressBar from 'Movie/Index/ProgressBar/MovieIndexProgressBar';
import MovieGenres from 'Movie/MovieGenres';
import MoviePoster from 'Movie/MoviePoster';
import formatRuntime from 'Utilities/Date/formatRuntime';
import translate from 'Utilities/String/translate';
@@ -249,9 +250,7 @@ class AddNewMovieSearchResult extends Component {
name={icons.GENRE}
size={13}
/>
<span className={styles.genres}>
{genres.slice(0, 3).join(', ')}
</span>
<MovieGenres className={styles.genres} genres={genres} />
</Label> :
null
}
@@ -280,7 +279,7 @@ class AddNewMovieSearchResult extends Component {
}
canFlip={true}
kind={kinds.INVERSE}
position={tooltipPositions.BOTTOM}
position={tooltipPositions.TOP}
/>
{

View File

@@ -1,6 +1,6 @@
import { AppSectionProviderState } from 'App/State/AppSectionState';
import Metadata from 'typings/Metadata';
interface MetadataAppState extends AppSectionProviderState<Metadata> {}
type MetadataAppState = AppSectionProviderState<Metadata>;
export default MetadataAppState;

View File

@@ -1,6 +1,6 @@
import AppSectionState from 'App/State/AppSectionState';
import MovieCredit from 'typings/MovieCredit';
interface MovieCreditAppState extends AppSectionState<MovieCredit> {}
type MovieCreditAppState = AppSectionState<MovieCredit>;
export default MovieCreditAppState;

View File

@@ -37,8 +37,7 @@ export interface NamingAppState
extends AppSectionItemState<NamingConfig>,
AppSectionSaveState {}
export interface NamingExamplesAppState
extends AppSectionItemState<NamingExample> {}
export type NamingExamplesAppState = AppSectionItemState<NamingExample>;
export interface ImportListAppState
extends AppSectionState<ImportList>,

View File

@@ -22,7 +22,7 @@ function createMapStateToProps() {
return {
...collection,
movies: [...collection.movies].sort((a, b) => b.year - a.year),
genres: Array.from(new Set(allGenres)).slice(0, 3)
genres: Array.from(new Set(allGenres))
};
}
);

View File

@@ -10,6 +10,7 @@ import Label from 'Components/Label';
import IconButton from 'Components/Link/IconButton';
import MonitorToggleButton from 'Components/MonitorToggleButton';
import { icons, sizes } from 'Helpers/Props';
import MovieGenres from 'Movie/MovieGenres';
import QualityProfileNameConnector from 'Settings/Profiles/Quality/QualityProfileNameConnector';
import dimensions from 'Styles/Variables/dimensions';
import fonts from 'Styles/Variables/fonts';
@@ -242,12 +243,10 @@ class CollectionOverview extends Component {
size={sizes.MEDIUM}
>
<Icon
name={icons.PROFILE}
name={icons.GENRE}
size={13}
/>
<span className={styles.genres}>
{genres.join(', ')}
</span>
<MovieGenres className={styles.genres} genres={genres} />
</Label>
}

View File

@@ -1,7 +1,7 @@
import React, { ComponentPropsWithoutRef } from 'react';
import styles from './TableRowCell.css';
export interface TableRowCellProps extends ComponentPropsWithoutRef<'td'> {}
export type TableRowCellProps = ComponentPropsWithoutRef<'td'>;
export default function TableRowCell({
className = styles.cell,

View File

@@ -85,10 +85,16 @@ $hoverScale: 1.05;
flex: 1 0 auto;
}
.overviewContainer {
display: flex;
justify-content: space-between;
flex: 0 1 1000px;
flex-direction: column;
}
.overview {
composes: link;
flex: 0 1 1000px;
overflow: hidden;
min-height: 0;
}

View File

@@ -11,6 +11,7 @@ interface CssExports {
'link': string;
'lists': string;
'overview': string;
'overviewContainer': string;
'poster': string;
'posterContainer': string;
'title': string;

View File

@@ -133,14 +133,20 @@ class DiscoverMovieOverview extends Component {
/>
</div>
<MoviePoster
className={styles.poster}
<Link
className={styles.link}
style={elementStyle}
images={images}
size={250}
lazy={false}
overflow={true}
/>
{...linkProps}
>
<MoviePoster
className={styles.poster}
style={elementStyle}
images={images}
size={250}
lazy={false}
overflow={true}
/>
</Link>
</div>
</div>
@@ -242,11 +248,13 @@ class DiscoverMovieOverview extends Component {
</div>
<div className={styles.details}>
<div className={styles.overview}>
<TextTruncate
line={Math.floor(overviewHeight / (defaultFontSize * lineHeight))}
text={overview}
/>
<div className={styles.overviewContainer}>
<Link className={styles.overview} {...linkProps}>
<TextTruncate
line={Math.floor(overviewHeight / (defaultFontSize * lineHeight))}
text={overview}
/>
</Link>
</div>
<DiscoverMovieOverviewInfo
@@ -255,7 +263,6 @@ class DiscoverMovieOverview extends Component {
{...overviewOptions}
{...otherProps}
/>
</div>
</div>
</div>

View File

@@ -49,7 +49,7 @@ function isVisible(row, props) {
valueProp
} = row;
return _.has(props, valueProp) && (_.get(props, showProp) || props.sortKey === name);
return _.has(props, valueProp) && _.get(props, valueProp) !== null && (props[showProp] || props.sortKey === name);
}
function getInfoRowProps(row, props) {

View File

@@ -28,6 +28,7 @@ import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector';
import getMovieStatusDetails from 'Movie/getMovieStatusDetails';
import MovieHistoryModal from 'Movie/History/MovieHistoryModal';
import MovieCollectionLabelConnector from 'Movie/MovieCollectionLabelConnector';
import MovieGenres from 'Movie/MovieGenres';
import MoviePoster from 'Movie/MoviePoster';
import MovieInteractiveSearchModal from 'Movie/Search/MovieInteractiveSearchModal';
import MovieFileEditorTable from 'MovieFile/Editor/MovieFileEditorTable';
@@ -651,9 +652,7 @@ class MovieDetails extends Component {
name={translate('Genres')}
size={sizes.LARGE}
>
<span className={styles.genres}>
{genres.join(', ')}
</span>
<MovieGenres className={styles.genres} genres={genres} />
</InfoLabel> :
null
}

View File

@@ -0,0 +1,39 @@
import React from 'react';
import Label from 'Components/Label';
import Tooltip from 'Components/Tooltip/Tooltip';
import { kinds, sizes, tooltipPositions } from 'Helpers/Props';
interface MovieGenresProps {
className?: string;
genres: string[];
}
function MovieGenres({ className, genres }: MovieGenresProps) {
const firstGenres = genres.slice(0, 3);
const otherGenres = genres.slice(3);
if (otherGenres.length) {
return (
<Tooltip
anchor={<span className={className}>{firstGenres.join(', ')}</span>}
tooltip={
<div>
{otherGenres.map((tag) => {
return (
<Label key={tag} kind={kinds.INFO} size={sizes.LARGE}>
{tag}
</Label>
);
})}
</div>
}
kind={kinds.INVERSE}
position={tooltipPositions.TOP}
/>
);
}
return <span className={className}>{firstGenres.join(', ')}</span>;
}
export default MovieGenres;

View File

@@ -0,0 +1,27 @@
import React from 'react';
import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import MediaInfoProps from 'typings/MediaInfo';
import getEntries from 'Utilities/Object/getEntries';
function MediaInfo(props: MediaInfoProps) {
return (
<DescriptionList>
{getEntries(props).map(([key, value]) => {
const title = key
.replace(/([A-Z])/g, ' $1')
.replace(/^./, (str) => str.toUpperCase());
if (!value) {
return null;
}
return (
<DescriptionListItem key={key} title={title} data={props[key]} />
);
})}
</DescriptionList>
);
}
export default MediaInfo;

View File

@@ -1,33 +0,0 @@
import React from 'react';
import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
function MediaInfoPopover(props) {
return (
<DescriptionList>
{
Object.keys(props).map((key) => {
const title = key
.replace(/([A-Z])/g, ' $1')
.replace(/^./, (str) => str.toUpperCase());
const value = props[key];
if (!value) {
return null;
}
return (
<DescriptionListItem
key={key}
title={title}
data={props[key]}
/>
);
})
}
</DescriptionList>
);
}
export default MediaInfoPopover;

View File

@@ -14,7 +14,7 @@ import MovieFormats from 'Movie/MovieFormats';
import MovieLanguages from 'Movie/MovieLanguages';
import MovieQuality from 'Movie/MovieQuality';
import FileEditModal from 'MovieFile/Edit/FileEditModal';
import MediaInfoConnector from 'MovieFile/MediaInfoConnector';
import MediaInfo from 'MovieFile/MediaInfo';
import * as mediaInfoTypes from 'MovieFile/mediaInfoTypes';
import formatBytes from 'Utilities/Number/formatBytes';
import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore';
@@ -224,7 +224,7 @@ class MovieFileEditorRow extends Component {
key={name}
className={styles.audio}
>
<MediaInfoConnector
<MediaInfo
type={mediaInfoTypes.AUDIO}
movieFileId={id}
/>
@@ -238,7 +238,7 @@ class MovieFileEditorRow extends Component {
key={name}
className={styles.audioLanguages}
>
<MediaInfoConnector
<MediaInfo
type={mediaInfoTypes.AUDIO_LANGUAGES}
movieFileId={id}
/>
@@ -252,7 +252,7 @@ class MovieFileEditorRow extends Component {
key={name}
className={styles.subtitles}
>
<MediaInfoConnector
<MediaInfo
type={mediaInfoTypes.SUBTITLES}
movieFileId={id}
/>
@@ -266,7 +266,7 @@ class MovieFileEditorRow extends Component {
key={name}
className={styles.video}
>
<MediaInfoConnector
<MediaInfo
type={mediaInfoTypes.VIDEO}
movieFileId={id}
/>
@@ -280,7 +280,7 @@ class MovieFileEditorRow extends Component {
key={name}
className={styles.videoDynamicRangeType}
>
<MediaInfoConnector
<MediaInfo
type={mediaInfoTypes.VIDEO_DYNAMIC_RANGE_TYPE}
movieFileId={id}
/>

View File

@@ -8,7 +8,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import MediaInfoPopover from './Editor/MediaInfoPopover';
import MediaInfo from './Editor/MediaInfo';
function FileDetailsModal(props) {
const {
@@ -31,7 +31,7 @@ function FileDetailsModal(props) {
</ModalHeader>
<ModalBody>
<MediaInfoPopover {...mediaInfo} />
<MediaInfo {...mediaInfo} />
</ModalBody>
<ModalFooter>

View File

@@ -1,104 +0,0 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React from 'react';
import getLanguageName from 'Utilities/String/getLanguageName';
import translate from 'Utilities/String/translate';
import * as mediaInfoTypes from './mediaInfoTypes';
function formatLanguages(languages) {
if (!languages) {
return null;
}
const splitLanguages = _.uniq(languages.split('/')).map((l) => {
const simpleLanguage = l.split('_')[0];
if (simpleLanguage === 'und') {
return translate('Unknown');
}
return getLanguageName(simpleLanguage);
});
if (splitLanguages.length > 3) {
return (
<span title={splitLanguages.join(', ')}>
{splitLanguages.slice(0, 2).join(', ')}, {splitLanguages.length - 2} more
</span>
);
}
return (
<span>
{splitLanguages.join(', ')}
</span>
);
}
function MediaInfo(props) {
const {
type,
audioChannels,
audioCodec,
audioLanguages,
subtitles,
videoCodec,
videoDynamicRangeType
} = props;
if (type === mediaInfoTypes.AUDIO) {
return (
<span>
{
audioCodec ? audioCodec : ''
}
{
audioCodec && audioChannels ? ' - ' : ''
}
{
audioChannels ? audioChannels.toFixed(1) : ''
}
</span>
);
}
if (type === mediaInfoTypes.AUDIO_LANGUAGES) {
return formatLanguages(audioLanguages);
}
if (type === mediaInfoTypes.SUBTITLES) {
return formatLanguages(subtitles);
}
if (type === mediaInfoTypes.VIDEO) {
return (
<span>
{videoCodec}
</span>
);
}
if (type === mediaInfoTypes.VIDEO_DYNAMIC_RANGE_TYPE) {
return (
<span>
{videoDynamicRangeType}
</span>
);
}
return null;
}
MediaInfo.propTypes = {
type: PropTypes.string.isRequired,
audioChannels: PropTypes.number,
audioCodec: PropTypes.string,
audioLanguages: PropTypes.string,
subtitles: PropTypes.string,
videoCodec: PropTypes.string,
videoDynamicRangeType: PropTypes.string
};
export default MediaInfo;

View File

@@ -0,0 +1,92 @@
import React from 'react';
import getLanguageName from 'Utilities/String/getLanguageName';
import translate from 'Utilities/String/translate';
import useMovieFile from './useMovieFile';
function formatLanguages(languages: string | undefined) {
if (!languages) {
return null;
}
const splitLanguages = [...new Set(languages.split('/'))].map((l) => {
const simpleLanguage = l.split('_')[0];
if (simpleLanguage === 'und') {
return translate('Unknown');
}
return getLanguageName(simpleLanguage);
});
if (splitLanguages.length > 3) {
return (
<span title={splitLanguages.join(', ')}>
{splitLanguages.slice(0, 2).join(', ')}, {splitLanguages.length - 2}{' '}
more
</span>
);
}
return <span>{splitLanguages.join(', ')}</span>;
}
export type MediaInfoType =
| 'audio'
| 'audioLanguages'
| 'subtitles'
| 'video'
| 'videoDynamicRangeType';
interface MediaInfoProps {
movieFileId?: number;
type: MediaInfoType;
}
function MediaInfo({ movieFileId, type }: MediaInfoProps) {
const movieFile = useMovieFile(movieFileId);
if (!movieFile?.mediaInfo) {
return null;
}
const {
audioChannels,
audioCodec,
audioLanguages,
subtitles,
videoCodec,
videoDynamicRangeType,
} = movieFile.mediaInfo;
if (type === 'audio') {
return (
<span>
{audioCodec ? audioCodec : ''}
{audioCodec && audioChannels ? ' - ' : ''}
{audioChannels ? audioChannels.toFixed(1) : ''}
</span>
);
}
if (type === 'audioLanguages') {
return formatLanguages(audioLanguages);
}
if (type === 'subtitles') {
return formatLanguages(subtitles);
}
if (type === 'video') {
return <span>{videoCodec}</span>;
}
if (type === 'videoDynamicRangeType') {
return <span>{videoDynamicRangeType}</span>;
}
return null;
}
export default MediaInfo;

View File

@@ -1,21 +0,0 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createMovieFileSelector from 'Store/Selectors/createMovieFileSelector';
import MediaInfo from './MediaInfo';
function createMapStateToProps() {
return createSelector(
createMovieFileSelector(),
(movieFile) => {
if (movieFile) {
return {
...movieFile.mediaInfo
};
}
return {};
}
);
}
export default connect(createMapStateToProps)(MediaInfo);

View File

@@ -1,17 +0,0 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import MovieLanguages from 'Movie/MovieLanguages';
import createMovieFileSelector from 'Store/Selectors/createMovieFileSelector';
function createMapStateToProps() {
return createSelector(
createMovieFileSelector(),
(movieFile) => {
return {
languages: movieFile ? movieFile.languages : undefined
};
}
);
}
export default connect(createMapStateToProps)(MovieLanguages);

View File

@@ -0,0 +1,15 @@
import React from 'react';
import MovieLanguages from 'Movie/MovieLanguages';
import useMovieFile from './useMovieFile';
interface MovieFileLanguagesProps {
movieFileId: number;
}
function MovieFileLanguages({ movieFileId }: MovieFileLanguagesProps) {
const movieFile = useMovieFile(movieFileId);
return <MovieLanguages languages={movieFile?.languages ?? []} />;
}
export default MovieFileLanguages;

View File

@@ -0,0 +1,18 @@
import { useSelector } from 'react-redux';
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
function createMovieFileSelector(movieFileId?: number) {
return createSelector(
(state: AppState) => state.movieFiles.items,
(movieFiles) => {
return movieFiles.find(({ id }) => id === movieFileId);
}
);
}
function useMovieFile(movieFileId: number | undefined) {
return useSelector(createMovieFileSelector(movieFileId));
}
export default useMovieFile;

View File

@@ -55,10 +55,10 @@ function EditSpecificationModalContent(props) {
<InlineMarkdown data={translate('ConditionUsingRegularExpressions')} />
</div>
<div>
<InlineMarkdown data={translate('RegularExpressionsTutorialLink')} />
<InlineMarkdown data={translate('RegularExpressionsTutorialLink', { url: 'https://www.regular-expressions.info/tutorial.html' })} />
</div>
<div>
<InlineMarkdown data={translate('RegularExpressionsCanBeTested')} />
<InlineMarkdown data={translate('RegularExpressionsCanBeTested', { url: 'http://regexstorm.net/tester' })} />
</div>
</Alert>
}

View File

@@ -1,5 +1,6 @@
import React, { useCallback } from 'react';
import { useDispatch } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import AppState from 'App/State/AppState';
import Modal from 'Components/Modal/Modal';
import { sizes } from 'Helpers/Props';
import { clearPendingChanges } from 'Store/Actions/baseActions';
@@ -7,7 +8,8 @@ import EditMetadataModalContent, {
EditMetadataModalContentProps,
} from './EditMetadataModalContent';
interface EditMetadataModalProps extends EditMetadataModalContentProps {
interface EditMetadataModalProps
extends Omit<EditMetadataModalContentProps, 'advancedSettings'> {
isOpen: boolean;
}
@@ -18,6 +20,10 @@ function EditMetadataModal({
}: EditMetadataModalProps) {
const dispatch = useDispatch();
const advancedSettings = useSelector(
(state: AppState) => state.settings.advancedSettings
);
const handleModalClose = useCallback(() => {
dispatch(clearPendingChanges({ section: 'metadata' }));
onModalClose();
@@ -27,6 +33,7 @@ function EditMetadataModal({
<Modal size={sizes.MEDIUM} isOpen={isOpen} onModalClose={handleModalClose}>
<EditMetadataModalContent
{...otherProps}
advancedSettings={advancedSettings}
onModalClose={handleModalClose}
/>
</Modal>

View File

@@ -95,7 +95,6 @@ function Metadata({ id, name, enable, fields }: MetadataProps) {
) : null}
<EditMetadataModal
advancedSettings={false}
id={id}
isOpen={isEditMetadataModalOpen}
onModalClose={handleModalClose}

View File

@@ -86,10 +86,10 @@ function EditSpecificationModalContent(props) {
<InlineMarkdown data={translate('ConditionUsingRegularExpressions')} />
</div>
<div>
<InlineMarkdown data={translate('RegularExpressionsTutorialLink')} />
<InlineMarkdown data={translate('RegularExpressionsTutorialLink', { url: 'https://www.regular-expressions.info/tutorial.html' })} />
</div>
<div>
<InlineMarkdown data={translate('RegularExpressionsCanBeTested')} />
<InlineMarkdown data={translate('RegularExpressionsCanBeTested', { url: 'http://regexstorm.net/tester' })} />
</div>
</Alert>
}

View File

@@ -91,12 +91,8 @@ export const defaultState = {
genres: function(item, filterValue, type) {
const predicate = filterTypePredicates[type];
let allGenres = [];
item.movies.forEach((movie) => {
allGenres = allGenres.concat(movie.genres);
});
const genres = Array.from(new Set(allGenres)).slice(0, 3);
const allGenres = item.movies.flatMap(({ genres }) => genres);
const genres = Array.from(new Set(allGenres));
return predicate(genres, filterValue);
},
@@ -138,12 +134,8 @@ export const defaultState = {
type: filterBuilderTypes.ARRAY,
optionsSelector: function(items) {
const genreList = items.reduce((acc, collection) => {
let collectionGenres = [];
collection.movies.forEach((movie) => {
collectionGenres = collectionGenres.concat(movie.genres);
});
const genres = Array.from(new Set(collectionGenres)).slice(0, 3);
const collectionGenres = collection.movies.flatMap(({ genres }) => genres);
const genres = Array.from(new Set(collectionGenres));
genres.forEach((genre) => {
acc.push({

View File

@@ -1,13 +1,14 @@
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
import Movie from 'Movie/Movie';
import QualityProfile from 'typings/QualityProfile';
import { createMovieSelectorForHook } from './createMovieSelector';
function createMovieQualityProfileSelector(movieId: number) {
return createSelector(
(state: AppState) => state.settings.qualityProfiles.items,
createMovieSelectorForHook(movieId),
(qualityProfiles, movie = {} as Movie) => {
(qualityProfiles: QualityProfile[], movie = {} as Movie) => {
return qualityProfiles.find(
(profile) => profile.id === movie.qualityProfileId
);

View File

@@ -0,0 +1,9 @@
export type Entries<T> = {
[K in keyof T]: [K, T[K]];
}[keyof T][];
function getEntries<T extends object>(obj: T): Entries<T> {
return Object.entries(obj) as Entries<T>;
}
export default getEntries;

View File

@@ -35,7 +35,7 @@ export default function getLanguageName(code: string) {
try {
return languageNames.of(code) ?? code;
} catch (error) {
} catch {
return code;
}
}

View File

@@ -17,7 +17,7 @@ export async function fetchTranslations(): Promise<boolean> {
translations = data.Strings;
resolve(true);
} catch (error) {
} catch {
resolve(false);
}
});

View File

@@ -153,12 +153,15 @@ class CutoffUnmet extends Component {
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label={translate('SearchSelected')}
label={itemsSelected ? translate('SearchSelected') : translate('SearchAll')}
iconName={icons.SEARCH}
isDisabled={!itemsSelected || isSearchingForCutoffUnmetMovies}
onPress={this.onSearchSelectedPress}
isDisabled={isSearchingForCutoffUnmetMovies}
isSpinning={isSearchingForCutoffUnmetMovies}
onPress={itemsSelected ? this.onSearchSelectedPress : this.onSearchAllCutoffUnmetPress}
/>
<PageToolbarSeparator />
<PageToolbarButton
label={isShowingMonitored ? translate('UnmonitorSelected') : translate('MonitorSelected')}
iconName={icons.MONITORED}
@@ -166,18 +169,6 @@ class CutoffUnmet extends Component {
isSpinning={isSaving}
onPress={this.onToggleSelectedPress}
/>
<PageToolbarSeparator />
<PageToolbarButton
label={translate('SearchAll')}
iconName={icons.SEARCH}
isDisabled={!items.length}
isSpinning={isSearchingForCutoffUnmetMovies}
onPress={this.onSearchAllCutoffUnmetPress}
/>
<PageToolbarSeparator />
</PageToolbarSection>
<PageToolbarSection alignContent={align.RIGHT}>

View File

@@ -18,9 +18,10 @@ function createMapStateToProps() {
return createSelector(
(state) => state.wanted.cutoffUnmet,
createCommandExecutingSelector(commandNames.CUTOFF_UNMET_MOVIES_SEARCH),
(cutoffUnmet, isSearchingForCutoffUnmetMovies) => {
createCommandExecutingSelector(commandNames.MOVIE_SEARCH),
(cutoffUnmet, isSearchingForCutoffUnmetMovies, isSearchingForSelectedCutoffUnmetMovies) => {
return {
isSearchingForCutoffUnmetMovies,
isSearchingForCutoffUnmetMovies: isSearchingForCutoffUnmetMovies || isSearchingForSelectedCutoffUnmetMovies,
isSaving: cutoffUnmet.items.filter((m) => m.isSaving).length > 1,
...cutoffUnmet
};

View File

@@ -8,7 +8,7 @@ import movieEntities from 'Movie/movieEntities';
import MovieSearchCell from 'Movie/MovieSearchCell';
import MovieStatusConnector from 'Movie/MovieStatusConnector';
import MovieTitleLink from 'Movie/MovieTitleLink';
import MovieFileLanguageConnector from 'MovieFile/MovieFileLanguageConnector';
import MovieFileLanguages from 'MovieFile/MovieFileLanguages';
import styles from './CutoffUnmetRow.css';
function CutoffUnmetRow(props) {
@@ -104,7 +104,7 @@ function CutoffUnmetRow(props) {
key={name}
className={styles.languages}
>
<MovieFileLanguageConnector
<MovieFileLanguages
movieFileId={movieFileId}
/>
</TableRowCell>

View File

@@ -159,12 +159,15 @@ class Missing extends Component {
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label={translate('SearchSelected')}
label={itemsSelected ? translate('SearchSelected') : translate('SearchAll')}
iconName={icons.SEARCH}
isDisabled={!itemsSelected || isSearchingForMissingMovies}
onPress={this.onSearchSelectedPress}
isSpinning={isSearchingForMissingMovies}
isDisabled={isSearchingForMissingMovies}
onPress={itemsSelected ? this.onSearchSelectedPress : this.onSearchAllMissingPress}
/>
<PageToolbarSeparator />
<PageToolbarButton
label={isShowingMonitored ? translate('UnmonitorSelected') : translate('MonitorSelected')}
iconName={icons.MONITORED}
@@ -175,16 +178,6 @@ class Missing extends Component {
<PageToolbarSeparator />
<PageToolbarButton
label={translate('SearchAll')}
iconName={icons.SEARCH}
isDisabled={!items.length}
isSpinning={isSearchingForMissingMovies}
onPress={this.onSearchAllMissingPress}
/>
<PageToolbarSeparator />
<PageToolbarButton
label={translate('ManualImport')}
iconName={icons.INTERACTIVE}

View File

@@ -17,9 +17,10 @@ function createMapStateToProps() {
return createSelector(
(state) => state.wanted.missing,
createCommandExecutingSelector(commandNames.MISSING_MOVIES_SEARCH),
(missing, isSearchingForMissingMovies) => {
createCommandExecutingSelector(commandNames.MOVIE_SEARCH),
(missing, isSearchingForMissingMovies, isSearchingForSelectedMissingMovies) => {
return {
isSearchingForMissingMovies,
isSearchingForMissingMovies: isSearchingForMissingMovies || isSearchingForSelectedMissingMovies,
isSaving: missing.items.filter((m) => m.isSaving).length > 1,
...missing
};

View File

@@ -1,6 +1,6 @@
import { createBrowserHistory } from 'history';
import React from 'react';
import { render } from 'react-dom';
import { createRoot } from 'react-dom/client';
import createAppStore from 'Store/createAppStore';
import App from './App/App';
@@ -9,9 +9,8 @@ import 'Diag/ConsoleApi';
export async function bootstrap() {
const history = createBrowserHistory();
const store = createAppStore(history);
const container = document.getElementById('root');
render(
<App store={store} history={history} />,
document.getElementById('root')
);
const root = createRoot(container!); // createRoot(container!) if you use TypeScript
root.render(<App store={store} history={history} />);
}

View File

@@ -14,6 +14,31 @@ window.Radarr = await response.json();
__webpack_public_path__ = `${window.Radarr.urlBase}/`;
/* eslint-enable no-undef, @typescript-eslint/ban-ts-comment */
const error = console.error;
// Monkey patch console.error to filter out some warnings from React
// TODO: Remove this after the great TypeScript migration
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function logError(...parameters: any[]) {
const filter = parameters.find((parameter) => {
return (
parameter.includes(
'Support for defaultProps will be removed from function components in a future major release'
) ||
parameter.includes(
'findDOMNode is deprecated and will be removed in the next major release'
)
);
});
if (!filter) {
error(...parameters);
}
}
console.error = logError;
const { bootstrap } = await import('./bootstrap');
await bootstrap();

View File

@@ -22,19 +22,19 @@
"defaults"
],
"dependencies": {
"@fortawesome/fontawesome-free": "6.6.0",
"@fortawesome/fontawesome-svg-core": "6.6.0",
"@fortawesome/free-brands-svg-icons": "6.6.0",
"@fortawesome/free-regular-svg-icons": "6.6.0",
"@fortawesome/free-solid-svg-icons": "6.6.0",
"@fortawesome/fontawesome-free": "6.7.1",
"@fortawesome/fontawesome-svg-core": "6.7.1",
"@fortawesome/free-brands-svg-icons": "6.7.1",
"@fortawesome/free-regular-svg-icons": "6.7.1",
"@fortawesome/free-solid-svg-icons": "6.7.1",
"@fortawesome/react-fontawesome": "0.2.2",
"@juggle/resize-observer": "3.4.0",
"@microsoft/signalr": "6.0.25",
"@sentry/browser": "7.119.1",
"@sentry/integrations": "7.119.1",
"@types/node": "20.16.11",
"@types/react": "18.2.79",
"@types/react-dom": "18.2.25",
"@types/react": "18.3.12",
"@types/react-dom": "18.3.1",
"classnames": "2.5.1",
"connected-react-router": "6.9.3",
"copy-to-clipboard": "3.3.3",
@@ -51,7 +51,7 @@
"normalize.css": "8.0.1",
"prop-types": "15.8.1",
"qs": "6.13.0",
"react": "17.0.2",
"react": "18.3.1",
"react-addons-shallow-compare": "15.6.3",
"react-async-script": "1.2.0",
"react-autosuggest": "10.1.0",
@@ -61,7 +61,7 @@
"react-dnd-multi-backend": "6.0.2",
"react-dnd-touch-backend": "14.1.1",
"react-document-title": "2.0.3",
"react-dom": "17.0.2",
"react-dom": "18.3.1",
"react-focus-lock": "2.9.4",
"react-google-recaptcha": "2.1.0",
"react-lazyload": "3.2.0",
@@ -84,16 +84,16 @@
"reselect": "4.1.8",
"stacktrace-js": "2.0.2",
"swiper": "8.3.2",
"typescript": "5.1.6"
"typescript": "5.7.2"
},
"devDependencies": {
"@babel/core": "7.25.8",
"@babel/eslint-parser": "7.25.8",
"@babel/plugin-proposal-export-default-from": "7.25.8",
"@babel/core": "7.26.0",
"@babel/eslint-parser": "7.25.9",
"@babel/plugin-proposal-export-default-from": "7.25.9",
"@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/preset-env": "7.25.8",
"@babel/preset-react": "7.25.7",
"@babel/preset-typescript": "7.25.7",
"@babel/preset-env": "7.26.0",
"@babel/preset-react": "7.26.3",
"@babel/preset-typescript": "7.26.0",
"@types/lodash": "4.14.195",
"@types/react-document-title": "2.0.10",
"@types/react-lazyload": "3.2.3",
@@ -102,13 +102,13 @@
"@types/react-window": "1.8.8",
"@types/redux-actions": "2.6.5",
"@types/webpack-livereload-plugin": "2.3.6",
"@typescript-eslint/eslint-plugin": "6.21.0",
"@typescript-eslint/parser": "6.21.0",
"@typescript-eslint/eslint-plugin": "8.18.1",
"@typescript-eslint/parser": "8.18.1",
"autoprefixer": "10.4.20",
"babel-loader": "9.2.1",
"babel-plugin-inline-classnames": "2.0.1",
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
"core-js": "3.38.1",
"core-js": "3.39.0",
"css-loader": "6.7.3",
"css-modules-typescript-loader": "4.0.1",
"eslint": "8.57.1",

View File

@@ -119,7 +119,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
o.Environment = BuildInfo.Branch;
// Crash free run statistics (sends a ping for healthy and for crashes sessions)
o.AutoSessionTracking = true;
o.AutoSessionTracking = false;
// Caches files in the event device is offline
// Sentry creates a 'sentry' sub directory, no need to concat here

View File

@@ -313,7 +313,7 @@ namespace NzbDrone.Common.Processes
processInfo = new ProcessInfo();
processInfo.Id = process.Id;
processInfo.Name = process.ProcessName;
processInfo.StartPath = process.MainModule.FileName;
processInfo.StartPath = process.MainModule?.FileName;
if (process.Id != GetCurrentProcessId() && process.HasExited)
{

View File

@@ -0,0 +1,43 @@
using System;
using System.Data.SQLite;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Datastore.Converters;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.Datastore.Converters;
[TestFixture]
public class TimeSpanConverterFixture : CoreTest<TimeSpanConverter>
{
private SQLiteParameter _param;
[SetUp]
public void Setup()
{
_param = new SQLiteParameter();
}
[Test]
public void should_return_string_when_saving_timespan_to_db()
{
var span = TimeSpan.FromMilliseconds(10);
Subject.SetValue(_param, span);
_param.Value.Should().Be(span.ToString());
}
[Test]
public void should_return_timespan_when_getting_string_from_db()
{
var span = TimeSpan.FromMilliseconds(10);
Subject.Parse(span.ToString()).Should().Be(span);
}
[Test]
public void should_return_zero_timespan_for_db_null_value_when_getting_from_db()
{
Subject.Parse(null).Should().Be(TimeSpan.Zero);
}
}

View File

@@ -5,6 +5,7 @@ using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.CustomFormats;
using NzbDrone.Core.DecisionEngine.Specifications;
using NzbDrone.Core.MediaFiles;
@@ -337,5 +338,42 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Subject.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse();
}
[Test]
public void should_return_false_if_quality_profile_does_not_allow_upgrades_but_format_cutoff_is_above_current_score_and_is_revision_upgrade()
{
var customFormat = new CustomFormat("My Format", new ResolutionSpecification { Value = (int)Resolution.R1080p }) { Id = 1 };
Mocker.GetMock<IConfigService>()
.SetupGet(s => s.DownloadPropersAndRepacks)
.Returns(ProperDownloadTypes.DoNotPrefer);
GivenProfile(new QualityProfile
{
Cutoff = Quality.SDTV.Id,
MinFormatScore = 0,
CutoffFormatScore = 10000,
Items = Qualities.QualityFixture.GetDefaultQualities(),
FormatItems = CustomFormatsTestHelpers.GetSampleFormatItems("My Format"),
UpgradeAllowed = false
});
_parseResultSingle.Movie.QualityProfile.FormatItems = new List<ProfileFormatItem>
{
new ProfileFormatItem
{
Format = customFormat,
Score = 50
}
};
GivenFileQuality(new QualityModel(Quality.WEBDL1080p, new Revision(version: 1)));
GivenNewQuality(new QualityModel(Quality.WEBDL1080p, new Revision(version: 2)));
GivenOldCustomFormats(new List<CustomFormat>());
GivenNewCustomFormats(new List<CustomFormat> { customFormat });
Subject.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse();
}
}
}

View File

@@ -107,6 +107,25 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.Should().Be(UpgradeableRejectReason.None);
}
[Test]
public void should_return_false_if_proper_and_autoDownloadPropers_is_do_not_prefer()
{
GivenAutoDownloadPropers(ProperDownloadTypes.DoNotPrefer);
var profile = new QualityProfile
{
Items = Qualities.QualityFixture.GetDefaultQualities(),
};
Subject.IsUpgradable(
profile,
new QualityModel(Quality.DVD, new Revision(version: 1)),
new List<CustomFormat>(),
new QualityModel(Quality.DVD, new Revision(version: 2)),
new List<CustomFormat>())
.Should().Be(UpgradeableRejectReason.UpgradesNotAllowed);
}
[Test]
public void should_return_false_if_release_and_existing_file_are_the_same()
{
@@ -121,7 +140,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
new List<CustomFormat>(),
new QualityModel(Quality.HDTV720p, new Revision(version: 1)),
new List<CustomFormat>())
.Should().Be(UpgradeableRejectReason.CustomFormatScore);
.Should().Be(UpgradeableRejectReason.UpgradesNotAllowed);
}
[Test]

View File

@@ -74,7 +74,7 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
Settings = new TorrentRssIndexerSettings { MultiLanguages = new List<int> { Language.Original.Id, Language.French.Id } }
};
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.Get(1))
.Setup(v => v.Find(1))
.Returns(indexerDefinition);
_remoteMovie.ParsedMovieInfo = GetParsedMovieInfo(new List<Language> { }, releaseTitle);
@@ -82,7 +82,7 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
_remoteMovie.Release.Title = releaseTitle;
Subject.Aggregate(_remoteMovie).Languages.Should().BeEquivalentTo(new List<Language> { _movie.MovieMetadata.Value.OriginalLanguage, Language.French });
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Get(1), Times.Once());
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Find(1), Times.Once());
Mocker.GetMock<IIndexerFactory>().VerifyNoOtherCalls();
}
@@ -104,7 +104,7 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
};
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.Get(1))
.Setup(v => v.Find(1))
.Returns(indexerDefinition1);
Mocker.GetMock<IIndexerFactory>()
@@ -117,7 +117,7 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
_remoteMovie.Release.Title = releaseTitle;
Subject.Aggregate(_remoteMovie).Languages.Should().BeEquivalentTo(new List<Language> { _movie.MovieMetadata.Value.OriginalLanguage, Language.French });
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Get(1), Times.Once());
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Find(1), Times.Once());
Mocker.GetMock<IIndexerFactory>().VerifyNoOtherCalls();
}
@@ -155,7 +155,7 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
Settings = new TorrentRssIndexerSettings { MultiLanguages = new List<int> { Language.Original.Id, Language.French.Id } }
};
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.Get(1))
.Setup(v => v.Find(1))
.Returns(indexerDefinition);
_remoteMovie.ParsedMovieInfo = GetParsedMovieInfo(new List<Language> { Language.Unknown }, releaseTitle);
@@ -163,7 +163,7 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
_remoteMovie.Release.Title = releaseTitle;
Subject.Aggregate(_remoteMovie).Languages.Should().BeEquivalentTo(new List<Language> { _movie.MovieMetadata.Value.OriginalLanguage, Language.French });
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Get(1), Times.Once());
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Find(1), Times.Once());
Mocker.GetMock<IIndexerFactory>().VerifyNoOtherCalls();
}
@@ -177,7 +177,7 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
Settings = new TorrentRssIndexerSettings { }
};
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.Get(1))
.Setup(v => v.Find(1))
.Returns(indexerDefinition);
_remoteMovie.ParsedMovieInfo = GetParsedMovieInfo(new List<Language> { }, releaseTitle);
@@ -185,7 +185,7 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
_remoteMovie.Release.Title = releaseTitle;
Subject.Aggregate(_remoteMovie).Languages.Should().BeEquivalentTo(new List<Language> { _movie.MovieMetadata.Value.OriginalLanguage });
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Get(1), Times.Once());
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Find(1), Times.Once());
Mocker.GetMock<IIndexerFactory>().VerifyNoOtherCalls();
}
@@ -248,5 +248,85 @@ namespace NzbDrone.Core.Test.Download.Aggregation.Aggregators
Subject.Aggregate(_remoteMovie).Languages.Should().Equal(Language.Greek);
}
[Test]
public void should_return_multi_languages_from_indexer_with_name_when_indexer_id_does_not_exist()
{
var releaseTitle = "Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup";
var indexerDefinition1 = new IndexerDefinition
{
Id = 1,
Name = "MyIndexer1",
Settings = new TorrentRssIndexerSettings { MultiLanguages = new List<int> { Language.Original.Id, Language.French.Id } }
};
var indexerDefinition2 = new IndexerDefinition
{
Id = 2,
Name = "MyIndexer2",
Settings = new TorrentRssIndexerSettings { MultiLanguages = new List<int> { Language.Original.Id, Language.German.Id } }
};
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.Find(1))
.Returns(null as IndexerDefinition);
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.FindByName("MyIndexer1"))
.Returns(indexerDefinition1);
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.All())
.Returns(new List<IndexerDefinition>() { indexerDefinition1, indexerDefinition2 });
_remoteMovie.ParsedMovieInfo = GetParsedMovieInfo(new List<Language> { }, releaseTitle);
_remoteMovie.Release.IndexerId = 10;
_remoteMovie.Release.Indexer = "MyIndexer1";
_remoteMovie.Release.Title = releaseTitle;
Subject.Aggregate(_remoteMovie).Languages.Should().BeEquivalentTo(new List<Language> { _movie.MovieMetadata.Value.OriginalLanguage, Language.French });
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Find(10), Times.Once());
Mocker.GetMock<IIndexerFactory>().Verify(c => c.FindByName("MyIndexer1"), Times.Once());
Mocker.GetMock<IIndexerFactory>().VerifyNoOtherCalls();
}
[Test]
public void should_return_multi_languages_from_indexer_with_name_when_indexer_id_not_available()
{
var releaseTitle = "Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup";
var indexerDefinition1 = new IndexerDefinition
{
Id = 1,
Name = "MyIndexer1",
Settings = new TorrentRssIndexerSettings { MultiLanguages = new List<int> { Language.Original.Id, Language.French.Id } }
};
var indexerDefinition2 = new IndexerDefinition
{
Id = 2,
Name = "MyIndexer2",
Settings = new TorrentRssIndexerSettings { MultiLanguages = new List<int> { Language.Original.Id, Language.German.Id } }
};
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.Find(1))
.Returns(null as IndexerDefinition);
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.FindByName("MyIndexer1"))
.Returns(indexerDefinition1);
Mocker.GetMock<IIndexerFactory>()
.Setup(v => v.All())
.Returns(new List<IndexerDefinition>() { indexerDefinition1, indexerDefinition2 });
_remoteMovie.ParsedMovieInfo = GetParsedMovieInfo(new List<Language> { }, releaseTitle);
_remoteMovie.Release.IndexerId = 0;
_remoteMovie.Release.Indexer = "MyIndexer1";
_remoteMovie.Release.Title = releaseTitle;
Subject.Aggregate(_remoteMovie).Languages.Should().BeEquivalentTo(new List<Language> { _movie.MovieMetadata.Value.OriginalLanguage, Language.French });
Mocker.GetMock<IIndexerFactory>().Verify(c => c.Find(10), Times.Never());
Mocker.GetMock<IIndexerFactory>().Verify(c => c.FindByName("MyIndexer1"), Times.Once());
Mocker.GetMock<IIndexerFactory>().VerifyNoOtherCalls();
}
}
}

View File

@@ -2,18 +2,17 @@ using System;
using System.Data;
using Dapper;
namespace NzbDrone.Core.Datastore.Converters
{
public class DapperTimeSpanConverter : SqlMapper.TypeHandler<TimeSpan>
{
public override void SetValue(IDbDataParameter parameter, TimeSpan value)
{
parameter.Value = value.ToString();
}
namespace NzbDrone.Core.Datastore.Converters;
public override TimeSpan Parse(object value)
{
return TimeSpan.Parse((string)value);
}
public class TimeSpanConverter : SqlMapper.TypeHandler<TimeSpan>
{
public override void SetValue(IDbDataParameter parameter, TimeSpan value)
{
parameter.Value = value.ToString();
}
public override TimeSpan Parse(object value)
{
return value is string str ? TimeSpan.Parse(str) : TimeSpan.Zero;
}
}

View File

@@ -188,7 +188,6 @@ namespace NzbDrone.Core.Datastore
SqlMapper.RemoveTypeMap(typeof(DateTime));
SqlMapper.AddTypeHandler(new DapperUtcConverter());
SqlMapper.AddTypeHandler(new DapperTimeSpanConverter());
SqlMapper.AddTypeHandler(new DapperQualityIntConverter());
SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter<List<QualityProfileQualityItem>>(new QualityIntConverter()));
SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter<List<ProfileFormatItem>>(new CustomFormatIntConverter()));
@@ -213,6 +212,9 @@ namespace NzbDrone.Core.Datastore
SqlMapper.RemoveTypeMap(typeof(Guid));
SqlMapper.RemoveTypeMap(typeof(Guid?));
SqlMapper.AddTypeHandler(new GuidConverter());
SqlMapper.RemoveTypeMap(typeof(TimeSpan));
SqlMapper.RemoveTypeMap(typeof(TimeSpan?));
SqlMapper.AddTypeHandler(new TimeSpanConverter());
SqlMapper.AddTypeHandler(new CommandConverter());
SqlMapper.AddTypeHandler(new SystemVersionConverter());
}

View File

@@ -96,17 +96,9 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
case UpgradeableRejectReason.MinCustomFormatScore:
return Decision.Reject("Release in queue has Custom Format score within Custom Format score increment: {0}", qualityProfile.MinUpgradeFormatScore);
}
_logger.Debug("Checking if profiles allow upgrading. Queued: {0}", remoteMovie.ParsedMovieInfo.Quality);
if (!_upgradableSpecification.IsUpgradeAllowed(subject.Movie.QualityProfile,
remoteMovie.ParsedMovieInfo.Quality,
remoteMovie.CustomFormats,
subject.ParsedMovieInfo.Quality,
subject.CustomFormats))
{
return Decision.Reject("Another release is queued and the Quality profile does not allow upgrades");
case UpgradeableRejectReason.UpgradesNotAllowed:
return Decision.Reject("Release in queue and Quality Profile '{0}' does not allow upgrades", qualityProfile.Name);
}
if (_upgradableSpecification.IsRevisionUpgrade(remoteMovie.ParsedMovieInfo.Quality, subject.ParsedMovieInfo.Quality))

View File

@@ -107,6 +107,9 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
case UpgradeableRejectReason.MinCustomFormatScore:
return Decision.Reject("{0} grab event in history has Custom Format score within Custom Format score increment: {1}", rejectionSubject, qualityProfile.MinUpgradeFormatScore);
case UpgradeableRejectReason.UpgradesNotAllowed:
return Decision.Reject("{0} grab event in history and Quality Profile '{1}' does not allow upgrades", rejectionSubject, qualityProfile.Name);
}
}

View File

@@ -57,6 +57,13 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return UpgradeableRejectReason.None;
}
if (!qualityProfile.UpgradeAllowed)
{
_logger.Debug("Quality profile '{0}' does not allow upgrading. Skipping.", qualityProfile.Name);
return UpgradeableRejectReason.UpgradesNotAllowed;
}
// Reject unless the user does not prefer propers/repacks and it's a revision downgrade.
if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
qualityRevisionCompare < 0)
@@ -86,7 +93,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return UpgradeableRejectReason.CustomFormatScore;
}
if (qualityProfile.UpgradeAllowed && currentFormatScore >= qualityProfile.CutoffFormatScore)
if (currentFormatScore >= qualityProfile.CutoffFormatScore)
{
_logger.Debug("Existing item meets cut-off for custom formats, skipping. Existing: [{0}] ({1}). Cutoff score: {2}",
currentCustomFormats.ConcatToString(),

View File

@@ -83,6 +83,9 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
case UpgradeableRejectReason.MinCustomFormatScore:
return Decision.Reject("Existing file on disk has Custom Format score within Custom Format score increment: {0}", qualityProfile.MinUpgradeFormatScore);
case UpgradeableRejectReason.UpgradesNotAllowed:
return Decision.Reject("Existing file on disk and Quality Profile '{0}' does not allow upgrades", qualityProfile.Name);
}
return Decision.Accept();

View File

@@ -8,6 +8,7 @@ namespace NzbDrone.Core.DecisionEngine
QualityCutoff,
CustomFormatScore,
CustomFormatCutoff,
MinCustomFormatScore
MinCustomFormatScore,
UpgradesNotAllowed
}
}

View File

@@ -77,9 +77,10 @@ namespace NzbDrone.Core.Download.Aggregation.Aggregators
if (releaseInfo is { IndexerId: > 0 })
{
indexer = _indexerFactory.Get(releaseInfo.IndexerId);
indexer = _indexerFactory.Find(releaseInfo.IndexerId);
}
else if (releaseInfo.Indexer?.IsNotNullOrWhiteSpace() == true)
if (indexer == null && releaseInfo.Indexer?.IsNotNullOrWhiteSpace() == true)
{
indexer = _indexerFactory.FindByName(releaseInfo.Indexer);
}

View File

@@ -38,6 +38,10 @@ namespace NzbDrone.Core.Download
public IDownloadClient GetDownloadClient(DownloadProtocol downloadProtocol, int indexerId = 0, bool filterBlockedClients = false, HashSet<int> tags = null)
{
// Tags aren't required, but download clients with tags should not be picked unless there is at least one matching tag.
// Defaulting to an empty HashSet ensures this is always checked.
tags ??= new HashSet<int>();
var blockedProviders = new HashSet<int>(_downloadClientStatusService.GetBlockedProviders().Select(v => v.ProviderId));
var availableProviders = _downloadClientFactory.GetAvailableProviders().Where(v => v.Protocol == downloadProtocol).ToList();
@@ -46,18 +50,15 @@ namespace NzbDrone.Core.Download
return null;
}
if (tags is { Count: > 0 })
var matchingTagsClients = availableProviders.Where(i => i.Definition.Tags.Intersect(tags).Any()).ToList();
availableProviders = matchingTagsClients.Count > 0 ?
matchingTagsClients :
availableProviders.Where(i => i.Definition.Tags.Empty()).ToList();
if (!availableProviders.Any())
{
var matchingTagsClients = availableProviders.Where(i => i.Definition.Tags.Intersect(tags).Any()).ToList();
availableProviders = matchingTagsClients.Count > 0 ?
matchingTagsClients :
availableProviders.Where(i => i.Definition.Tags.Empty()).ToList();
if (!availableProviders.Any())
{
throw new DownloadClientUnavailableException("No download client was found without tags or a matching movie tag. Please check your settings.");
}
throw new DownloadClientUnavailableException("No download client was found without tags or a matching movie tag. Please check your settings.");
}
if (indexerId > 0)

View File

@@ -711,7 +711,7 @@
"RefreshLists": "Actualitza llistes",
"RefreshMonitoredIntervalHelpText": "Amb quina freqüència s'actualitzen les baixades monitorades dels clients de descàrrega, mínim 1 minut",
"RefreshMovie": "Actualitza pel·lícula",
"RegularExpressionsCanBeTested": "Les expressions regulars es poden provar [aquí](http://regexstorm.net/tester).",
"RegularExpressionsCanBeTested": "Les expressions regulars es poden provar [aquí]({url}).",
"RejectionCount": "Recompte de rebuigs",
"RelativePath": "Camí relatiu",
"ReleaseBranchCheckOfficialBranchMessage": "La branca {0} no és una branca de llançament de {appName} vàlida, no rebreu actualitzacions",

View File

@@ -16,7 +16,7 @@
"InCinemas": "I Biografen",
"ImportTipsMessage": "Nogle tips for at sikre importeringen går glat:",
"ImportMechanismHealthCheckMessage": "Aktiver Fuldendt Download Håndtering",
"ImportHeader": "Importer film du allerede har",
"ImportHeader": "Importer et allerede organiseret filmbibliotek for at føje film til {appName}",
"ImportExistingMovies": "Importer Eksisterende Film",
"Imported": "Importeret",
"Import": "Importer",
@@ -49,7 +49,7 @@
"DownloadClientStatusCheckAllClientMessage": "Alle download klienter er utilgængelige på grund af fejl",
"DownloadClientsSettingsSummary": "Download klienter, download håndtering og remote path mappings",
"DownloadClients": "Download Klienter",
"DownloadClientCheckUnableToCommunicateMessage": "Ude af stand til at kommunikere med {downloadClientName}.",
"DownloadClientCheckUnableToCommunicateMessage": "Ude af stand til at kommunikere med {downloadClientName}. »{errorMessage}«",
"DownloadClientCheckNoneAvailableMessage": "Ingen download klient tilgængelig",
"DownloadClient": "Download Klient",
"DiskSpace": "Disk Plads",
@@ -63,13 +63,13 @@
"Dates": "Datoer",
"Date": "Dato",
"CustomFormatsSettingsSummary": "Bruger Tilpassede Formater og Indstillinger",
"CustomFormatScore": "Bruger Tilpasset Format score",
"CustomFormatScore": "Brugerdefineret formats resultat",
"CustomFormats": "Bruger Tilpasset Formater",
"CustomFilters": "Bruger Tilpassede Filtere",
"Crew": "Besætning",
"ConnectSettingsSummary": "Notifikationer, forbindelser til media servere/afspillere og custom scripts",
"ConnectSettingsSummary": "Notifikationer, forbindelser til medieservere/-afspillere og brugerdefinerede scripts",
"Connections": "Forbindelser",
"ConnectionLost": "Forbindelse Mistet",
"ConnectionLost": "Forbindelse mistet",
"Connect": "Tilslut",
"Component": "Komponent",
"CompletedDownloadHandling": "Færdig Download Håndtering",
@@ -130,9 +130,9 @@
"EnableInteractiveSearch": "Aktivér interaktiv søgning",
"IgnoreDeletedMovies": "Fjern overvågning af slettede film",
"Images": "Billeder",
"IndexerPriorityHelpText": "Indekseringsprioritet fra 1 (højest) til 50 (lavest). Standard: 25.",
"IndexerPriorityHelpText": "Indeksatorprioritet fra 1 (højest) til 50 (lavest). Standard: 25. Anvendes til at vælge mellem udgivelser med ellers lige mange point. {appName} vil stadig bruge alle aktiverede indeksatorer til RSS-synkronisering og søgning",
"LogLevelTraceHelpTextWarning": "Sporlogning bør kun aktiveres midlertidigt",
"MappedNetworkDrivesWindowsService": "Tilsluttede netværksdrev er ikke tilgængelige, når programmet kører som en Windows-tjeneste. Se FAQ'en for mere information",
"MappedNetworkDrivesWindowsService": "Tilsluttede netværksdrev er ikke tilgængelige, når programmet kører som en Windows-tjeneste. Se FAQ'en ({url}) for mere information.",
"MassMovieSearch": "Massefilmsøgning",
"MIA": "MIA",
"MonitoredOnly": "Kun overvåget",
@@ -170,15 +170,15 @@
"AddRemotePathMapping": "Tilføj kortlægning af fjernsti",
"AddDelayProfile": "Tilføj forsinkelsesprofil",
"AddDownloadClient": "Tilføj downloadklient",
"AddedToDownloadQueue": "Tilføjet til download kø",
"AddedToDownloadQueue": "Føjet til downloadkø",
"AddQualityProfile": "Tilføj kvalitetsprofil",
"AddRootFolder": "Tilføj rodmappe",
"AllFiles": "Alle filer",
"AllMoviesInPathHaveBeenImported": "Alle film i {0} er blevet importeret",
"AllMoviesInPathHaveBeenImported": "Alle film i {path} er blevet importeret",
"AllResultsHiddenFilter": "Alle resultater skjules af det anvendte filter",
"Always": "Altid",
"AnalyticsEnabledHelpText": "Send anonym brugs- og fejlinformation til {appName}s servere. Dette inkluderer information i din browser, hvilke {appName} WebUI-sider du bruger, fejlrapportering samt OS og runtime-version. Vi bruger disse oplysninger til at prioritere funktioner og fejlrettelser.",
"AppDataDirectory": "AppData-bibliotek",
"AppDataDirectory": "AppData-mappe",
"AuthBasic": "Grundlæggende (pop op-browser)",
"Authentication": "Godkendelse",
"ApplyTags": "Anvend tags",
@@ -206,7 +206,7 @@
"ChownGroupHelpText": "Gruppens navn eller gid. Brug gid til eksterne filsystemer.",
"Add": "Tilføj",
"AddCustomFormat": "Tilføj tilpasset format",
"AddToDownloadQueue": "Tilføjet til downloadkø",
"AddToDownloadQueue": "Føj til downloadkø",
"AfterManualRefresh": "Efter manuel opdatering",
"ApiKey": "API-nøgle",
"AptUpdater": "Brug apt til at installere opdateringen",
@@ -219,10 +219,10 @@
"CancelProcessing": "Annuller behandling",
"CantFindMovie": "Hvorfor kan jeg ikke finde min film?",
"CertificateValidation": "Validering af certifikat",
"CertificateValidationHelpText": "Skift, hvor streng HTTPS-certificering er",
"CertificateValidationHelpText": "Skift, hvor streng HTTPS-certificering er. Ændr kun dette hvis du forstå risiciene.",
"CertValidationNoLocal": "Deaktiveret for lokale adresser",
"ChangeFileDate": "Skift fildato",
"CustomFormatUnknownCondition": "Ukendt tilstand for tilpasset format '{0}'",
"CustomFormatUnknownCondition": "Ukendt betingelse for tilpasset format »{implementation}«",
"DatabaseMigration": "DB Migration",
"ChownGroupHelpTextWarning": "Dette fungerer kun, hvis den bruger, der kører {appName}, er ejeren af filen. Det er bedre at sikre, at downloadklienten bruger den samme gruppe som {appName}.",
"ExcludeMovie": "Ekskluder film",
@@ -232,8 +232,8 @@
"CertificationCountryHelpText": "Vælg land for filmcertificeringer",
"ImportErrors": "Importfejl",
"ImportExtraFiles": "Importer ekstra filer",
"ImportExtraFilesMovieHelpText": "Importer matchende ekstra filer (undertekster, nfo osv.) Efter import af en filmfil",
"ImportFailed": "Import mislykkedes: {0}",
"ImportExtraFilesMovieHelpText": "Importer matchende ekstra filer (undertekster, nfo osv.) efter import af en filmfil",
"ImportFailed": "Import mislykkedes: »{sourceTitle}«",
"ImportLibrary": "Biblioteksimport",
"ImportListStatusCheckAllClientMessage": "Alle lister er utilgængelige på grund af fejl",
"DeleteBackup": "Slet sikkerhedskopi",
@@ -310,7 +310,7 @@
"RecyclingBinCleanup": "Oprydning af papirkurven",
"Refresh": "Opdater",
"RefreshMovie": "Opdater film",
"RegularExpressionsCanBeTested": "Regulære udtryk kan testes ",
"RegularExpressionsCanBeTested": "Regulære udtryk kan testes [her]({url}).",
"RejectionCount": "Afvisningstal",
"RelativePath": "Relativ sti",
"Released": "Udgivet",
@@ -358,7 +358,7 @@
"MediaManagementSettings": "Indstillinger for mediestyring",
"MediaManagementSettingsSummary": "Navngivning og filhåndteringsindstillinger",
"Hostname": "Værtsnavn",
"MinutesSixty": "60 minutter: {0}",
"MinutesSixty": "60 minutter: {sixty}",
"Missing": "Mangler",
"Month": "Måned",
"MoreDetails": "Flere detaljer",
@@ -399,7 +399,7 @@
"AllowHardcodedSubs": "Tillad hardcodede subs",
"PhysicalRelease": "Fysisk frigivelse",
"Port": "Havn",
"ProfilesSettingsSummary": "Kvalitets-, sprog- og forsinkelsesprofiler",
"ProfilesSettingsSummary": "Kvalitets-, sprog-, forsinkelses-, og udgivelsesprofiler",
"Progress": "Fremskridt",
"Proper": "Passende",
"Protocol": "Protokol",
@@ -408,7 +408,7 @@
"QualityProfile": "Kvalitetsprofil",
"QualityProfiles": "Kvalitetsprofiler",
"PreferredSize": "Foretrukken størrelse",
"QuickImport": "Hurtig import",
"QuickImport": "Flyt automatisk",
"SupportedListsMovie": "{appName} understøtter alle RSS-filmlister såvel som nedenstående.",
"AlreadyInYourLibrary": "Allerede i dit bibliotek",
"RecyclingBinCleanupHelpTextWarning": "Filer i papirkurven, der er ældre end det valgte antal dage, renses automatisk",
@@ -416,7 +416,7 @@
"AddingTag": "Tilføjer tag",
"AgeWhenGrabbed": "Alder (når grebet)",
"RefreshAndScan": "Opdater & Scan",
"RequiredHelpText": "Denne {0} betingelse skal matche for at det tilpassede format kan anvendes. Ellers er en enkelt {1} match tilstrækkelig.",
"RequiredHelpText": "Denne {implementationName}-betingelse skal matche for at det tilpassede format kan anvendes. Ellers er et enkelt {implementationName}-match tilstrækkeligt.",
"AddNewRestriction": "Tilføj ny begrænsning",
"RestartRequiredHelpTextWarning": "Kræver genstart for at træde i kraft",
"RestoreBackup": "Gendan sikkerhedskopi",
@@ -425,7 +425,7 @@
"Level": "Niveau",
"FileBrowserPlaceholderText": "Start med at skrive, eller vælg en sti nedenfor",
"StartupDirectory": "Startmappe",
"MoviesSelectedInterp": "{0} Film (er) valgt",
"MoviesSelectedInterp": "{count} film er valgt",
"MovieTitle": "Filmtitel",
"EditDelayProfile": "Rediger forsinkelsesprofil",
"Name": "Navn",
@@ -435,7 +435,7 @@
"MustContain": "Skal indeholde",
"MustNotContain": "Må ikke indeholde",
"NamingSettings": "Navngivningsindstillinger",
"NegateHelpText": "Hvis dette er markeret, gælder det tilpassede format ikke, hvis denne {0} betingelse stemmer overens.",
"NegateHelpText": "Hvis dette er markeret, gælder det tilpassede format ikke, hvis denne {implementationName}-betingelse stemmer overens.",
"SystemTimeHealthCheckMessage": "Systemtiden er slukket mere end 1 dag. Planlagte opgaver kører muligvis ikke korrekt, før tiden er rettet",
"Posters": "Plakater",
"PosterSize": "Plakatstørrelse",
@@ -466,53 +466,53 @@
"CloneIndexer": "Klonindekser",
"CloneProfile": "Klonprofil",
"CloseCurrentModal": "Luk Nuværende Modal",
"ColonReplacement": "Udskiftning af tyktarm",
"ColonReplacement": "Udskiftning af kolon",
"ColonReplacementFormatHelpText": "Skift hvordan {appName} håndterer kolonudskiftning",
"Conditions": "Betingelser",
"Connection": "Forbindelser",
"ConnectSettings": "Forbind indstillinger",
"ConsideredAvailable": "Anses for tilgængelig",
"CopyToClipboard": "Kopier til udklipsholder",
"CopyUsingHardlinksMovieHelpText": "Brug hardlinks, når du prøver at kopiere filer fra torrents, der stadig udsås",
"CopyUsingHardlinksMovieHelpText": "Hardlinks tillader {appName} at importere torrent-filer der stadig seedes, uden at optage ekstra diskplads eller at kopiere the fulde fil. Hardlinks virker kun, hvis kildefilen og destinationsfilen er på samme volumen",
"CopyUsingHardlinksHelpTextWarning": "Lejlighedsvis kan fillåse forhindre omdøbning af filer, der bliver seedet. Du kan midlertidigt deaktivere såning og bruge {appName}s omdøbningsfunktion som et arbejde rundt.",
"CouldNotFindResults": "Kunne ikke finde nogen resultater for '{0}'",
"CouldNotFindResults": "Kunne ikke finde nogen resultater for »{term}«",
"CreateEmptyMovieFolders": "Opret tomme filmmapper",
"CreateGroup": "Opret gruppe",
"CurrentlyInstalled": "Aktuelt installeret",
"CustomFormat": "Bruger Tilpasset Formater",
"CustomFormatHelpText": "{appName} scorer hver udgivelse ved hjælp af summen af scores for matchende tilpassede formater. Hvis en ny udgivelse ville forbedre scoren i samme eller bedre kvalitet, vil {appName} gribe den.",
"CustomFormatsSettings": "Indstillinger for brugerdefinerede formater",
"CustomFormatUnknownConditionOption": "Ukendt valgmulighed '{0}' for betingelse '{1}'",
"CustomFormatUnknownConditionOption": "Ukendt valgmulighed »{key}« for betingelsen »{implementation}«",
"Cutoff": "Skære af",
"UpgradeUntilCustomFormatScoreMovieHelpText": "Når denne score til brugerdefineret format er nået, downloader {appName} ikke længere film",
"UpgradeUntilMovieHelpText": "Når denne kvalitet er nået, downloader {appName} ikke længere film",
"CutoffUnmet": "Afskåret ude",
"CutoffUnmet": "Grænse ikke opnået",
"Days": "Dage",
"Debug": "Fejlfinde",
"EditCustomFormat": "Rediger brugerdefineret format",
"DefaultCase": "Standard sag",
"DefaultDelayProfileMovie": "Dette er standardprofilen. Det gælder for alle film, der ikke har en eksplicit profil.",
"DelayProfile": "Udskyd Profiler",
"DeleteBackupMessageText": "Er du sikker på, at du vil slette sikkerhedskopien '{0}'?",
"DeleteBackupMessageText": "Er du sikker på, at du vil slette sikkerhedskopien »{name}«?",
"DeleteDelayProfile": "Slet forsinkelsesprofil",
"DeleteDownloadClientMessageText": "Er du sikker på, at du vil slette downloadklienten '{0}'?",
"DeleteDownloadClientMessageText": "Er du sikker på, at du vil fjerne downloadklienten »{name}«?",
"DeleteEmptyFolders": "Slet tomme mapper",
"DeleteEmptyFoldersHelpText": "Slet tomme filmmapper under diskscanning, og når filmfiler slettes",
"DeleteMovieFilesHelpText": "Slet filmfilerne og filmmappen",
"DeleteMovieFiles": "Slet {0} filmfiler",
"DeleteMovieFiles": "Fjern {movieFileCount} filmfiler",
"DeleteHeader": "Slet - {0}",
"DeleteImportListExclusion": "Slet udelukkelse af importliste",
"DeleteIndexer": "Slet Indexer",
"DeleteIndexerMessageText": "Er du sikker på, at du vil slette indeksøren '{0}'?",
"DeleteIndexerMessageText": "Er du sikker på, at du vil slette indeksøren »{name}«?",
"DeleteNotification": "Slet underretning",
"DeleteNotificationMessageText": "Er du sikker på, at du vil slette underretningen '{0}'?",
"DeleteNotificationMessageText": "Er du sikker på, at du vil slette notifikationen »{name}«?",
"DeleteQualityProfile": "Slet kvalitetsprofil",
"DeleteRestriction": "Slet begrænsning",
"DeleteRestrictionHelpText": "Er du sikker på, at du vil slette denne begrænsning?",
"DeleteSelectedMovie": "Slet valgte film",
"DeleteSelectedMovieFiles": "Slet valgte filmfiler",
"DeleteTagMessageText": "Er du sikker på, at du vil slette tagget '{0}'?",
"DeleteMovieFolderConfirmation": "Filmmappen '{0}' og alt dens indhold slettes.",
"DeleteTagMessageText": "Er du sikker på, at du vil slette etiketten »{label}«?",
"DeleteMovieFolderConfirmation": "Filmmappen »{path}« og alt dens indhold slettes.",
"DestinationPath": "Destinationssti",
"DestinationRelativePath": "Destinationsrelateret sti",
"DetailedProgressBar": "Detaljeret statuslinje",
@@ -527,7 +527,7 @@
"Downloading": "Downloader",
"DownloadPropersAndRepacks": "Propers og Repacks",
"DownloadPropersAndRepacksHelpTextCustomFormat": "Brug 'Foretrækkes ikke' til at sortere efter brugerdefineret format score over Propers / Repacks",
"DownloadWarning": "Downloadadvarsel: {0}",
"DownloadWarning": "Downloadadvarsel: »{warningMessage}«",
"Edition": "Udgave",
"EditImportListExclusion": "Rediger ekskludering af lister",
"EditMovieFile": "Rediger filmfil",
@@ -580,12 +580,12 @@
"Global": "Global",
"GoToInterp": "Gå til {0}",
"Grab": "Tag fat",
"GrabRelease": "Grab Release",
"GrabRelease": "Hent udgivelse",
"GrabReleaseMessageText": "{appName} var ikke i stand til at bestemme, hvilken film denne udgivelse var til. {appName} kan muligvis ikke automatisk importere denne udgivelse. Vil du hente '{0}'?",
"Group": "Gruppe",
"HiddenClickToShow": "Skjult, klik for at vise",
"Host": "Vært",
"ICalLink": "iCal Link",
"ICalLink": "iCal-link",
"IconForCutoffUnmet": "Ikon til Cutoff Unmet",
"IgnoredAddresses": "Ignorerede adresser",
"IgnoredHelpText": "Frigivelsen afvises, hvis den indeholder et eller flere af vilkårene (store og små bogstaver)",
@@ -614,7 +614,7 @@
"Links": "Links",
"ImportLists": "Lister",
"ImportListSettings": "Listeindstillinger",
"ImportListsSettingsSummary": "Importlister, listeekskluderinger",
"ImportListsSettingsSummary": "Importér fra en anden {appName}-instans eller fra Trakt-lister og håndter listeekskluderinger",
"ListSyncLevelHelpText": "Film i biblioteket fjernes eller overvåges, hvis de ikke er på din liste",
"LogFiles": "Logfiler",
"Logging": "Logning",
@@ -640,8 +640,8 @@
"MinimumAvailability": "Minimum tilgængelighed",
"MinimumCustomFormatScore": "Minimum tilpasset format score",
"MinimumFreeSpaceHelpText": "Forhindre import, hvis den efterlader mindre end denne mængde diskplads tilgængelig",
"MinutesHundredTwenty": "120 minutter: {0}",
"MinutesNinety": "90 minutter: {0}",
"MinutesHundredTwenty": "120 minutter: {hundredTwenty}",
"MinutesNinety": "90 minutter: {ninety}",
"Mode": "Mode",
"Monitor": "Overvåge",
"Monitored": "Overvåget",
@@ -666,7 +666,7 @@
"NoTagsHaveBeenAddedYet": "Der er ikke tilføjet nogen tags endnu",
"Options": "Muligheder",
"Organize": "Organisere",
"OrganizeConfirm": "Er du sikker på, at du vil organisere alle filer i de {0} valgte film?",
"OrganizeConfirm": "Er du sikker på, at du vil organisere alle filer i de {count} valgte film?",
"OrganizeSelectedMovies": "Organiser valgte film",
"Original": "Original",
"OutputPath": "Outputsti",
@@ -678,7 +678,7 @@
"Preferred": "Foretrukket",
"PreviewRename": "Vis eksempel Omdøb",
"PreviewRenameHelpText": "Tip: For at få vist et omdøbning ... vælg 'Annuller', klik derefter på en filmtitel og brug",
"PrioritySettings": "Prioritet: {0}",
"PrioritySettings": "Prioritet: {priority}",
"ProxyCheckBadRequestMessage": "Kunne ikke teste proxy. Statuskode: {statusCode}",
"ProxyCheckFailedToTestMessage": "Kunne ikke teste proxy: {url}",
"ProxyCheckResolveIpMessage": "Mislykkedes at løse IP-adressen til den konfigurerede proxyhost {proxyHostName}",
@@ -702,7 +702,7 @@
"ReleaseStatus": "Frigør status",
"ReleaseTitle": "Udgiv titel",
"Reload": "Genindlæs",
"RemotePathMappings": "Remote Path Mappings",
"RemotePathMappings": "Sammenkædning med fjernsti",
"Remove": "Fjerne",
"RemovedFromTaskQueue": "Fjernet fra opgavekøen",
"RemovedMovieCheckMultipleMessage": "Film {movies} blev fjernet fra TMDb",
@@ -756,7 +756,7 @@
"SearchForMovie": "Søg efter film",
"SearchMissing": "Søgning mangler",
"SearchOnAdd": "Søg på Tilføj",
"ListSearchOnAddMovieHelpText": "Søg efter film på denne liste, når du føjes til {appName}",
"ListSearchOnAddMovieHelpText": "Søg efter film på denne liste, når de føjes til biblioteket",
"SearchSelected": "Søgning valgt",
"Seconds": "Sekunder",
"Security": "Sikkerhed",
@@ -805,7 +805,7 @@
"SkipFreeSpaceCheck": "Spring fri pladscheck over",
"Small": "Lille",
"Socks4": "Strømper 4",
"Socks5": "Socks5 (Support TOR)",
"Socks5": "Socks5 (Understøtter TOR)",
"SomeResultsHiddenFilter": "Nogle resultater skjules af det anvendte filter",
"SorryThatMovieCannotBeFound": "Beklager, den film kan ikke findes.",
"Sort": "Sortere",
@@ -830,23 +830,23 @@
"Table": "Tabel",
"TableOptions": "Tabelindstillinger",
"TableOptionsColumnsMessage": "Vælg hvilke kolonner der er synlige og hvilken rækkefølge de vises i",
"TagDetails": "Tagdetaljer - {0}",
"TagDetails": "Etiketdetaljer - {label}",
"TagIsNotUsedAndCanBeDeleted": "Tag bruges ikke og kan slettes",
"Tags": "Mærker",
"ICalTagsMoviesHelpText": "Gælder film med mindst et matchende tag",
"Tasks": "Opgaver",
"Test": "Afprøv",
"TestAll": "Afprøv alle",
"TheLogLevelDefault": "Logniveauet er som standard 'Info' og kan ændres i",
"ThisCannotBeCancelled": "Dette kan ikke annulleres en gang startet uden genstart af {appName}.",
"TheLogLevelDefault": "Logniveauet er som standard 'Info' og kan ændres under [Generelle indstillinger](/settings/general)",
"ThisCannotBeCancelled": "Dette kan ikke annulleres når først det er startet uden at du deaktiverer alle dine indeksører.",
"Title": "Titel",
"Titles": "Titler",
"TMDBId": "TMDb Id",
"TMDBId": "TMDb-ID",
"TmdbIdExcludeHelpText": "TMDb-id for filmen, der skal ekskluderes",
"Today": "I dag",
"TorrentDelay": "Torrentforsinkelse",
"TorrentDelayHelpText": "Forsink i minutter, før du tager fat i en torrent",
"TorrentDelayTime": "Torrentforsinkelse: {0}",
"TorrentDelayTime": "Torrentforsinkelse: {torrentDelay}",
"Torrents": "Torrenter",
"TorrentsDisabled": "Torrenter deaktiveret",
"Trace": "Spor",
@@ -904,7 +904,7 @@
"UpdateAutomaticallyHelpText": "Download og installer opdateringer automatisk. Du kan stadig installere fra System: Updates",
"UpdateCheckStartupTranslocationMessage": "Kan ikke installere opdatering, fordi startmappen '{startupFolder}' er i en App Translocation-mappe.",
"UpdateCheckUINotWritableMessage": "Kan ikke installere opdatering, fordi '{userName}' ikke kan skrive til mappen for brugergrænseflade '{uiFolder}'.",
"UpdateMechanismHelpText": "Brug {appName}s indbyggede opdatering eller et script",
"UpdateMechanismHelpText": "Brug {appName}s indbyggede opdateringsfunktion eller et script",
"UpdateScriptPathHelpText": "Sti til et brugerdefineret script, der tager en udpakket opdateringspakke og håndterer resten af opdateringsprocessen",
"UpdateSelected": "Opdatering valgt",
"UpgradeUntilCustomFormatScore": "Opgrader indtil brugerdefineret format score",
@@ -917,7 +917,7 @@
"Usenet": "Usenet",
"UsenetDelay": "Usenet-forsinkelse",
"UsenetDelayHelpText": "Forsink i minutter, før du tager fat i en frigivelse fra Usenet",
"UsenetDelayTime": "Usenetforsinkelse: {0}",
"UsenetDelayTime": "Usenet-forsinkelse: {usenetDelay}",
"UsenetDisabled": "Usenet deaktiveret",
"UseProxy": "Brug proxy",
"Version": "Version",
@@ -930,7 +930,7 @@
"WhitelistedHardcodedSubsHelpText": "Undertekstmærker, der er angivet her, betragtes ikke som hardkodede",
"WhitelistedSubtitleTags": "Hvidlistede undertekstmærker",
"Wiki": "Wiki",
"WouldYouLikeToRestoreBackup": "Vil du gendanne sikkerhedskopien {0}?",
"WouldYouLikeToRestoreBackup": "Vil du gendanne sikkerhedskopien »{name}«?",
"Year": "År",
"YesCancel": "Ja, Annuller",
"YesMoveFiles": "Ja, flyt filerne",
@@ -966,7 +966,7 @@
"Rating": "Bedømmelser",
"RssSyncIntervalHelpText": "Interval på få minutter. Sæt til nul for at deaktivere (dette stopper al automatisk frigivelse)",
"MonitorMovies": "Overvåg film",
"NoCollections": "Ingen film fundet. For at komme i gang vil du tilføje en ny film eller importere nogle eksisterende.",
"NoCollections": "Ingen samlinger fundet. For at komme i gang skal du tilføje en ny film eller importere nogle eksisterende",
"AllCollectionsHiddenDueToFilter": "Alle film er gemt på grund af aktivt filter.",
"Collections": "Samling",
"File": "Filer",
@@ -979,10 +979,10 @@
"DeleteDelayProfileMessageText": "Er du sikker på, at du vil slette denne forsinkelsesprofil?",
"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}'?",
"DeleteConditionMessageText": "Er du sikker på, at du vil slette betingelsen »{name}«?",
"DeleteCustomFormatMessageText": "Er du sikker på, at du vil slette indeksøren '{name}'?",
"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?",
"RemoveSelectedItemQueueMessageText": "Er du sikker på, at du vil fjerne 1 element fra køen?",
"RemoveSelectedItemsQueueMessageText": "Er du sikker på, at du vil fjerne {selectedCount} elementer fra køen?",
"ResetAPIKeyMessageText": "Er du sikker på, at du vil nulstille din API-nøgle?",
"ApplyTagsHelpTextAdd": "Tilføj: Føj tags til den eksisterende liste over tags",
"ApplyTagsHelpTextHowToApplyIndexers": "Sådan anvendes tags på de valgte film",
@@ -1006,16 +1006,16 @@
"DownloadClientsLoadError": "Kunne ikke indlæse downloadklienter",
"NotificationStatusSingleClientHealthCheckMessage": "Lister utilgængelige på grund af fejl: {notificationNames}",
"NotificationsSimplepushSettingsEvent": "Begivenhed",
"RemoveQueueItemConfirmation": "Er du sikker på, at du vil fjerne {0} element {1} fra køen?",
"RemoveQueueItemConfirmation": "Er du sikker på, at du vil fjerne »{sourceTitle}« fra køen?",
"AutoRedownloadFailed": "Download fejlede",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Minimum tilpasset format score",
"EditImportListImplementation": "Tilføj importliste - {implementationName}",
"FormatAgeMinute": "Protokoller",
"InteractiveImportLoadError": "Kunne ikke indlæse manuelle importvarer",
"ConditionUsingRegularExpressions": "Denne betingelse stemmer overens med brug af regulære udtryk. Bemærk, at tegnene {0} har en særlig betydning og skal undslippe med en {1}",
"ConnectionLostReconnect": "Radarr vil prøve at tilslutte automatisk, eller du kan klikke genindlæs forneden.",
"ConditionUsingRegularExpressions": "Denne betingelse stemmer overens ved brug af regulære udtryk. Bemærk, at tegnene »\\^$.|?*+()[{« har en særlig betydning og skal indledes med indkodningstegnet »\\«",
"ConnectionLostReconnect": "{appName} vil prøve at tilslutte automatisk. Ellers du kan klikke genindlæs forneden.",
"DeleteSpecification": "Slet underretning",
"DeleteSpecificationHelpText": "Er du sikker på, at du vil slette kvalitetsprofilen {0}",
"DeleteSpecificationHelpText": "Er du sikker på, at du vil slette specifikationen »{name}«?",
"DeletedReasonUpgrade": "Filen blev slettet for at importere en opgradering",
"Directory": "Mappe",
"Lists": "Lister",
@@ -1023,15 +1023,15 @@
"PreferredProtocol": "Foretrukken protokol",
"RestartLater": "Jeg genstarter senere",
"SelectDropdown": "'Vælg...",
"AddIndexerImplementation": "Tilføj betingelse - {implementationName}",
"AddIndexerImplementation": "Tilføj indeksør - {implementationName}",
"EditDownloadClientImplementation": "Tilføj downloadklient - {implementationName}",
"DelayingDownloadUntil": "Forsinker download indtil {0} kl. {1}",
"AddAutoTag": "Tilføj automatisk Tag",
"DeleteAutoTagHelpText": "Er du sikker på, at du vil slette kvalitetsprofilen {0}",
"DelayingDownloadUntil": "Forsinker download indtil {date} kl. {time}",
"AddAutoTag": "Tilføj automatisk etiket",
"DeleteAutoTagHelpText": "Er du sikker på, at du vil slette den automatiske etiket »{name}«?",
"BlocklistLoadError": "Kunne ikke indlæse sortliste",
"NotificationStatusAllClientHealthCheckMessage": "Alle lister er utilgængelige på grund af fejl",
"InteractiveSearchModalHeader": "Interaktiv søgning",
"RetryingDownloadOn": "Prøver igen at downloade {0} kl. {1}",
"RetryingDownloadOn": "Prøver igen at downloade d. {date} kl. {time}",
"OrganizeLoadError": "Fejl ved indlæsning af forhåndsvisning",
"QueueLoadError": "Kunne kunne ikke indlæses",
"EditIndexerImplementation": "Tilføj betingelse - {implementationName}",
@@ -1050,39 +1050,39 @@
"CustomFilter": "Bruger Tilpassede Filtere",
"ReleaseProfiles": "udgivelsesprofil",
"EditConditionImplementation": "Tilføj forbindelse - {implementationName}",
"GrabId": "Grab ID",
"GrabId": "Hent ID",
"FormatAgeMinutes": "Protokoller",
"Label": "Etiket",
"RemoveSelectedBlocklistMessageText": "Er du sikker på, at du vil fjerne de valgte emner fra sortlisten?",
"AddAutoTagError": "Kan ikke tilføje en ny liste, prøv igen.",
"AddAutoTagError": "Kan ikke tilføje en ny automatisk etiket. Prøv igen.",
"Release": "udgivelse",
"DelayProfileMovieTagsHelpText": "Gælder film med mindst et matchende tag",
"OrganizeNothingToRename": "Succes! Mit arbejde er udført, ingen filer at omdøbe.",
"MovieFileDeleted": "Slet på filmfil",
"ApplyTagsHelpTextHowToApplyMovies": "Sådan anvendes tags på de valgte film",
"DownloadClientSettingsRecentPriority": "Kundens prioritet",
"DeleteQualityProfileMessageText": "Er du sikker på, at du vil slette kvalitetsprofilen {0}",
"DeleteQualityProfileMessageText": "Er du sikker på, at du vil slette kvalitetsprofilen »{name}«?",
"DeleteSelectedMovieFilesHelpText": "Er du sikker på, at du vil slette de valgte filmfiler?",
"MovieIsNotMonitored": "Film overvåges",
"DeleteReleaseProfile": "Slet forsinkelsesprofil",
"DeleteReleaseProfileMessageText": "Er du sikker på, at du vil slette kvalitetsprofilen {0}",
"DeleteReleaseProfile": "Slet udgivelsesprofil",
"DeleteReleaseProfileMessageText": "Er du sikker på, at du vil slette udgivelsesprofilen »{name}«?",
"DeletedReasonMovieMissingFromDisk": "{appName} kunne ikke finde filen på disken, så den blev fjernet",
"ReleaseProfilesLoadError": "Kunne ikke indlæse forsinkelsesprofiler",
"SearchOnAddCollectionHelpText": "Søg efter film denne liste, når du føjes til {appName}",
"SearchOnAddCollectionHelpText": "Søg efter film i denne samling, når de føjes til biblioteket",
"EditConnectionImplementation": "Tilføj forbindelse - {implementationName}",
"MovieSearchResultsLoadError": "Kunne ikke indlæse resultater for denne filmsøgning. Prøv igen senere",
"FormatAgeHour": "Timer",
"IndexerSettingsMultiLanguageRelease": "Multi-sprog",
"DeleteImportListMessageText": "Er du sikker på, at du vil slette kvalitetsprofilen {0}",
"DeleteImportListMessageText": "Er du sikker på, at du vil slette listen »{name}«?",
"ReleaseGroups": "Slip gruppe",
"IMDbId": "TMDb Id",
"AddDelayProfileError": "Kan ikke tilføje en ny forsinkelsesprofil. Prøv venligst igen.",
"AddDelayProfileError": "Kan ikke tilføje en ny forsinkelsesprofil. Prøv igen.",
"ShowUnknownMovieItemsHelpText": "Vis emner uden en film i køen. Dette kan omfatte fjernede film eller andet i {appName}s kategori",
"MovieFileDeletedTooltip": "Slet på filmfil",
"DeleteMovieFolders": "Slet filmmappe",
"DeleteMovieFoldersHelpText": "Slet filmmappen og dens indhold",
"DeleteSelectedMovies": "Slet valgte filmfiler",
"AutoTaggingNegateHelpText": "Hvis dette er markeret, gælder det tilpassede format ikke, hvis denne {0} betingelse stemmer overens.",
"AutoTaggingNegateHelpText": "Hvis dette er markeret, vil reglen for automatisk etiket ikke blive anvendt, hvis denne {implementationName}-betingelse stemmer overens.",
"DeleteSelectedImportListExclusionsMessageText": "Er du sikker på, at du vil slette denne undtagelse fra importlisten?",
"DeleteSelectedCustomFormats": "Slet brugerdefineret format",
"ReleaseDate": "Slip datoer",
@@ -1095,5 +1095,7 @@
"Delay": "Forsinkelse",
"EditReleaseProfile": "Rediger forsinkelsesprofil",
"DownloadClientUnavailable": "Downloadklienten er ikke tilgængelig",
"AddReleaseProfile": "Rediger forsinkelsesprofil"
"AddReleaseProfile": "Rediger forsinkelsesprofil",
"ApiKeyValidationHealthCheckMessage": "Opdater din API-nøgle til at være på mindste {length} karakterer. Dette kan gøres i indstillingerne eller i konfigurationsfilen",
"AutoTaggingSpecificationTag": "Etiket"
}

View File

@@ -658,7 +658,7 @@
"AddConditionError": "Die neue Bedingung konnte nicht hinzugefügt werden, bitte erneut probieren.",
"FileBrowserPlaceholderText": "Beginne mit der Eingabe oder wähle unten einen Pfad aus",
"Restore": "Wiederherstellen",
"RegularExpressionsCanBeTested": "Reguläre Ausdrücke können [hier](http://regexstorm.net/tester) getestet werden.",
"RegularExpressionsCanBeTested": "Reguläre Ausdrücke können [hier]({url}) getestet werden.",
"SupportedCustomConditions": "{appName} unterstützt benutzerdefinierte Bedingungen für die Release-Eigenschaften unten.",
"SupportedListsMovie": "RSS Film Listen sowie unten aufgelistete werden untertützt.",
"SupportedIndexers": "{appName} unterstützt jeden Indexer, der den Newznab-Standard verwendet, sowie andere Indexer, die unten aufgelistet sind.",
@@ -1317,7 +1317,7 @@
"EditIndexerImplementation": "Indexer bearbeiten - {implementationName}",
"Lists": "Listen",
"MustNotContainHelpText": "Das Release wird abgelehnt, wenn einer oder mehrere dieser Begriffe enthalten sind (Groß- und Kleinschreibung ignorieren)",
"RegularExpressionsTutorialLink": "Weitere Details zu regulären Ausdrücken finden Sie [hier](https://www.regular-expressions.info/tutorial.html).",
"RegularExpressionsTutorialLink": "Weitere Details zu regulären Ausdrücken finden Sie [hier]({url}).",
"Release": "Veröffentlichung",
"Space": "Platz",
"TablePageSize": "Seitengröße",
@@ -1787,5 +1787,7 @@
"UnableToImportAutomatically": "Kann nicht automatisch importiert werden",
"UnknownEventTooltip": "Unbekanntes Ereignis",
"Warning": "Warnung",
"YesterdayAt": "Gestern um {time}"
"YesterdayAt": "Gestern um {time}",
"RemotePathMappingsInfo": "Remote-Pfadzuordnungen sind sehr selten erforderlich. Wenn {appName} und dein Download-Client auf demselben System sind, ist es besser, deine Pfade abzugleichen. Weitere Informationen findest du im [Wiki]({wikiLink}).",
"NotificationsTelegramSettingsMetadataLinks": "Metadaten-Links"
}

View File

@@ -1234,6 +1234,10 @@
"NotificationsTelegramSettingsChatIdHelpText": "You must start a conversation with the bot or add it to your group to receive messages",
"NotificationsTelegramSettingsIncludeAppName": "Include {appName} in Title",
"NotificationsTelegramSettingsIncludeAppNameHelpText": "Optionally prefix message title with {appName} to differentiate notifications from different applications",
"NotificationsTelegramSettingsIncludeInstanceName": "Include Instance Name in Title",
"NotificationsTelegramSettingsIncludeInstanceNameHelpText": "Optionally include Instance name in notification",
"NotificationsTelegramSettingsMetadataLinks": "Metadata Links",
"NotificationsTelegramSettingsMetadataLinksMovieHelpText": "Add links to movie metadata when sending notifications",
"NotificationsTelegramSettingsSendSilently": "Send Silently",
"NotificationsTelegramSettingsSendSilentlyHelpText": "Sends the message silently. Users will receive a notification with no sound",
"NotificationsTelegramSettingsTopicId": "Topic ID",
@@ -1418,8 +1422,8 @@
"RefreshLists": "Refresh Lists",
"RefreshMonitoredIntervalHelpText": "How often to refresh monitored downloads from download clients, minimum 1 minute",
"RefreshMovie": "Refresh movie",
"RegularExpressionsCanBeTested": "Regular expressions can be tested [here](http://regexstorm.net/tester).",
"RegularExpressionsTutorialLink": "More details on regular expressions can be found [here](https://www.regular-expressions.info/tutorial.html).",
"RegularExpressionsCanBeTested": "Regular expressions can be tested [here]({url}).",
"RegularExpressionsTutorialLink": "More details on regular expressions can be found [here]({url}).",
"RejectionCount": "Rejection Count",
"Rejections": "Rejections",
"RelativePath": "Relative Path",

View File

@@ -661,7 +661,7 @@
"TagIsNotUsedAndCanBeDeleted": "La etiqueta no se usa y puede ser borrada",
"FileBrowserPlaceholderText": "Comienza a escribir o selecciona una ruta debajo",
"Restore": "Restaurar",
"RegularExpressionsCanBeTested": "Las expresiones regulares pueden ser probadas [aquí](http://regexstorm.net/tester).",
"RegularExpressionsCanBeTested": "Las expresiones regulares pueden ser probadas [aquí]({url}).",
"SupportedListsMovie": "{appName} soporta cualquier lista RSS de películas, como también la listada debajo.",
"SupportedIndexers": "{appName} soporta cualquier indexador que use el estándar Newznab, así como otros indexadores listados a continuación.",
"SupportedDownloadClients": "{appName} soporta muchos torrent populares y clientes de descarga de usenet.",
@@ -1745,7 +1745,7 @@
"Underscore": "Guion bajo",
"AddDelayProfileError": "No se pudo añadir un nuevo perfil de retraso, por favor inténtalo de nuevo.",
"ChownGroup": "chown del grupo",
"RegularExpressionsTutorialLink": "Más detalles de las expresiones regulares pueden ser encontrados [aquí](https://www.regular-expressions.info/tutorial.html).",
"RegularExpressionsTutorialLink": "Más detalles de las expresiones regulares pueden ser encontrados [aquí]({url}).",
"ReleaseGroupFootNote": "Opcionalmente controla el truncamiento hasta un número máximo de bytes, incluyendo elipsis (`...`). Está soportado truncar tanto desde el final (p. ej. `{Grupo de lanzamiento:30}`) como desde el principio (p. ej. `{Grupo de lanzamiento:-30}`).",
"EditionFootNote": "Opcionalmente controla el truncamiento hasta un número máximo de bytes, incluyendo elipsis (`...`). Está soportado truncar tanto desde el final (p. ej. `{Etiquetas de edición:30}`) como desde el principio (p. ej. `{Etiquetas de edición:-30}`).",
"MovieFootNote": "Opcionalmente controla el truncamiento hasta un número máximo de bytes, incluyendo elipsis (`...`). Está soportado truncar tanto desde el final (p. ej. `{Título de película:30}`) como desde el principio (p. ej. `{Título de película:-30}`).",
@@ -1863,5 +1863,12 @@
"Warning": "Aviso",
"FavoriteFolderRemove": "Eliminar carpeta favorita",
"DownloadClientUnavailable": "Cliente de descarga no disponible",
"NotificationsSettingsWebhookHeaders": "Cabeceras"
"NotificationsSettingsWebhookHeaders": "Cabeceras",
"MetadataKometaDeprecated": "Los archivos de Kometa no seguirán siendo creados, el soporte se eliminará completamente en la v6",
"MetadataKometaDeprecatedSetting": "Obsoleto",
"Fallback": "Retirada",
"NotificationsTelegramSettingsMetadataLinks": "Enlaces de metadatos",
"NotificationsTelegramSettingsIncludeInstanceName": "Incluir el nombre de la instancia en el título",
"NotificationsTelegramSettingsIncludeInstanceNameHelpText": "Opcionalmente incluye el nombre de la instancia en la notificación",
"NotificationsTelegramSettingsMetadataLinksMovieHelpText": "Añade un enlace a los metadatos de la película cuando se envían notificaciones"
}

View File

@@ -232,7 +232,7 @@
"ReadTheWikiForMoreInformation": "Wikistä löydät lisää tietoja",
"Reason": "Syy",
"Refresh": "Päivitä",
"RegularExpressionsCanBeTested": "Säännöllisiä lausekkeita voidaan testata [täällä](http://regexstorm.net/tester).",
"RegularExpressionsCanBeTested": "Säännöllisiä lausekkeita voidaan testata [täällä]({url}).",
"New": "Uutta",
"LocalPath": "Paikallinen sijainti",
"RemotePath": "Kaukopolku",
@@ -1695,7 +1695,7 @@
"RestartLater": "Käynnistän uudelleen myöhemmin",
"Repack": "Uudelleenpaketoitu",
"Release": "Julkaisu",
"RegularExpressionsTutorialLink": "Lisätietoja säännöllisistä lausekkeista löytyy [täältä](https://www.regular-expressions.info/tutorial.html).",
"RegularExpressionsTutorialLink": "Lisätietoja säännöllisistä lausekkeista löytyy [täältä]({url}).",
"ReleaseProfileIndexerHelpText": "Määritä mitä tietolähdettä profiili koskee.",
"ReleaseProfileTagMovieHelpText": "Julkaisuprofiileja sovelletaan elokuviin, jotka on merkitty ainakin yhdellä vastaavalla tunnisteella. Käytä kaikille elokuville jättämällä tyhjäksi.",
"SearchMoviesOnAdd": "Etsi elokuvia kun ne lisätään",

View File

@@ -670,7 +670,7 @@
"Remove": "Retirer",
"ReleaseRejected": "Libération rejetée",
"ReleaseDates": "Date de sortie",
"RegularExpressionsCanBeTested": "Les expressions régulières peuvent être testées [ici](http://regexstorm.net/tester).",
"RegularExpressionsCanBeTested": "Les expressions régulières peuvent être testées [ici]({url}).",
"RefreshMovie": "Actualiser le film",
"RefreshInformationAndScanDisk": "Actualiser les informations et analyser le disque",
"RecyclingBinCleanup": "Nettoyage du bac de recyclage",
@@ -1669,7 +1669,7 @@
"NoDelay": "Pas de délai",
"OptionalName": "Nom facultatif",
"Popular": "Populaire",
"RegularExpressionsTutorialLink": "Vous trouverez plus de détails sur les expressions régulières [ici](https://www.regular-expressions.info/tutorial.html).",
"RegularExpressionsTutorialLink": "Vous trouverez plus de détails sur les expressions régulières [ici]({url}).",
"Trending": "Tendance",
"TypeOfList": "{typeOfList} Liste",
"DownloadClientDownloadStationValidationNoDefaultDestinationDetail": "Vous devez vous connecter à votre poste de travail en tant que {username} et le configurer manuellement dans les paramètres de la DownloadStation sous BT/HTTP/FTP/NZB -> Location.",
@@ -1846,5 +1846,7 @@
"FileBrowser": "Explorateur de fichiers",
"Completed": "Terminé",
"Delay": "Délai",
"DownloadClientUnavailable": "Le client de téléchargement n'est pas disponible"
"DownloadClientUnavailable": "Le client de téléchargement n'est pas disponible",
"NotificationsTelegramSettingsMetadataLinks": "Liens de métadonnées",
"NotificationsTelegramSettingsMetadataLinksMovieHelpText": "Ajouter un lien vers les métadonnées de la série lors de l'envoi de notifications"
}

View File

@@ -865,7 +865,7 @@
"BrowserReloadRequired": "חובה לטעון דפדפן",
"UiSettings": "הגדרות ממשק המשתמש",
"UiSettingsSummary": "אפשרויות לקויות לוח שנה, תאריך וצבע",
"AddConditionError": "לא ניתן להוסיף תנאי חדש, נסה שוב.",
"AddConditionError": "לא ניתן להוסיף תנאי חדש, נסה שנית.",
"AddCustomFormatError": "לא ניתן להוסיף פורמט מותאם אישית חדש, נסה שוב.",
"AddDownloadClientError": "לא ניתן להוסיף לקוח הורדות חדש, נסה שוב.",
"AddIndexerError": "לא ניתן להוסיף אינדקס חדש, נסה שוב.",
@@ -1048,7 +1048,7 @@
"ReleaseProfilesLoadError": "לא ניתן לטעון פרופילי עיכוב",
"RemoveQueueItemConfirmation": "האם אתה בטוח שברצונך להסיר את {0} פריט {1} מהתור?",
"Yes": "כן",
"AddAutoTag": "הוסף טגית אוטומטית",
"AddAutoTag": "הוסף תג אוטומטית",
"DeleteQualityProfileMessageText": "האם אתה בטוח שברצונך למחוק את פרופיל האיכות {0}",
"ApplyTagsHelpTextHowToApplyDownloadClients": "כיצד להחיל תגים על הסרטים שנבחרו",
"DisabledForLocalAddresses": "מושבת לכתובות מקומיות",
@@ -1084,7 +1084,7 @@
"DeleteReleaseProfile": "מחק פרופיל עיכוב",
"InteractiveSearchModalHeader": "חיפוש אינטראקטיבי",
"InteractiveImportLoadError": "לא ניתן לטעון פריטי ייבוא ידניים",
"AddAutoTagError": "לא ניתן להוסיף רשימה חדשה, אנא נסה שוב.",
"AddAutoTagError": "לא ניתן להוסיף תג חדש, נסה שנית.",
"No": "לא",
"MustNotContainHelpText": "המהדורה תידחה אם היא מכילה אחד או יותר מהתנאים (חסר רישיות)",
"ApplyTagsHelpTextHowToApplyMovies": "כיצד להחיל תגים על הסרטים שנבחרו",
@@ -1118,5 +1118,6 @@
"Clone": "סגור",
"EditReleaseProfile": "ערוך פרופיל עיכוב",
"AddReleaseProfile": "ערוך פרופיל עיכוב",
"DownloadClientUnavailable": "לקוח ההורדות אינו זמין"
"DownloadClientUnavailable": "לקוח ההורדות אינו זמין",
"AddCondition": "הוסף תנאי"
}

View File

@@ -1337,7 +1337,7 @@
"RemoveTagsAutomatically": "Címkék automatikus eltávolítása",
"RestartLater": "Később újraindítom",
"QualitiesLoadError": "Nem lehet minőségeket betölteni",
"RegularExpressionsTutorialLink": "További részletek a reguláris kifejezésekről [itt](https://www.regular-expressions.info/tutorial.html).",
"RegularExpressionsTutorialLink": "További részletek a reguláris kifejezésekről [itt]({url}).",
"PasswordConfirmation": "Jelszó megerősítése",
"SecretToken": "Titkos token",
"AddListExclusion": "Listakizárás hozzáadása",

View File

@@ -7,7 +7,7 @@
"Activity": "Aktivitas",
"Add": "Tambah",
"AddCustomFormat": "Tambahkan Format Khusus",
"AddDownloadClient": "Tambahkan Klien Pengunduhan",
"AddDownloadClient": "Tambahkan Download Client",
"AddIndexer": "Tambahkan Pengindeks",
"Age": "Usia",
"All": "Semua",
@@ -174,5 +174,7 @@
"ToggleMonitoredToUnmonitored": "Dimonitor, klik untuk berhenti monitor",
"ToggleUnmonitoredToMonitored": "Tidak dimonitor, klik untuk monitor",
"Clone": "Tutup",
"EnableSsl": "Aktifkan RSS"
"EnableSsl": "Aktifkan RSS",
"AddCustomFormatError": "Tidak dapat menambahkan format khusus baru, coba lagi.",
"AddDelayProfile": "Tambah Delay Profile"
}

View File

@@ -409,7 +409,7 @@
"ReleaseRejected": "Release rifiutata",
"ReleaseDates": "Date di rilascio",
"RejectionCount": "Rifiuta il conteggio",
"RegularExpressionsCanBeTested": "Le espressioni regolari possono essere testate [qui](http://regexstorm.net/tester).",
"RegularExpressionsCanBeTested": "Le espressioni regolari possono essere testate [qui]({url}).",
"RefreshMovie": "Aggiorna il Film",
"RefreshInformationAndScanDisk": "Aggiorna le informazioni e scansiona il disco",
"RecyclingBinCleanup": "Pulizia Cestino",

View File

@@ -85,7 +85,7 @@
"UpdateScriptPathHelpText": "추출 된 업데이트 패키지를 사용하고 나머지 업데이트 프로세스를 처리하는 사용자 지정 스크립트에 대한 경로",
"UpgradeUntil": "품질까지 업그레이드",
"Usenet": "유즈넷",
"VisitTheWikiForMoreDetails": "자세한 내용은 위키를 방문하십시오. ",
"VisitTheWikiForMoreDetails": "자세한 내용은 위키를 방문하세요: ",
"YouCanAlsoSearch": "영화의 TMDb ID 또는 IMDb ID를 사용하여 검색 할 수도 있습니다. 예 : `tmdb : 71663`",
"OverviewOptions": "개요 옵션",
"PackageVersion": "패키지 버전",
@@ -404,7 +404,7 @@
"ImportListStatusCheckAllClientMessage": "실패로 인해 모든 목록을 사용할 수 없습니다.",
"ImportListStatusCheckSingleClientMessage": "실패로 인해 사용할 수없는 목록 : {importListNames}",
"TotalSpace": "총 공간",
"UpdateCheckStartupNotWritableMessage": "'{1}'사용자가 '{0}'시작 폴더에 쓸 수 없기 때문에 업데이트를 설치할 수 없습니다.",
"UpdateCheckStartupNotWritableMessage": "'{userName}' 사용자가 시작 폴더 '{startupFolder}'에 쓸 수 없기 때문에 업데이트를 설치할 수 없습니다.",
"UpgradesAllowedHelpText": "비활성화 된 자질은 업그레이드되지 않습니다.",
"Backup": "백업",
"Username": "사용자 이름",
@@ -413,9 +413,9 @@
"Disabled": "비활성화됨",
"Peers": "동료",
"UiSettingsLoadError": "UI 설정을 불러올 수 없습니다.",
"Unavailable": "없는",
"Unavailable": "사용 불가능",
"VideoCodec": "비디오 코덱",
"View": "표시 변경",
"View": "화면",
"Importing": "가져오기",
"NoLeaveIt": "아니, 놔둬",
"NoLimitForAnyRuntime": "런타임 제한 없음",
@@ -853,10 +853,10 @@
"TMDBId": "TMDb ID",
"TmdbIdExcludeHelpText": "제외 할 영화의 TMDb ID",
"Today": "오늘",
"TorrentDelay": "급류 지연",
"TorrentDelayHelpText": "급류를 잡기 전에 대기하는 데 몇 분이 걸립니다.",
"TorrentDelayTime": "급류 지연 : {0}",
"Torrents": "급류",
"TorrentDelay": "토렌트 지연",
"TorrentDelayHelpText": "토렌트를 잡기 전에 대기까지 소요되는 지연 (분)",
"TorrentDelayTime": "토렌트 지연: {0torrentDelay}",
"Torrents": "토렌트",
"TorrentsDisabled": "토렌트 비활성화",
"Trace": "자취",
"Trailer": "트레일러",
@@ -869,10 +869,10 @@
"BrowserReloadRequired": "브라우저 새로 고침 필요",
"UiSettings": "UI 설정",
"UiSettingsSummary": "달력, 날짜 및 색상 장애 옵션",
"AddConditionError": "새 조건을 추가 할 수 없습니다. 다시 시도하십시오.",
"AddConditionError": "새 조건을 추가 할 수 없습니다. 다시 시도해주세요.",
"AddCustomFormatError": "새 사용자 정의 형식을 추가 할 수 없습니다. 다시 시도하십시오.",
"AddDownloadClientError": "새 다운로드 클라이언트를 추가 할 수 없습니다. 다시 시도하십시오.",
"AddIndexerError": "새 인덱서를 추가 할 수 없습니다. 다시 시도하십시오.",
"AddIndexerError": "새 인덱서를 추가 할 수 없습니다. 다시 시도해주세요.",
"AddImportListExclusionError": "새 목록 제외를 추가 할 수 없습니다. 다시 시도하십시오.",
"AddListError": "새 목록을 추가 할 수 없습니다. 다시 시도하십시오.",
"AddQualityProfileError": "새 품질 프로필을 추가 할 수 없습니다. 다시 시도하십시오.",
@@ -908,12 +908,12 @@
"UpdateAll": "모두 업데이트",
"UpdateAutomaticallyHelpText": "업데이트를 자동으로 다운로드하고 설치합니다. 시스템 : 업데이트에서 계속 설치할 수 있습니다.",
"UpdateCheckStartupTranslocationMessage": "시작 폴더 '{startupFolder}'이 (가) App Translocation 폴더에 있으므로 업데이트를 설치할 수 없습니다.",
"UpdateMechanismHelpText": "{appName}의 내장 업데이트 프로그램 또는 스크립트 사용",
"UpdateMechanismHelpText": "{appName}의 내장 업데이트 도구 또는 스크립트 사용",
"UpdateSelected": "선택한 항목 업데이트",
"UpgradeUntilCustomFormatScore": "사용자 지정 형식 점수까지 업그레이드",
"UpgradeUntilThisQualityIsMetOrExceeded": "이 품질이 충족되거나 초과 될 때까지 업그레이드",
"Uppercase": "대문자",
"UrlBase": "URL베이스",
"UrlBase": "URL 기반",
"UrlBaseHelpText": "역방향 프록시 지원의 경우 기본값은 비어 있습니다.",
"UseHardlinksInsteadOfCopy": "복사 대신 하드 링크 사용",
"UsenetDelay": "유즈넷 지연",
@@ -928,12 +928,12 @@
"Week": "주",
"Weeks": "주",
"WhitelistedHardcodedSubsHelpText": "여기에 설정된 자막 태그는 하드 코딩 된 것으로 간주되지 않습니다.",
"WhitelistedSubtitleTags": "허용 된 자막 태그",
"WhitelistedSubtitleTags": "허용된 자막 태그",
"Wiki": "위키",
"WouldYouLikeToRestoreBackup": "{0} 백업을 복원 하시겠습니까?",
"WouldYouLikeToRestoreBackup": "'{name}' 백업을 복원하시겠습니까?",
"Year": "년",
"YesCancel": "예, 취소합니다",
"YesMoveFiles": "예, 파일 이동",
"YesMoveFiles": "예, 파일 이동합니다",
"Yesterday": "어제",
"MaintenanceRelease": "유지 관리 출시 : 버그 수정 및 기타 개선. 자세한 내용은 Github 커밋 내역을 참조하십시오.",
"MissingMonitoredAndConsideredAvailable": "누락 (모니터링 됨)",
@@ -1024,7 +1024,7 @@
"ReleaseProfilesLoadError": "지연 프로필을로드 할 수 없습니다.",
"QualitiesLoadError": "품질을로드 할 수 없습니다.",
"TablePageSize": "페이지 크기",
"AddAutoTagError": "새 목록을 추가 할 수 없습니다. 다시 시도하십시오.",
"AddAutoTagError": "새 자동 태그을 추가 할 수 없습니다. 다시 시도해주세요.",
"AddRootFolderError": "루트 폴더를로드 할 수 없습니다.",
"ApplyTagsHelpTextHowToApplyImportLists": "선택한 동영상에 태그를 적용하는 방법",
"MustNotContainHelpText": "하나 이상의 용어가 포함 된 경우 릴리스가 거부됩니다 (대소 문자 구분 안 함).",
@@ -1045,7 +1045,7 @@
"MovieSearchResultsLoadError": "이 영화 검색 결과를 불러올 수 없습니다. 나중에 다시 시도",
"NotificationsSimplepushSettingsEvent": "이벤트",
"SearchOnAddCollectionHelpText": "{appName}에 추가되면이 목록에서 영화 검색",
"AddDelayProfileError": "새 품질 프로필을 추가 할 수 없습니다. 다시 시도하십시오.",
"AddDelayProfileError": "새 지연 프로필을 추가할 수 없습니다. 다시 시도해주세요.",
"DeleteMovieFolders": "영화 폴더 삭제",
"DeleteMovieFoldersHelpText": "동영상 폴더 및 내용 삭제",
"DeleteSelectedMovies": "선택한 동영상 파일 삭제",
@@ -1073,5 +1073,24 @@
"EditConditionImplementation": "연결 추가 - {implementationName}",
"EditConnectionImplementation": "애플리케이션 추가 - {implementationName}",
"EditDownloadClientImplementation": "다운로드 클라이언트 추가 - {implementationName}",
"AddConditionImplementation": "연결 추가 - {implementationName}"
"AddConditionImplementation": "조건 추가 - {implementationName}",
"UnknownEventTooltip": "알 수 없는 이벤트",
"Waiting": "기다리는 중",
"TraktRating": "Trakt 평점",
"AddAutoTag": "자동 태그 추가",
"AddCondition": "조건 추가",
"TotalMovies": "총 영화",
"UseSsl": "SSL 사용",
"UsenetBlackhole": "유즈넷 블랙홀",
"TypeOfList": "{typeOfList} 목록",
"AddImportList": "가져오기 목록 추가",
"AddImportListImplementation": "가져오기 목록 추가 - {implementationName}",
"TorrentBlackholeTorrentFolder": "토렌트 폴더",
"UsenetBlackholeNzbFolder": "Nzb 폴더",
"UpdateAvailableHealthCheckMessage": "새 업데이트 사용 가능: {version}",
"Warning": "경고",
"VideoDynamicRange": "동영상 다이나믹 레인지",
"XmlRpcPath": "XML RPC 경로",
"YesterdayAt": "어제 {time}",
"DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더"
}

View File

@@ -662,7 +662,7 @@
"AddDownloadClientError": "Kon geen nieuwe downloader toevoegen, gelieve opnieuw te proberen.",
"AddCustomFormatError": "Kon geen nieuw eigen formaat toevoegen, gelieve opnieuw te proberen.",
"AddConditionError": "Kon geen nieuwe conditie toevoegen, gelieve opnieuw te proberen.",
"RegularExpressionsCanBeTested": "Reguliere expressies kunnen [hier] worden getest (http:://regexstorm.net/tester).",
"RegularExpressionsCanBeTested": "Reguliere expressies kunnen [hier] worden getest ({url}).",
"SupportedCustomConditions": "{appName} ondersteunt aangepaste condities tegenover de uitgave eigenschappen hieronder.",
"SupportedListsMovie": "{appName} ondersteunt elke RSS filmlijst, tevens ook de ander hieronder weergegeven lijsten.",
"SupportedIndexers": "{appName} ondersteund elke indexeerder die gebruik maakt van de Newznab standaard, tevens ook de ander hieronder weergegeven indexeerders.",

View File

@@ -747,7 +747,7 @@
"ReleasedMovieDescription": "Filme lançado",
"ReleaseDates": "Datas de lançamento",
"RelativePath": "Caminho relativo",
"RegularExpressionsCanBeTested": "Expressões regulares podem ser testadas [aqui](http://regexstorm.net/tester).",
"RegularExpressionsCanBeTested": "Expressões regulares podem ser testadas [aqui]({url}).",
"RefreshMovie": "Atualizar filme",
"RefreshLists": "Atualizar listas",
"RefreshInformationAndScanDisk": "Atualizar as informações e verificar o disco",
@@ -1711,7 +1711,7 @@
"DelayProfileProtocol": "Protocolo: {preferredProtocol}",
"DeleteReleaseProfile": "Excluir perfil de lançamento",
"MediaInfoFootNote": "MediaInfo Full/AudioLanguages/SubtitleLanguages suporta um sufixo `:EN+DE` permitindo filtrar os idiomas incluídos no nome do arquivo. Use `-DE` para excluir idiomas específicos. Anexar `+` (por exemplo, `:EN+`) resultará em `[EN]`/`[EN+--]`/`[--]` dependendo dos idiomas excluídos. Por exemplo, `{MediaInfo Full:EN+DE}`.",
"RegularExpressionsTutorialLink": "Mais detalhes sobre expressões regulares podem ser encontrados [aqui](https://www.regular-expressions.info/tutorial.html).",
"RegularExpressionsTutorialLink": "Mais detalhes sobre expressões regulares podem ser encontrados [aqui]({url}).",
"RestartRequiredToApplyChanges": "{appName} requer reinicialização para aplicar as alterações. Deseja reiniciar agora?",
"SupportedAutoTaggingProperties": "{appName} oferece suporte às propriedades a seguir para regras de codificação automática",
"WantMoreControlAddACustomFormat": "Quer mais controle sobre quais downloads são preferidos? Adicione um [Formato Personalizado](/settings/customformats)",
@@ -1864,5 +1864,11 @@
"FavoriteFolders": "Pastas Favoritas",
"Warning": "Cuidado",
"DownloadClientUnavailable": "Cliente de download indisponível",
"NotificationsSettingsWebhookHeaders": "Cabeçalhos"
"NotificationsSettingsWebhookHeaders": "Cabeçalhos",
"MetadataKometaDeprecatedSetting": "Deprecado",
"MetadataKometaDeprecated": "Os arquivos Kometa não serão mais criados, o suporte será completamente removido na v6",
"NotificationsTelegramSettingsIncludeInstanceName": "Incluir nome da instância no título",
"NotificationsTelegramSettingsIncludeInstanceNameHelpText": "Opcionalmente, inclua o nome da instância na notificação",
"NotificationsTelegramSettingsMetadataLinks": "Links de metadados",
"NotificationsTelegramSettingsMetadataLinksMovieHelpText": "Adicione links aos metadados da série ao enviar notificações"
}

View File

@@ -288,7 +288,7 @@
"SupportedListsMoreInfo": "Pentru mai multe informații despre listele de import individuale, faceți clic pe butoanele de informații.",
"LogLevelTraceHelpTextWarning": "Înregistrarea urmăririi trebuie activată doar temporar",
"Lowercase": "Minuscule",
"MappedNetworkDrivesWindowsService": "Unitățile de rețea mapate nu sunt disponibile atunci când rulează ca serviciu Windows. Vă rugăm să consultați FAQ pentru mai multe informații",
"MappedNetworkDrivesWindowsService": "Unitățile de rețea mapate nu sunt disponibile atunci când rulează ca serviciu Windows. Vă rugăm să consultați [FAQ]({url}) pentru mai multe informații",
"MinutesHundredTwenty": "120 de minute: {0}",
"MinutesNinety": "90 de minute: {0}",
"Months": "Luni",

View File

@@ -19,7 +19,7 @@
"Sort": "Sınıflandır",
"SetTags": "Etiketleri Ayarla",
"Scheduled": "Planlı",
"RootFolders": "Kök klasörler",
"RootFolders": "Kök Klasörler",
"RootFolderCheckSingleMessage": "Eksik kök klasör: {rootFolderPath}",
"RootFolderCheckMultipleMessage": "Birden fazla kök klasörler eksik: {rootFolderPaths}",
"RootFolder": "Kök Klasör",
@@ -29,20 +29,20 @@
"ProxyCheckBadRequestMessage": "Proxy ile test edilemedi. DurumKodu: {statusCode}",
"Proxy": "Proxy",
"PreviewRename": "Yeniden Adlandır ve Önizle",
"ImportListStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {importListNames}",
"ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor",
"ImportListStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan dizinleyiciler: {importListNames}",
"ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor",
"MonitoredOnly": "Sadece Takip Edilen",
"MetadataSettingsMovieSummary": "Filmler içe aktarıldığında veya yenilenince meta veri dosyaları oluştur",
"Metadata": "Meta veri",
"MediaManagement": "Medya işletme",
"MediaManagement": "Medya Yönetimi",
"Logging": "Loglama",
"LogFiles": "Log dosyaları",
"LogFiles": "Log Kayıtları",
"ImportListsSettingsSummary": "Başka bir {appName} örneğinden veya Trakt listelerinden içe aktarın ve liste hariç tutma işlemlerini yönetin",
"ImportTipsMessage": "İçe aktarmanın sorunsuz geçmesini sağlamak için bazı ipuçları:",
"ImportHeader": "{appName} uygulamasına film eklemek için mevcut kitaplığı içe aktarın",
"Host": "Ana bilgisayar",
"GrabSelected": "Seçilenleri Kap",
"GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analitikler ve güncellemeler",
"Host": "Sunucu",
"GrabSelected": "Seçilenleri Al",
"GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analizler ve güncellemeler",
"Folder": "Klasör",
"Files": "Dosyalar",
"Filename": "Dosya adı",
@@ -51,7 +51,7 @@
"CustomFormats": "Özel Formatlar",
"Crew": "Ekip",
"AppDataLocationHealthCheckMessage": "Güncelleme sırasında AppData'nın silinmesini önlemek için güncelleme yapılmayacaktır",
"AddNewTmdbIdMessage": "Ayrıca bir filmin TMDb kimliğini kullanarak da arama yapabilirsiniz. Örneğin. tmdb:71663",
"AddNewTmdbIdMessage": "Ayrıca bir filmin TMDb kimliğini kullanarak da arama yapabilirsiniz. Örneğin. tmdb:50737",
"AddNewMessage": "Yeni film eklemek çok kolay, eklemek istediğiniz filmin adını yazmanız yeterli",
"AddExclusion": "Dışlananlara Ekle",
"Actions": "Eylemler",
@@ -68,7 +68,7 @@
"UpdateAll": "Tümünü Güncelle",
"UnselectAll": "Tüm Seçimleri Kaldır",
"UnmappedFolders": "Eşlenmemiş Klasörler",
"UiSettingsSummary": "Takvim, tarih ve renk engelli seçenekler",
"UiSettingsSummary": "Takvim, tarih ve renk körlüğü seçenekleri",
"Ui": "Arayüz",
"Titles": "Başlıklar",
"Timeleft": "Kalan Zaman",
@@ -99,7 +99,7 @@
"RemoveSelected": "Seçilenleri Kaldır",
"RemovedMovieCheckSingleMessage": "{movie} filmi TMDb'den çıkarıldı",
"RemovedMovieCheckMultipleMessage": "{movies} filmleri TMDb'den çıkarıldı",
"ReleaseTitle": "Yayin Başlığı",
"ReleaseTitle": "Yayın Başlığı",
"ReleaseStatus": "Yayın Durumu",
"ReleaseGroup": "Yayımlayan Grup",
"ReleaseBranchCheckOfficialBranchMessage": "{0} şubesi geçerli bir {appName} sürüm dalı değil; güncelleme almayacaksınız",
@@ -123,7 +123,7 @@
"MovieNaming": "Film Adlandırma",
"MovieEditor": "Film Editörü",
"Movie": "Film",
"MoreInfo": "Daha fazla bilgi",
"MoreInfo": "Daha Fazla Bilgi",
"Month": "Ay",
"Monitor": "Takip",
"Missing": "Eksik",
@@ -145,7 +145,7 @@
"Formats": "Formatlar",
"Forecast": "Tahmin",
"Filter": "Filtre",
"FileManagement": "Dosya idare",
"FileManagement": "Dosya Yönetimi",
"Failed": "Başarısız oldu",
"Edit": "Düzenle",
"Downloaded": "İndirildi",
@@ -156,19 +156,19 @@
"ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut dosyaları",
"CompletedDownloadHandling": "Tamamlanan İndirme İşlemleri",
"ChooseAnotherFolder": "Başka bir dosya seç",
"Analytics": "Analitik",
"Analytics": "Analiz",
"All": "Hepsi",
"Agenda": "Ajanda",
"Added": "Eklendi",
"Added": "Eklenme",
"Activity": "Etkinlik",
"MinimumCustomFormatScoreHelpText": "İndirmeye izin verilen minimum özel biçim puanı",
"MinimumCustomFormatScoreHelpText": "İndirmeye izin verilen minimum özel format puanı",
"MovieIsRecommend": "Son eklenenlere göre film önerilir",
"NoEventsFound": "Etkinlik bulunamadı",
"NoMinimumForAnyRuntime": "Herhangi bir çalışma süresi için minimum değer yok",
"NoMoviesExist": "Film bulunamadı, başlamak için yeni bir film eklemek veya mevcut filmlerden bazılarını içe aktarmak isteyeceksiniz.",
"CancelPendingTask": "Bu bekleyen görevi iptal etmek istediğinizden emin misiniz?",
"CancelPendingTask": "Bekleyen görevi iptal etmek istediğinizden emin misiniz?",
"OnHealthIssue": "Sağlık Sorunu Hakkında",
"OnLatestVersion": "{appName}'ın en son sürümü zaten kurulu",
"OnLatestVersion": "{appName}'ın en son sürümü kurulu",
"OnlyTorrent": "Sadece Torrent",
"OnRename": "Yeniden Adlandırıldığında",
"OpenBrowserOnStart": "Başlangıçta tarayıcıyı aç",
@@ -190,7 +190,7 @@
"RemotePath": "Uzak Yol",
"ShowCertification": "Sertifikayı Göster",
"TestAllClients": "Tüm İstemcileri Test Et",
"TestAllIndexers": "Tüm Dizinleyicileri Test Et",
"TestAllIndexers": "Dizinleyicileri Test Et",
"TestAllLists": "Tüm Listeleri Test Et",
"TMDb": "TMDb",
"Name": "İsim",
@@ -204,13 +204,13 @@
"LoadingMovieCreditsFailed": "Film jeneriği yüklenemedi",
"LoadingMovieFilesFailed": "Film dosyaları yüklenemedi",
"Local": "Yerel",
"Location": "yer",
"Location": "Klasör Yolu",
"MarkAsFailed": "Başarısız olarak işaretle",
"MaximumSizeHelpText": "MB cinsinden alınacak bir sürüm için maksimum boyut. Sınırsız olarak ayarlamak için sıfıra ayarlayın",
"MediaManagementSettings": "Medya Yönetimi Ayarları",
"MountMovieHealthCheckMessage": "Bir film yolu içeren bağlama, salt okunur olarak bağlanır: ",
"RadarrTags": "{appName} Etiketleri",
"VideoCodec": "Video Codec",
"VideoCodec": "Video Kodek",
"NoLimitForAnyRuntime": "Herhangi bir çalışma zamanı için sınır yok",
"CloneCustomFormat": "Özel Formatı Klonla",
"Columns": "Sütunlar",
@@ -219,24 +219,24 @@
"DeleteIndexerMessageText": "'{name}' dizinleyicisini silmek istediğinizden emin misiniz?",
"DeleteRestrictionHelpText": "Bu kısıtlamayı silmek istediğinizden emin misiniz?",
"DoneEditingGroups": "Grupları Düzenleme Bitti",
"EditCustomFormat": "Özel Biçimi Düzenle",
"EditCustomFormat": "Özel Formatı Düzenle",
"EditPerson": "Kişiyi Düzenle",
"EditQualityProfile": "Kalite Profilini Düzenle",
"EnableAutomaticSearchHelpText": "Kullanıcı arayüzü veya {appName} tarafından otomatik aramalar yapıldığında kullanılacaktır",
"EnableColorImpairedModeHelpText": "Renk bozukluğu olan kullanıcıların renk kodlu bilgileri daha iyi ayırt etmesine olanak tanıyan değiştirilmiş stil",
"EnableColorImpairedModeHelpText": "Renk engelli kullanıcıların renkleri daha iyi ayırt edebilmelerini sağlamak için değiştirilmiş stil",
"EnableInteractiveSearch": "Etkileşimli Aramayı Etkinleştir",
"ExtraFileExtensionsHelpTextsExamples": "Örnekler: \".sub, .nfo\" veya \"sub, nfo\"",
"FocusSearchBox": "Arama Kutusuna Odaklan",
"Folders": "Klasörler",
"FollowPerson": "Kişiyi Takip Et",
"GrabReleaseMessageText": "{appName}, bu yayının hangi film için olduğunu belirleyemedi. {appName} bu yayını otomatik olarak içe aktaramayabilir. '{0}'ı yakalamak istiyor musunuz?",
"GrabReleaseMessageText": "{appName}, bu yayının hangi film için olduğunu belirleyemedi. {appName} bu yayını otomatik olarak içe aktaramayabilir. '{0}'ı almak istiyor musunuz?",
"IndexerPriority": "Dizinleyici Önceliği",
"IndexerSearchCheckNoAvailableIndexersMessage": "Son indeksleyici hataları nedeniyle arama özellikli indeksleyicilerin tümü geçici olarak kullanılamıyor",
"IndexerSearchCheckNoAvailableIndexersMessage": "Son zamanlardaki dizinleyici hataları nedeniyle tüm arama yeteneğine sahip dizinleyiciler geçici olarak kullanılamıyor",
"InstallLatest": "En Sonu Yükle",
"InteractiveSearch": "Etkileşimli Arama",
"MovieInvalidFormat": "Film: Geçersiz Format",
"Negated": "Reddedildi",
"OutputPath": "Çıkış yolu",
"OutputPath": "İndirilen Yol",
"PreferIndexerFlagsHelpText": "Yayınları özel işaretlerle önceliklendirin",
"RefreshInformationAndScanDisk": "Bilgileri ve tarama diskini yenileyin",
"RemoveFromDownloadClient": "İndirme İstemcisinden Kaldır",
@@ -290,11 +290,11 @@
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}' alt klasörü otomatik olarak oluşturulacak",
"Sunday": "Pazar",
"Table": "Tablo",
"TableOptions": "Masa Seçenekleri",
"TableOptionsColumnsMessage": "Hangi sütunların görünür olduğunu ve hangi sırada görüneceklerini seçin",
"TableOptions": "Tablo Seçenekleri",
"TableOptionsColumnsMessage": "Hangi sütunların görünür olacağını ve hangi sırayla görüneceğini seçin",
"TagIsNotUsedAndCanBeDeleted": "Etiket kullanılmaz ve silinebilir",
"TestAll": "Tümünü Test Et",
"TheLogLevelDefault": "Günlük düzeyi varsayılan olarak 'Bilgi' şeklindedir ve [Genel Ayarlar](/settings/general) bölümünden değiştirilebilir",
"TheLogLevelDefault": "Log seviyesi varsayılan olarak 'Bilgi' şeklindedir ve [Genel Ayarlar](/ayarlar/genel) bölümünden değiştirilebilir",
"ThisCannotBeCancelled": "Bu, {appName} yeniden başlatılmadan başlatıldıktan sonra iptal edilemez.",
"Title": "Başlık",
"TMDBId": "TMDb Kimliği",
@@ -313,7 +313,7 @@
"BrowserReloadRequired": "Tarayıcının Yeniden Yüklenmesi Gerekiyor",
"UiSettings": "Arayüz Ayarları",
"AddConditionError": "Yeni bir koşul eklenemiyor, lütfen tekrar deneyin.",
"AddCustomFormatError": "Yeni bir özel biçim eklenemiyor, lütfen tekrar deneyin.",
"AddCustomFormatError": "Yeni bir özel format eklenemiyor, lütfen tekrar deneyin.",
"AddDownloadClientError": "Yeni bir indirme istemcisi eklenemiyor, lütfen tekrar deneyin.",
"AddIndexerError": "Yeni dizinleyici eklenemiyor, lütfen tekrar deneyin.",
"AddListError": "Yeni bir liste eklenemiyor, lütfen tekrar deneyin.",
@@ -347,7 +347,7 @@
"UnsavedChanges": "Kaydedilmemiş Değişiklikler",
"UpdateMechanismHelpText": "{appName}'ın yerleşik güncelleyicisini veya bir komut dosyasını kullanın",
"UpdateScriptPathHelpText": ıkarılan bir güncelleme paketini alan ve güncelleme işleminin geri kalanını işleyen özel bir komut dosyasına giden yol",
"UpgradeUntilCustomFormatScore": "Özel Biçim Puanına Kadar Yükseltme",
"UpgradeUntilCustomFormatScore": "Özel Format Puanına Kadar Yükseltme",
"UpgradeUntil": "Kaliteye Kadar Yükseltme",
"UpgradeUntilThisQualityIsMetOrExceeded": "Bu kalite karşılanana veya aşılana kadar yükseltin",
"UrlBaseHelpText": "Ters proxy desteği için varsayılan boştur",
@@ -367,7 +367,7 @@
"YesCancel": "Evet İptal",
"YesMoveFiles": "Evet, Dosyaları Taşı",
"Yesterday": "Dün",
"YouCanAlsoSearch": "Filmin TMDb kimliğini veya IMDb kimliğini kullanarak da arama yapabilirsiniz. Örneğin. \"tmdb: 71663\"",
"YouCanAlsoSearch": "Filmin TMDb kimliğini veya IMDb kimliğini kullanarak da arama yapabilirsiniz. Örneğin. \"tmdb: 50737\"",
"MaintenanceRelease": "Bakım Sürümü: hata düzeltmeleri ve diğer iyileştirmeler. Daha fazla ayrıntı için Github İşlem Geçmişine bakın",
"MovieDetailsPreviousMovie": "Film Detayları: Önceki Film",
"MovieExcludedFromAutomaticAdd": "Otomatik Eklemeden Hariç Tutulan Film",
@@ -375,19 +375,19 @@
"AddNewMovie": "Yeni Film Ekle",
"Add": "Ekle",
"AddCustomFormat": "Özel Format Ekle",
"AddDelayProfile": "Gecikme Profili Ekleme",
"AddDelayProfile": "Gecikme Profili Ekle",
"AddDownloadClient": "İndirme İstemcisi Ekle",
"AddedToDownloadQueue": "İndirme kuyruğuna eklendi",
"AllMoviesInPathHaveBeenImported": "{path} içindeki tüm filmler içe aktarıldı",
"AlternativeTitle": "Alternatif Başlık",
"Always": "Her zaman",
"AptUpdater": "Güncellemeyi yüklemek için apt'ı kullanın",
"CancelProcessing": "İşlemeyi İptal Et",
"CancelProcessing": "İşlemi İptal Et",
"CantFindMovie": "Filmimi neden bulamıyorum?",
"CertValidationNoLocal": "Yerel Adresler için Devre Dışı Bırak",
"ChmodFolderHelpTextWarning": "Bu, yalnızca {appName}'ı çalıştıran kullanıcı dosyanın sahibi ise çalışır. İndirme istemcisinin izinleri doğru şekilde ayarladığından emin olmak daha iyidir.",
"ChmodFolderHelpTextWarning": "Bu yalnızca {appName} uygulamasını çalıştıran kullanıcı, dosyanın sahibiyse işe yarar. İndirme istemci izinlerinin doğruluğundan emin olmak önerilir.",
"ChownGroupHelpText": "Grup adı veya gid. Uzak dosya sistemleri için gid kullanın.",
"ChownGroupHelpTextWarning": "Bu, yalnızca {appName}'ı çalıştıran kullanıcı dosyanın sahibi ise çalışır. İndirme istemcisinin {appName} ile aynı grubu kullanmasını sağlamak daha iyidir.",
"ChownGroupHelpTextWarning": "Bu yalnızca {appName} uygulamasını çalıştıran kullanıcı, dosyanın sahibiyse işe yarar. İndirme istemcisinin {appName} ile aynı grubu kullandığından emin olmak önerilir.",
"DeleteMovieFilesHelpText": "Film dosyalarını ve film klasörünü silin",
"DeleteMovieFiles": "{movieFileCount} Film Dosyasını Sil",
"DeleteHeader": "Sil - {0}",
@@ -407,10 +407,10 @@
"QualityProfileInUseMovieListCollection": "Bir filme eklenmiş kaliteli bir profili silemezsiniz",
"QueueIsEmpty": "Kuyruk boş",
"CalendarFeed": "{appName} Takvim Beslemesi",
"DownloadPropersAndRepacksHelpTextCustomFormat": "Propers / Repacks üzerinden özel format puanına göre sıralamak için \"Tercih Etme\" seçeneğini kullanın",
"DownloadPropersAndRepacksHelpTextCustomFormat": "Uygunluk ve Yeniden Paketlemeler üzerinden özel format puanına göre sıralamak için \"Tercih Etme\" seçeneğini kullanın",
"Tomorrow": "Yarın",
"DotNetVersion": ".NET",
"NoHistory": "Geçmiş yok",
"NoHistory": "Geçmiş bulunamadı",
"AddQualityProfile": "Kalite Profili Ekle",
"NoBackupsAreAvailable": "Kullanılabilir yedek yok",
"AddRootFolder": "Kök Klasör Ekle",
@@ -420,11 +420,11 @@
"AcceptConfirmationModal": "Onay Modunu Kabul Et",
"AddIndexer": "Dizinleyici Ekle",
"AllResultsHiddenFilter": "Tüm sonuçlar, uygulanan filtre tarafından gizlenir",
"AnalyseVideoFiles": "Video dosyalarını analiz edin",
"AnalyseVideoFiles": "Video Dosyalarını Analiz Et",
"AppDataDirectory": "Uygulama Veri Dizini",
"CustomFormatUnknownCondition": "Bilinmeyen Özel Biçim koşulu '{implementation}'",
"CustomFormatUnknownCondition": "Bilinmeyen Özel Format koşulu '{implementation}'",
"AuthBasic": "Temel (Tarayıcıılır Penceresi)",
"AuthForm": "Formlar (Giriş Sayfası)",
"AuthForm": "Form (Giriş Sayfası)",
"Branch": "Şube",
"BuiltIn": "Dahili",
"CalendarOptions": "Takvim Seçenekleri",
@@ -474,13 +474,13 @@
"None": "Yok",
"NoResultsFound": "Sonuç bulunamadı",
"MovieFilesTotaling": "Film Dosyaları Toplamı",
"OnGrab": "Yakalandığında",
"OnGrab": "Alındığında",
"OnlyUsenet": "Sadece Usenet",
"PendingChangesMessage": "Kaydedilmemiş değişiklikleriniz var, bu sayfadan ayrılmak istediğinizden emin misiniz?",
"ProxyType": "Proxy Türü",
"RegularExpressionsCanBeTested": "Normal ifadeler [burada](http://regexstorm.net/tester) test edilebilir.",
"RegularExpressionsCanBeTested": "Düzenli ifadeler [burada]({url}) test edilebilir.",
"ShowGenres": "Türleri Göster",
"UpgradesAllowed": "Yükseltmelere İzin Verildi",
"UpgradesAllowed": "Yükseltmelere İzin Ver",
"Pending": "Bekliyor",
"EnableSsl": "SSL'yi etkinleştir",
"Indexer": "Dizinleyici",
@@ -489,7 +489,7 @@
"LoadingMovieExtraFilesFailed": "İlave film dosyaları yüklenemedi",
"Manual": "Manuel",
"ManualImport": "Manuel İçe Aktar",
"Mechanism": "İşleyiş",
"Mechanism": "Teknik",
"MediaInfo": "Medya bilgisi",
"Hostname": "Hostname",
"MinutesSixty": "60 Dakika: {sixty}",
@@ -505,43 +505,43 @@
"AddImportListExclusion": "İçe Aktarma Listesi Hariç Tutma Ekle",
"ApiKey": "API Anahtarı",
"NamingSettings": "Adlandırma Ayarları",
"NoLogFiles": "Günlük dosyası yok",
"NoLogFiles": "Log kayıt dosyası henüz yok",
"NoMatchFound": "Eşleşme bulunamadı!",
"NotMonitored": "Takip Edilmeyen",
"MinimumAge": "Asgari yaş",
"MinimumAge": "Minimum Geçen Süre",
"NoUpdatesAreAvailable": "Güncelleme yok",
"AddingTag": "Etiket ekleniyor",
"Age": "Yıl",
"AgeWhenGrabbed": "Yıl (yakalandığında)",
"AgeWhenGrabbed": "Yıl (alındığında)",
"AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Buna, tarayıcınız, hangi {appName} WebUI sayfalarını kullandığınız, hata raporlamanın yanı sıra işletim sistemi ve çalışma zamanı sürümü hakkındaki bilgiler de dahildir. Bu bilgiyi özelliklere ve hata düzeltmelerine öncelik vermek için kullanacağız.",
"Apply": "Uygula",
"ICalShowAsAllDayEventsHelpText": "Etkinlikler, takviminizde tüm gün süren etkinlikler olarak görünecek",
"Authentication": "Doğrulama",
"ApplyTags": "Etiketleri Uygula",
"AuthenticationMethodHelpText": "{appName}'a erişmek için Kullanıcı Adı ve Şifre gerektir",
"AuthenticationMethodHelpText": "{appName}'e erişmek için Kullanıcı Adı ve Parola gereklidir",
"Automatic": "Otomatik",
"AutoRedownloadFailedHelpText": "Otomatik olarak farklı bir Yayın arayın ve indirmeye çalışın",
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "Diskten silinen filmler otomatik olarak {appName}'da takip edilmez",
"AvailabilityDelay": "Kullanılabilirlik Gecikmesi",
"AvailabilityDelayHelpText": "Film aramak için mevcut tarihten önceki veya sonraki zaman miktarı",
"BackupIntervalHelpText": "Otomatik yedeklemeler arasındaki zaman aralığı",
"BackupNow": "Şimdi yedekle",
"BackupRetentionHelpText": "Saklama süresinden daha eski olan otomatik yedeklemeler otomatik olarak temizlenecektir",
"BackupNow": "Şimdi Yedekle",
"BackupRetentionHelpText": "Saklama süresinden daha eski otomatik yedeklemeler otomatik olarak temizlenecektir",
"Backups": "Yedeklemeler",
"BeforeUpdate": "Güncellemeden önce",
"BindAddress": "Bind Adresi",
"BindAddressHelpText": "Tüm arayüzler için geçerli IP adresi, localhost veya '*'",
"CertificateValidation": "Sertifika Doğrulama",
"CertificateValidation": "Sertifika Doğrulaması",
"CertificateValidationHelpText": "HTTPS sertifika doğrulamasının sıkılığını değiştirin. Riskleri anlamadığınız sürece değişmeyin.",
"Certification": "Sertifikasyon",
"BranchUpdate": "{appName}'ı güncellemek için kullanılacak dal",
"BranchUpdateMechanism": "Harici güncelleme mekanizması tarafından kullanılan dal",
"BypassProxyForLocalAddresses": "Yerel Adresler için Proxy'yi Atla",
"Certification": "Sertifika",
"BranchUpdate": "{appName} uygulamasını güncellemek için kullanılacak şube",
"BranchUpdateMechanism": "Harici güncelleme mekanizması tarafından kullanılan şube",
"BypassProxyForLocalAddresses": "Yerel Adresler için Proxy'yi Kullanma",
"ChangeFileDate": "Dosya Tarihini Değiştir",
"ChangeHasNotBeenSavedYet": "Değişiklik henüz kaydedilmedi",
"CheckDownloadClientForDetails": "daha fazla ayrıntı için indirme istemcisini kontrol edin",
"CheckForFinishedDownloadsInterval": "Tamamlanan İndirmeler Aralığını Kontrol Et",
"CleanLibraryLevel": "Kitaplık Düzeyini Temizle",
"CleanLibraryLevel": "Kütüphane Seviyesini Temizle",
"ClientPriority": "Müşteri Önceliği",
"CertificationCountry": "Sertifikasyon Ülkesi",
"CertificationCountryHelpText": "Film Sertifikaları için Ülke Seçin",
@@ -552,12 +552,12 @@
"DeleteCustomFormat": "Özel Formatı Sil",
"DeleteDownloadClient": "İndirme İstemcisini Sil",
"DeleteBackupMessageText": "'{name}' yedeğini silmek istediğinizden emin misiniz?",
"Edition": "Baskı",
"Edition": "Versiyon",
"EnableCompletedDownloadHandlingHelpText": "Tamamlanan indirmeleri indirme istemcisinden otomatik olarak içe aktarın",
"ListEnabledHelpText": "Bu listeyi {appName}'da kullanmak üzere etkinleştirin",
"Ended": "Bitti",
"Events": "Etkinlikler",
"IncludeCustomFormatWhenRenamingHelpText": "{Custom Formats} yeniden adlandırma formatına dahil et",
"Ended": "Biten",
"Events": "Olaylar",
"IncludeCustomFormatWhenRenamingHelpText": "Özel formatları yeniden adlandırma formatına dahil et",
"Overview": "Genel Bakış",
"OverviewOptions": "Genel Bakış Seçenekler",
"MinimumFreeSpace": "Minimum Boş Alan",
@@ -572,12 +572,12 @@
"MovieTitleToExcludeHelpText": "Hariç tutulacak filmin başlığı (anlamlı herhangi bir şey olabilir)",
"MovieYear": "Film Yılı",
"MovieYearToExcludeHelpText": "Hariç tutulacak film yılı",
"PendingChangesDiscardChanges": "Değişiklikleri atın ve ayrıl",
"PendingChangesDiscardChanges": "Değişiklikleri at ve ayrıl",
"PreferredSize": "Tercih Edilen Boyut",
"Proper": "Uygun",
"PtpOldSettingsCheckMessage": "Aşağıdaki PassThePopcorn dizinleyicilerinin ayarları kullanımdan kaldırıldı ve güncellenmeleri gerekiyor: {0}",
"Queued": "Kuyruğa alındı",
"RecyclingBinCleanup": "Geri Dönüşüm Kutusu Temizleme",
"RecyclingBinCleanup": "Geri Dönüşüm Kutusu Temizle",
"RefreshMovie": "Filmi yenile",
"RejectionCount": "Reddetme Sayısı",
"RelativePath": "Göreceli yol",
@@ -595,7 +595,7 @@
"AudioInfo": "Ses Bilgisi",
"Cancel": "Vazgeç",
"PhysicalRelease": "Fiziksel Salınım",
"Port": "Liman",
"Port": "Port No",
"Close": "Kapat",
"PortNumber": "Port numarası",
"ProtocolHelpText": "Hangi protokol (ler) in kullanılacağını ve başka türlü eşit sürümler arasında seçim yaparken hangisinin tercih edileceğini seçin",
@@ -607,7 +607,7 @@
"SupportedListsMovie": "{appName}, aşağıda belirtilenlerin yanı sıra tüm RSS film listelerini destekler.",
"AlreadyInYourLibrary": "Kütüphanenizde mevcut",
"RecyclingBinHelpText": "Film dosyaları, kalıcı olarak silinmek yerine silindiğinde buraya gider",
"RequiredHelpText": "Özel biçimin uygulanabilmesi için bu {implementationName} koşulunun eşleşmesi gerekir. Aksi takdirde tek bir {implementationName} eşleşmesi yeterlidir.",
"RequiredHelpText": "Özel formatın uygulanabilmesi için bu {implementationName} koşulunun eşleşmesi gerekir. Aksi takdirde tek bir {implementationName} eşleşmesi yeterlidir.",
"AddNewRestriction": "Yeni kısıtlama ekle",
"RestartRequiredHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir",
"Restore": "Onarmak",
@@ -625,12 +625,12 @@
"Backup": "Yedekler",
"Username": "Kullanıcı adı",
"WaitingToImport": "İçe Aktarma Bekleniyor",
"BackupFolderHelpText": "Göreli yollar {appName}'ın AppData dizini altında olacaktır",
"BackupFolderHelpText": "Bağıl yollar {appName}'ın AppData dizini altında olacak",
"Disabled": "Devre dışı",
"Peers": "Akranlar",
"Peers": "Eşler",
"UiSettingsLoadError": "Arayüz ayarları yüklenemiyor",
"Unavailable": "Kullanım dışı",
"Importing": "İçe aktarılıyor",
"Importing": "İçe Aktarma",
"NoLeaveIt": "Hayır, Bırak",
"NotAvailable": "Müsait değil",
"NotificationTriggers": "Bildirim Tetikleyicileri",
@@ -652,11 +652,11 @@
"CouldNotFindResults": "'{term}' için herhangi bir sonuç bulunamadı",
"CreateEmptyMovieFolders": "Boş film klasörleri oluşturun",
"CreateGroup": "Grup oluştur",
"CurrentlyInstalled": "Şu anda Yüklü",
"CurrentlyInstalled": "Şuan Kurulu",
"Custom": "Özel",
"CustomFormat": "Özel Format",
"CustomFormatHelpText": "{appName}, özel formatlarla eşleşen puanların toplamını kullanarak her yayını puanlar. Yeni bir yayının, puanı aynı veya daha iyi kalitede iyileştirecekse, {appName} onu alacaktır.",
"CustomFormatScore": "Özel Biçim Puanı",
"CustomFormatScore": "Özel Format Puanı",
"CustomFormatsSettings": "Özel Format Ayarları",
"CustomFormatUnknownConditionOption": "'{implementation}' koşulu için bilinmeyen seçenek '{key}'",
"Cutoff": "Kesinti",
@@ -684,21 +684,21 @@
"DeleteTagMessageText": "'{label}' etiketini silmek istediğinizden emin misiniz?",
"DeleteMovieFolderConfirmation": "'{path}' film klasörü ve tüm içeriği silinecek.",
"Discord": "Uyuşmazlık",
"Docker": "Liman işçisi",
"Donations": "Bağışlar",
"Docker": "Docker",
"Donations": "Bağış",
"DoNotPrefer": "Tercih etmeme",
"DoNotUpgradeAutomatically": "Otomatik Olarak Yükseltme",
"DownloadClient": stemciyi İndir",
"DownloadClient": ndirme İstemcisi",
"DownloadClientCheckNoneAvailableMessage": "İndirme istemcisi yok",
"DownloadClients": "İndirme İstemcileri",
"DownloadClientSettings": "İstemci Ayarlarını İndir",
"DownloadClientSettings": ndirme İstemcisi Ayarlarını",
"DownloadClientsSettingsSummary": "İndirme İstemcileri, indirme işlemleri ve uzaktan yol eşlemeleri",
"DownloadClientStatusCheckSingleClientMessage": "Hatalar nedeniyle indirilemeyen istemciler: {downloadClientNames}",
"DownloadedAndMonitored": "İndirildi (Takip Ediliyor)",
"DownloadedButNotMonitored": "İndirildi (Takip Edilmiyor)",
"DownloadFailed": "Yükleme başarısız",
"Downloading": "İndiriliyor",
"DownloadPropersAndRepacks": "Propers ve Repacks",
"DownloadPropersAndRepacks": "Uygunluj ve Yeniden Paketlemeler",
"DownloadPropersAndRepacksHelpText": "Propers / Repacks'e otomatik olarak yükseltme yapılıp yapılmayacağı",
"DownloadPropersAndRepacksHelpTextWarning": "Propers / Repacks'e otomatik yükseltmeler için özel formatlar kullanın",
"DownloadWarning": "Uyarıyı indir: {warningMessage}",
@@ -734,11 +734,11 @@
"FailedLoadingSearchResults": "Arama sonuçları yüklenemedi, lütfen tekrar deneyin.",
"FailedToLoadMovieFromAPI": "API'den film yüklenemedi",
"FeatureRequests": "Özellik talepleri",
"ChangeFileDateHelpText": "İçe aktarmada / yeniden taramada dosya tarihini değiştirin",
"ChangeFileDateHelpText": "İçe aktarma/yeniden tarama sırasında dosya tarihini değiştir",
"FileNames": "Dosya Adları",
"FilterPlaceHolder": "Film ara",
"FirstDayOfWeek": "Haftanın ilk günü",
"Fixed": "Sabit",
"Fixed": "Düzeltilen",
"FolderMoveRenameWarning": "Bu aynı zamanda ayarlarda film klasörü formatına göre film klasörünü yeniden adlandıracaktır.",
"SupportedDownloadClientsMoreInfo": "Bireysel indirme istemcileri hakkında daha fazla bilgi için bilgi düğmelerine tıklayın.",
"SupportedListsMoreInfo": "Ayrı ayrı içe aktarma listeleri hakkında daha fazla bilgi için bilgi düğmelerine tıklayın.",
@@ -747,8 +747,8 @@
"Genres": "Türler",
"Global": "Küresel",
"GoToInterp": "{0} adresine gidin",
"Grabbed": "Yakalandı",
"GrabRelease": "Yayın Yakalama",
"Grabbed": "Alındı",
"GrabRelease": "Yayın Alma",
"Group": "Grup",
"HardlinkCopyFiles": "Hardlink / Dosyaları Kopyala",
"NoIssuesWithYourConfiguration": "Yapılandırmanızla ilgili sorun yok",
@@ -761,7 +761,7 @@
"Images": "Görüntüler",
"IMDb": "IMDb",
"Import": "İçe aktar",
"ImportCustomFormat": "Özel Biçimi İçe Aktar",
"ImportCustomFormat": "Özel Formatı İçe Aktar",
"ImportedTo": "İçeri Aktarıldı",
"ImportRootPath": "{appName}'ı belirli bir filmi değil, tüm filmlerinizi içeren klasöre yöneltin. Örneğin. {1} değil {0}. Ek olarak, her film kök / kitaplık klasöründe kendi klasöründe olmalıdır.",
"InCinemasDate": "Vizyon Tarihi",
@@ -771,11 +771,11 @@
"IncludeUnmonitored": "Takip Edilmeyenleri Dahil Et",
"ImportMovies": "Filmleri İçe Aktar",
"IndexerPriorityHelpText": "Dizinleyici Önceliği (En Yüksek) 1'den (En Düşük) 50'ye kadar. Varsayılan: 25'dir. Eşit olmayan yayınlar için eşitlik bozucu olarak yayınlar alınırken kullanılan {appName}, RSS Senkronizasyonu ve Arama için etkinleştirilmiş tüm dizin oluşturucuları kullanmaya devam edecek",
"IndexerRssHealthCheckNoAvailableIndexers": "Son indeksleyici hataları nedeniyle tüm rss özellikli indeksleyiciler geçici olarak kullanılamıyor",
"IndexerRssHealthCheckNoAvailableIndexers": "Son zamanlardaki dizinleyici hataları nedeniyle tüm rss uyumlu dizinleyiciler geçici olarak kullanılamıyor",
"IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni yayınlar otomatik olarak almayacak",
"Indexers": "Dizinleyiciler",
"IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinken indeksleyici yok, {appName} herhangi bir otomatik arama sonucu sağlamayacak",
"IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinleştirilmiş fakat dizinleyici mevcut değil; {appName} herhangi bir etkileşimli arama sonucu sağlayamayacaktır",
"IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinleştirildiğinde hiçbir dizinleyici kullanılamaz, {appName} herhangi bir otomatik arama sonucu sağlamayacaktır",
"IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinleştirildiğinde hiçbir dizinleyici kullanılamaz, {appName} herhangi bir etkileşimli arama sonucu sağlamayacaktır",
"IndexerSettings": "Dizinleyici Ayarları",
"IndexerStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {indexerNames}",
"InteractiveImport": "Etkileşimli İçe Aktarma",
@@ -790,26 +790,26 @@
"Links": "Bağlantılar",
"ImportListSettings": "Liste Ayarları",
"ListSyncLevelHelpText": "Kitaplıktaki filmlerin listenizde/listelerinizde görünmemesi durumunda seçiminize göre işlem yapılacaktır",
"LogLevel": "Günlük Düzeyi",
"LogLevelTraceHelpTextWarning": "İzleme günlük kaydı yalnızca geçici olarak etkinleştirilmelidir",
"LogLevel": "Log Seviyesi",
"LogLevelTraceHelpTextWarning": "İzleme kaydı yalnızca geçici olarak etkinleştirilmelidir",
"LogOnly": "Sadece hesap aç",
"Logs": "Kütükler",
"Logs": "Kayıtlar",
"LookingForReleaseProfiles1": "Yayımlama Profilleri mi arıyorsunuz? Deneyin",
"LookingForReleaseProfiles2": "yerine.",
"Lowercase": "Küçük Harf",
"ManualImportSelectLanguage": "Manuel İçe Aktar - Dil Seçin",
"ManualImportSelectMovie": "Manuel İçe Aktar - Film Seçin",
"ManualImportSelectQuality": " Manuel İçe Aktar - Kaliteyi Seçin",
"MappedNetworkDrivesWindowsService": "Eşlenen ağ sürücüleri, bir Windows Hizmeti olarak çalışırken kullanılamaz. Daha fazla bilgi için lütfen SSS bölümüne bakın",
"MappedNetworkDrivesWindowsService": "Windows Hizmeti olarak çalıştırıldığında eşlenen ağ sürücüleri kullanılamaz, daha fazla bilgi için [SSS]({url}) bölümüne bakın.",
"MarkAsFailedMessageText": "'{0}' başarısız olarak işaretlemek istediğinizden emin misiniz?",
"MaximumLimits": "Maksimum Sınırlar",
"MaximumSize": "En büyük boy",
"MaximumSize": "Maksimum Boyut",
"MegabytesPerMinute": "Dakika Başına Megabayt",
"Message": "İleti",
"Message": "Mesaj",
"MetadataSettings": "Meta Veri Ayarları",
"MIA": "MIA",
"Min": "Min",
"MinimumAgeHelpText": "Yalnızca Usenet: NZB'lerin alınmadan önceki dakika cinsinden minimum yaşı. Yeni yayınların usenet sağlayıcınıza yayılması için zaman tanımak için bunu kullanın.",
"MinimumAgeHelpText": "Yalnızca Usenet: NZB'lerin almadan önceki minimum geçen süre (dakika cinsinden). Bunu, yeni sürümlerin usenet sağlayıcınıza yayılması için zaman vermek amacıyla kullanın.",
"MinimumAvailability": "Minimum Kullanılabilirlik",
"MinimumCustomFormatScore": "Minimum Özel Format Puanı",
"MinimumFreeSpaceHelpText": "Bu miktardan daha az kullanılabilir disk alanı bırakacaksa içe aktarmayı önleyin",
@@ -874,7 +874,7 @@
"RemovingTag": "Etiket kaldırılıyor",
"RenameMovies": "Filmleri Yeniden Adlandır",
"RenameMoviesHelpText": "Yeniden adlandırma devre dışı bırakılırsa, {appName} mevcut dosya adını kullanacaktır",
"ReplaceIllegalCharacters": "Yasadışı Karakterleri Değiştirin",
"ReplaceIllegalCharacters": "Geçersiz Karakterleri Değiştirin",
"ReplaceIllegalCharactersHelpText": "Geçersiz karakterleri değiştirin. İşaretlenmezse bunun yerine {appName} bunları kaldıracak",
"ReplaceWithSpaceDash": "Space Dash ile değiştirin",
"Required": "Gerekli",
@@ -894,13 +894,13 @@
"Save": "Kaydet",
"SaveSettings": "Ayarları kaydet",
"Score": "Puan",
"Script": "Hazır Metin",
"Script": "Komut Dosyası",
"ScriptPath": "Komut Dosyası Yolu",
"SearchCutoffUnmet": "Arama Kesintisi Karşılanmadı",
"SearchForMovie": "Film ara",
"SearchMissing": "Arama Eksik",
"SearchMovie": "Film Ara",
"SearchOnAdd": "Eklemede ara",
"SearchOnAdd": "Ekle ve Ara",
"ListSearchOnAddMovieHelpText": "Kitaplığa eklendiğinde bu listedeki filmleri arayın",
"Seconds": "Saniye",
"Seeders": "Ekme makineleri",
@@ -925,7 +925,7 @@
"StartProcessing": "İşlemeye Başla",
"TagDetails": "Etiket Ayrıntıları - {label}",
"ICalTagsMoviesHelpText": "En az bir eşleşen etikete sahip filmler için geçerlidir",
"Test": "Sına",
"Test": "Test Et",
"Time": "Zaman",
"Trigger": "Tetik",
"UiLanguage": "Arayüz Dili",
@@ -955,7 +955,7 @@
"More": "Daha",
"Download": "İndir",
"DownloadClientRootFolderHealthCheckMessage": "İndirme istemcisi {downloadClientName}, indirmeleri kök klasöre yerleştirir {rootFolderPath}. Bir kök klasöre indirmemelisiniz.",
"Blocklist": "Kara liste",
"Blocklist": "Engellenenler listesi",
"BlocklistRelease": "Kara Liste Sürümü",
"RemoveFromBlocklist": "Kara listeden kaldır",
"Blocklisted": "Kara liste",
@@ -964,7 +964,7 @@
"Filters": "Filtreler",
"Rating": "Puan",
"SelectLanguages": "Dil Seçin",
"RssSyncIntervalHelpText": "Dakika cinsinden periyot. Devre dışı bırakmak için sıfıra ayarlayın (tüm otomatik yayın yakalamayı durduracaktır)",
"RssSyncIntervalHelpText": "Dakika cinsinden aralık. Devre dışı bırakmak için sıfıra ayarlayın (tüm otomatik yayın almayı durduracaktır)",
"AllCollectionsHiddenDueToFilter": "Uygulanan filtre nedeniyle tüm koleksiyonlar gizlendi.",
"Collections": "Koleksiyon",
"MonitorMovies": "Film Takip Edilebilirliği",
@@ -978,7 +978,7 @@
"AddCondition": "Koşul Ekle",
"AddConditionImplementation": "Koşul Ekle - {implementationName}",
"AddConnection": "Bağlantı Ekle",
"AddIndexerImplementation": "Yeni Dizin Ekle - {implementationName}",
"AddIndexerImplementation": "Yeni Dizinleyici Ekle - {implementationName}",
"AddConnectionImplementation": "Bağlantı Ekle - {implementationName}",
"EditIndexerImplementation": "Koşul Ekle - {implementationName}",
"AllTitles": "Tüm Başlıklar",
@@ -995,7 +995,7 @@
"AutomaticUpdatesDisabledDocker": "Docker güncelleme mekanizması kullanıldığında otomatik güncellemeler doğrudan desteklenmez. Konteyner görüntüsünü {appName} dışında güncellemeniz veya bir komut dosyası kullanmanız gerekecek",
"BypassDelayIfHighestQuality": "En Yüksek Kalitedeyse Atla",
"AppUpdated": "{appName} Güncellendi",
"AppUpdatedVersion": "{appName}, `{version}` sürümüne güncellendi; en son değişikliklerin etkin olabilmesi için {appName} uygulamasını yeniden başlatmanız gerekli",
"AppUpdatedVersion": "{appName}, `{version}` sürümüne güncellendi; değişikliklerin etkin olabilmesi için {appName} uygulamasını yeniden başlatmanız gerekli",
"ApplyTagsHelpTextHowToApplyIndexers": "Seçilen indeksleyicilere etiketler nasıl uygulanır",
"ApplyTagsHelpTextHowToApplyMovies": "Seçilen filmlere etiketler nasıl uygulanır",
"ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın",
@@ -1081,13 +1081,13 @@
"DeletedReasonUpgrade": "Bir yükseltmeyi içe aktarmak için dosya silindi",
"AutoTaggingSpecificationTag": "Etiket",
"CustomFormatsSettingsTriggerInfo": "Bir yayına veya dosyaya, seçilen farklı koşul türlerinden en az biriyle eşleştiğinde Özel Format uygulanacaktır.",
"CutoffNotMet": "Kesinti Noktasına Ulaşılmadı",
"CutoffNotMet": "Kesinti Karşılanmadı",
"Default": "Varsayılan",
"Dash": "Çizgi",
"DefaultNameCopiedSpecification": "{name} - Kopyala",
"DeleteAutoTag": "Etiketi Otomatik Sil",
"DeleteCondition": "Koşulu Sil",
"Directory": "Rehber",
"Directory": "Dizin",
"Donate": "Bağış yap",
"DeleteImportListExclusionMessageText": "Bu içe aktarma listesi hariç tutma işlemini silmek istediğinizden emin misiniz?",
"DoNotBlocklist": "Engelleme Listesine Eklemeyin",
@@ -1105,7 +1105,7 @@
"DownloadClientFreeboxApiError": "Freebox API'si şu hatayı döndürdü: {errorDescription}",
"DownloadClientFreeboxSettingsPortHelpText": "Freebox arayüzüne erişim için kullanılan bağlantı noktası, varsayılan olarak '{port}' şeklindedir",
"DeleteAutoTagHelpText": "'{name}' etiketini otomatik silmek istediğinizden emin misiniz?",
"DeleteCustomFormatMessageText": "'{name}' özel biçimini silmek istediğinizden emin misiniz?",
"DeleteCustomFormatMessageText": "'{name}' özel formatı silmek istediğinizden emin misiniz?",
"DeleteImportList": "İçe Aktarma Listesini Sil",
"DeleteRootFolder": "Kök Klasörü Sil",
"DeleteSelectedIndexers": "Dizinleyicileri Sil",
@@ -1152,7 +1152,7 @@
"DownloadClientFreeboxSettingsAppId": "Uygulama kimliği",
"DownloadClientFreeboxSettingsApiUrl": "API URL'si",
"DownloadClientFreeboxSettingsAppToken": "Uygulama Jetonu",
"DownloadClientFreeboxSettingsHostHelpText": "Freebox'un ana bilgisayar adı veya ana bilgisayar IP adresi, varsayılan olarak '{url}' şeklindedir (yalnızca aynı ağdaysa çalışır)",
"DownloadClientFreeboxSettingsHostHelpText": "Freebox'un istemci adı veya istemci IP adresi, varsayılan olarak '{url}' şeklindedir (yalnızca aynı ağda çalışır)",
"DownloadClientFreeboxAuthenticationError": "Freebox API'sinde kimlik doğrulama başarısız oldu. Sebep: {errorDescription}",
"DownloadClientFreeboxNotLoggedIn": "Giriş yapmadınız",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Freebox API temel URL'sini API sürümüyle tanımlayın, örneğin '{url}', varsayılan olarak '{defaultApiUrl}' olur",
@@ -1170,7 +1170,7 @@
"DownloadClientSettingsCategoryHelpText": "{appName}'e özel bir kategori eklemek, {appName} dışındaki ilgisiz indirmelerle çakışmaları önler. Kategori kullanmak isteğe bağlıdır ancak önemle tavsiye edilir.",
"DownloadClientSettingsCategorySubFolderHelpText": "{appName}'e özel bir kategori eklemek, {appName} dışındaki ilgisiz indirmelerle çakışmaları önler. Kategori kullanmak isteğe bağlıdır ancak önemle tavsiye edilir. Çıkış dizininde bir [kategori] alt dizini oluşturur.",
"DownloadClientSettingsDestinationHelpText": "İndirme hedefini manuel olarak belirtir, varsayılanı kullanmak için boş bırakın",
"DownloadClientSettingsRecentPriority": "Yeni Öncelik",
"DownloadClientSettingsRecentPriority": "Yeni Önceliği",
"DownloadClientSettingsUseSslHelpText": "{clientName} ile bağlantı kurulurken güvenli bağlantıyı kullan",
"DownloadClientUTorrentTorrentStateError": "uTorrent bir hata bildirdi",
"DownloadClientValidationVerifySsl": "SSL Doğrulama ayarı",
@@ -1181,7 +1181,7 @@
"DownloadClientNzbgetValidationKeepHistoryOverMaxDetail": "NzbGet KeepHistory ayarı çok yüksek ayarlanmış.",
"DownloadClientPneumaticSettingsNzbFolder": "Nzb Klasörü",
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Bu klasördeki .strm dosyaları drone ile içe aktarılacak",
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "İlk ve Son İlk",
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "İlk ve Son",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Torrentlerin başlangıç durumu qBittorrent'e eklendi. Zorunlu Torrentlerin seed kısıtlamalarına uymadığını unutmayın",
"DownloadClientQbittorrentSettingsSequentialOrder": "Sıralı Sıra",
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Sıralı olarak indirin (qBittorrent 4.1.0+)",
@@ -1194,7 +1194,7 @@
"DownloadClientQbittorrentValidationQueueingNotEnabledDetail": "Torrent Kuyruğa Alma, qBittorrent ayarlarınızda etkin değil. qBittorrent'te etkinleştirin veya öncelik olarak 'Son'u seçin.",
"DownloadClientQbittorrentValidationQueueingNotEnabled": "kuyruğa Alma Etkin Değil",
"DownloadClientQbittorrentValidationRemovesAtRatioLimit": "qBittorrent, Torrentleri Paylaşım Oranı Sınırına ulaştıklarında kaldıracak şekilde yapılandırılmıştır",
"DownloadClientRTorrentSettingsAddStopped": "Ekleme Durduruldu",
"DownloadClientRTorrentSettingsAddStopped": "Durdurulana Ekle",
"DownloadClientRTorrentSettingsUrlPathHelpText": "XMLRPC uç noktasının yolu, bkz. {url}. RuTorrent kullanılırken bu genellikle RPC2 veya [ruTorrent yolu]{url2} olur.",
"DownloadClientRTorrentSettingsUrlPath": "URL Yolu",
"DownloadClientSabnzbdValidationCheckBeforeDownload": "Sabnbzd'de 'İndirmeden önce kontrol et' seçeneğini devre dışı bırakın",
@@ -1203,7 +1203,7 @@
"DownloadClientSabnzbdValidationEnableDisableTvSorting": "TV Sıralamasını Devre Dışı Bırak",
"DownloadClientSabnzbdValidationEnableJobFolders": "İş klasörlerini etkinleştir",
"DownloadClientSabnzbdValidationUnknownVersion": "Bilinmeyen Sürüm: {rawVersion}",
"DownloadClientSettingsAddPaused": "Ekleme Durduruldu",
"DownloadClientSettingsAddPaused": "Duraklatılana Ekle",
"DownloadClientSettingsInitialState": "Başlangıç Durumu",
"DownloadClientSettingsInitialStateHelpText": "{clientName} dosyasına eklenen torrentler için başlangıç durumu",
"DownloadClientSettingsOlderPriority": "Eski Önceliği",
@@ -1301,7 +1301,7 @@
"ManageClients": "İstemcileri Yönet",
"FormatRuntimeHours": "{hours}s",
"IgnoreDownloadHint": "{appName}'in bu indirmeyi daha fazla işlemesini durdurur",
"LogFilesLocation": "Günlük dosyaları şu konumda bulunur: {location}",
"LogFilesLocation": "Log kayıtlarının bulunduğu konum: {location}",
"ManageIndexers": "Dizinleyicileri Yönet",
"MovieFileDeletedTooltip": "Film dosyası silindi",
"NotificationsCustomScriptSettingsArgumentsHelpText": "Komut dosyasına aktarılacak argümanlar",
@@ -1330,20 +1330,20 @@
"FullColorEventsHelpText": "Etkinliğin tamamını yalnızca sol kenar yerine durum rengiyle renklendirecek şekilde stil değiştirildi. Gündem için geçerli değildir",
"IMDbId": "IMDb Id",
"EnableProfile": "Profili Etkinleştir",
"IndexerDownloadClientHelpText": "Bu dizinleyiciden yakalamak için hangi indirme istemcisinin kullanılacağını belirtin",
"IndexerDownloadClientHelpText": "Bu dizinleyiciden almak için hangi indirme istemcisinin kullanılacağını belirtin",
"InstanceNameHelpText": "Sekmedeki örnek adı ve Syslog uygulaması adı için",
"InstanceName": "Örnek isim",
"InteractiveImportNoFilesFound": "Seçilen klasörde video dosyası bulunamadı",
"InteractiveImportNoQuality": "Seçilen her dosya için kalite seçilmelidir",
"InvalidUILanguage": "Kullanıcı arayüzünüz geçersiz bir dile ayarlanmış, düzeltin ve ayarlarınızı kaydedin",
"ManualGrab": "Manuel Yakalama",
"ManualGrab": "Manuel Alımlarda",
"IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizinleyiciler: {indexerNames}.",
"MovieCollectionRootFolderMissingRootHealthCheckMessage": "Film koleksiyonu için eksik kök klasör: {rootFolderInfo}",
"NoImportListsFound": "İçe aktarma listesi bulunamadı",
"MovieGrabbedTooltip": "Film {indexer}'dan alındı ve {downloadClient}'a gönderildi",
"NotificationStatusAllClientHealthCheckMessage": "Arızalar nedeniyle tüm bildirimler kullanılamıyor",
"FormatAgeHour": "saat",
"GrabId": "ID'den Yakala",
"GrabId": "ID'den Al",
"ImportListMissingRoot": "İçe aktarma listeleri için kök klasör eksik: {rootFolderInfo}",
"MonitoredCollectionHelpText": "Bu koleksiyondaki filmlerin otomatik olarak kitaplığa eklenmesini sağlamak için takip edin",
"MovieCollectionFolderMultipleMissingRootsHealthCheckMessage": "Film koleksiyonları için birden fazla kök klasör eksik: {rootFoldersInfo}",
@@ -1379,7 +1379,7 @@
"NotificationsAppriseSettingsNotificationType": "Apprise Bildirim Türü",
"NotificationsAppriseSettingsTagsHelpText": "İsteğe bağlı olarak yalnızca uygun şekilde etiketlenenleri bilgilendirin.",
"NotificationsDiscordSettingsAvatarHelpText": "Bu entegrasyondaki mesajlar için kullanılan avatarı değiştirin",
"NotificationsDiscordSettingsOnGrabFields": "Yakalamalarda",
"NotificationsDiscordSettingsOnGrabFields": "Alımlarda",
"ImportScriptPath": "Komut Dosyası Yolunu İçe Aktar",
"MovieIsPopular": "TMDb'de Popüler Film",
"NotificationStatusSingleClientHealthCheckMessage": "Arızalar nedeniyle bildirimler kullanılamıyor: {notificationNames}",
@@ -1392,7 +1392,7 @@
"IncludeHealthWarnings": "Sağlık Uyarılarını Dahil Et",
"IgnoreDownload": "İndirmeyi Yoksay",
"IgnoreDownloads": "İndirilenleri Yoksay",
"ListQualityProfileHelpText": "Kalite Profili listesi öğeleri şu şekilde eklenecektir:",
"ListQualityProfileHelpText": "Kalite Profili liste öğeleri eklenecektir",
"ListRootFolderHelpText": "Kök Klasör listesi öğeleri eklenecek",
"MustContainHelpText": "Yayın, bu terimlerden en az birini içermelidir (büyük / küçük harfe duyarsız)",
"NewNonExcluded": "Yeni Hariç Tutulmayanlar",
@@ -1405,8 +1405,8 @@
"NotificationsKodiSettingsCleanLibraryHelpText": "Güncellemeden sonra kitaplığı temizle",
"NotificationsMailgunSettingsUseEuEndpointHelpText": "AB MailGun uç noktasını kullanmayı etkinleştirin",
"IndexerJackettAll": "Desteklenmeyen Jackett 'hepsi' uç noktasını kullanan dizinleyiciler: {indexerNames}",
"IndexerSettingsRejectBlocklistedTorrentHashes": "Yakalarken Engellenen Torrent Karmalarını Reddet",
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Bir torrent hash tarafından engellenirse, bazı dizinleyiciler için RSS / Arama sırasında düzgün bir şekilde reddedilmeyebilir, bunun etkinleştirilmesi, torrent yakalandıktan sonra, ancak istemciye gönderilmeden önce reddedilmesine izin verecektir.",
"IndexerSettingsRejectBlocklistedTorrentHashes": "Alırken Engellenen Torrent Karmalarını Reddet",
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Bir torrent hash tarafından engellenirse, bazı dizinleyiciler için RSS / Arama sırasında düzgün bir şekilde reddedilmeyebilir, bunun etkinleştirilmesi, torrent alındıktan sonra, ancak istemciye gönderilmeden önce reddedilmesine izin verecektir.",
"MovieFileRenamedTooltip": "Film dosyası yeniden adlandırıldı",
"MovieFileRenamed": "Film Dosyası Yeniden Adlandırıldı",
"NotificationsCustomScriptValidationFileDoesNotExist": "Dosya bulunmuyor",
@@ -1421,8 +1421,8 @@
"NotificationsKodiSettingsDisplayTime": "Gösterim Süresi",
"NotificationsMailgunSettingsSenderDomain": "Gönderen Alanı",
"IndexerSettingsMultiLanguageReleaseHelpText": "Bu indeksleyicideki çoklu sürümde normalde hangi diller bulunur?",
"IndexerSettingsMultiLanguageRelease": "Çok dil",
"ListWillRefreshEveryInterval": "Liste her {refreshInterval} yenilenecektir",
"IndexerSettingsMultiLanguageRelease": "Çoklu Dil",
"ListWillRefreshEveryInterval": "Liste yenileme periyodu {refreshInterval}dır",
"NotificationsNotifiarrSettingsApiKeyHelpText": "Profilinizdeki API anahtarınız",
"Menu": "Menü",
"MovieSearchResultsLoadError": "Bu film aramasına ilişkin sonuçlar yüklenemiyor. Daha sonra tekrar deneyin",
@@ -1461,7 +1461,7 @@
"FailedToUpdateSettings": "Ayarlar güncellenemedi",
"FormatShortTimeSpanSeconds": "{seconds} saniye",
"ExistsInLibrary": "Kütüphanede Mevcut",
"HealthMessagesInfoBox": "Satırın sonundaki wiki bağlantısını (kitap simgesi) tıklayarak veya [günlüklerinizi]({link}) kontrol ederek bu durum kontrolü mesajlarının nedeni hakkında daha fazla bilgi bulabilirsiniz. Bu mesajları yorumlamakta zorluk yaşıyorsanız aşağıdaki bağlantılardan destek ekibimize ulaşabilirsiniz.",
"HealthMessagesInfoBox": "Satırın sonundaki wiki bağlantısını (kitap simgesi) tıklayarak veya [log kayıtlarınızı]({link}) kontrol ederek bu durum kontrolü mesajlarının nedeni hakkında daha fazla bilgi bulabilirsiniz. Bu mesajları yorumlamakta zorluk yaşıyorsanız aşağıdaki bağlantılardan destek ekibimize ulaşabilirsiniz.",
"HourShorthand": "s",
"ImportScriptPathHelpText": "İçe aktarma için kullanılacak komut dosyasının yolu",
"ImportUsingScriptHelpText": "Bir komut dosyası kullanarak içe aktarmak için dosyaları kopyalayın (ör. kod dönüştürme için)",
@@ -1473,17 +1473,17 @@
"Letterboxd": "Letterboxd",
"MediaInfoFootNote": "Full/AudioLanguages/SubtitleLanguages, dosya adında yer alan dilleri filtrelemenize olanak tanıyan bir `:EN+DE` son ekini destekler. Belirli dilleri hariç tutmak için '-DE'yi kullanın. `+` (örneğin `:EN+`) eklenmesi, hariç tutulan dillere bağlı olarak `[EN]`/`[EN+--]`/`[--]` sonucunu verecektir. Örneğin `{MediaInfo Full:EN+DE}`.",
"NoIndexersFound": "Dizinleyici bulunamadı",
"NotificationsDiscordSettingsOnGrabFieldsHelpText": "Bu 'yakalandı' bildirimi için iletilen alanları değiştirin",
"NotificationsDiscordSettingsOnGrabFieldsHelpText": "Bu 'alındı' bildirimi için iletilen alanları değiştirin",
"NotificationsDiscordSettingsOnManualInteractionFieldsHelpText": "'Manuel Etkileşimlerde' bildirimi için iletilen alanları değiştirin",
"Popularity": "Popülerlik",
"PopularityIndex": "Güncel Popülerlik Endeksi",
"ReleaseProfilesLoadError": "Yayımlama Profilleri yüklenemiyor",
"RemotePathMappingCheckImportFailed": "{appName} filmi içe aktaramadı. Ayrıntılar için günlüklerinizi kontrol edin.",
"RemotePathMappingCheckImportFailed": "{appName} filmi içe aktaramadı. Ayrıntılar için log kayıtlarınızı kontrol edin.",
"OnManualInteractionRequired": "Manuel Etkileşim Gerektiğinde",
"OnHealthRestored": "Sağlığın İyileştirilmesi Hakkında",
"OrganizeNamingPattern": "Adlandırma düzeni: `{standardMovieFormat}`",
"OrganizeNothingToRename": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.",
"OverrideGrabModalTitle": "Geçersiz Kıl ve Yakala - {title}",
"OverrideGrabModalTitle": "Geçersiz Kıl ve Al - {title}",
"QueueLoadError": "Kuyruk yüklenemedi",
"RefreshMonitoredIntervalHelpText": "İndirme istemcilerinden takip edilen indirmelerin ne sıklıkta yenileneceği, minimum 1 dakika",
"Rejections": "Reddedilenler",
@@ -1605,7 +1605,7 @@
"NotificationsValidationUnableToConnectToApi": "{service} API'sine bağlanılamıyor. Sunucu bağlantısı başarısız oldu: ({responseCode}) {exceptionMessage}",
"Recommendation": "Öneri",
"Recommended": "Önerilen",
"RegularExpressionsTutorialLink": "Normal ifadelerle ilgili daha fazla ayrıntıyı [burada](https://www.regular-expressions.info/tutorial.html) bulabilirsiniz.",
"RegularExpressionsTutorialLink": "Düzenli ifadeler hakkında daha fazla ayrıntıyı [burada]({url}) bulabilirsiniz.",
"NotificationsTwitterSettingsDirectMessageHelpText": "Herkese açık mesaj yerine doğrudan mesaj gönderin",
"NzbgetHistoryItemMessage": "PAR Durumu: {parStatus} - Paketten Çıkarma Durumu: {unpackStatus} - Taşıma Durumu: {moveStatus} - Komut Dosyası Durumu: {scriptStatus} - Silme Durumu: {deleteStatus} - İşaretleme Durumu: {markStatus}",
"OneMinute": "1 dakika",
@@ -1637,7 +1637,7 @@
"Popular": "Popüler",
"PostImportCategory": "İçe Aktarma Sonrası Kategorisi",
"PreferProtocol": "{preferredProtocol}'u tercih edin",
"PreviouslyInstalled": "Önceden Yüklenmiş",
"PreviouslyInstalled": "Daha Önce Kurulmuş",
"Release": "Yayın",
"ReleaseProfileTagMovieHelpText": "Yayımlama profilleri, en az bir eşleşen etikete sahip filmlere uygulanacaktır. Tüm filmlere uygulamak için boş bırakın",
"RestartLater": "Daha sonra yeniden başlayacağım",
@@ -1664,7 +1664,7 @@
"RemoveSelectedItemsQueueMessageText": "{selectedCount} öğeyi kuyruktan kaldırmak istediğinizden emin misiniz?",
"RemoveSelectedBlocklistMessageText": "Seçilen öğeleri engellenenler listesinden kaldırmak istediğinizden emin misiniz?",
"RemoveTagsAutomatically": "Otomatik Etiketlemeyi Kaldır",
"RemotePathMappingsInfo": "Uzak Yol Eşlemeleri çok nadiren gereklidir; {appName} ve indirme istemciniz aynı sistemdeyse yollarınızı eşleştirmek daha iyidir. Daha fazla bilgi için [wiki]({wikiLink}) sayfasına bakın.",
"RemotePathMappingsInfo": "Uzak Yol Eşlemeleri çok nadiren gereklidir, {appName} ve indirme istemciniz aynı sistemdeyse yollarınızı eşleştirmeniz daha iyidir. Daha fazla bilgi için [wiki]({wikiLink}) adresini ziyaret edin.",
"ResetDefinitions": "Tanımları Sıfırla",
"UpdateFiltered": "Filtrelenenleri Güncelle",
"RemoveFailedDownloads": "Başarısız İndirmeleri Kaldır",
@@ -1709,7 +1709,7 @@
"ThereWasAnErrorLoadingThisItem": "Bu öğe yüklenirken bir hata oluştu",
"ResetTitles": "Başlıkları Sıfırla",
"SkipRedownloadHelpText": "{appName} uygulamasının bu öğe için alternatif bir yayın indirmeye çalışmasını engeller",
"UpdaterLogFiles": "Güncelleme Günlük Dosyaları",
"UpdaterLogFiles": "Log Kayıt Güncelleyici",
"Unknown": "Bilinmeyen",
"RottenTomatoesRating": "Tomato Derecelendirmesi",
"RootFolderPath": "Kök Klasör Yolu",
@@ -1758,19 +1758,19 @@
"BlocklistFilterHasNoItems": "Seçilen engelleme listesi filtresi hiçbir öğe içermiyor",
"IndexerSettingsSeedTime": "Seed Süresi",
"IndexerSettingsSeedRatio": "Seed Oranı",
"IndexerSettingsSeedTimeHelpText": "Bir torrentin durmadan önce seed edilmesi gereken süre. Boş bırakılırsa indirme istemcisinin varsayılan ayarını kullanır",
"IndexerSettingsSeedRatioHelpText": "Bir torrentin durmadan önce ulaşması gereken oran. Boş bırakılırsa indirme istemcisinin varsayılan değerini kullanır. Oran en az 1,0 olmalı ve indeksleyici kurallarına uygun olmalıdır",
"IndexerSettingsSeedTimeHelpText": "Bir torrentin durdurulmadan önce ulaşması gereken oran, boş bırakıldığında uygulamanın varsayılanı kullanılır",
"IndexerSettingsSeedRatioHelpText": "Bir torrentin durdurulmadan önce ulaşması gereken oran. Boş bırakılırsa indirme istemcisinin varsayılan değerini kullanır. Oran en az 1,0 olmalı ve indeksleyici kurallarına uygun olmalıdır",
"MissingLoadError": "Eksik öğeler yüklenirken hata oluştu",
"MissingNoItems": "Eksik öğe yok",
"MovieDownloaded": "Film İndirildi",
"MovieIsNotAvailable": "Film kullanılamıyor",
"MovieMissingFromDisk": "Film diskte eksik",
"CutoffUnmetLoadError": "Karşılanmamış kesinti öğeleri yüklenirken hata oluştu",
"CutoffUnmetLoadError": "Kesinti karşılanmayan öğeleri yükleme hatası",
"CutoffUnmetNoItems": "Karşılanmayan son öğe yok",
"External": "Harici",
"InteractiveSearchModalHeaderTitle": "İnteraktif Arama - {title}",
"MassSearchCancelWarning": "Bu işlem, {appName} yeniden başlatılmadan veya tüm dizin oluşturucularınız devre dışı bırakılmadan başlatılır ise iptal edilemez.",
"MonitorSelected": "Takip Edilen Seçildi",
"MonitorSelected": "Seçilenleri Bırak",
"MovieIsNotMonitored": "Film takip edilemiyor",
"SearchForAllMissingMovies": "Eksik tüm filmleri arayın",
"SearchForAllMissingMoviesConfirmationCount": "{totalRecords} eksik filmin tamamını aramak istediğinizden emin misiniz?",
@@ -1795,7 +1795,7 @@
"ReleaseDate": "Yayın tarihleri",
"EditSelectedCustomFormats": "Seçilen Özel Formatları Düzenle",
"DeleteSelected": "Seçileni Sil",
"CountCustomFormatsSelected": "{count} özel biçim seçildi",
"CountCustomFormatsSelected": "{count} özel format seçildi",
"NoCustomFormatsFound": "Özel format bulunamadı",
"ProgressBarProgress": "İlerleme Çubuğu %{progress} seviyesinde",
"InvalidMovieInfoLanguageLanguage": "Film Bilgi Diliniz geçersiz bir değere ayarlanmış, düzeltin ve ayarlarınızı kaydedin",
@@ -1816,7 +1816,7 @@
"TodayAt": "Bugün {time}'da",
"YesterdayAt": "Dün saat {time}'da",
"MinimumCustomFormatScoreIncrement": "Minimum Özel Format Puanı Artışı",
"MinimumCustomFormatScoreIncrementHelpText": "{appName}'in bunu bir yükseltme olarak değerlendirmesi için mevcut ve yeni sürümler arasında özel biçim puanında gereken minimum iyileştirme",
"MinimumCustomFormatScoreIncrementHelpText": "{appName}'in bunu bir yükseltme olarak değerlendirmesi için mevcut ve yeni sürümler arasında özel format puanında gereken minimum iyileştirme",
"DayOfWeekAt": "{day}, {time} saatinde",
"Disposition": "Düzen",
"CustomFormatsSpecificationExceptLanguageHelpText": "Seçilen dil dışında herhangi bir dil mevcutsa eşleşir",
@@ -1863,5 +1863,12 @@
"FavoriteFolderRemove": "Favori Klasörü Kaldır",
"FavoriteFolders": "Favori Klasörler",
"Warning": "Uyarı",
"ManageFormats": "Biçimleri Yönet"
"ManageFormats": "Formatları Yönet",
"MetadataKometaDeprecatedSetting": "Kullanım Dışı",
"MetadataKometaDeprecated": "Kometa dosyaları artık oluşturulmayacak, destek v6'da tamamen kaldırılacak",
"NotificationsSettingsWebhookHeaders": "Başlıklar",
"NotificationsTelegramSettingsIncludeInstanceName": "Başlığa Örnek Adını Dahil Et",
"NotificationsTelegramSettingsIncludeInstanceNameHelpText": "İsteğe bağlı olarak Örnek adını bildirime ekleyin",
"NotificationsTelegramSettingsMetadataLinks": "Meta Veri Bağlantıları",
"NotificationsTelegramSettingsMetadataLinksMovieHelpText": "Bildirim gönderirken film meta verilerine bir bağlantı ekleyin"
}

View File

@@ -1120,7 +1120,7 @@
"RetryingDownloadOn": "Завантаження відкладається до {0} о {1}",
"TablePageSize": "Розмір сторінки",
"BlocklistLoadError": "Не вдалося завантажити список блокувань",
"BlocklistReleaseHelpText": "Забороняє {appName} знову автоматично захопити цей випуск",
"BlocklistReleaseHelpText": "Блокує завантаження цього випуску {appName} через RSS або Автоматичний пошук",
"DelayingDownloadUntil": "Завантаження відкладається до {date} о {time}",
"DeletedReasonUpgrade": "Файл видалено, щоб імпортувати оновлення",
"AutoRedownloadFailed": "Помилка повторного завантаження",
@@ -1289,5 +1289,8 @@
"DefaultNotFoundMessage": "Ви, мабуть, заблукали, тут нічого не видно.",
"Completed": "Завершено",
"Delay": "Затримка",
"DownloadClientUnavailable": "Клієнт завантажувача недоступний"
"DownloadClientUnavailable": "Клієнт завантажувача недоступний",
"CountIndexersSelected": "{count} індексер(-и) обрано",
"AnnouncedMovieAvailabilityDescription": "Фільми вважаються доступними, щойно їх додають у {appName}.",
"CountCustomFormatsSelected": "Користувацькі формати обрано {count}"
}

View File

@@ -802,7 +802,7 @@
"PreviewRenameHelpText": "小提示:要预览重命名效果,选择 “取消” ,然后点击任何电影标题并使用",
"PtpOldSettingsCheckMessage": "以下 PassThePopcorn 索引器的设置已弃用,应更新为:{0}",
"QualityDefinitions": "质量定义",
"RegularExpressionsCanBeTested": "正则表达式可在 [此处](http://regexstorm.net/tester) 测试。",
"RegularExpressionsCanBeTested": "正则表达式可在 [此处]({url}) 测试。",
"ReleaseTitle": "发布资源标题",
"RemoveHelpTextWarning": "移除操作会从下载客户端中删除任务和已下载文件。",
"RequiredRestrictionHelpText": "发布资源必须至少包含这些项目之一(不区分大小写)",
@@ -1588,7 +1588,7 @@
"OptionalName": "可选名称",
"Period": "时期",
"QualityCutoffNotMet": "未达到质量阈值",
"RegularExpressionsTutorialLink": "有关正则表达式的更多详细信息,请参阅[此处](https://www.regular-expressions.info/tutorial.html)。",
"RegularExpressionsTutorialLink": "有关正则表达式的更多详细信息,请参阅[此处]({url})。",
"RestartLater": "稍后重启",
"RestartRequiredWindowsService": "根据运行{appName}的用户,在服务自动启动之前,您可能需要以管理员身份重新启动{appName}一次。",
"IndexerSettingsMultiLanguageRelease": "多种语言",
@@ -1864,5 +1864,8 @@
"OnFileImport": "关于文件导入",
"ManageFormats": "管理格式",
"NotificationsSettingsWebhookHeaders": "标头",
"Warning": "警告"
"Warning": "警告",
"MetadataKometaDeprecatedSetting": "弃用",
"NotificationsTelegramSettingsMetadataLinks": "元数据链接",
"NotificationsTelegramSettingsMetadataLinksMovieHelpText": "添加一个在发送通知时指向电影元数据的链接"
}

View File

@@ -275,7 +275,6 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
movie.Genres = resource.Genres;
movie.Images = resource.Images.Select(MapImage).ToList();
// movie.Genres = resource.Genres;
movie.Recommendations = resource.Recommendations?.Select(r => r.TmdbId).ToList() ?? new List<int>();
// Workaround due to metadata change until cache cleans up

View File

@@ -0,0 +1,15 @@
using System.Collections.Generic;
using NzbDrone.Common.Messaging;
namespace NzbDrone.Core.Movies.Events
{
public class MoviesBulkEditedEvent : IEvent
{
public IReadOnlyCollection<Movie> Movies { get; private set; }
public MoviesBulkEditedEvent(IReadOnlyCollection<Movie> movies)
{
Movies = movies;
}
}
}

View File

@@ -279,6 +279,7 @@ namespace NzbDrone.Core.Movies
_movieRepository.UpdateMany(movies);
_logger.Debug("{0} movies updated", movies.Count);
_eventAggregator.PublishEvent(new MoviesBulkEditedEvent(movies));
return movies;
}
@@ -331,6 +332,8 @@ namespace NzbDrone.Core.Movies
return true;
}
_logger.Debug("Tags not updated for '{0}'", movie.Title);
return false;
}

View File

@@ -117,8 +117,7 @@ namespace NzbDrone.Core.Movies
movieMetadata.LastInfoSync = DateTime.UtcNow;
movieMetadata.Runtime = movieInfo.Runtime;
movieMetadata.Ratings = movieInfo.Ratings;
// movie.Genres = movieInfo.Genres;
movieMetadata.Genres = movieInfo.Genres;
movieMetadata.Certification = movieInfo.Certification;
movieMetadata.InCinemas = movieInfo.InCinemas;
movieMetadata.Website = movieInfo.Website;

View File

@@ -2,6 +2,7 @@ using System.Collections.Generic;
using System.Linq;
using FluentValidation.Results;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Movies;
namespace NzbDrone.Core.Notifications.Telegram
@@ -9,85 +10,103 @@ namespace NzbDrone.Core.Notifications.Telegram
public class Telegram : NotificationBase<TelegramSettings>
{
private readonly ITelegramProxy _proxy;
private readonly IConfigFileProvider _configFileProvider;
public Telegram(ITelegramProxy proxy)
public Telegram(ITelegramProxy proxy, IConfigFileProvider configFileProvider)
{
_proxy = proxy;
_configFileProvider = configFileProvider;
}
public override string Name => "Telegram";
public override string Link => "https://telegram.org/";
private string InstanceName => _configFileProvider.InstanceName;
public override void OnGrab(GrabMessage grabMessage)
{
var title = Settings.IncludeAppNameInTitle ? MOVIE_GRABBED_TITLE_BRANDED : MOVIE_GRABBED_TITLE;
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
var links = GetLinks(grabMessage.Movie);
_proxy.SendNotification(title, grabMessage.Message, Settings);
_proxy.SendNotification(title, grabMessage.Message, links, Settings);
}
public override void OnDownload(DownloadMessage message)
{
string title;
if (message.OldMovieFiles.Any())
{
var title = Settings.IncludeAppNameInTitle ? MOVIE_UPGRADED_TITLE_BRANDED : MOVIE_UPGRADED_TITLE;
_proxy.SendNotification(title, message.Message, Settings);
title = Settings.IncludeAppNameInTitle ? MOVIE_UPGRADED_TITLE_BRANDED : MOVIE_UPGRADED_TITLE;
}
else
{
var title = Settings.IncludeAppNameInTitle ? MOVIE_DOWNLOADED_TITLE_BRANDED : MOVIE_DOWNLOADED_TITLE;
_proxy.SendNotification(title, message.Message, Settings);
title = Settings.IncludeAppNameInTitle ? MOVIE_DOWNLOADED_TITLE_BRANDED : MOVIE_DOWNLOADED_TITLE;
}
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
var links = GetLinks(message.Movie);
_proxy.SendNotification(title, message.Message, links, Settings);
}
public override void OnMovieAdded(Movie movie)
{
var title = Settings.IncludeAppNameInTitle ? MOVIE_ADDED_TITLE_BRANDED : MOVIE_ADDED_TITLE;
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
var links = GetLinks(movie);
_proxy.SendNotification(title, $"{movie.Title} added to library", Settings);
_proxy.SendNotification(title, $"{movie.Title} added to library", links, Settings);
}
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
var title = Settings.IncludeAppNameInTitle ? MOVIE_FILE_DELETED_TITLE_BRANDED : MOVIE_FILE_DELETED_TITLE;
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
var links = GetLinks(deleteMessage.Movie);
_proxy.SendNotification(title, deleteMessage.Message, Settings);
_proxy.SendNotification(title, deleteMessage.Message, links, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
var title = Settings.IncludeAppNameInTitle ? MOVIE_DELETED_TITLE_BRANDED : MOVIE_DELETED_TITLE;
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
var links = GetLinks(deleteMessage.Movie);
_proxy.SendNotification(title, deleteMessage.Message, Settings);
_proxy.SendNotification(title, deleteMessage.Message, links, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
var title = Settings.IncludeAppNameInTitle ? HEALTH_ISSUE_TITLE_BRANDED : HEALTH_ISSUE_TITLE;
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
_proxy.SendNotification(title, healthCheck.Message, Settings);
_proxy.SendNotification(title, healthCheck.Message, new List<TelegramLink>(), Settings);
}
public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck)
{
var title = Settings.IncludeAppNameInTitle ? HEALTH_RESTORED_TITLE_BRANDED : HEALTH_RESTORED_TITLE;
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
_proxy.SendNotification(title, $"The following issue is now resolved: {previousCheck.Message}", Settings);
_proxy.SendNotification(title, $"The following issue is now resolved: {previousCheck.Message}", new List<TelegramLink>(), Settings);
}
public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage)
{
var title = Settings.IncludeAppNameInTitle ? APPLICATION_UPDATE_TITLE_BRANDED : APPLICATION_UPDATE_TITLE;
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
_proxy.SendNotification(title, updateMessage.Message, Settings);
_proxy.SendNotification(title, updateMessage.Message, new List<TelegramLink>(), Settings);
}
public override void OnManualInteractionRequired(ManualInteractionRequiredMessage message)
{
var title = Settings.IncludeAppNameInTitle ? MANUAL_INTERACTION_REQUIRED_TITLE_BRANDED : MANUAL_INTERACTION_REQUIRED_TITLE;
title = Settings.IncludeInstanceNameInTitle ? $"{title} - {InstanceName}" : title;
_proxy.SendNotification(title, message.Message, Settings);
_proxy.SendNotification(title, message.Message, new List<TelegramLink>(), Settings);
}
public override ValidationResult Test()
@@ -98,5 +117,37 @@ namespace NzbDrone.Core.Notifications.Telegram
return new ValidationResult(failures);
}
private List<TelegramLink> GetLinks(Movie movie)
{
var links = new List<TelegramLink>();
if (movie == null)
{
return links;
}
foreach (var link in Settings.MetadataLinks)
{
var linkType = (MetadataLinkType)link;
if (linkType == MetadataLinkType.Tmdb && movie.TmdbId > 0)
{
links.Add(new TelegramLink("TMDb", $"https://www.themoviedb.org/movie/{movie.TmdbId}"));
}
if (linkType == MetadataLinkType.Imdb && movie.ImdbId.IsNotNullOrWhiteSpace())
{
links.Add(new TelegramLink("IMDb", $"https://www.imdb.com/title/{movie.ImdbId}"));
}
if (linkType == MetadataLinkType.Trakt && movie.TmdbId > 0)
{
links.Add(new TelegramLink("Trakt", $"https://trakt.tv/search/tmdb/{movie.TmdbId}?id_type=movie"));
}
}
return links;
}
}
}

View File

@@ -0,0 +1,14 @@
namespace NzbDrone.Core.Notifications.Telegram
{
public class TelegramLink
{
public string Label { get; set; }
public string Link { get; set; }
public TelegramLink(string label, string link)
{
Label = label;
Link = link;
}
}
}

View File

@@ -1,19 +1,21 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Web;
using FluentValidation.Results;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
namespace NzbDrone.Core.Notifications.Telegram
{
public interface ITelegramProxy
{
void SendNotification(string title, string message, TelegramSettings settings);
void SendNotification(string title, string message, List<TelegramLink> links, TelegramSettings settings);
ValidationFailure Test(TelegramSettings settings);
}
@@ -21,20 +23,28 @@ namespace NzbDrone.Core.Notifications.Telegram
{
private const string URL = "https://api.telegram.org";
private readonly IHttpClient _httpClient;
private readonly IConfigFileProvider _configFileProvider;
private readonly ILocalizationService _localizationService;
private readonly Logger _logger;
public TelegramProxy(IHttpClient httpClient, ILocalizationService localizationService, Logger logger)
public TelegramProxy(IHttpClient httpClient, IConfigFileProvider configFileProvider, ILocalizationService localizationService, Logger logger)
{
_httpClient = httpClient;
_configFileProvider = configFileProvider;
_localizationService = localizationService;
_logger = logger;
}
public void SendNotification(string title, string message, TelegramSettings settings)
public void SendNotification(string title, string message, List<TelegramLink> links, TelegramSettings settings)
{
// Format text to add the title before and bold using markdown
var text = $"<b>{HttpUtility.HtmlEncode(title)}</b>\n{HttpUtility.HtmlEncode(message)}";
var text = new StringBuilder($"<b>{HttpUtility.HtmlEncode(title)}</b>\n");
text.AppendLine(HttpUtility.HtmlEncode(message));
foreach (var link in links)
{
text.AppendLine($"<a href=\"{link.Link}\">{HttpUtility.HtmlEncode(link.Label)}</a>");
}
var requestBuilder = new HttpRequestBuilder(URL).Resource("bot{token}/sendmessage").Post();
@@ -57,7 +67,15 @@ namespace NzbDrone.Core.Notifications.Telegram
const string title = "Test Notification";
const string body = "This is a test message from Radarr";
SendNotification(settings.IncludeAppNameInTitle ? brandedTitle : title, body, settings);
var links = new List<TelegramLink>
{
new ("Radarr.video", "https://radarr.video")
};
var testMessageTitle = settings.IncludeAppNameInTitle ? brandedTitle : title;
testMessageTitle = settings.IncludeInstanceNameInTitle ? $"{testMessageTitle} - {_configFileProvider.InstanceName}" : testMessageTitle;
SendNotification(testMessageTitle, body, links, settings);
}
catch (Exception ex)
{

View File

@@ -1,3 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using FluentValidation;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Validation;
@@ -12,6 +15,16 @@ namespace NzbDrone.Core.Notifications.Telegram
RuleFor(c => c.ChatId).NotEmpty();
RuleFor(c => c.TopicId).Must(topicId => !topicId.HasValue || topicId > 1)
.WithMessage("Topic ID must be greater than 1 or empty");
RuleFor(c => c.MetadataLinks).Custom((links, context) =>
{
foreach (var link in links)
{
if (!Enum.IsDefined(typeof(MetadataLinkType), link))
{
context.AddFailure("MetadataLinks", $"MetadataLink is not valid: {link}");
}
}
});
}
}
@@ -19,6 +32,11 @@ namespace NzbDrone.Core.Notifications.Telegram
{
private static readonly TelegramSettingsValidator Validator = new ();
public TelegramSettings()
{
MetadataLinks = Enumerable.Empty<int>();
}
[FieldDefinition(0, Label = "NotificationsTelegramSettingsBotToken", Privacy = PrivacyLevel.ApiKey, HelpLink = "https://core.telegram.org/bots")]
public string BotToken { get; set; }
@@ -34,6 +52,12 @@ namespace NzbDrone.Core.Notifications.Telegram
[FieldDefinition(4, Label = "NotificationsTelegramSettingsIncludeAppName", Type = FieldType.Checkbox, HelpText = "NotificationsTelegramSettingsIncludeAppNameHelpText")]
public bool IncludeAppNameInTitle { get; set; }
[FieldDefinition(5, Label = "NotificationsTelegramSettingsIncludeInstanceName", Type = FieldType.Checkbox, HelpText = "NotificationsTelegramSettingsIncludeInstanceNameHelpText", Advanced = true)]
public bool IncludeInstanceNameInTitle { get; set; }
[FieldDefinition(6, Label = "NotificationsTelegramSettingsMetadataLinks", Type = FieldType.Select, SelectOptions = typeof(MetadataLinkType), HelpText = "NotificationsTelegramSettingsMetadataLinksMovieHelpText")]
public IEnumerable<int> MetadataLinks { get; set; }
public override NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));

View File

@@ -6,14 +6,15 @@
<PackageReference Include="Dapper" Version="2.0.151" />
<PackageReference Include="Diacritical.Net" Version="1.0.4" />
<PackageReference Include="Equ" Version="2.3.0" />
<PackageReference Include="MailKit" Version="3.6.0" />
<PackageReference Include="MailKit" Version="4.8.0" />
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.35" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" />
<PackageReference Include="Npgsql" Version="7.0.9" />
<PackageReference Include="Polly" Version="8.5.0" />
<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" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.35" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
<PackageReference Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" />

View File

@@ -39,6 +39,7 @@ namespace Radarr.Api.V3.Movies
IHandle<MovieEditedEvent>,
IHandle<MoviesDeletedEvent>,
IHandle<MovieRenamedEvent>,
IHandle<MoviesBulkEditedEvent>,
IHandle<MediaCoversUpdatedEvent>
{
private readonly IMovieService _moviesService;
@@ -370,6 +371,15 @@ namespace Radarr.Api.V3.Movies
BroadcastResourceChange(ModelAction.Updated, MapToResource(message.Movie));
}
[NonAction]
public void Handle(MoviesBulkEditedEvent message)
{
foreach (var movie in message.Movies)
{
BroadcastResourceChange(ModelAction.Updated, MapToResource(movie));
}
}
[NonAction]
public void Handle(MediaCoversUpdatedEvent message)
{

View File

@@ -50,7 +50,7 @@ namespace Radarr.Api.V3.System.Backup
}
[RestDeleteById]
public void DeleteBackup(int id)
public object DeleteBackup(int id)
{
var backup = GetBackup(id);
@@ -67,6 +67,8 @@ namespace Radarr.Api.V3.System.Backup
}
_diskProvider.DeleteFile(path);
return new { };
}
[HttpPost("restore/{id:int}")]

View File

@@ -9583,6 +9583,9 @@
"backupRetention": {
"type": "integer",
"format": "int32"
},
"trustCgnatIpAddresses": {
"type": "boolean"
}
},
"additionalProperties": false

1532
yarn.lock

File diff suppressed because it is too large Load Diff