mirror of
https://github.com/Sonarr/Sonarr.git
synced 2026-04-17 21:26:13 -04:00
Compare commits
20 Commits
v4.0.4.169
...
v4.0.5.174
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c331c8bd11 | ||
|
|
52b72925f9 | ||
|
|
378fedcd9d | ||
|
|
a90ab1a8fd | ||
|
|
0edc5ba99a | ||
|
|
ea54ade9bf | ||
|
|
e07eb05e8b | ||
|
|
d9b771ab0b | ||
|
|
6b08e849b8 | ||
|
|
9c1f48ebc9 | ||
|
|
fd3dd1ab7d | ||
|
|
11e5c5a11b | ||
|
|
48f0291884 | ||
|
|
af0e55aef4 | ||
|
|
39a439eb4c | ||
|
|
66940b283b | ||
|
|
2a662afaef | ||
|
|
62a9c2519b | ||
|
|
ca372bee25 | ||
|
|
0904a0737e |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -22,7 +22,7 @@ env:
|
||||
FRAMEWORK: net6.0
|
||||
RAW_BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
|
||||
SONARR_MAJOR_VERSION: 4
|
||||
VERSION: 4.0.4
|
||||
VERSION: 4.0.5
|
||||
|
||||
jobs:
|
||||
backend:
|
||||
|
||||
12
docs.sh
12
docs.sh
@@ -25,17 +25,23 @@ slnFile=src/Sonarr.sln
|
||||
|
||||
platform=Posix
|
||||
|
||||
if [ "$PLATFORM" = "Windows" ]; then
|
||||
application=Sonarr.Console.dll
|
||||
else
|
||||
application=Sonarr.dll
|
||||
fi
|
||||
|
||||
dotnet clean $slnFile -c Debug
|
||||
dotnet clean $slnFile -c Release
|
||||
|
||||
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
|
||||
|
||||
dotnet new tool-manifest
|
||||
dotnet tool install --version 6.5.0 Swashbuckle.AspNetCore.Cli
|
||||
dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli
|
||||
|
||||
dotnet tool run swagger tofile --output ./src/Sonarr.Api.V3/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/Sonarr.dll" v3 &
|
||||
dotnet tool run swagger tofile --output ./src/Sonarr.Api.V3/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v3 &
|
||||
|
||||
sleep 30
|
||||
sleep 45
|
||||
|
||||
kill %1
|
||||
|
||||
|
||||
@@ -24,7 +24,11 @@ function TimeleftCell(props) {
|
||||
} = props;
|
||||
|
||||
if (status === 'delay') {
|
||||
const date = getRelativeDate(estimatedCompletionTime, shortDateFormat, showRelativeDates);
|
||||
const date = getRelativeDate({
|
||||
date: estimatedCompletionTime,
|
||||
shortDateFormat,
|
||||
showRelativeDates
|
||||
});
|
||||
const time = formatTime(estimatedCompletionTime, timeFormat, { includeMinuteZero: true });
|
||||
|
||||
return (
|
||||
@@ -40,7 +44,11 @@ function TimeleftCell(props) {
|
||||
}
|
||||
|
||||
if (status === 'downloadClientUnavailable') {
|
||||
const date = getRelativeDate(estimatedCompletionTime, shortDateFormat, showRelativeDates);
|
||||
const date = getRelativeDate({
|
||||
date: estimatedCompletionTime,
|
||||
shortDateFormat,
|
||||
showRelativeDates
|
||||
});
|
||||
const time = formatTime(estimatedCompletionTime, timeFormat, { includeMinuteZero: true });
|
||||
|
||||
return (
|
||||
|
||||
@@ -28,7 +28,7 @@ class DayOfWeek extends Component {
|
||||
if (view === calendarViews.WEEK) {
|
||||
formatedDate = momentDate.format(calendarWeekColumnHeader);
|
||||
} else if (view === calendarViews.FORECAST) {
|
||||
formatedDate = getRelativeDate(date, shortDateFormat, showRelativeDates);
|
||||
formatedDate = getRelativeDate({ date, shortDateFormat, showRelativeDates });
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@@ -40,7 +40,7 @@ class RelativeDateCell extends PureComponent {
|
||||
title={formatDateTime(date, longDateFormat, timeFormat, { includeSeconds, includeRelativeDay: !showRelativeDates })}
|
||||
{...otherProps}
|
||||
>
|
||||
{getRelativeDate(date, shortDateFormat, showRelativeDates, { timeFormat, includeSeconds, includeTime, timeForToday: true })}
|
||||
{getRelativeDate({ date, shortDateFormat, showRelativeDates, timeFormat, includeSeconds, includeTime, timeForToday: true })}
|
||||
</Component>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -138,7 +138,10 @@ function getInfoRowProps(
|
||||
}),
|
||||
iconName: icons.CALENDAR,
|
||||
label:
|
||||
getRelativeDate(previousAiring, shortDateFormat, showRelativeDates, {
|
||||
getRelativeDate({
|
||||
date: previousAiring,
|
||||
shortDateFormat,
|
||||
showRelativeDates,
|
||||
timeFormat,
|
||||
timeForToday: true,
|
||||
}) ?? '',
|
||||
@@ -156,7 +159,10 @@ function getInfoRowProps(
|
||||
}),
|
||||
iconName: icons.ADD,
|
||||
label:
|
||||
getRelativeDate(added, shortDateFormat, showRelativeDates, {
|
||||
getRelativeDate({
|
||||
date: added,
|
||||
shortDateFormat,
|
||||
showRelativeDates,
|
||||
timeFormat,
|
||||
timeForToday: true,
|
||||
}) ?? '',
|
||||
@@ -232,15 +238,13 @@ function SeriesIndexOverviewInfo(props: SeriesIndexOverviewInfoProps) {
|
||||
<SeriesIndexOverviewInfoRow
|
||||
title={formatDateTime(nextAiring, longDateFormat, timeFormat)}
|
||||
iconName={icons.SCHEDULED}
|
||||
label={getRelativeDate(
|
||||
nextAiring,
|
||||
label={getRelativeDate({
|
||||
date: nextAiring,
|
||||
shortDateFormat,
|
||||
showRelativeDates,
|
||||
{
|
||||
timeFormat,
|
||||
timeForToday: true,
|
||||
}
|
||||
)}
|
||||
timeFormat,
|
||||
timeForToday: true,
|
||||
})}
|
||||
/>
|
||||
)}
|
||||
|
||||
|
||||
@@ -217,7 +217,10 @@ function SeriesIndexPoster(props: SeriesIndexPosterProps) {
|
||||
timeFormat
|
||||
)}`}
|
||||
>
|
||||
{getRelativeDate(nextAiring, shortDateFormat, showRelativeDates, {
|
||||
{getRelativeDate({
|
||||
date: nextAiring,
|
||||
shortDateFormat,
|
||||
showRelativeDates,
|
||||
timeFormat,
|
||||
timeForToday: true,
|
||||
})}
|
||||
|
||||
@@ -80,7 +80,10 @@ function SeriesIndexPosterInfo(props: SeriesIndexPosterInfoProps) {
|
||||
timeFormat
|
||||
)}`}
|
||||
>
|
||||
{getRelativeDate(previousAiring, shortDateFormat, showRelativeDates, {
|
||||
{getRelativeDate({
|
||||
date: previousAiring,
|
||||
shortDateFormat,
|
||||
showRelativeDates,
|
||||
timeFormat,
|
||||
timeForToday: true,
|
||||
})}
|
||||
@@ -89,15 +92,13 @@ function SeriesIndexPosterInfo(props: SeriesIndexPosterInfoProps) {
|
||||
}
|
||||
|
||||
if (sortKey === 'added' && added) {
|
||||
const addedDate = getRelativeDate(
|
||||
added,
|
||||
const addedDate = getRelativeDate({
|
||||
date: added,
|
||||
shortDateFormat,
|
||||
showRelativeDates,
|
||||
{
|
||||
timeFormat,
|
||||
timeForToday: false,
|
||||
}
|
||||
);
|
||||
timeFormat,
|
||||
timeForToday: false,
|
||||
});
|
||||
|
||||
return (
|
||||
<div
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
import moment from 'moment';
|
||||
import formatTime from 'Utilities/Date/formatTime';
|
||||
import isInNextWeek from 'Utilities/Date/isInNextWeek';
|
||||
import isToday from 'Utilities/Date/isToday';
|
||||
import isTomorrow from 'Utilities/Date/isTomorrow';
|
||||
import isYesterday from 'Utilities/Date/isYesterday';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import formatDateTime from './formatDateTime';
|
||||
|
||||
function getRelativeDate(date, shortDateFormat, showRelativeDates, { timeFormat, includeSeconds = false, timeForToday = false, includeTime = false } = {}) {
|
||||
if (!date) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const isTodayDate = isToday(date);
|
||||
const time = formatTime(date, timeFormat, { includeMinuteZero: true, includeSeconds });
|
||||
|
||||
if (isTodayDate && timeForToday && timeFormat) {
|
||||
return time;
|
||||
}
|
||||
|
||||
if (!showRelativeDates) {
|
||||
return moment(date).format(shortDateFormat);
|
||||
}
|
||||
|
||||
if (isYesterday(date)) {
|
||||
return includeTime ? translate('YesterdayAt', { time } ): translate('Yesterday');
|
||||
}
|
||||
|
||||
if (isTodayDate) {
|
||||
return includeTime ? translate('TodayAt', { time } ): translate('Today');
|
||||
}
|
||||
|
||||
if (isTomorrow(date)) {
|
||||
return includeTime ? translate('TomorrowAt', { time } ): translate('Tomorrow');
|
||||
}
|
||||
|
||||
if (isInNextWeek(date)) {
|
||||
const day = moment(date).format('dddd');
|
||||
|
||||
return includeTime ? translate('DayOfWeekAt', { day, time }) : day;
|
||||
}
|
||||
|
||||
return includeTime ?
|
||||
formatDateTime(date, shortDateFormat, timeFormat, { includeSeconds }) :
|
||||
moment(date).format(shortDateFormat);
|
||||
}
|
||||
|
||||
export default getRelativeDate;
|
||||
82
frontend/src/Utilities/Date/getRelativeDate.tsx
Normal file
82
frontend/src/Utilities/Date/getRelativeDate.tsx
Normal file
@@ -0,0 +1,82 @@
|
||||
import moment from 'moment';
|
||||
import formatTime from 'Utilities/Date/formatTime';
|
||||
import isInNextWeek from 'Utilities/Date/isInNextWeek';
|
||||
import isToday from 'Utilities/Date/isToday';
|
||||
import isTomorrow from 'Utilities/Date/isTomorrow';
|
||||
import isYesterday from 'Utilities/Date/isYesterday';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import formatDateTime from './formatDateTime';
|
||||
|
||||
interface GetRelativeDateOptions {
|
||||
date?: string;
|
||||
shortDateFormat: string;
|
||||
showRelativeDates: boolean;
|
||||
timeFormat?: string;
|
||||
includeSeconds?: boolean;
|
||||
timeForToday?: boolean;
|
||||
includeTime?: boolean;
|
||||
}
|
||||
|
||||
function getRelativeDate({
|
||||
date,
|
||||
shortDateFormat,
|
||||
showRelativeDates,
|
||||
timeFormat,
|
||||
includeSeconds = false,
|
||||
timeForToday = false,
|
||||
includeTime = false,
|
||||
}: GetRelativeDateOptions) {
|
||||
if (!date) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ((includeTime || timeForToday) && !timeFormat) {
|
||||
throw new Error(
|
||||
"getRelativeDate: 'timeFormat' is required when 'includeTime' or 'timeForToday' is true"
|
||||
);
|
||||
}
|
||||
|
||||
const isTodayDate = isToday(date);
|
||||
const time = timeFormat
|
||||
? formatTime(date, timeFormat, {
|
||||
includeMinuteZero: true,
|
||||
includeSeconds,
|
||||
})
|
||||
: '';
|
||||
|
||||
if (isTodayDate && timeForToday) {
|
||||
return time;
|
||||
}
|
||||
|
||||
if (!showRelativeDates) {
|
||||
return moment(date).format(shortDateFormat);
|
||||
}
|
||||
|
||||
if (isYesterday(date)) {
|
||||
return includeTime
|
||||
? translate('YesterdayAt', { time })
|
||||
: translate('Yesterday');
|
||||
}
|
||||
|
||||
if (isTodayDate) {
|
||||
return includeTime ? translate('TodayAt', { time }) : translate('Today');
|
||||
}
|
||||
|
||||
if (isTomorrow(date)) {
|
||||
return includeTime
|
||||
? translate('TomorrowAt', { time })
|
||||
: translate('Tomorrow');
|
||||
}
|
||||
|
||||
if (isInNextWeek(date)) {
|
||||
const day = moment(date).format('dddd');
|
||||
|
||||
return includeTime ? translate('DayOfWeekAt', { day, time }) : day;
|
||||
}
|
||||
|
||||
return includeTime
|
||||
? formatDateTime(date, shortDateFormat, timeFormat, { includeSeconds })
|
||||
: moment(date).format(shortDateFormat);
|
||||
}
|
||||
|
||||
export default getRelativeDate;
|
||||
@@ -608,5 +608,47 @@ namespace NzbDrone.Core.Test.IndexerSearchTests
|
||||
allCriteria.Last().As<SingleEpisodeSearchCriteria>().SeasonNumber.Should().Be(2);
|
||||
allCriteria.Last().As<SingleEpisodeSearchCriteria>().EpisodeNumber.Should().Be(3);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task episode_search_should_include_series_title_when_not_a_direct_title_match()
|
||||
{
|
||||
_xemSeries.Title = "Sonarr's Title";
|
||||
_xemSeries.CleanTitle = "sonarrstitle";
|
||||
|
||||
WithEpisode(1, 12, 2, 3);
|
||||
|
||||
Mocker.GetMock<ISceneMappingService>()
|
||||
.Setup(s => s.FindByTvdbId(It.IsAny<int>()))
|
||||
.Returns(new List<SceneMapping>
|
||||
{
|
||||
new SceneMapping
|
||||
{
|
||||
TvdbId = _xemSeries.TvdbId,
|
||||
SearchTerm = "Sonarrs Title",
|
||||
ParseTerm = _xemSeries.CleanTitle,
|
||||
SeasonNumber = 1,
|
||||
SceneSeasonNumber = 1,
|
||||
SceneOrigin = "tvdb",
|
||||
Type = "ServicesProvider"
|
||||
}
|
||||
});
|
||||
|
||||
var allCriteria = WatchForSearchCriteria();
|
||||
|
||||
await Subject.EpisodeSearch(_xemEpisodes.First(), false, false);
|
||||
|
||||
Mocker.GetMock<ISceneMappingService>()
|
||||
.Verify(v => v.FindByTvdbId(_xemSeries.Id), Times.Once());
|
||||
|
||||
allCriteria.Should().HaveCount(2);
|
||||
|
||||
allCriteria.First().Should().BeOfType<SingleEpisodeSearchCriteria>();
|
||||
allCriteria.First().As<SingleEpisodeSearchCriteria>().SeasonNumber.Should().Be(1);
|
||||
allCriteria.First().As<SingleEpisodeSearchCriteria>().EpisodeNumber.Should().Be(12);
|
||||
|
||||
allCriteria.Last().Should().BeOfType<SingleEpisodeSearchCriteria>();
|
||||
allCriteria.Last().As<SingleEpisodeSearchCriteria>().SeasonNumber.Should().Be(2);
|
||||
allCriteria.Last().As<SingleEpisodeSearchCriteria>().EpisodeNumber.Should().Be(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo
|
||||
[TestCase(10, "", "", "", null, HdrFormat.None)]
|
||||
[TestCase(10, "bt709", "bt709", "", null, HdrFormat.None)]
|
||||
[TestCase(8, "bt2020", "smpte2084", "", null, HdrFormat.None)]
|
||||
[TestCase(10, "bt2020", "bt2020-10", "", null, HdrFormat.Hlg10)]
|
||||
[TestCase(10, "bt2020", "bt2020-10", "", null, HdrFormat.None)]
|
||||
[TestCase(10, "bt2020", "arib-std-b67", "", null, HdrFormat.Hlg10)]
|
||||
[TestCase(10, "bt2020", "smpte2084", "", null, HdrFormat.Pq10)]
|
||||
[TestCase(10, "bt2020", "smpte2084", "FFMpegCore.SideData", null, HdrFormat.Pq10)]
|
||||
|
||||
@@ -419,13 +419,21 @@ namespace NzbDrone.Core.Configuration
|
||||
throw new InvalidConfigFileException($"{_configFile} is corrupt. Please delete the config file and Sonarr will recreate it.");
|
||||
}
|
||||
|
||||
return XDocument.Parse(_diskProvider.ReadAllText(_configFile));
|
||||
var xDoc = XDocument.Parse(_diskProvider.ReadAllText(_configFile));
|
||||
var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).ToList();
|
||||
|
||||
if (config.Count != 1)
|
||||
{
|
||||
throw new InvalidConfigFileException($"{_configFile} is invalid. Please delete the config file and Sonarr will recreate it.");
|
||||
}
|
||||
|
||||
return xDoc;
|
||||
}
|
||||
|
||||
var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
|
||||
xDoc.Add(new XElement(CONFIG_ELEMENT_NAME));
|
||||
var newXDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
|
||||
newXDoc.Add(new XElement(CONFIG_ELEMENT_NAME));
|
||||
|
||||
return xDoc;
|
||||
return newXDoc;
|
||||
}
|
||||
}
|
||||
catch (XmlException ex)
|
||||
|
||||
@@ -28,6 +28,7 @@ namespace NzbDrone.Core.Download.TrackedDownloads
|
||||
|
||||
public class TrackedDownloadService : ITrackedDownloadService,
|
||||
IHandle<EpisodeInfoRefreshedEvent>,
|
||||
IHandle<SeriesAddedEvent>,
|
||||
IHandle<SeriesDeletedEvent>
|
||||
{
|
||||
private readonly IParsingService _parsingService;
|
||||
@@ -278,12 +279,29 @@ namespace NzbDrone.Core.Download.TrackedDownloads
|
||||
}
|
||||
}
|
||||
|
||||
public void Handle(SeriesAddedEvent message)
|
||||
{
|
||||
var cachedItems = _cache.Values
|
||||
.Where(t =>
|
||||
t.RemoteEpisode?.Series == null ||
|
||||
message.Series?.TvdbId == t.RemoteEpisode.Series.TvdbId)
|
||||
.ToList();
|
||||
|
||||
if (cachedItems.Any())
|
||||
{
|
||||
cachedItems.ForEach(UpdateCachedItem);
|
||||
|
||||
_eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads()));
|
||||
}
|
||||
}
|
||||
|
||||
public void Handle(SeriesDeletedEvent message)
|
||||
{
|
||||
var cachedItems = _cache.Values.Where(t =>
|
||||
t.RemoteEpisode?.Series != null &&
|
||||
message.Series.Any(s => s.Id == t.RemoteEpisode.Series.Id))
|
||||
.ToList();
|
||||
var cachedItems = _cache.Values
|
||||
.Where(t =>
|
||||
t.RemoteEpisode?.Series != null &&
|
||||
message.Series.Any(s => s.Id == t.RemoteEpisode.Series.Id || s.TvdbId == t.RemoteEpisode.Series.TvdbId))
|
||||
.ToList();
|
||||
|
||||
if (cachedItems.Any())
|
||||
{
|
||||
|
||||
@@ -22,6 +22,7 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
|
||||
public virtual bool UserInvokedSearch { get; set; }
|
||||
public virtual bool InteractiveSearch { get; set; }
|
||||
|
||||
public List<string> AllSceneTitles => SceneTitles.Concat(CleanSceneTitles).Distinct().ToList();
|
||||
public List<string> CleanSceneTitles => SceneTitles.Select(GetCleanSceneTitle).Distinct().ToList();
|
||||
|
||||
public static string GetCleanSceneTitle(string title)
|
||||
|
||||
@@ -265,7 +265,7 @@ namespace NzbDrone.Core.IndexerSearch
|
||||
}
|
||||
}
|
||||
|
||||
if (sceneMapping.ParseTerm == series.CleanTitle && sceneMapping.FilterRegex.IsNullOrWhiteSpace())
|
||||
if (sceneMapping.SearchTerm == series.Title && sceneMapping.FilterRegex.IsNullOrWhiteSpace())
|
||||
{
|
||||
// Disable the implied mapping if we have an explicit mapping by the same name
|
||||
includeGlobal = false;
|
||||
|
||||
@@ -410,7 +410,7 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
$"&season={NewznabifySeasonNumber(searchCriteria.SeasonNumber)}&ep={searchCriteria.EpisodeNumber}");
|
||||
}
|
||||
|
||||
var queryTitles = TextSearchEngine == "raw" ? searchCriteria.SceneTitles : searchCriteria.CleanSceneTitles;
|
||||
var queryTitles = TextSearchEngine == "raw" ? searchCriteria.AllSceneTitles : searchCriteria.CleanSceneTitles;
|
||||
|
||||
foreach (var queryTitle in queryTitles)
|
||||
{
|
||||
|
||||
@@ -34,5 +34,9 @@
|
||||
"AddImportListImplementation": "Tilføj importliste - {implementationName}",
|
||||
"AddRootFolderError": "Kunne ikke tilføje rodmappe",
|
||||
"Table": "Tabel",
|
||||
"AddIndexer": "Tilføj indekser"
|
||||
"AddIndexer": "Tilføj indekser",
|
||||
"AddDownloadClient": "Tilføj downloadklient",
|
||||
"AddImportListExclusion": "Tilføj ekslusion til importeringslisten",
|
||||
"AddDelayProfileError": "Kan ikke tilføje en ny forsinkelsesprofil. Prøv venligst igen.",
|
||||
"AddDownloadClientError": "Ikke muligt at tilføje en ny downloadklient. Prøv venligst igen."
|
||||
}
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
"AddConnectionImplementation": "Verbindung hinzufügen - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Download-Client hinzufügen - {implementationName}",
|
||||
"AddIndexerImplementation": "Indexer hinzufügen - {implementationName}",
|
||||
"AddNotificationError": "Neue Benachrichtigung konnte nicht hinzugefügt werden, bitte versuchen Sie es erneut.",
|
||||
"AddNotificationError": "Die neue Benachrichtigung konnte nicht hinzugefügt werden, bitte erneut probieren.",
|
||||
"AddQualityProfileError": "Qualitätsprofil konnte nicht hinzugefügt werden. Bitte versuchen Sie es erneut.",
|
||||
"AddNewSeriesRootFolderHelpText": "Unterordner '{folder}' wird automatisch erstellt",
|
||||
"AddNewSeriesSearchForMissingEpisodes": "Suche für fehlende Episoden starten",
|
||||
@@ -144,7 +144,7 @@
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Gib einen neuen Benutzernamen ein",
|
||||
"AuthenticationRequiredHelpText": "Ändern, welche anfragen Authentifizierung benötigen. Ändere nichts wenn du dir nicht des Risikos bewusst bist.",
|
||||
"AnalyseVideoFilesHelpText": "Videoinformationen wie Auflösung, Laufzeit und Codec-Informationen aus Dateien extrahieren. Dies erfordert, dass {appName} Teile der Datei liest, was bei Scans zu hoher Festplatten- oder Netzwerkaktivität führen kann.",
|
||||
"AnalyseVideoFilesHelpText": "Videoinformationen wie Auflösung, Laufzeit und Codec aus Datien erkennen. Dazu ist es erforderlich, dass {appName} Teile der Datei liest, was zu hoher Festplatten- oder Netzwerkaktivität während der Scans führen kann.",
|
||||
"AnalyticsEnabledHelpText": "Senden Sie anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen zu Ihrem Browser, welche {appName}-WebUI-Seiten Sie verwenden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.",
|
||||
"AutoTaggingNegateHelpText": "Falls aktiviert wird die Auto Tagging Regel nicht angewendet, solange diese Bedingung {implementationName} zutrifft.",
|
||||
"CopyUsingHardlinksSeriesHelpText": "Mithilfe von Hardlinks kann {appName} Seeding-Torrents in den Serienordner importieren, ohne zusätzlichen Speicherplatz zu beanspruchen oder den gesamten Inhalt der Datei zu kopieren. Hardlinks funktionieren nur, wenn sich Quelle und Ziel auf demselben Volume befinden",
|
||||
@@ -164,7 +164,7 @@
|
||||
"RestartReloadNote": "Hinweis: {appName} startet während des Wiederherstellungsvorgangs automatisch neu und lädt die Benutzeroberfläche neu.",
|
||||
"AutoRedownloadFailedHelpText": "Suchen Sie automatisch nach einer anderen Version und versuchen Sie, sie herunterzuladen",
|
||||
"AirDate": "Ausstrahlungsdatum",
|
||||
"AgeWhenGrabbed": "Alter (zum Zeitpunkt der Entführung)",
|
||||
"AgeWhenGrabbed": "Alter (bei Erfassung)",
|
||||
"ApplyTagsHelpTextHowToApplySeries": "So wenden Sie Tags auf die ausgewählte Serie an",
|
||||
"ApiKey": "API-Schlüssel",
|
||||
"AutoTaggingLoadError": "Automatisches Tagging konnte nicht geladen werden",
|
||||
@@ -272,7 +272,7 @@
|
||||
"ContinuingOnly": "Nur fortlaufend",
|
||||
"ContinuingSeriesDescription": "Weitere Episoden/eine weitere Staffel werden erwartet",
|
||||
"CopyToClipboard": "In die Zwischenablage kopieren",
|
||||
"CouldNotFindResults": "Es konnten keine Ergebnisse für „{term}“ gefunden werden.",
|
||||
"CouldNotFindResults": "Es konnten keine Ergebnisse für „{term}“ gefunden werden",
|
||||
"CountSeriesSelected": "{count} Serie ausgewählt",
|
||||
"CreateEmptySeriesFoldersHelpText": "Erstellen Sie beim Festplatten-Scan Ordner für fehlende Serien",
|
||||
"CreateGroup": "Gruppe erstellen",
|
||||
@@ -416,7 +416,7 @@
|
||||
"DownloadClientSabnzbdValidationEnableDisableDateSorting": "Deaktivieren Sie die Datumssortierung",
|
||||
"DownloadClientSabnzbdValidationEnableDisableDateSortingDetail": "Sie müssen die Datumssortierung für die von {appName} verwendete Kategorie deaktivieren, um Importprobleme zu vermeiden. Gehen Sie zu Sabnzbd, um das Problem zu beheben.",
|
||||
"DownloadClientSabnzbdValidationEnableDisableMovieSorting": "Deaktivieren Sie die Filmsortierung",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Alle Resultate werden wegen des angewandten Filters nicht angezeigt",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Alle Ergebnisse werden durch den angewendeten Filter ausgeblendet",
|
||||
"RegularExpressionsCanBeTested": "Reguläre Ausdrücke können [hier] getestet werden ({url}).",
|
||||
"ReleaseSceneIndicatorUnknownSeries": "Unbekannte Folge oder Serie.",
|
||||
"RemoveFilter": "Filter entfernen",
|
||||
@@ -549,7 +549,7 @@
|
||||
"CountImportListsSelected": "{count} Importliste(n) ausgewählt",
|
||||
"CountIndexersSelected": "{count} Indexer ausgewählt",
|
||||
"CountSelectedFiles": "{selectedCount} ausgewählte Dateien",
|
||||
"CustomFormatUnknownConditionOption": "Unbekannte Option „{key}“ für Bedingung „{implementation}“",
|
||||
"CustomFormatUnknownConditionOption": "Unbekannte Option '{key}' für die Bedingung '{implementation}'",
|
||||
"CustomFormatsSettings": "Einstellungen für eigene Formate",
|
||||
"Daily": "Täglich",
|
||||
"Dash": "Bindestrich",
|
||||
@@ -580,7 +580,7 @@
|
||||
"SslCertPassword": "SSL-Zertifikatskennwort",
|
||||
"SpecialsFolderFormat": "Specials-Ordnerformat",
|
||||
"SourceTitle": "Quellentitel",
|
||||
"Agenda": "Tagesordnung",
|
||||
"Agenda": "Agenda",
|
||||
"AnEpisodeIsDownloading": "Eine Episode wird heruntergeladen",
|
||||
"CollapseMultipleEpisodesHelpText": "Reduzieren Sie mehrere Episoden, die am selben Tag ausgestrahlt werden",
|
||||
"Connect": "Verbinden",
|
||||
@@ -792,5 +792,86 @@
|
||||
"MediaManagement": "Medienverwaltung",
|
||||
"StartupDirectory": "Start-Verzeichnis",
|
||||
"OnRename": "Bei Umbenennung",
|
||||
"MaintenanceRelease": "Maintenance Release: Fehlerbehebungen und andere Verbesserungen. Siehe Github Commit Verlauf für weitere Details"
|
||||
"MaintenanceRelease": "Maintenance Release: Fehlerbehebungen und andere Verbesserungen. Siehe Github Commit Verlauf für weitere Details",
|
||||
"BlocklistRelease": "Release sperren",
|
||||
"BranchUpdateMechanism": "Git-Branch für den externen Updateablauf",
|
||||
"AutoTaggingSpecificationGenre": "Genre(s)",
|
||||
"AutoTaggingSpecificationOriginalLanguage": "Sprache",
|
||||
"AutoTaggingSpecificationQualityProfile": "Qualitätsprofil",
|
||||
"AutoTaggingSpecificationRootFolder": "Stammverzeichnis",
|
||||
"AutoTaggingSpecificationStatus": "Status",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Fügt ein Präfix zur {connectionName} URL hinzu, z. B. {url}",
|
||||
"DeleteImportListExclusion": "Importlisten Ausschluss löschen",
|
||||
"DeleteTag": "Tag löschen",
|
||||
"DoNotBlocklistHint": "Entfernen ohne Sperren",
|
||||
"DownloadClientPriorityHelpText": "Download-Client-Priorität von 1 (Höchste) bis 50 (Niedrigste). Standard: 1. Round-Robin wird für Clients mit der gleichen Priorität verwendet.",
|
||||
"DownloadClientSettingsRecentPriority": "Neueste Priorität",
|
||||
"DownloadClientValidationApiKeyIncorrect": "API-Key fehlerhaft",
|
||||
"ClientPriority": "Priorität",
|
||||
"Cutoff": "Schwelle",
|
||||
"DownloadClient": "Downloader",
|
||||
"DownloadClientSabnzbdValidationUnknownVersion": "Unbekannte Version: {rawVersion}",
|
||||
"CutoffUnmet": "Schwelle nicht erreicht",
|
||||
"DownloadClientSettingsInitialState": "Ausgangszustand",
|
||||
"DownloadClientValidationApiKeyRequired": "API-Key benötigt",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "Benutzerdefiniertes Format RegEx ist nicht groß-/kleinschreibungssensitiv",
|
||||
"CustomFormatsSpecificationMinimumSize": "Mindestgröße",
|
||||
"CustomFormatsSpecificationRegularExpression": "Regulären Ausdruck",
|
||||
"CustomFormatsSpecificationReleaseGroup": "Release-Gruppe",
|
||||
"CustomFormatsSpecificationResolution": "Auflösung",
|
||||
"DeleteImportListExclusionMessageText": "Bist du sicher, dass du diesen Importlisten Ausschluss löschen willst?",
|
||||
"DownloadClientSabnzbdValidationEnableDisableTvSorting": "TV-Sortierung deaktivieren",
|
||||
"CustomFormatUnknownCondition": "Unbekannte Eigene Formatbedingung '{implementation}'",
|
||||
"ReleaseGroups": "Release Gruppen",
|
||||
"DownloadClientSettingsUseSslHelpText": "Sichere Verbindung verwenden, wenn Verbindung zu {clientName} hergestellt wird",
|
||||
"ReleaseRejected": "Release abgelehnt",
|
||||
"Clear": "Leeren",
|
||||
"DownloadClientValidationCategoryMissing": "Kategorie existiert nicht",
|
||||
"DownloadClientValidationAuthenticationFailure": "Authentifizierung fehlgeschlagen",
|
||||
"DownloadClientValidationErrorVersion": "{clientName} Version sollte mindestens {requiredVersion} sein. Die gemeldete Version ist {reportedVersion}",
|
||||
"DownloadClientValidationGroupMissing": "Gruppe existiert nicht",
|
||||
"DownloadClientValidationSslConnectFailure": "Verbindung über SSL nicht möglich",
|
||||
"ReleaseProfilesLoadError": "Release-Profile können nicht geladen werden",
|
||||
"DownloadClientDelugeSettingsDirectory": "Download Verzeichnis",
|
||||
"DownloadClientDelugeSettingsDirectoryCompleted": "Verschieben, wenn Verzeichnis abgeschlossen",
|
||||
"DownloadClientSettings": "Downloader Einstellungen",
|
||||
"IgnoreDownloadHint": "Hält {appName} von der weiteren Verarbeitung dieses Downloads ab",
|
||||
"ClearBlocklist": "Sperrliste leeren",
|
||||
"CleanLibraryLevel": "Mediathek aufräumen",
|
||||
"CloneAutoTag": "Automatische Tags kopieren",
|
||||
"DownloadClientSettingsOlderPriorityEpisodeHelpText": "Priorität beim Abrufen von Episoden, die vor mehr als 14 Tagen ausgestrahlt wurden",
|
||||
"DownloadClientSettingsInitialStateHelpText": "Anfangszustand für zu {clientName} hinzugefügte Torrents",
|
||||
"DownloadClientSettingsOlderPriority": "Ältere Priorität",
|
||||
"IgnoreDownload": "Download ignorieren",
|
||||
"CustomFormatsSettingsTriggerInfo": "Ein Eigenes Format wird auf eine Veröffentlichung oder Datei angewandt, wenn sie mindestens einer der verschiedenen ausgewählten Bedingungen entspricht.",
|
||||
"DatabaseMigration": "DB Migration",
|
||||
"DownloadClientSettingsDestinationHelpText": "Legt das Ziel für den Download manuell fest; lassen Sie es leer, um die Standardeinstellung zu verwenden",
|
||||
"DownloadClientSettingsCategorySubFolderHelpText": "Das Hinzufügen einer spezifischen Kategorie für {appName} vermeidet Konflikte mit nicht verwandten Downloads, die nicht {appName} sind. Die Verwendung einer Kategorie ist optional, wird aber dringend empfohlen. Erzeugt ein Unterverzeichnis [category] im Ausgabeverzeichnis.",
|
||||
"BlocklistReleases": "Release sperren",
|
||||
"DownloadClientQbittorrentTorrentStateMissingFiles": "qBittorrent meldet fehlende Dateien",
|
||||
"ChangeCategoryHint": "Änderung des Downloads in die 'Post-Import-Kategorie' vom Download-Client",
|
||||
"ChangeCategoryMultipleHint": "Änderung der Downloads in die 'Post-Import-Kategorie' vom Download-Client",
|
||||
"CustomFormatsSpecificationSource": "Quelle",
|
||||
"BlocklistFilterHasNoItems": "Ausgewählter Blocklistenfilter enthält keine Elemente",
|
||||
"CustomFilter": "Benutzerdefinierter Filter",
|
||||
"CustomFormatsSpecificationFlag": "Markierung",
|
||||
"CustomFormatScore": "Eigenes Format Bewertungspunkte",
|
||||
"CustomFormatsSpecificationLanguage": "Sprache",
|
||||
"CustomFormatsSpecificationMaximumSize": "Maximale Größe",
|
||||
"AutoTaggingSpecificationTag": "Tag",
|
||||
"BindAddress": "Adresse binden",
|
||||
"DownloadClientSettingsRecentPriorityEpisodeHelpText": "Priorität beim Abrufen von Episoden, die innerhalb der letzten 14 Tage ausgestrahlt wurden",
|
||||
"DownloadClientSettingsUrlBaseHelpText": "Fügt ein Präfix zur {clientName} Url hinzu, z.B. {url}",
|
||||
"DownloadClientTransmissionSettingsDirectoryHelpText": "Optionaler Speicherort für Downloads; leer lassen, um den Standardspeicherort für Übertragungen zu verwenden",
|
||||
"DownloadClientUTorrentTorrentStateError": "uTorrent meldet einen Fehler",
|
||||
"DoNotBlocklist": "Nicht Sperren",
|
||||
"ReleaseHash": "Release Hash",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Optionaler Speicherort für Downloads. Lassen Sie das Feld leer, um den standardmäßigen rTorrent-Speicherort zu verwenden",
|
||||
"DownloadClientSeriesTagHelpText": "Verwenden Sie diesen Downloader nur für Serien mit mindestens einem passenden Tag. Lassen Sie ihn leer, um ihn für alle Serien zu verwenden.",
|
||||
"DownloadClientSettingsCategoryHelpText": "Das Hinzufügen einer spezifischen Kategorie für {appName} vermeidet Konflikte mit nicht verwandten Downloads, die nicht {appName} sind. Die Verwendung einer Kategorie ist optional, wird aber dringend empfohlen.",
|
||||
"DownloadClientSettingsPostImportCategoryHelpText": "Kategorie für {appName}, die nach dem Importieren des Downloads festgelegt wird. {appName} wird Torrents in dieser Kategorie nicht entfernen, auch wenn das Seeding beendet ist. Leer lassen, um dieselbe Kategorie beizubehalten.",
|
||||
"DownloadClientValidationCategoryMissingDetail": "Die von Ihnen eingegebene Kategorie existiert nicht in {clientName}. Erstellen Sie sie zuerst in {clientName}.",
|
||||
"DownloadClientValidationGroupMissingDetail": "Die von Ihnen eingegebene Gruppe existiert nicht in {clientName}. Erstellen Sie sie zuerst in {clientName}.",
|
||||
"IgnoreDownloads": "Downloads ignorieren",
|
||||
"IgnoreDownloadsHint": "Hindert {appName}, diese Downloads weiter zu verarbeiten"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"Added": "Añadido",
|
||||
"ApplyChanges": "Aplicar Cambios",
|
||||
"AuthBasic": "Básico (ventana emergente del navegador)",
|
||||
"AuthBasic": "Básica (Ventana emergente del navegador)",
|
||||
"BackupFolderHelpText": "Las rutas relativas estarán en el directorio AppData de {appName}",
|
||||
"BackupsLoadError": "No se pudieron cargar las copias de seguridad",
|
||||
"Enable": "Habilitar",
|
||||
@@ -36,22 +36,22 @@
|
||||
"AddNewRestriction": "Añadir nueva restricción",
|
||||
"AddRemotePathMapping": "Añadir Asignación de Ruta Remota",
|
||||
"Analytics": "Analíticas",
|
||||
"ApiKey": "Clave de API",
|
||||
"ApiKey": "Clave API",
|
||||
"AnimeEpisodeFormat": "Formato de Episodio de Anime",
|
||||
"ApplicationUrlHelpText": "La URL externa de la aplicación incluyendo http(s)://, puerto y URL base",
|
||||
"ApplyTagsHelpTextReplace": "Reemplazar: Sustituye las etiquetas por las introducidas (introduce \"no tags\" para borrar todas las etiquetas)",
|
||||
"ApplicationURL": "URL de la aplicación",
|
||||
"Authentication": "Autenticación",
|
||||
"AuthForm": "Formularios (Página de inicio de sesión)",
|
||||
"AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder {appName}",
|
||||
"AuthenticationMethodHelpText": "Requiere usuario y contraseña para acceder a {appName}",
|
||||
"AuthenticationRequired": "Autenticación requerida",
|
||||
"AutoTaggingLoadError": "No se pudo cargar el etiquetado automático",
|
||||
"AutoRedownloadFailedHelpText": "Buscar e intentar descargar automáticamente una versión diferente",
|
||||
"AutoRedownloadFailedHelpText": "Busca e intenta descargar automáticamente una versión diferente",
|
||||
"Backup": "Copia de seguridad",
|
||||
"AutomaticSearch": "Búsqueda Automática",
|
||||
"Automatic": "Automático",
|
||||
"BindAddressHelpText": "Dirección IP4 válida, localhost o '*' para todas las interfaces",
|
||||
"BindAddress": "Dirección de Ligado",
|
||||
"BindAddress": "Dirección de enlace",
|
||||
"Branch": "Rama",
|
||||
"BuiltIn": "Integrado",
|
||||
"Condition": "Condición",
|
||||
@@ -65,7 +65,7 @@
|
||||
"Duplicate": "Duplicar",
|
||||
"Error": "Error",
|
||||
"Episodes": "Episodios",
|
||||
"External": "Externo",
|
||||
"External": "Externa",
|
||||
"Extend": "Extender",
|
||||
"Restore": "Restaurar",
|
||||
"Security": "Seguridad",
|
||||
@@ -78,10 +78,10 @@
|
||||
"Torrents": "Torrents",
|
||||
"Ui": "Interfaz",
|
||||
"Underscore": "Guion bajo",
|
||||
"UpdateMechanismHelpText": "Usar el actualizador integrado de {appName} o un script",
|
||||
"UpdateMechanismHelpText": "Usa el actualizador integrado de {appName} o un script",
|
||||
"Warn": "Advertencia",
|
||||
"AutoTagging": "Etiquetado Automático",
|
||||
"AddAutoTag": "Añadir Etiqueta Automática",
|
||||
"AddAutoTag": "Añadir etiqueta automática",
|
||||
"AddCondition": "Añadir Condición",
|
||||
"AbsoluteEpisodeNumbers": "Número(s) de Episodio Absoluto(s)",
|
||||
"AirDate": "Fecha de Emisión",
|
||||
@@ -165,7 +165,7 @@
|
||||
"AddRemotePathMappingError": "No se pudo añadir una nueva asignación de ruta remota, inténtelo de nuevo.",
|
||||
"AgeWhenGrabbed": "Antigüedad (cuando se añadió)",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Todos los resultados están ocultos por el filtro aplicado",
|
||||
"AnalyseVideoFilesHelpText": "Extraer información de video como la resolución, el tiempo de ejecución y la información del códec de los archivos. Esto requiere que {appName} lea partes del archivo lo cual puede causar una alta actividad en el disco o en la red durante los escaneos.",
|
||||
"AnalyseVideoFilesHelpText": "Extrae información de video como la resolución, el tiempo de ejecución y la información del códec de los archivos. Esto requiere que {appName} lea partes del archivo lo cual puede causar una alta actividad en el disco o en la red durante los escaneos.",
|
||||
"AnimeEpisodeTypeDescription": "Episodios lanzados usando un número de episodio absoluto",
|
||||
"ApiKeyValidationHealthCheckMessage": "Por favor actualiza tu clave API para que tenga de longitud al menos {length} caracteres. Puedes hacerlo en los ajustes o en el archivo de configuración",
|
||||
"AppDataLocationHealthCheckMessage": "No será posible actualizar para evitar la eliminación de AppData al actualizar",
|
||||
@@ -174,7 +174,7 @@
|
||||
"Clone": "Clonar",
|
||||
"Connections": "Conexiones",
|
||||
"Dash": "Guion",
|
||||
"AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de {appName}. Esto incluye información sobre su navegador, qué páginas de {appName} WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.",
|
||||
"AnalyticsEnabledHelpText": "Envía información anónima de uso y error a los servidores de {appName}. Esto incluye información sobre tu navegador, qué páginas de interfaz web de {appName} utilizas, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.",
|
||||
"BackupIntervalHelpText": "Intervalo entre copias de seguridad automáticas",
|
||||
"BackupRetentionHelpText": "Las copias de seguridad automáticas anteriores al período de retención serán borradas automáticamente",
|
||||
"AddNewSeries": "Añadir Nueva Serie",
|
||||
@@ -182,7 +182,7 @@
|
||||
"AddNewSeriesHelpText": "Es fácil añadir una nueva serie, empiece escribiendo el nombre de la serie que desea añadir.",
|
||||
"AddNewSeriesRootFolderHelpText": "La subcarpeta '{folder}' será creada automáticamente",
|
||||
"AddNewSeriesSearchForCutoffUnmetEpisodes": "Empezar la búsqueda de episodios con límites no alcanzados",
|
||||
"AddNewSeriesSearchForMissingEpisodes": "Empezar búsqueda de episodios faltantes",
|
||||
"AddNewSeriesSearchForMissingEpisodes": "Empezar la búsqueda de episodios faltantes",
|
||||
"AddQualityProfile": "Añadir Perfil de Calidad",
|
||||
"AddQualityProfileError": "No se pudo añadir un nuevo perfil de calidad, inténtelo de nuevo.",
|
||||
"AddReleaseProfile": "Añadir perfil de lanzamiento",
|
||||
@@ -199,7 +199,7 @@
|
||||
"EditSelectedDownloadClients": "Editar Clientes de Descarga Seleccionados",
|
||||
"DeleteRemotePathMappingMessageText": "¿Está seguro de querer eliminar esta asignación de ruta remota?",
|
||||
"Implementation": "Implementación",
|
||||
"ImportUsingScript": "Importar Script de Uso",
|
||||
"ImportUsingScript": "Importar usando un script",
|
||||
"CloneAutoTag": "Clonar Etiquetado Automático",
|
||||
"ManageIndexers": "Gestionar Indexadores",
|
||||
"DeleteAutoTag": "Eliminar Etiquetado Automático",
|
||||
@@ -219,15 +219,15 @@
|
||||
"AddConditionImplementation": "Añadir condición - {implementationName}",
|
||||
"AppUpdated": "{appName} Actualizado",
|
||||
"AutomaticUpdatesDisabledDocker": "Las actualizaciones automáticas no están soportadas directamente cuando se utiliza el mecanismo de actualización de Docker. Tendrá que actualizar la imagen del contenedor fuera de {appName} o utilizar un script",
|
||||
"AuthenticationRequiredHelpText": "Cambiar para que las solicitudes requieran autenticación. No lo cambie a menos que entienda los riesgos.",
|
||||
"AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Introduzca una nueva contraseña",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Introduzca un nuevo nombre de usuario",
|
||||
"AuthenticationRequiredHelpText": "Cambia para qué solicitudes se requiere autenticación. No cambiar a menos que entiendas los riesgos.",
|
||||
"AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación sea habilitada. Opcionalmente puedes deshabilitar la autenticación desde direcciones locales.",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Introduce una nueva contraseña",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Introduce un nuevo usuario",
|
||||
"AuthenticationMethod": "Método de autenticación",
|
||||
"AddConnectionImplementation": "Añadir Conexión - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}",
|
||||
"VideoDynamicRange": "Video de Rango Dinámico",
|
||||
"AuthenticationMethodHelpTextWarning": "Por favor selecciona un método válido de autenticación",
|
||||
"AuthenticationMethodHelpTextWarning": "Por favor selecciona un método de autenticación válido",
|
||||
"AddCustomFilter": "Añadir Filtro Personalizado",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Puntuación mínima de formato personalizado",
|
||||
"CountIndexersSelected": "{count} indexador(es) seleccionado(s)",
|
||||
@@ -266,12 +266,12 @@
|
||||
"DeleteSelectedImportListsMessageText": "¿Estás seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?",
|
||||
"DeletedReasonUpgrade": "Se ha borrado el archivo para importar una versión mejorada",
|
||||
"DeleteTagMessageText": "¿Está seguro de querer eliminar la etiqueta '{label}'?",
|
||||
"DisabledForLocalAddresses": "Deshabilitado para Direcciones Locales",
|
||||
"DisabledForLocalAddresses": "Deshabilitada para direcciones locales",
|
||||
"DeletedReasonManual": "El archivo fue eliminado usando {appName}, o bien manualmente o por otra herramienta a través de la API",
|
||||
"ClearBlocklist": "Limpiar lista de bloqueos",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña",
|
||||
"MonitorPilotEpisode": "Episodio Piloto",
|
||||
"MonitorRecentEpisodesDescription": "Monitorizar episodios emitidos en los últimos 90 días y los episodios futuros",
|
||||
"MonitorRecentEpisodesDescription": "Monitoriza episodios emitidos en los últimos 90 días y los episodios futuros",
|
||||
"MonitorSelected": "Monitorizar seleccionados",
|
||||
"MonitorSeries": "Monitorizar Series",
|
||||
"NoHistory": "Sin historial",
|
||||
@@ -288,7 +288,7 @@
|
||||
"MonitorNoNewSeasonsDescription": "No monitorizar automáticamente ninguna temporada nueva",
|
||||
"HistoryLoadError": "No se pudo cargar el historial",
|
||||
"LibraryImport": "Importar Librería",
|
||||
"RescanSeriesFolderAfterRefresh": "Re-escanear la Carpeta de Series tras Actualizar",
|
||||
"RescanSeriesFolderAfterRefresh": "Volver a escanear la carpeta de series tras actualizar",
|
||||
"Wanted": "Buscado",
|
||||
"MonitorPilotEpisodeDescription": "Sólo monitorizar el primer episodio de la primera temporada",
|
||||
"MonitorRecentEpisodes": "Episodios Recientes",
|
||||
@@ -300,14 +300,14 @@
|
||||
"MonitorSpecialEpisodes": "Monitorizar Especiales",
|
||||
"Queue": "Cola",
|
||||
"RescanAfterRefreshHelpTextWarning": "{appName} no detectará automáticamente cambios en los archivos si no se elige 'Siempre'",
|
||||
"RescanAfterRefreshSeriesHelpText": "Re-escanear la carpeta de series tras actualizar las series",
|
||||
"RescanAfterRefreshSeriesHelpText": "Vuelve a escanear la carpeta de series tras actualizar las series",
|
||||
"MonitorNoNewSeasons": "Sin Nuevas Temporadas",
|
||||
"MonitorSpecialEpisodesDescription": "Monitorizar todos los episodios especiales sin cambiar el estado de monitorizado de otros episodios",
|
||||
"MonitorSpecialEpisodesDescription": "Monitoriza todos los episodios especiales sin cambiar el estado de monitorizado de otros episodios",
|
||||
"Calendar": "Calendario",
|
||||
"BlocklistRelease": "Lista de bloqueos de lanzamiento",
|
||||
"CountSeasons": "{count} Temporadas",
|
||||
"BranchUpdate": "Rama a usar para actualizar {appName}",
|
||||
"ChmodFolder": "Carpeta chmod",
|
||||
"ChmodFolder": "chmod de la carpeta",
|
||||
"CheckDownloadClientForDetails": "Revisar el cliente de descarga para más detalles",
|
||||
"ChooseAnotherFolder": "Elige otra Carpeta",
|
||||
"ClientPriority": "Prioridad del Cliente",
|
||||
@@ -317,7 +317,7 @@
|
||||
"CalendarLoadError": "Incapaz de cargar el calendario",
|
||||
"CertificateValidation": "Validacion de certificado",
|
||||
"BypassProxyForLocalAddresses": "Omitir Proxy para Direcciones Locales",
|
||||
"ChangeFileDateHelpText": "Cambiar la fecha del archivo al importar/rescan",
|
||||
"ChangeFileDateHelpText": "Cambia la fecha del archivo al importar/volver a escanear",
|
||||
"ChownGroupHelpText": "Nombre del grupo o gid. Utilice gid para sistemas de archivos remotos.",
|
||||
"CloneProfile": "Clonar Perfil",
|
||||
"CollectionsLoadError": "No se han podido cargar las colecciones",
|
||||
@@ -355,7 +355,7 @@
|
||||
"Agenda": "Agenda",
|
||||
"Cancel": "Cancelar",
|
||||
"ChangeFileDate": "Cambiar fecha de archivo",
|
||||
"CertificateValidationHelpText": "Cambiar como es la validacion de la certificacion estricta de HTTPS. No cambiar a menos que entiendas las consecuencias.",
|
||||
"CertificateValidationHelpText": "Cambia cómo de estricta es la validación de certificación de HTTPS. No cambiar a menos que entiendas los riesgos.",
|
||||
"AddListExclusion": "Añadir lista de exclusión",
|
||||
"AddedDate": "Agregado: {date}",
|
||||
"AllSeriesAreHiddenByTheAppliedFilter": "Todos los resultados estan ocultos por el filtro aplicado",
|
||||
@@ -422,7 +422,7 @@
|
||||
"FailedToFetchUpdates": "Fallo al buscar las actualizaciones",
|
||||
"FailedToUpdateSettings": "Fallo al actualizar los ajustes",
|
||||
"MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle",
|
||||
"CreateEmptySeriesFoldersHelpText": "Cree carpetas de series faltantes durante el análisis del disco",
|
||||
"CreateEmptySeriesFoldersHelpText": "Crea carpetas de series faltantes durante el análisis del disco",
|
||||
"DefaultCase": "Caso predeterminado",
|
||||
"Daily": "Diario",
|
||||
"CollapseMultipleEpisodesHelpText": "Contraer varios episodios que se emiten el mismo día",
|
||||
@@ -465,7 +465,7 @@
|
||||
"InteractiveImportNoQuality": "La calidad debe elegirse para cada archivo seleccionado",
|
||||
"InteractiveSearchModalHeader": "Búsqueda interactiva",
|
||||
"InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración",
|
||||
"ChownGroup": "chown grupo",
|
||||
"ChownGroup": "chown del grupo",
|
||||
"DelayProfileProtocol": "Protocolo: {preferredProtocol}",
|
||||
"DelayProfilesLoadError": "Incapaz de cargar Perfiles de Retardo",
|
||||
"ContinuingSeriesDescription": "Se esperan más episodios u otra temporada",
|
||||
@@ -598,7 +598,7 @@
|
||||
"DownloadClientNzbgetValidationKeepHistoryZero": "La configuración KeepHistory de NzbGet debería ser mayor de 0",
|
||||
"DownloadClientNzbgetValidationKeepHistoryZeroDetail": "La configuración KeepHistory de NzbGet está establecida a 0. Esto evita que {appName} vea las descargas completadas.",
|
||||
"DownloadClientDownloadStationValidationSharedFolderMissing": "La carpeta compartida no existe",
|
||||
"DownloadPropersAndRepacksHelpText": "Decidir si automáticamente actualizar a Propers/Repacks",
|
||||
"DownloadPropersAndRepacksHelpText": "Actualiza automáticamente o no a Propers/Repacks",
|
||||
"EditListExclusion": "Editar exclusión de lista",
|
||||
"EnableAutomaticAdd": "Habilitar añadido automático",
|
||||
"EditQualityProfile": "Editar perfil de calidad",
|
||||
@@ -737,7 +737,7 @@
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Estado inicial para los torrents añadidos a qBittorrent. Ten en cuenta que Forzar torrents no cumple las restricciones de semilla",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Descarga en orden secuencial (qBittorrent 4.1.0+)",
|
||||
"DownloadClientDownloadStationValidationSharedFolderMissingDetail": "El Diskstation no tiene una carpeta compartida con el nombre '{sharedFolder}'. ¿Estás seguro que lo has especificado correctamente?",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importar automáticamente las descargas completas del gestor de descargas",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importa automáticamente las descargas completas del gestor de descargas",
|
||||
"EnableInteractiveSearchHelpTextWarning": "Buscar no está soportado por este indexador",
|
||||
"EnableRss": "Habilitar RSS",
|
||||
"Ended": "Terminado",
|
||||
@@ -783,7 +783,7 @@
|
||||
"FilterDoesNotEndWith": "no termina en",
|
||||
"Fixed": "Arreglado",
|
||||
"Global": "Global",
|
||||
"Enabled": "Habilitado",
|
||||
"Enabled": "Habilitada",
|
||||
"EpisodeHistoryLoadError": "No se puede cargar el historial del episodio",
|
||||
"EpisodeIsDownloading": "El episodio se está descargando",
|
||||
"EpisodeHasNotAired": "El episodio no está en emisión",
|
||||
@@ -801,7 +801,7 @@
|
||||
"GeneralSettings": "Opciones generales",
|
||||
"GeneralSettingsLoadError": "No se pueden cargar las opciones generales",
|
||||
"Grab": "Capturar",
|
||||
"GrabReleaseUnknownSeriesOrEpisodeMessageText": "{appName} no pudo determinar para qué serie y episodio era este lanzamiento. {appName} no pudo automáticamente importar este lanzamiento. ¿Te gustaría capturar '{title}'?",
|
||||
"GrabReleaseUnknownSeriesOrEpisodeMessageText": "{appName} no pudo determinar para qué serie y episodio era este lanzamiento. {appName} no pudo importar automáticamente este lanzamiento. ¿Te gustaría capturar '{title}'?",
|
||||
"HasMissingSeason": "Tiene temporadas faltantes",
|
||||
"ImportListSearchForMissingEpisodesHelpText": "Una vez se añada la serie a {appName}, buscar automáticamente episodios faltantes",
|
||||
"ImportListsSonarrValidationInvalidUrl": "La URL de {appName} es inválida. ¿Te falta la URL base?",
|
||||
@@ -989,7 +989,7 @@
|
||||
"ImportListsValidationInvalidApiKey": "La clave API es inválida",
|
||||
"ImportListsValidationTestFailed": "El test fue abortado debido a un error: {exceptionMessage}",
|
||||
"ImportScriptPathHelpText": "La ruta al script a usar para importar",
|
||||
"ImportUsingScriptHelpText": "Copiar archivos para importar usando un script (p. ej. para transcodificación)",
|
||||
"ImportUsingScriptHelpText": "Copia archivos para importar usando un script (p. ej. para transcodificación)",
|
||||
"Importing": "Importando",
|
||||
"IncludeUnmonitored": "Incluir no monitorizadas",
|
||||
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Ningún indexador está disponible debido a errores durante más de 6 horas",
|
||||
@@ -1040,7 +1040,7 @@
|
||||
"ImportMechanismHandlingDisabledHealthCheckMessage": "Habilitar Gestión de descargas completadas",
|
||||
"ImportedTo": "Importar a",
|
||||
"IncludeCustomFormatWhenRenaming": "Incluir formato personalizado cuando se renombra",
|
||||
"CleanLibraryLevel": "Limpiar el nivel de la librería",
|
||||
"CleanLibraryLevel": "Limpiar nivel de biblioteca",
|
||||
"SearchForCutoffUnmetEpisodes": "Buscar todos los episodios con límites no alcanzados",
|
||||
"IconForSpecials": "Icono para Especiales",
|
||||
"ImportListExclusions": "Importar lista de exclusiones",
|
||||
@@ -1067,7 +1067,7 @@
|
||||
"IndexerSearchNoAutomaticHealthCheckMessage": "No hay indexadores disponibles con Búsqueda Automática activada, {appName} no proporcionará ningún resultado de búsquedas automáticas",
|
||||
"IndexerSearchNoAvailableIndexersHealthCheckMessage": "Todos los indexadores con capacidad de búsqueda no están disponibles temporalmente debido a errores recientes del indexadores",
|
||||
"IndexerSearchNoInteractiveHealthCheckMessage": "No hay indexadores disponibles con Búsqueda Interactiva activada, {appName} no proporcionará ningún resultado de búsquedas interactivas",
|
||||
"PasswordConfirmation": "Confirmación de Contraseña",
|
||||
"PasswordConfirmation": "Confirmación de contraseña",
|
||||
"IndexerSettingsAdditionalParameters": "Parámetros adicionales",
|
||||
"IndexerSettingsAllowZeroSizeHelpText": "Activar esta opción le permitirá utilizar fuentes que no especifiquen el tamaño del lanzamiento, pero tenga cuidado, no se realizarán comprobaciones relacionadas con el tamaño.",
|
||||
"IndexerSettingsAllowZeroSize": "Permitir Tamaño Cero",
|
||||
@@ -1189,7 +1189,7 @@
|
||||
"ListSyncTag": "Etiqueta de Sincronización de Lista",
|
||||
"ListSyncTagHelpText": "Esta etiqueta se añadirá cuando una serie desaparezca o ya no esté en su(s) lista(s)",
|
||||
"MetadataLoadError": "No se puede cargar Metadatos",
|
||||
"MetadataSourceSettingsSeriesSummary": "Información de dónde {appName} obtiene información de series y episodio",
|
||||
"MetadataSourceSettingsSeriesSummary": "Fuente de información de donde {appName} obtiene información de series y episodios",
|
||||
"Max": "Máximo",
|
||||
"MaximumSizeHelpText": "Tamaño máximo en MB para que un lanzamiento sea capturado. Establece a cero para establecer a ilimitado",
|
||||
"MatchedToEpisodes": "Ajustado a Episodios",
|
||||
@@ -1486,7 +1486,7 @@
|
||||
"RemoveQueueItemConfirmation": "¿Estás seguro que quieres eliminar '{sourceTitle}' de la cola?",
|
||||
"RemoveRootFolder": "Eliminar la carpeta raíz",
|
||||
"RemoveSelectedItem": "Eliminar elemento seleccionado",
|
||||
"RemoveTagsAutomaticallyHelpText": "Eliminar etiquetas automáticamente si las condiciones no se cumplen",
|
||||
"RemoveTagsAutomaticallyHelpText": "Elimina etiquetas automáticamente si las condiciones no se cumplen",
|
||||
"RemovedFromTaskQueue": "Eliminar de la cola de tareas",
|
||||
"RemovedSeriesMultipleRemovedHealthCheckMessage": "Las series {series} fueron eliminadas de TheTVDB",
|
||||
"RenameFiles": "Renombrar archivos",
|
||||
@@ -1595,7 +1595,7 @@
|
||||
"TestAllIndexers": "Probar todos los indexadores",
|
||||
"TestAllLists": "Probar todas las listas",
|
||||
"TestParsing": "Probar análisis",
|
||||
"ThemeHelpText": "Cambiar el tema de la interfaz de la aplicación, el tema 'Auto' usará el tema de tu sistema para establecer el modo luminoso u oscuro. Inspirado por Theme.Park",
|
||||
"ThemeHelpText": "Cambia el tema de la interfaz de la aplicación, el tema 'Auto' usará el tema de tu sistema para establecer el modo luminoso u oscuro. Inspirado por Theme.Park",
|
||||
"TimeLeft": "Tiempo restante",
|
||||
"ToggleMonitoredSeriesUnmonitored ": "No se puede conmutar el estado monitorizado cuando la serie no está monitorizada",
|
||||
"Tomorrow": "Mañana",
|
||||
@@ -1621,7 +1621,7 @@
|
||||
"Upcoming": "Próximamente",
|
||||
"UpcomingSeriesDescription": "Series que han sido anunciadas pero aún no hay fecha de emisión exacta",
|
||||
"ReleaseSceneIndicatorUnknownSeries": "Episodio o serie desconocido.",
|
||||
"RemoveDownloadsAlert": "Las opciones de Eliminar fueron movidas a las opciones del cliente de descarga individual en la table anterior.",
|
||||
"RemoveDownloadsAlert": "Las opciones de eliminación fueron trasladadas a las opciones del cliente de descarga individual en la tabla anterior.",
|
||||
"RestartRequiredHelpTextWarning": "Requiere reiniciar para que tenga efecto",
|
||||
"SelectFolder": "Seleccionar carpeta",
|
||||
"TestAllClients": "Probar todos los clientes",
|
||||
@@ -1894,7 +1894,7 @@
|
||||
"UiLanguage": "Idioma de interfaz",
|
||||
"UiLanguageHelpText": "Idioma que {appName} usará en la interfaz",
|
||||
"UiSettingsSummary": "Opciones de calendario, fecha y color alterado",
|
||||
"UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones",
|
||||
"UpdateAutomaticallyHelpText": "Descarga e instala actualizaciones automáticamente. Podrás seguir instalándolas desde Sistema: Actualizaciones",
|
||||
"TotalRecords": "Total de registros: {totalRecords}",
|
||||
"WantMoreControlAddACustomFormat": "¿Quieres más control sobre qué descargas son preferidas? Añade un [formato personalizado](/opciones/formatospersonalizados)",
|
||||
"OrganizeModalHeader": "Organizar y renombrar",
|
||||
@@ -1916,7 +1916,7 @@
|
||||
"SelectEpisodesModalTitle": "{modalTitle} - Seleccionar episodio(s)",
|
||||
"DownloadClientDelugeSettingsDirectory": "Directorio de descarga",
|
||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación predeterminada de Deluge",
|
||||
"UnmonitorSpecialsEpisodesDescription": "Dejar de monitorizar todos los episodios especiales sin cambiar el estado monitorizado de otros episodios",
|
||||
"UnmonitorSpecialsEpisodesDescription": "Deja de monitorizar todos los episodios especiales sin cambiar el estado monitorizado de otros episodios",
|
||||
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicación opcional a la que mover las descargas completadas, dejar en blanco para usar la ubicación predeterminada de Deluge",
|
||||
"DownloadClientDelugeSettingsDirectoryCompleted": "Directorio al que mover cuando se complete",
|
||||
"NotificationsDiscordSettingsWebhookUrlHelpText": "URL de canal webhook de Discord",
|
||||
@@ -2074,5 +2074,9 @@
|
||||
"IndexerSettingsMultiLanguageReleaseHelpText": "¿Qué idiomas están normalmente en un lanzamiento múltiple en este indexador?",
|
||||
"DownloadClientQbittorrentTorrentStateMissingFiles": "qBittorrent está reportando archivos faltantes",
|
||||
"BlocklistFilterHasNoItems": "El filtro de lista de bloqueo seleccionado no contiene elementos",
|
||||
"HasUnmonitoredSeason": "Tiene temporada sin monitorizar"
|
||||
"HasUnmonitoredSeason": "Tiene temporada sin monitorizar",
|
||||
"TomorrowAt": "Mañana a las {time}",
|
||||
"YesterdayAt": "Ayer a las {time}",
|
||||
"TodayAt": "Hoy a las {time}",
|
||||
"DayOfWeekAt": "{day} a las {time}"
|
||||
}
|
||||
|
||||
@@ -616,7 +616,7 @@
|
||||
"OnSeriesDelete": "Lors de la suppression de la série",
|
||||
"OnlyTorrent": "Uniquement Torrent",
|
||||
"OpenBrowserOnStart": "Ouvrir le navigateur au démarrage",
|
||||
"OpenSeries": "Série ouverte",
|
||||
"OpenSeries": "Ouvrir la série",
|
||||
"Options": "Options",
|
||||
"Organize": "Organiser",
|
||||
"OrganizeLoadError": "Erreur lors du chargement des aperçus",
|
||||
@@ -1344,7 +1344,7 @@
|
||||
"DeleteDelayProfile": "Supprimer le profil de retard",
|
||||
"DeleteDelayProfileMessageText": "Êtes-vous sûr de vouloir supprimer ce profil de retard ?",
|
||||
"DeleteEpisodeFile": "Supprimer le fichier de l'épisode",
|
||||
"DeleteEpisodeFileMessage": "Supprimer le fichier de l'épisode '{path}'?",
|
||||
"DeleteEpisodeFileMessage": "Êtes-vous sûr de vouloir supprimer « {path} » ?",
|
||||
"DeleteEpisodeFromDisk": "Supprimer l'épisode du disque",
|
||||
"DeleteImportListMessageText": "Êtes-vous sûr de vouloir supprimer la liste « {name} » ?",
|
||||
"DeleteSelectedEpisodeFiles": "Supprimer les fichiers d'épisode sélectionnés",
|
||||
|
||||
@@ -205,5 +205,7 @@
|
||||
"Category": "Categorie",
|
||||
"BlocklistReleaseHelpText": "Voorkom dat deze release opnieuw wordt gedownload door {appName} door een RSS lijst of een automatische zoekopdracht",
|
||||
"ChangeCategory": "Verander categorie",
|
||||
"ChownGroup": "chown groep"
|
||||
"ChownGroup": "chown groep",
|
||||
"AutoTaggingSpecificationTag": "Tag",
|
||||
"AddDelayProfileError": "Mislukt om vertragingsprofiel toe te voegen, probeer het later nog eens."
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
"Calendar": "Calendário",
|
||||
"Connect": "Conectar",
|
||||
"CustomFormats": "Formatos personalizados",
|
||||
"CutoffUnmet": "Corte não alcançado",
|
||||
"CutoffUnmet": "Limite não alcançado",
|
||||
"DownloadClients": "Clientes de download",
|
||||
"Events": "Eventos",
|
||||
"General": "Geral",
|
||||
@@ -432,7 +432,7 @@
|
||||
"AuthBasic": "Básico (pop-up do navegador)",
|
||||
"AuthForm": "Formulário (página de login)",
|
||||
"Authentication": "Autenticação",
|
||||
"AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar o {appName}",
|
||||
"AuthenticationMethodHelpText": "Exigir Nome de Usuário e Senha para acessar {appName}",
|
||||
"AuthenticationRequired": "Autenticação exigida",
|
||||
"AutoRedownloadFailedHelpText": "Procurar automaticamente e tente baixar uma versão diferente",
|
||||
"AutoTaggingLoadError": "Não foi possível carregar tagging automática",
|
||||
@@ -493,8 +493,8 @@
|
||||
"CustomFormatsLoadError": "Não foi possível carregar Formatos Personalizados",
|
||||
"CustomFormatsSettings": "Configurações de Formatos Personalizados",
|
||||
"CustomFormatsSettingsSummary": "Configurações e Formatos Personalizados",
|
||||
"DailyEpisodeFormat": "Formato do Episódio Diário",
|
||||
"Cutoff": "Corte",
|
||||
"DailyEpisodeFormat": "Formato do episódio diário",
|
||||
"Cutoff": "Limite",
|
||||
"Dash": "Traço",
|
||||
"Dates": "Datas",
|
||||
"Debug": "Depuração",
|
||||
@@ -1448,11 +1448,11 @@
|
||||
"MissingNoItems": "Nenhum item ausente",
|
||||
"SearchAll": "Pesquisar Todos",
|
||||
"UnmonitorSelected": "Não Monitorar os Selecionados",
|
||||
"CutoffUnmetNoItems": "Nenhum item com corte não atingido",
|
||||
"CutoffUnmetNoItems": "Nenhum item com limite não atingido",
|
||||
"MonitorSelected": "Monitorar Selecionados",
|
||||
"SearchForAllMissingEpisodesConfirmationCount": "Tem certeza de que deseja pesquisar todos os episódios ausentes de {totalRecords}?",
|
||||
"SearchSelected": "Pesquisar Selecionado",
|
||||
"CutoffUnmetLoadError": "Erro ao carregar itens de corte não atingidos",
|
||||
"CutoffUnmetLoadError": "Erro ao carregar itens de limite não atingido",
|
||||
"MassSearchCancelWarning": "Isso não pode ser cancelado depois de iniciado sem reiniciar {appName} ou desabilitar todos os seus indexadores.",
|
||||
"SearchForAllMissingEpisodes": "Pesquisar por todos os episódios ausentes",
|
||||
"SearchForCutoffUnmetEpisodes": "Pesquise todos os episódios que o corte não foi atingido",
|
||||
@@ -2016,7 +2016,7 @@
|
||||
"BlocklistReleaseHelpText": "Impede que esta versão seja baixada novamente por {appName} via RSS ou Pesquisa Automática",
|
||||
"ChangeCategoryHint": "Altera o download para a \"Categoria pós-importação\" do cliente de download",
|
||||
"ChangeCategoryMultipleHint": "Altera os downloads para a \"Categoria pós-importação' do cliente de download",
|
||||
"DatabaseMigration": "Migração de Banco de Dados",
|
||||
"DatabaseMigration": "Migração de banco de dados",
|
||||
"DoNotBlocklistHint": "Remover sem colocar na lista de bloqueio",
|
||||
"ChangeCategory": "Alterar categoria",
|
||||
"DoNotBlocklist": "Não coloque na lista de bloqueio",
|
||||
@@ -2073,5 +2073,10 @@
|
||||
"AutoTaggingSpecificationTag": "Etiqueta",
|
||||
"IndexerSettingsMultiLanguageRelease": "Multi Idiomas",
|
||||
"DownloadClientQbittorrentTorrentStateMissingFiles": "qBittorrent está relatando arquivos perdidos",
|
||||
"BlocklistFilterHasNoItems": "O filtro selecionado para a lista de bloqueio não contém itens"
|
||||
"BlocklistFilterHasNoItems": "O filtro selecionado para a lista de bloqueio não contém itens",
|
||||
"DayOfWeekAt": "{day} às {time}",
|
||||
"TodayAt": "Hoje às {time}",
|
||||
"TomorrowAt": "Amanhã às {time}",
|
||||
"HasUnmonitoredSeason": "Tem Temporada Não Monitorada",
|
||||
"YesterdayAt": "Ontem às {time}"
|
||||
}
|
||||
|
||||
@@ -5,5 +5,7 @@
|
||||
"ApiKeyValidationHealthCheckMessage": "Hãy cập nhật mã API để dài ít nhất {length} kí tự. Bạn có thể làm điều này trong cài đặt hoặc trong tập config",
|
||||
"AppDataLocationHealthCheckMessage": "Việc cập nhật sẽ không xảy ra để tránh xóa AppData khi cập nhật",
|
||||
"ApplyChanges": "Áp dụng thay đổi",
|
||||
"AutomaticAdd": "Tự động thêm"
|
||||
"AutomaticAdd": "Tự động thêm",
|
||||
"CalendarOptions": "Tùy chọn lịch",
|
||||
"UpdateMechanismHelpText": "Sử dụng trình cập nhật tích hợp của {appName} hoặc một tập lệnh"
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
"CountIndexersSelected": "已选择 {count} 个索引器",
|
||||
"CurrentlyInstalled": "已安装",
|
||||
"CustomFormats": "自定义命名格式",
|
||||
"CutoffUnmet": "未达截止条件",
|
||||
"CutoffUnmet": "未达设定标准",
|
||||
"Date": "日期",
|
||||
"DeleteBackup": "删除备份",
|
||||
"DeleteCustomFormat": "删除自定义命名格式",
|
||||
@@ -293,7 +293,7 @@
|
||||
"RootFolderMultipleMissingHealthCheckMessage": "多个根目录缺失:{rootFolderPaths}",
|
||||
"SkipRedownloadHelpText": "阻止{appName}尝试下载此项目的替代版本",
|
||||
"Tasks": "任务",
|
||||
"Wanted": "已追踪",
|
||||
"Wanted": "待获取",
|
||||
"Yes": "确定",
|
||||
"AbsoluteEpisodeNumbers": "准确的集数",
|
||||
"RemoveCompleted": "移除已完成",
|
||||
@@ -550,7 +550,7 @@
|
||||
"AutoRedownloadFailedHelpText": "自动搜索并尝试下载不同的版本",
|
||||
"AutoTaggingLoadError": "无法加载自动标记",
|
||||
"Automatic": "自动化",
|
||||
"AutoTaggingRequiredHelpText": "这个{implementationName}条件必须匹配自动标记规则才能应用。否则,一个{implementationName}匹配就足够了。",
|
||||
"AutoTaggingRequiredHelpText": "这个{0}条件必须匹配自动标记规则才能应用。否则,一个{0}匹配就足够了。",
|
||||
"AutoTaggingNegateHelpText": "如果选中,当 {implementationName} 条件匹配时,自动标记不会应用。",
|
||||
"BackupRetentionHelpText": "超过保留期限的自动备份将被自动清理",
|
||||
"BackupsLoadError": "无法加载备份",
|
||||
@@ -688,7 +688,7 @@
|
||||
"ICalShowAsAllDayEventsHelpText": "事件将以全天事件的形式显示在日历中",
|
||||
"ICalSeasonPremieresOnlyHelpText": "每季中只有第一集会出现在订阅中",
|
||||
"IconForFinalesHelpText": "根据可用的集信息为完结的剧集或季显示图标",
|
||||
"IconForCutoffUnmet": "未达截止条件的图标",
|
||||
"IconForCutoffUnmet": "未达设定标准的图标",
|
||||
"IconForCutoffUnmetHelpText": "终止监控条件未满足前为文件显示图标",
|
||||
"IconForFinales": "剧集或季完结的图标",
|
||||
"Images": "图像",
|
||||
@@ -1459,8 +1459,8 @@
|
||||
"TotalFileSize": "文件总大小",
|
||||
"TotalRecords": "记录总数: {totalRecords}",
|
||||
"Trace": "追踪",
|
||||
"CutoffUnmetLoadError": "加载未达截止条件项目错误",
|
||||
"CutoffUnmetNoItems": "没有未达截止条件的项目",
|
||||
"CutoffUnmetLoadError": "加载未达设定标准项目时出错",
|
||||
"CutoffUnmetNoItems": "没有未达设定标准的项目",
|
||||
"DeleteSeriesFolderHelpText": "删除剧集文件夹及其所含文件",
|
||||
"DeleteSeriesModalHeader": "删除 - {title}",
|
||||
"DeletedSeriesDescription": "剧集已从 TheTVDB 移除",
|
||||
@@ -1830,5 +1830,11 @@
|
||||
"AutoTaggingSpecificationStatus": "状态",
|
||||
"ClickToChangeIndexerFlags": "点击修改索引器标志",
|
||||
"ConnectionSettingsUrlBaseHelpText": "向 {clientName} url 添加前缀,例如 {url}",
|
||||
"BlocklistFilterHasNoItems": "所选的黑名单过滤器没有项目"
|
||||
"BlocklistFilterHasNoItems": "所选的黑名单过滤器没有项目",
|
||||
"CustomFormatsSpecificationReleaseGroup": "发布组",
|
||||
"MetadataSettingsSeriesMetadata": "季元数据",
|
||||
"CustomFormatsSpecificationResolution": "分辨率",
|
||||
"CustomFormatsSpecificationSource": "来源",
|
||||
"ClickToChangeReleaseType": "点击更改发布类型",
|
||||
"CustomFormatsSettingsTriggerInfo": "当一个发布版本或文件至少匹配其中一个条件时,自定义格式将会被应用到这个版本或文件上。"
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
|
||||
private readonly List<FFProbePixelFormat> _pixelFormats;
|
||||
|
||||
public const int MINIMUM_MEDIA_INFO_SCHEMA_REVISION = 8;
|
||||
public const int CURRENT_MEDIA_INFO_SCHEMA_REVISION = 10;
|
||||
public const int CURRENT_MEDIA_INFO_SCHEMA_REVISION = 11;
|
||||
|
||||
private static readonly string[] ValidHdrColourPrimaries = { "bt2020" };
|
||||
private static readonly string[] HlgTransferFunctions = { "bt2020-10", "arib-std-b67" };
|
||||
private static readonly string[] HlgTransferFunctions = { "arib-std-b67" };
|
||||
private static readonly string[] PqTransferFunctions = { "smpte2084" };
|
||||
private static readonly string[] ValidHdrTransferFunctions = HlgTransferFunctions.Concat(PqTransferFunctions).ToArray();
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ using FluentValidation.Results;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaCover;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.Notifications.Webhook;
|
||||
using NzbDrone.Core.Tags;
|
||||
@@ -15,8 +16,8 @@ namespace NzbDrone.Core.Notifications.Notifiarr
|
||||
{
|
||||
private readonly INotifiarrProxy _proxy;
|
||||
|
||||
public Notifiarr(INotifiarrProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, ILocalizationService localizationService, ITagRepository tagRepository)
|
||||
: base(configFileProvider, configService, localizationService, tagRepository)
|
||||
public Notifiarr(INotifiarrProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, ILocalizationService localizationService, ITagRepository tagRepository, IMapCoversToLocal mediaCoverService)
|
||||
: base(configFileProvider, configService, localizationService, tagRepository, mediaCoverService)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
||||
@@ -233,7 +233,7 @@ namespace NzbDrone.Core.Notifications
|
||||
|
||||
public void Handle(ManualInteractionRequiredEvent message)
|
||||
{
|
||||
var series = message.Episode.Series;
|
||||
var series = message.Episode?.Series;
|
||||
var mess = "";
|
||||
|
||||
if (series != null)
|
||||
@@ -255,7 +255,7 @@ namespace NzbDrone.Core.Notifications
|
||||
{
|
||||
Message = mess,
|
||||
Series = series,
|
||||
Quality = message.Episode.ParsedEpisodeInfo.Quality,
|
||||
Quality = message.Episode?.ParsedEpisodeInfo.Quality,
|
||||
Episode = message.Episode,
|
||||
TrackedDownload = message.TrackedDownload,
|
||||
DownloadClientInfo = message.TrackedDownload.DownloadItem?.DownloadClientInfo,
|
||||
|
||||
@@ -3,6 +3,7 @@ using FluentValidation.Results;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaCover;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.Tags;
|
||||
using NzbDrone.Core.Tv;
|
||||
@@ -14,8 +15,8 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
{
|
||||
private readonly IWebhookProxy _proxy;
|
||||
|
||||
public Webhook(IWebhookProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, ILocalizationService localizationService, ITagRepository tagRepository)
|
||||
: base(configFileProvider, configService, localizationService, tagRepository)
|
||||
public Webhook(IWebhookProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, ILocalizationService localizationService, ITagRepository tagRepository, IMapCoversToLocal mediaCoverService)
|
||||
: base(configFileProvider, configService, localizationService, tagRepository, mediaCoverService)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Linq;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaCover;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.Tags;
|
||||
using NzbDrone.Core.Tv;
|
||||
@@ -17,13 +18,15 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
private readonly IConfigService _configService;
|
||||
protected readonly ILocalizationService _localizationService;
|
||||
private readonly ITagRepository _tagRepository;
|
||||
private readonly IMapCoversToLocal _mediaCoverService;
|
||||
|
||||
protected WebhookBase(IConfigFileProvider configFileProvider, IConfigService configService, ILocalizationService localizationService, ITagRepository tagRepository)
|
||||
protected WebhookBase(IConfigFileProvider configFileProvider, IConfigService configService, ILocalizationService localizationService, ITagRepository tagRepository, IMapCoversToLocal mediaCoverService)
|
||||
{
|
||||
_configFileProvider = configFileProvider;
|
||||
_configService = configService;
|
||||
_localizationService = localizationService;
|
||||
_tagRepository = tagRepository;
|
||||
_mediaCoverService = mediaCoverService;
|
||||
}
|
||||
|
||||
protected WebhookGrabPayload BuildOnGrabPayload(GrabMessage message)
|
||||
@@ -36,7 +39,7 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
EventType = WebhookEventType.Grab,
|
||||
InstanceName = _configFileProvider.InstanceName,
|
||||
ApplicationUrl = _configService.ApplicationUrl,
|
||||
Series = new WebhookSeries(message.Series, GetTagLabels(message.Series)),
|
||||
Series = GetSeries(message.Series),
|
||||
Episodes = remoteEpisode.Episodes.ConvertAll(x => new WebhookEpisode(x)),
|
||||
Release = new WebhookRelease(quality, remoteEpisode),
|
||||
DownloadClient = message.DownloadClientName,
|
||||
@@ -55,7 +58,7 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
EventType = WebhookEventType.Download,
|
||||
InstanceName = _configFileProvider.InstanceName,
|
||||
ApplicationUrl = _configService.ApplicationUrl,
|
||||
Series = new WebhookSeries(message.Series, GetTagLabels(message.Series)),
|
||||
Series = GetSeries(message.Series),
|
||||
Episodes = episodeFile.Episodes.Value.ConvertAll(x => new WebhookEpisode(x)),
|
||||
EpisodeFile = new WebhookEpisodeFile(episodeFile),
|
||||
Release = new WebhookGrabbedRelease(message.Release),
|
||||
@@ -85,7 +88,7 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
EventType = WebhookEventType.EpisodeFileDelete,
|
||||
InstanceName = _configFileProvider.InstanceName,
|
||||
ApplicationUrl = _configService.ApplicationUrl,
|
||||
Series = new WebhookSeries(deleteMessage.Series, GetTagLabels(deleteMessage.Series)),
|
||||
Series = GetSeries(deleteMessage.Series),
|
||||
Episodes = deleteMessage.EpisodeFile.Episodes.Value.ConvertAll(x => new WebhookEpisode(x)),
|
||||
EpisodeFile = new WebhookEpisodeFile(deleteMessage.EpisodeFile),
|
||||
DeleteReason = deleteMessage.Reason
|
||||
@@ -99,7 +102,7 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
EventType = WebhookEventType.SeriesAdd,
|
||||
InstanceName = _configFileProvider.InstanceName,
|
||||
ApplicationUrl = _configService.ApplicationUrl,
|
||||
Series = new WebhookSeries(addMessage.Series, GetTagLabels(addMessage.Series)),
|
||||
Series = GetSeries(addMessage.Series),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -110,7 +113,7 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
EventType = WebhookEventType.SeriesDelete,
|
||||
InstanceName = _configFileProvider.InstanceName,
|
||||
ApplicationUrl = _configService.ApplicationUrl,
|
||||
Series = new WebhookSeries(deleteMessage.Series, GetTagLabels(deleteMessage.Series)),
|
||||
Series = GetSeries(deleteMessage.Series),
|
||||
DeletedFiles = deleteMessage.DeletedFiles
|
||||
};
|
||||
}
|
||||
@@ -122,7 +125,7 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
EventType = WebhookEventType.Rename,
|
||||
InstanceName = _configFileProvider.InstanceName,
|
||||
ApplicationUrl = _configService.ApplicationUrl,
|
||||
Series = new WebhookSeries(series, GetTagLabels(series)),
|
||||
Series = GetSeries(series),
|
||||
RenamedEpisodeFiles = renamedFiles.ConvertAll(x => new WebhookRenamedEpisodeFile(x))
|
||||
};
|
||||
}
|
||||
@@ -175,7 +178,7 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
EventType = WebhookEventType.ManualInteractionRequired,
|
||||
InstanceName = _configFileProvider.InstanceName,
|
||||
ApplicationUrl = _configService.ApplicationUrl,
|
||||
Series = new WebhookSeries(message.Series, GetTagLabels(message.Series)),
|
||||
Series = GetSeries(message.Series),
|
||||
Episodes = remoteEpisode.Episodes.ConvertAll(x => new WebhookEpisode(x)),
|
||||
DownloadInfo = new WebhookDownloadClientItem(quality, message.TrackedDownload.DownloadItem),
|
||||
DownloadClient = message.DownloadClientInfo?.Name,
|
||||
@@ -216,6 +219,13 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
};
|
||||
}
|
||||
|
||||
private WebhookSeries GetSeries(Series series)
|
||||
{
|
||||
_mediaCoverService.ConvertToLocalUrls(series.Id, series.Images);
|
||||
|
||||
return new WebhookSeries(series, GetTagLabels(series));
|
||||
}
|
||||
|
||||
private List<string> GetTagLabels(Series series)
|
||||
{
|
||||
return _tagRepository.GetTags(series.Tags)
|
||||
|
||||
18
src/NzbDrone.Core/Notifications/Webhook/WebhookImage.cs
Normal file
18
src/NzbDrone.Core/Notifications/Webhook/WebhookImage.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using NzbDrone.Core.MediaCover;
|
||||
|
||||
namespace NzbDrone.Core.Notifications.Webhook
|
||||
{
|
||||
public class WebhookImage
|
||||
{
|
||||
public MediaCoverTypes CoverType { get; set; }
|
||||
public string Url { get; set; }
|
||||
public string RemoteUrl { get; set; }
|
||||
|
||||
public WebhookImage(MediaCover.MediaCover image)
|
||||
{
|
||||
CoverType = image.CoverType;
|
||||
RemoteUrl = image.RemoteUrl;
|
||||
Url = image.Url;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NzbDrone.Core.Tv;
|
||||
|
||||
namespace NzbDrone.Core.Notifications.Webhook
|
||||
@@ -14,6 +15,8 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
public string ImdbId { get; set; }
|
||||
public SeriesTypes Type { get; set; }
|
||||
public int Year { get; set; }
|
||||
public List<string> Genres { get; set; }
|
||||
public List<WebhookImage> Images { get; set; }
|
||||
public List<string> Tags { get; set; }
|
||||
|
||||
public WebhookSeries()
|
||||
@@ -31,6 +34,8 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
ImdbId = series.ImdbId;
|
||||
Type = series.SeriesType;
|
||||
Year = series.Year;
|
||||
Genres = series.Genres;
|
||||
Images = series.Images.Select(i => new WebhookImage(i)).ToList();
|
||||
Tags = tags;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -642,7 +642,7 @@ namespace NzbDrone.Core.Organizer
|
||||
new Dictionary<string, int>(FileNameBuilderTokenEqualityComparer.Instance)
|
||||
{
|
||||
{ MediaInfoVideoDynamicRangeToken, 5 },
|
||||
{ MediaInfoVideoDynamicRangeTypeToken, 10 }
|
||||
{ MediaInfoVideoDynamicRangeTypeToken, 11 }
|
||||
};
|
||||
|
||||
private void AddMediaInfoTokens(Dictionary<string, Func<TokenMatch, string>> tokenHandlers, EpisodeFile episodeFile)
|
||||
|
||||
@@ -37,6 +37,12 @@ namespace NzbDrone.Core.Tv
|
||||
|
||||
private void MoveSingleSeries(Series series, string sourcePath, string destinationPath, int? index = null, int? total = null)
|
||||
{
|
||||
if (!sourcePath.IsPathValid(PathValidationType.CurrentOs))
|
||||
{
|
||||
_logger.Warn("Folder '{0}' for '{1}' is invalid, unable to move series. Try moving files manually", sourcePath, series.Title);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_diskProvider.FolderExists(sourcePath))
|
||||
{
|
||||
_logger.Debug("Folder '{0}' for '{1}' does not exist, not moving.", sourcePath, series.Title);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using FluentValidation.Validators;
|
||||
using FluentValidation.Validators;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.RootFolders;
|
||||
|
||||
@@ -24,7 +25,7 @@ namespace NzbDrone.Core.Validation.Paths
|
||||
|
||||
context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString());
|
||||
|
||||
return !_rootFolderService.All().Exists(r => r.Path.PathEquals(context.PropertyValue.ToString()));
|
||||
return !_rootFolderService.All().Exists(r => r.Path.IsPathValid(PathValidationType.CurrentOs) && r.Path.PathEquals(context.PropertyValue.ToString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Linq;
|
||||
using FluentValidation.Validators;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Tv;
|
||||
|
||||
@@ -28,7 +29,10 @@ namespace NzbDrone.Core.Validation.Paths
|
||||
dynamic instance = context.ParentContext.InstanceToValidate;
|
||||
var instanceId = (int)instance.Id;
|
||||
|
||||
return !_seriesService.GetAllSeriesPaths().Any(s => s.Value.PathEquals(context.PropertyValue.ToString()) && s.Key != instanceId);
|
||||
// Skip the path for this series and any invalid paths
|
||||
return !_seriesService.GetAllSeriesPaths().Any(s => s.Key != instanceId &&
|
||||
s.Value.IsPathValid(PathValidationType.CurrentOs) &&
|
||||
s.Value.PathEquals(context.PropertyValue.ToString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Owin" Version="6.0.21" />
|
||||
<PackageReference Include="NLog.Extensions.Logging" Version="1.7.4" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.5.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
|
||||
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
|
||||
|
||||
@@ -7,6 +7,7 @@ using NzbDrone.Core.Tv;
|
||||
using Sonarr.Api.V3.EpisodeFiles;
|
||||
using Sonarr.Api.V3.Series;
|
||||
using Sonarr.Http.REST;
|
||||
using Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
namespace Sonarr.Api.V3.Episodes
|
||||
{
|
||||
@@ -40,6 +41,7 @@ namespace Sonarr.Api.V3.Episodes
|
||||
|
||||
// Hiding this so people don't think its usable (only used to set the initial state)
|
||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
|
||||
[SwaggerIgnore]
|
||||
public bool Grabbed { get; set; }
|
||||
}
|
||||
|
||||
|
||||
@@ -86,7 +86,8 @@ namespace Sonarr.Api.V3.Indexers
|
||||
{
|
||||
if (release.IndexerId == 0 && release.Indexer.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
var indexer = _indexerFactory.All().FirstOrDefault(v => v.Name == release.Indexer);
|
||||
var indexer = _indexerFactory.All().FirstOrDefault(v => v.Name.EqualsIgnoreCase(release.Indexer));
|
||||
|
||||
if (indexer != null)
|
||||
{
|
||||
release.IndexerId = indexer.Id;
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Linq;
|
||||
using FluentValidation;
|
||||
using FluentValidation.Results;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
using NzbDrone.Core.Validation;
|
||||
@@ -32,7 +33,7 @@ namespace Sonarr.Api.V3
|
||||
_bulkResourceMapper = bulkResourceMapper;
|
||||
|
||||
SharedValidator.RuleFor(c => c.Name).NotEmpty();
|
||||
SharedValidator.RuleFor(c => c.Name).Must((v, c) => !_providerFactory.All().Any(p => p.Name == c && p.Id != v.Id)).WithMessage("Should be unique");
|
||||
SharedValidator.RuleFor(c => c.Name).Must((v, c) => !_providerFactory.All().Any(p => p.Name.EqualsIgnoreCase(c) && p.Id != v.Id)).WithMessage("Should be unique");
|
||||
SharedValidator.RuleFor(c => c.Implementation).NotEmpty();
|
||||
SharedValidator.RuleFor(c => c.ConfigContract).NotEmpty();
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<PackageReference Include="FluentValidation" Version="9.5.4" />
|
||||
<PackageReference Include="Ical.Net" Version="4.2.0" />
|
||||
<PackageReference Include="NLog" Version="4.7.14" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.6.2" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Core\Sonarr.Core.csproj" />
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user