mirror of
https://github.com/Radarr/Radarr.git
synced 2026-03-05 13:21:25 -05:00
Compare commits
36 Commits
v5.16.1.95
...
v5.17.1.95
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f23c465ee | ||
|
|
af60cca9ae | ||
|
|
d34d23a052 | ||
|
|
0a0da42543 | ||
|
|
e5419f6f06 | ||
|
|
88d9c08f1a | ||
|
|
6b4259757c | ||
|
|
f1d7c56d94 | ||
|
|
c81b2e80ee | ||
|
|
5efefd804b | ||
|
|
38f9543526 | ||
|
|
aae68e681e | ||
|
|
1d21bbf78f | ||
|
|
99c3c8ce5b | ||
|
|
85171e40a5 | ||
|
|
86b656d323 | ||
|
|
5ae5d1043a | ||
|
|
b801aa0935 | ||
|
|
b2b5aa1f79 | ||
|
|
8c6ba9a543 | ||
|
|
4e024c51d3 | ||
|
|
e4106f0ede | ||
|
|
9032ac20ff | ||
|
|
23fce4bf2e | ||
|
|
64fd8552f8 | ||
|
|
e016410c10 | ||
|
|
bea943adf8 | ||
|
|
9780d20f8a | ||
|
|
62722d45b0 | ||
|
|
27dd8e8cd5 | ||
|
|
6c47ede76b | ||
|
|
7b9562bb38 | ||
|
|
8b0b7c1cb0 | ||
|
|
7ebd341cd6 | ||
|
|
6c85f166ff | ||
|
|
45aabce107 |
@@ -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)'
|
||||
|
||||
@@ -187,7 +187,7 @@ module.exports = (env) => {
|
||||
loose: true,
|
||||
debug: false,
|
||||
useBuiltIns: 'entry',
|
||||
corejs: 3
|
||||
corejs: '3.39'
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
@@ -91,6 +91,10 @@
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.genres {
|
||||
pointer-events: all;
|
||||
}
|
||||
|
||||
.links {
|
||||
margin-left: 5px;
|
||||
pointer-events: all;
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>,
|
||||
|
||||
@@ -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))
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ interface CssExports {
|
||||
'link': string;
|
||||
'lists': string;
|
||||
'overview': string;
|
||||
'overviewContainer': string;
|
||||
'poster': string;
|
||||
'posterContainer': string;
|
||||
'title': string;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
39
frontend/src/Movie/MovieGenres.tsx
Normal file
39
frontend/src/Movie/MovieGenres.tsx
Normal 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;
|
||||
27
frontend/src/MovieFile/Editor/MediaInfo.tsx
Normal file
27
frontend/src/MovieFile/Editor/MediaInfo.tsx
Normal 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;
|
||||
@@ -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;
|
||||
@@ -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}
|
||||
/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
92
frontend/src/MovieFile/MediaInfo.tsx
Normal file
92
frontend/src/MovieFile/MediaInfo.tsx
Normal 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;
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
15
frontend/src/MovieFile/MovieFileLanguages.tsx
Normal file
15
frontend/src/MovieFile/MovieFileLanguages.tsx
Normal 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;
|
||||
18
frontend/src/MovieFile/useMovieFile.ts
Normal file
18
frontend/src/MovieFile/useMovieFile.ts
Normal 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;
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -95,7 +95,6 @@ function Metadata({ id, name, enable, fields }: MetadataProps) {
|
||||
) : null}
|
||||
|
||||
<EditMetadataModal
|
||||
advancedSettings={false}
|
||||
id={id}
|
||||
isOpen={isEditMetadataModalOpen}
|
||||
onModalClose={handleModalClose}
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
9
frontend/src/Utilities/Object/getEntries.ts
Normal file
9
frontend/src/Utilities/Object/getEntries.ts
Normal 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;
|
||||
@@ -35,7 +35,7 @@ export default function getLanguageName(code: string) {
|
||||
|
||||
try {
|
||||
return languageNames.of(code) ?? code;
|
||||
} catch (error) {
|
||||
} catch {
|
||||
return code;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ export async function fetchTranslations(): Promise<boolean> {
|
||||
translations = data.Strings;
|
||||
|
||||
resolve(true);
|
||||
} catch (error) {
|
||||
} catch {
|
||||
resolve(false);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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}>
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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} />);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
38
package.json
38
package.json
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace NzbDrone.Core.DecisionEngine
|
||||
QualityCutoff,
|
||||
CustomFormatScore,
|
||||
CustomFormatCutoff,
|
||||
MinCustomFormatScore
|
||||
MinCustomFormatScore,
|
||||
UpgradesNotAllowed
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 på 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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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": "הוסף תנאי"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 폴더"
|
||||
}
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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ı Açı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"
|
||||
}
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -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": "添加一个在发送通知时指向电影元数据的链接"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
15
src/NzbDrone.Core/Movies/Events/MoviesBulkEditedEvent.cs
Normal file
15
src/NzbDrone.Core/Movies/Events/MoviesBulkEditedEvent.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
14
src/NzbDrone.Core/Notifications/Telegram/TelegramLink.cs
Normal file
14
src/NzbDrone.Core/Notifications/Telegram/TelegramLink.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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}")]
|
||||
|
||||
@@ -9583,6 +9583,9 @@
|
||||
"backupRetention": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
},
|
||||
"trustCgnatIpAddresses": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
|
||||
Reference in New Issue
Block a user