Translate backend: Autotagging + CF specs, Metadata + ImportLists

Signed-off-by: Stevie Robinson <stevie.robinson@gmail.com>
This commit is contained in:
Stevie Robinson 2024-01-14 21:57:42 +01:00 committed by Mark McDowall
parent 9884f6f282
commit de1cc25c90
54 changed files with 320 additions and 144 deletions

View File

@ -23,7 +23,7 @@ namespace NzbDrone.Core.AutoTagging.Specifications
public override int Order => 1; public override int Order => 1;
public override string ImplementationName => "Genre"; public override string ImplementationName => "Genre";
[FieldDefinition(1, Label = "Genre(s)", Type = FieldType.Tag)] [FieldDefinition(1, Label = "AutoTaggingSpecificationGenre", Type = FieldType.Tag)]
public IEnumerable<string> Value { get; set; } public IEnumerable<string> Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(Series series) protected override bool IsSatisfiedByWithoutNegate(Series series)

View File

@ -21,7 +21,7 @@ namespace NzbDrone.Core.AutoTagging.Specifications
public override int Order => 1; public override int Order => 1;
public override string ImplementationName => "Original Language"; public override string ImplementationName => "Original Language";
[FieldDefinition(1, Label = "Language", Type = FieldType.Select, SelectOptions = typeof(OriginalLanguageFieldConverter))] [FieldDefinition(1, Label = "AutoTaggingSpecificationOriginalLanguage", Type = FieldType.Select, SelectOptions = typeof(OriginalLanguageFieldConverter))]
public int Value { get; set; } public int Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(Series series) protected override bool IsSatisfiedByWithoutNegate(Series series)

View File

@ -20,7 +20,7 @@ namespace NzbDrone.Core.AutoTagging.Specifications
public override int Order => 1; public override int Order => 1;
public override string ImplementationName => "Quality Profile"; public override string ImplementationName => "Quality Profile";
[FieldDefinition(1, Label = "Quality Profile", Type = FieldType.QualityProfile)] [FieldDefinition(1, Label = "AutoTaggingSpecificationQualityProfile", Type = FieldType.QualityProfile)]
public int Value { get; set; } public int Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(Series series) protected override bool IsSatisfiedByWithoutNegate(Series series)

View File

@ -22,7 +22,7 @@ namespace NzbDrone.Core.AutoTagging.Specifications
public override int Order => 1; public override int Order => 1;
public override string ImplementationName => "Root Folder"; public override string ImplementationName => "Root Folder";
[FieldDefinition(1, Label = "Root Folder", Type = FieldType.RootFolder)] [FieldDefinition(1, Label = "AutoTaggingSpecificationRootFolder", Type = FieldType.RootFolder)]
public string Value { get; set; } public string Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(Series series) protected override bool IsSatisfiedByWithoutNegate(Series series)

View File

@ -20,7 +20,7 @@ namespace NzbDrone.Core.AutoTagging.Specifications
public override int Order => 2; public override int Order => 2;
public override string ImplementationName => "Series Type"; public override string ImplementationName => "Series Type";
[FieldDefinition(1, Label = "Series Type", Type = FieldType.Select, SelectOptions = typeof(SeriesTypes))] [FieldDefinition(1, Label = "AutoTaggingSpecificationSeriesType", Type = FieldType.Select, SelectOptions = typeof(SeriesTypes))]
public int Value { get; set; } public int Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(Series series) protected override bool IsSatisfiedByWithoutNegate(Series series)

View File

@ -16,7 +16,7 @@ namespace NzbDrone.Core.AutoTagging.Specifications
public override int Order => 1; public override int Order => 1;
public override string ImplementationName => "Status"; public override string ImplementationName => "Status";
[FieldDefinition(1, Label = "Status", Type = FieldType.Select, SelectOptions = typeof(SeriesStatusType))] [FieldDefinition(1, Label = "AutoTaggingSpecificationStatus", Type = FieldType.Select, SelectOptions = typeof(SeriesStatusType))]
public int Status { get; set; } public int Status { get; set; }
protected override bool IsSatisfiedByWithoutNegate(Series series) protected override bool IsSatisfiedByWithoutNegate(Series series)

View File

@ -23,10 +23,10 @@ namespace NzbDrone.Core.AutoTagging.Specifications
public override int Order => 1; public override int Order => 1;
public override string ImplementationName => "Year"; public override string ImplementationName => "Year";
[FieldDefinition(1, Label = "Minimum Year", Type = FieldType.Number)] [FieldDefinition(1, Label = "AutoTaggingSpecificationMinimumYear", Type = FieldType.Number)]
public int Min { get; set; } public int Min { get; set; }
[FieldDefinition(2, Label = "Maximum Year", Type = FieldType.Number)] [FieldDefinition(2, Label = "AutoTaggingSpecificationMaximumYear", Type = FieldType.Number)]
public int Max { get; set; } public int Max { get; set; }
protected override bool IsSatisfiedByWithoutNegate(Series series) protected override bool IsSatisfiedByWithoutNegate(Series series)

View File

@ -27,7 +27,7 @@ namespace NzbDrone.Core.CustomFormats
public override int Order => 3; public override int Order => 3;
public override string ImplementationName => "Language"; public override string ImplementationName => "Language";
[FieldDefinition(1, Label = "Language", Type = FieldType.Select, SelectOptions = typeof(LanguageFieldConverter))] [FieldDefinition(1, Label = "CustomFormatsSpecificationLanguage", Type = FieldType.Select, SelectOptions = typeof(LanguageFieldConverter))]
public int Value { get; set; } public int Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input) protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input)

View File

@ -21,7 +21,7 @@ namespace NzbDrone.Core.CustomFormats
protected Regex _regex; protected Regex _regex;
protected string _raw; protected string _raw;
[FieldDefinition(1, Label = "Regular Expression", HelpText = "Custom Format RegEx is Case Insensitive")] [FieldDefinition(1, Label = "CustomFormatsSpecificationRegularExpression", HelpText = "CustomFormatsSpecificationRegularExpressionHelpText")]
public string Value public string Value
{ {
get => _raw; get => _raw;

View File

@ -20,7 +20,7 @@ namespace NzbDrone.Core.CustomFormats
public override int Order => 6; public override int Order => 6;
public override string ImplementationName => "Resolution"; public override string ImplementationName => "Resolution";
[FieldDefinition(1, Label = "Resolution", Type = FieldType.Select, SelectOptions = typeof(Resolution))] [FieldDefinition(1, Label = "CustomFormatsSpecificationResolution", Type = FieldType.Select, SelectOptions = typeof(Resolution))]
public int Value { get; set; } public int Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input) protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input)

View File

@ -20,10 +20,10 @@ namespace NzbDrone.Core.CustomFormats
public override int Order => 8; public override int Order => 8;
public override string ImplementationName => "Size"; public override string ImplementationName => "Size";
[FieldDefinition(1, Label = "Minimum Size", HelpText = "Release must be greater than this size", Unit = "GB", Type = FieldType.Number)] [FieldDefinition(1, Label = "CustomFormatsSpecificationMinimumSize", HelpText = "CustomFormatsSpecificationMinimumSizeHelpText", Unit = "GB", Type = FieldType.Number)]
public double Min { get; set; } public double Min { get; set; }
[FieldDefinition(1, Label = "Maximum Size", HelpText = "Release must be less than or equal to this size", Unit = "GB", Type = FieldType.Number)] [FieldDefinition(1, Label = "CustomFormatsSpecificationMaximumSize", HelpText = "CustomFormatsSpecificationMaximumSizeHelpText", Unit = "GB", Type = FieldType.Number)]
public double Max { get; set; } public double Max { get; set; }
protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input) protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input)

View File

@ -20,7 +20,7 @@ namespace NzbDrone.Core.CustomFormats
public override int Order => 5; public override int Order => 5;
public override string ImplementationName => "Source"; public override string ImplementationName => "Source";
[FieldDefinition(1, Label = "Source", Type = FieldType.Select, SelectOptions = typeof(QualitySource))] [FieldDefinition(1, Label = "CustomFormatsSpecificationSource", Type = FieldType.Select, SelectOptions = typeof(QualitySource))]
public int Value { get; set; } public int Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input) protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input)

View File

@ -18,7 +18,7 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Plex
SeriesPlexMatchFile = true; SeriesPlexMatchFile = true;
} }
[FieldDefinition(0, Label = "Series Plex Match File", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "Creates a .plexmatch file in the series folder")] [FieldDefinition(0, Label = "MetadataPlexSettingsSeriesPlexMatchFile", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "MetadataPlexSettingsSeriesPlexMatchFileHelpText")]
public bool SeriesPlexMatchFile { get; set; } public bool SeriesPlexMatchFile { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

View File

@ -21,16 +21,16 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Roksbox
EpisodeImages = true; EpisodeImages = true;
} }
[FieldDefinition(0, Label = "Episode Metadata", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "Season##\\filename.xml")] [FieldDefinition(0, Label = "MetadataSettingsEpisodeMetadata", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "Season##\\filename.xml")]
public bool EpisodeMetadata { get; set; } public bool EpisodeMetadata { get; set; }
[FieldDefinition(1, Label = "Series Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Series Title.jpg")] [FieldDefinition(1, Label = "MetadataSettingsSeriesImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Series Title.jpg")]
public bool SeriesImages { get; set; } public bool SeriesImages { get; set; }
[FieldDefinition(2, Label = "Season Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Season ##.jpg")] [FieldDefinition(2, Label = "MetadataSettingsSeasonImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Season ##.jpg")]
public bool SeasonImages { get; set; } public bool SeasonImages { get; set; }
[FieldDefinition(3, Label = "Episode Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Season##\\filename.jpg")] [FieldDefinition(3, Label = "MetadataSettingsEpisodeImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Season##\\filename.jpg")]
public bool EpisodeImages { get; set; } public bool EpisodeImages { get; set; }
public bool IsValid => true; public bool IsValid => true;

View File

@ -21,16 +21,16 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Wdtv
EpisodeImages = true; EpisodeImages = true;
} }
[FieldDefinition(0, Label = "Episode Metadata", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "Season##\\filename.xml")] [FieldDefinition(0, Label = "MetadataSettingsEpisodeMetadata", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "Season##\\filename.xml")]
public bool EpisodeMetadata { get; set; } public bool EpisodeMetadata { get; set; }
[FieldDefinition(1, Label = "Series Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "folder.jpg")] [FieldDefinition(1, Label = "MetadataSettingsSeriesImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "folder.jpg")]
public bool SeriesImages { get; set; } public bool SeriesImages { get; set; }
[FieldDefinition(2, Label = "Season Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Season##\\folder.jpg")] [FieldDefinition(2, Label = "MetadataSettingsSeasonImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Season##\\folder.jpg")]
public bool SeasonImages { get; set; } public bool SeasonImages { get; set; }
[FieldDefinition(3, Label = "Episode Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Season##\\filename.metathumb")] [FieldDefinition(3, Label = "MetadataSettingsEpisodeImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Season##\\filename.metathumb")]
public bool EpisodeImages { get; set; } public bool EpisodeImages { get; set; }
public bool IsValid => true; public bool IsValid => true;

View File

@ -24,28 +24,28 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
EpisodeImages = true; EpisodeImages = true;
} }
[FieldDefinition(0, Label = "Series Metadata", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "tvshow.nfo with full series metadata")] [FieldDefinition(0, Label = "MetadataSettingsSeriesMetadata", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "MetadataXmbcSettingsSeriesMetadataHelpText")]
public bool SeriesMetadata { get; set; } public bool SeriesMetadata { get; set; }
[FieldDefinition(1, Label = "Series Metadata Episode Guide", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "Include JSON formatted episode guide element in tvshow.nfo (Requires 'Series Metadata')", Advanced = true)] [FieldDefinition(1, Label = "MetadataSettingsSeriesMetadataEpisodeGuide", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "MetadataXmbcSettingsSeriesMetadataEpisodeGuideHelpText", Advanced = true)]
public bool SeriesMetadataEpisodeGuide { get; set; } public bool SeriesMetadataEpisodeGuide { get; set; }
[FieldDefinition(2, Label = "Series Metadata URL", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "Include TheTVDB show URL in tvshow.nfo (can be combined with 'Series Metadata')", Advanced = true)] [FieldDefinition(2, Label = "MetadataSettingsSeriesMetadataUrl", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "MetadataXmbcSettingsSeriesMetadataUrlHelpText", Advanced = true)]
public bool SeriesMetadataUrl { get; set; } public bool SeriesMetadataUrl { get; set; }
[FieldDefinition(3, Label = "Episode Metadata", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "<filename>.nfo")] [FieldDefinition(3, Label = "MetadataSettingsEpisodeMetadata", Type = FieldType.Checkbox, Section = MetadataSectionType.Metadata, HelpText = "<filename>.nfo")]
public bool EpisodeMetadata { get; set; } public bool EpisodeMetadata { get; set; }
[FieldDefinition(4, Label = "Episode Metadata Image Thumbs", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "Include image thumb tags in <filename>.nfo (Requires 'Episode Metadata')", Advanced = true)] [FieldDefinition(4, Label = "MetadataSettingsEpisodeMetadataImageThumbs", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "MetadataXmbcSettingsEpisodeMetadataImageThumbsHelpText", Advanced = true)]
public bool EpisodeImageThumb { get; set; } public bool EpisodeImageThumb { get; set; }
[FieldDefinition(5, Label = "Series Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "fanart.jpg, poster.jpg, banner.jpg")] [FieldDefinition(5, Label = "MetadataSettingsSeriesImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "fanart.jpg, poster.jpg, banner.jpg")]
public bool SeriesImages { get; set; } public bool SeriesImages { get; set; }
[FieldDefinition(6, Label = "Season Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "season##-poster.jpg, season##-banner.jpg, season-specials-poster.jpg, season-specials-banner.jpg")] [FieldDefinition(6, Label = "MetadataSettingsSeasonImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "season##-poster.jpg, season##-banner.jpg, season-specials-poster.jpg, season-specials-banner.jpg")]
public bool SeasonImages { get; set; } public bool SeasonImages { get; set; }
[FieldDefinition(7, Label = "Episode Images", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "<filename>-thumb.jpg")] [FieldDefinition(7, Label = "MetadataSettingsEpisodeImages", Type = FieldType.Checkbox, Section = MetadataSectionType.Image, HelpText = "<filename>-thumb.jpg")]
public bool EpisodeImages { get; set; } public bool EpisodeImages { get; set; }
public bool IsValid => true; public bool IsValid => true;

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@ -28,8 +29,9 @@ namespace NzbDrone.Core.ImportLists.AniList
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(httpClient, importListStatusService, configService, parsingService, logger) : base(httpClient, importListStatusService, configService, parsingService, localizationService, logger)
{ {
_importListRepository = netImportRepository; _importListRepository = netImportRepository;
} }

View File

@ -42,16 +42,16 @@ namespace NzbDrone.Core.ImportLists.AniList
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
[FieldDefinition(0, Label = "Access Token", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsAccessToken", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string AccessToken { get; set; } public string AccessToken { get; set; }
[FieldDefinition(0, Label = "Refresh Token", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsRefreshToken", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string RefreshToken { get; set; } public string RefreshToken { get; set; }
[FieldDefinition(0, Label = "Expires", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsExpires", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public DateTime Expires { get; set; } public DateTime Expires { get; set; }
[FieldDefinition(99, Label = "Authenticate with AniList", Type = FieldType.OAuth)] [FieldDefinition(99, Label = "ImportListsAniListSettingsAuthenticateWithAniList", Type = FieldType.OAuth)]
public string SignIn { get; set; } public string SignIn { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

View File

@ -9,6 +9,7 @@ using NzbDrone.Core.Configuration;
using NzbDrone.Core.Http.CloudFlare; using NzbDrone.Core.Http.CloudFlare;
using NzbDrone.Core.ImportLists.Exceptions; using NzbDrone.Core.ImportLists.Exceptions;
using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Exceptions;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
@ -21,12 +22,13 @@ namespace NzbDrone.Core.ImportLists.AniList.List
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(netImportRepository, httpClient, importListStatusService, configService, parsingService, logger) : base(netImportRepository, httpClient, importListStatusService, configService, parsingService, localizationService, logger)
{ {
} }
public override string Name => "AniList List"; public override string Name => _localizationService.GetLocalizedString("TypeOfList", new Dictionary<string, object> { { "typeOfList", "AniList" } });
public override AniListRequestGenerator GetRequestGenerator() public override AniListRequestGenerator GetRequestGenerator()
{ {

View File

@ -31,40 +31,40 @@ namespace NzbDrone.Core.ImportLists.AniList.List
protected override AbstractValidator<AniListSettings> Validator => new AniListSettingsValidator(); protected override AbstractValidator<AniListSettings> Validator => new AniListSettingsValidator();
[FieldDefinition(1, Label = "Username", HelpText = "Username for the List to import from")] [FieldDefinition(1, Label = "Username", HelpText = "ImportListsAniListSettingsUsernameHelpText")]
public string Username { get; set; } public string Username { get; set; }
[FieldDefinition(2, Label = "Import Watching", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "List: Currently Watching")] [FieldDefinition(2, Label = "ImportListsAniListSettingsImportWatching", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportWatchingHelpText")]
public bool ImportCurrent { get; set; } public bool ImportCurrent { get; set; }
[FieldDefinition(3, Label = "Import Planning", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "List: Planning to Watch")] [FieldDefinition(3, Label = "ImportListsAniListSettingsImportPlanning", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportPlanningHelpText")]
public bool ImportPlanning { get; set; } public bool ImportPlanning { get; set; }
[FieldDefinition(4, Label = "Import Completed", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "List: Completed Watching")] [FieldDefinition(4, Label = "ImportListsAniListSettingsImportCompleted", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportCompletedHelpText")]
public bool ImportCompleted { get; set; } public bool ImportCompleted { get; set; }
[FieldDefinition(5, Label = "Import Dropped", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "List: Dropped")] [FieldDefinition(5, Label = "ImportListsAniListSettingsImportDropped", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportDroppedHelpText")]
public bool ImportDropped { get; set; } public bool ImportDropped { get; set; }
[FieldDefinition(6, Label = "Import Paused", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "List: On Hold")] [FieldDefinition(6, Label = "ImportListsAniListSettingsImportPaused", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportPausedHelpText")]
public bool ImportPaused { get; set; } public bool ImportPaused { get; set; }
[FieldDefinition(7, Label = "Import Repeating", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "List: Currently Rewatching")] [FieldDefinition(7, Label = "ImportListsAniListSettingsImportRepeating", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportRepeatingHelpText")]
public bool ImportRepeating { get; set; } public bool ImportRepeating { get; set; }
[FieldDefinition(8, Label = "Import Finished", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "Media: All episodes have aired")] [FieldDefinition(8, Label = "ImportListsAniListSettingsImportFinished", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportFinishedHelpText")]
public bool ImportFinished { get; set; } public bool ImportFinished { get; set; }
[FieldDefinition(9, Label = "Import Releasing", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "Media: Currently airing new episodes")] [FieldDefinition(9, Label = "ImportListsAniListSettingsImportReleasing", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportReleasingHelpText")]
public bool ImportReleasing { get; set; } public bool ImportReleasing { get; set; }
[FieldDefinition(10, Label = "Import Not Yet Released", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "Media: Airing has not yet started")] [FieldDefinition(10, Label = "ImportListsAniListSettingsImportNotYetReleased", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportNotYetReleasedHelpText")]
public bool ImportUnreleased { get; set; } public bool ImportUnreleased { get; set; }
[FieldDefinition(11, Label = "Import Cancelled", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "Media: Series is cancelled")] [FieldDefinition(11, Label = "ImportListsAniListSettingsImportCancelled", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportCancelledHelpText")]
public bool ImportCancelled { get; set; } public bool ImportCancelled { get; set; }
[FieldDefinition(12, Label = "Import Hiatus", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "Media: Series on Hiatus")] [FieldDefinition(12, Label = "ImportListsAniListSettingsImportHiatus", Type = FieldType.Checkbox, Section = sectionImport, HelpText = "ImportListsAniListSettingsImportHiatusHelpText")]
public bool ImportHiatus { get; set; } public bool ImportHiatus { get; set; }
} }
} }

View File

@ -4,6 +4,7 @@ using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
@ -12,7 +13,7 @@ namespace NzbDrone.Core.ImportLists.Custom
public class CustomImport : ImportListBase<CustomSettings> public class CustomImport : ImportListBase<CustomSettings>
{ {
private readonly ICustomImportProxy _customProxy; private readonly ICustomImportProxy _customProxy;
public override string Name => "Custom List"; public override string Name => _localizationService.GetLocalizedString("ImportListsCustomListSettingsName");
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(6); public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(6);
@ -22,8 +23,9 @@ namespace NzbDrone.Core.ImportLists.Custom
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(importListStatusService, configService, parsingService, logger) : base(importListStatusService, configService, parsingService, localizationService, logger)
{ {
_customProxy = customProxy; _customProxy = customProxy;
} }

View File

@ -10,6 +10,7 @@ using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Localization;
namespace NzbDrone.Core.ImportLists.Custom namespace NzbDrone.Core.ImportLists.Custom
{ {
@ -22,11 +23,13 @@ namespace NzbDrone.Core.ImportLists.Custom
public class CustomImportProxy : ICustomImportProxy public class CustomImportProxy : ICustomImportProxy
{ {
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
private readonly ILocalizationService _localizationService;
private readonly Logger _logger; private readonly Logger _logger;
public CustomImportProxy(IHttpClient httpClient, Logger logger) public CustomImportProxy(IHttpClient httpClient, ILocalizationService localizationService, Logger logger)
{ {
_httpClient = httpClient; _httpClient = httpClient;
_localizationService = localizationService;
_logger = logger; _logger = logger;
} }
@ -46,16 +49,16 @@ namespace NzbDrone.Core.ImportLists.Custom
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized) if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
{ {
_logger.Error(ex, "There was an authorization issue. We cannot get the list from the provider."); _logger.Error(ex, "There was an authorization issue. We cannot get the list from the provider.");
return new ValidationFailure("BaseUrl", "It seems we are unauthorized to make this request."); return new ValidationFailure("BaseUrl", _localizationService.GetLocalizedString("ImportListsCustomListValidationAuthenticationFailure"));
} }
_logger.Error(ex, "Unable to connect to import list."); _logger.Error(ex, "Unable to connect to import list.");
return new ValidationFailure("BaseUrl", $"We are unable to make the request to that URL. StatusCode: {ex.Response.StatusCode}"); return new ValidationFailure("BaseUrl", _localizationService.GetLocalizedString("ImportListsCustomListValidationConnectionError", new Dictionary<string, object> { { "exceptionStatusCode", ex.Response.StatusCode } }));
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.Error(ex, "Unable to connect to import list."); _logger.Error(ex, "Unable to connect to import list.");
return new ValidationFailure(string.Empty, $"Unable to connect to import list: {ex.Message}. Check the log surrounding this error for details."); return new ValidationFailure(string.Empty, _localizationService.GetLocalizedString("ImportListsValidationUnableToConnectException", new Dictionary<string, object> { { "exceptionMessage", ex.Message } }));
} }
return null; return null;

View File

@ -22,7 +22,7 @@ namespace NzbDrone.Core.ImportLists.Custom
BaseUrl = ""; BaseUrl = "";
} }
[FieldDefinition(0, Label = "List URL", HelpText = "The URL for the series list")] [FieldDefinition(0, Label = "ImportListsCustomListSettingsUrl", HelpText = "ImportListsCustomListSettingsUrlHelpText")]
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

View File

@ -10,6 +10,7 @@ using NzbDrone.Core.Configuration;
using NzbDrone.Core.Http.CloudFlare; using NzbDrone.Core.Http.CloudFlare;
using NzbDrone.Core.ImportLists.Exceptions; using NzbDrone.Core.ImportLists.Exceptions;
using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Exceptions;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@ -31,8 +32,8 @@ namespace NzbDrone.Core.ImportLists
public abstract IImportListRequestGenerator GetRequestGenerator(); public abstract IImportListRequestGenerator GetRequestGenerator();
public abstract IParseImportListResponse GetParser(); public abstract IParseImportListResponse GetParser();
public HttpImportListBase(IHttpClient httpClient, IImportListStatusService importListStatusService, IConfigService configService, IParsingService parsingService, Logger logger) public HttpImportListBase(IHttpClient httpClient, IImportListStatusService importListStatusService, IConfigService configService, IParsingService parsingService, ILocalizationService localizationService, Logger logger)
: base(importListStatusService, configService, parsingService, logger) : base(importListStatusService, configService, parsingService, localizationService, logger)
{ {
_httpClient = httpClient; _httpClient = httpClient;
} }

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
@ -10,7 +11,7 @@ namespace NzbDrone.Core.ImportLists.Imdb
{ {
public class ImdbListImport : HttpImportListBase<ImdbListSettings> public class ImdbListImport : HttpImportListBase<ImdbListSettings>
{ {
public override string Name => "IMDb Lists"; public override string Name => _localizationService.GetLocalizedString("TypeOfList", new Dictionary<string, object> { { "typeOfList", "IMDb" } });
public override ImportListType ListType => ImportListType.Other; public override ImportListType ListType => ImportListType.Other;
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12); public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12);
@ -19,8 +20,9 @@ namespace NzbDrone.Core.ImportLists.Imdb
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(httpClient, importListStatusService, configService, parsingService, logger) : base(httpClient, importListStatusService, configService, parsingService, localizationService, logger)
{ {
} }

View File

@ -20,7 +20,7 @@ namespace NzbDrone.Core.ImportLists.Imdb
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
[FieldDefinition(1, Label = "List ID", HelpText = "IMDb list ID (e.g ls12345678)")] [FieldDefinition(1, Label = "ImportListsImdbSettingsListId", HelpText = "ImportListsImdbSettingsListIdHelpText")]
public string ListId { get; set; } public string ListId { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

View File

@ -4,6 +4,7 @@ using System.Linq;
using FluentValidation.Results; using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
@ -16,6 +17,7 @@ namespace NzbDrone.Core.ImportLists
protected readonly IImportListStatusService _importListStatusService; protected readonly IImportListStatusService _importListStatusService;
protected readonly IConfigService _configService; protected readonly IConfigService _configService;
protected readonly IParsingService _parsingService; protected readonly IParsingService _parsingService;
protected readonly ILocalizationService _localizationService;
protected readonly Logger _logger; protected readonly Logger _logger;
public abstract string Name { get; } public abstract string Name { get; }
@ -24,11 +26,12 @@ namespace NzbDrone.Core.ImportLists
public abstract TimeSpan MinRefreshInterval { get; } public abstract TimeSpan MinRefreshInterval { get; }
public ImportListBase(IImportListStatusService importListStatusService, IConfigService configService, IParsingService parsingService, Logger logger) public ImportListBase(IImportListStatusService importListStatusService, IConfigService configService, IParsingService parsingService, ILocalizationService localizationService, Logger logger)
{ {
_importListStatusService = importListStatusService; _importListStatusService = importListStatusService;
_configService = configService; _configService = configService;
_parsingService = parsingService; _parsingService = parsingService;
_localizationService = localizationService;
_logger = logger; _logger = logger;
} }
@ -86,7 +89,7 @@ namespace NzbDrone.Core.ImportLists
catch (Exception ex) catch (Exception ex)
{ {
_logger.Error(ex, "Test aborted due to exception"); _logger.Error(ex, "Test aborted due to exception");
failures.Add(new ValidationFailure(string.Empty, "Test was aborted due to an error: " + ex.Message)); failures.Add(new ValidationFailure(string.Empty, _localizationService.GetLocalizedString("ImportListsValidationTestFailed", new Dictionary<string, object> { { "exceptionMessage", ex.Message } })));
} }
return new ValidationResult(failures); return new ValidationResult(failures);

View File

@ -5,6 +5,7 @@ using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Exceptions; using NzbDrone.Core.Exceptions;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Notifications.Plex.PlexTv; using NzbDrone.Core.Notifications.Plex.PlexTv;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
@ -24,13 +25,14 @@ namespace NzbDrone.Core.ImportLists.Plex
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(httpClient, importListStatusService, configService, parsingService, logger) : base(httpClient, importListStatusService, configService, parsingService, localizationService, logger)
{ {
_plexTvService = plexTvService; _plexTvService = plexTvService;
} }
public override string Name => "Plex Watchlist"; public override string Name => _localizationService.GetLocalizedString("ImportListsPlexSettingsWatchlistName");
public override int PageSize => 50; public override int PageSize => 50;
public override IList<ImportListItemInfo> Fetch() public override IList<ImportListItemInfo> Fetch()

View File

@ -27,10 +27,10 @@ namespace NzbDrone.Core.ImportLists.Plex
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
[FieldDefinition(0, Label = "Access Token", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsAccessToken", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string AccessToken { get; set; } public string AccessToken { get; set; }
[FieldDefinition(99, Label = "Authenticate with Plex.tv", Type = FieldType.OAuth)] [FieldDefinition(99, Label = "ImportListsPlexSettingsAuthenticateWithPlex", Type = FieldType.OAuth)]
public string SignIn { get; set; } public string SignIn { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

View File

@ -2,13 +2,14 @@ using System;
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
namespace NzbDrone.Core.ImportLists.Rss.Plex namespace NzbDrone.Core.ImportLists.Rss.Plex
{ {
public class PlexRssImport : RssImportBase<PlexRssImportSettings> public class PlexRssImport : RssImportBase<PlexRssImportSettings>
{ {
public override string Name => "Plex Watchlist RSS"; public override string Name => _localizationService.GetLocalizedString("ImportListsPlexSettingsWatchlistRSSName");
public override ImportListType ListType => ImportListType.Plex; public override ImportListType ListType => ImportListType.Plex;
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(6); public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(6);
@ -16,8 +17,9 @@ namespace NzbDrone.Core.ImportLists.Rss.Plex
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(httpClient, importListStatusService, configService, parsingService, logger) : base(httpClient, importListStatusService, configService, parsingService, localizationService, logger)
{ {
} }

View File

@ -16,7 +16,7 @@ namespace NzbDrone.Core.ImportLists.Rss.Plex
{ {
private PlexRssImportSettingsValidator Validator => new (); private PlexRssImportSettingsValidator Validator => new ();
[FieldDefinition(0, Label = "Url", Type = FieldType.Textbox, HelpLink = "https://app.plex.tv/desktop/#!/settings/watchlist")] [FieldDefinition(0, Label = "ImportListsSettingsRssUrl", Type = FieldType.Textbox, HelpLink = "https://app.plex.tv/desktop/#!/settings/watchlist")]
public override string Url { get; set; } public override string Url { get; set; }
public override NzbDroneValidationResult Validate() public override NzbDroneValidationResult Validate()

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
@ -19,8 +20,9 @@ namespace NzbDrone.Core.ImportLists.Rss
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(httpClient, importListStatusService, configService, parsingService, logger) : base(httpClient, importListStatusService, configService, parsingService, localizationService, logger)
{ {
} }

View File

@ -18,7 +18,7 @@ namespace NzbDrone.Core.ImportLists.Rss
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
[FieldDefinition(0, Label = "Url", Type = FieldType.Textbox)] [FieldDefinition(0, Label = "ImportListsSettingsRssUrl", Type = FieldType.Textbox)]
public virtual string Url { get; set; } public virtual string Url { get; set; }
public virtual NzbDroneValidationResult Validate() public virtual NzbDroneValidationResult Validate()

View File

@ -4,6 +4,7 @@ using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@ -28,8 +29,9 @@ namespace NzbDrone.Core.ImportLists.Simkl
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(httpClient, importListStatusService, configService, parsingService, logger) : base(httpClient, importListStatusService, configService, parsingService, localizationService, logger)
{ {
_importListRepository = netImportRepository; _importListRepository = netImportRepository;
} }

View File

@ -37,19 +37,19 @@ namespace NzbDrone.Core.ImportLists.Simkl
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
[FieldDefinition(0, Label = "Access Token", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsAccessToken", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string AccessToken { get; set; } public string AccessToken { get; set; }
[FieldDefinition(0, Label = "Refresh Token", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsRefreshToken", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string RefreshToken { get; set; } public string RefreshToken { get; set; }
[FieldDefinition(0, Label = "Expires", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsExpires", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public DateTime Expires { get; set; } public DateTime Expires { get; set; }
[FieldDefinition(0, Label = "Auth User", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsAuthUser", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string AuthUser { get; set; } public string AuthUser { get; set; }
[FieldDefinition(99, Label = "Authenticate with Simkl", Type = FieldType.OAuth)] [FieldDefinition(99, Label = "ImportListsSimklSettingsAuthenticatewithSimkl", Type = FieldType.OAuth)]
public string SignIn { get; set; } public string SignIn { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

View File

@ -1,6 +1,7 @@
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
namespace NzbDrone.Core.ImportLists.Simkl.User namespace NzbDrone.Core.ImportLists.Simkl.User
@ -12,12 +13,13 @@ namespace NzbDrone.Core.ImportLists.Simkl.User
IImportListStatusService netImportStatusService, IImportListStatusService netImportStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, logger) : base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, localizationService, logger)
{ {
} }
public override string Name => "Simkl User Watchlist"; public override string Name => _localizationService.GetLocalizedString("ImportListsSimklSettingsName");
public override IImportListRequestGenerator GetRequestGenerator() public override IImportListRequestGenerator GetRequestGenerator()
{ {

View File

@ -1,18 +1,18 @@
using System.Runtime.Serialization; using NzbDrone.Core.Annotations;
namespace NzbDrone.Core.ImportLists.Simkl.User namespace NzbDrone.Core.ImportLists.Simkl.User
{ {
public enum SimklUserListType public enum SimklUserListType
{ {
[EnumMember(Value = "Watching")] [FieldOption(Label = "ImportListsSimklSettingsUserListTypeWatching")]
Watching = 0, Watching = 0,
[EnumMember(Value = "Plan To Watch")] [FieldOption(Label = "ImportListsSimklSettingsUserListTypePlanToWatch")]
PlanToWatch = 1, PlanToWatch = 1,
[EnumMember(Value = "Hold")] [FieldOption(Label = "ImportListsSimklSettingsUserListTypeHold")]
Hold = 2, Hold = 2,
[EnumMember(Value = "Completed")] [FieldOption(Label = "ImportListsSimklSettingsUserListTypeCompleted")]
Completed = 3, Completed = 3,
[EnumMember(Value = "Dropped")] [FieldOption(Label = "ImportListsSimklSettingsUserListTypeDropped")]
Dropped = 4 Dropped = 4
} }
} }

View File

@ -22,10 +22,10 @@ namespace NzbDrone.Core.ImportLists.Simkl.User
ShowType = (int)SimklUserShowType.Shows; ShowType = (int)SimklUserShowType.Shows;
} }
[FieldDefinition(1, Label = "List Type", Type = FieldType.Select, SelectOptions = typeof(SimklUserListType), HelpText = "Type of list you're seeking to import from")] [FieldDefinition(1, Label = "ImportListsSimklSettingsListType", Type = FieldType.Select, SelectOptions = typeof(SimklUserListType), HelpText = "ImportListsSimklSettingsListTypeHelpText")]
public int ListType { get; set; } public int ListType { get; set; }
[FieldDefinition(1, Label = "Show Type", Type = FieldType.Select, SelectOptions = typeof(SimklUserShowType), HelpText = "Type of show you're seeking to import from")] [FieldDefinition(1, Label = "ImportListsSimklSettingsShowType", Type = FieldType.Select, SelectOptions = typeof(SimklUserShowType), HelpText = "ImportListsSimklSettingsShowTypeHelpText")]
public int ShowType { get; set; } public int ShowType { get; set; }
} }
} }

View File

@ -5,6 +5,7 @@ using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@ -23,8 +24,9 @@ namespace NzbDrone.Core.ImportLists.Sonarr
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(importListStatusService, configService, parsingService, logger) : base(importListStatusService, configService, parsingService, localizationService, logger)
{ {
_sonarrV3Proxy = sonarrV3Proxy; _sonarrV3Proxy = sonarrV3Proxy;
} }

View File

@ -29,22 +29,23 @@ namespace NzbDrone.Core.ImportLists.Sonarr
RootFolderPaths = Array.Empty<string>(); RootFolderPaths = Array.Empty<string>();
} }
[FieldDefinition(0, Label = "Full URL", HelpText = "URL, including port, of the Sonarr instance to import from")] [FieldDefinition(0, Label = "ImportListsSonarrSettingsFullUrl", HelpText = "ImportListsSonarrSettingsFullUrlHelpText")]
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
[FieldDefinition(1, Label = "API Key", HelpText = "Apikey of the Sonarr instance to import from")] [FieldDefinition(1, Label = "ApiKey", HelpText = "ImportListsSonarrSettingsApiKeyHelpText")]
public string ApiKey { get; set; } public string ApiKey { get; set; }
[FieldDefinition(2, Type = FieldType.Select, SelectOptionsProviderAction = "getProfiles", Label = "Quality Profiles", HelpText = "Quality Profiles from the source instance to import from")] [FieldDefinition(2, Type = FieldType.Select, SelectOptionsProviderAction = "getProfiles", Label = "QualityProfiles", HelpText = "ImportListsSonarrSettingsQualityProfilesHelpText")]
public IEnumerable<int> ProfileIds { get; set; } public IEnumerable<int> ProfileIds { get; set; }
// TODO: Remove this eventually, no translation added as deprecated
[FieldDefinition(3, Type = FieldType.Select, SelectOptionsProviderAction = "getLanguageProfiles", Label = "Language Profiles", HelpText = "Language Profiles from the source instance to import from")] [FieldDefinition(3, Type = FieldType.Select, SelectOptionsProviderAction = "getLanguageProfiles", Label = "Language Profiles", HelpText = "Language Profiles from the source instance to import from")]
public IEnumerable<int> LanguageProfileIds { get; set; } public IEnumerable<int> LanguageProfileIds { get; set; }
[FieldDefinition(4, Type = FieldType.Select, SelectOptionsProviderAction = "getTags", Label = "Tags", HelpText = "Tags from the source instance to import from")] [FieldDefinition(4, Type = FieldType.Select, SelectOptionsProviderAction = "getTags", Label = "Tags", HelpText = "ImportListsSonarrSettingsTagsHelpText")]
public IEnumerable<int> TagIds { get; set; } public IEnumerable<int> TagIds { get; set; }
[FieldDefinition(5, Type = FieldType.Select, SelectOptionsProviderAction = "getRootFolders", Label = "Root Folders", HelpText = "Root Folders from the source instance to import from")] [FieldDefinition(5, Type = FieldType.Select, SelectOptionsProviderAction = "getRootFolders", Label = "RootFolders", HelpText = "ImportListsSonarrSettingsRootFoldersHelpText")]
public IEnumerable<string> RootFolderPaths { get; set; } public IEnumerable<string> RootFolderPaths { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

View File

@ -6,6 +6,7 @@ using Newtonsoft.Json;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Localization;
namespace NzbDrone.Core.ImportLists.Sonarr namespace NzbDrone.Core.ImportLists.Sonarr
{ {
@ -23,10 +24,12 @@ namespace NzbDrone.Core.ImportLists.Sonarr
{ {
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
private readonly Logger _logger; private readonly Logger _logger;
private readonly ILocalizationService _localizationService;
public SonarrV3Proxy(IHttpClient httpClient, Logger logger) public SonarrV3Proxy(IHttpClient httpClient, ILocalizationService localizationService, Logger logger)
{ {
_httpClient = httpClient; _httpClient = httpClient;
_localizationService = localizationService;
_logger = logger; _logger = logger;
} }
@ -66,22 +69,22 @@ namespace NzbDrone.Core.ImportLists.Sonarr
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized) if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
{ {
_logger.Error(ex, "API Key is invalid"); _logger.Error(ex, "API Key is invalid");
return new ValidationFailure("ApiKey", "API Key is invalid"); return new ValidationFailure("ApiKey", _localizationService.GetLocalizedString("ImportListsValidationInvalidApiKey"));
} }
if (ex.Response.HasHttpRedirect) if (ex.Response.HasHttpRedirect)
{ {
_logger.Error(ex, "Sonarr returned redirect and is invalid"); _logger.Error(ex, "Sonarr returned redirect and is invalid");
return new ValidationFailure("BaseUrl", "Sonarr URL is invalid, are you missing a URL base?"); return new ValidationFailure("BaseUrl", _localizationService.GetLocalizedString("ImportListsSonarrValidationInvalidUrl"));
} }
_logger.Error(ex, "Unable to connect to import list."); _logger.Error(ex, "Unable to connect to import list.");
return new ValidationFailure(string.Empty, $"Unable to connect to import list: {ex.Message}. Check the log surrounding this error for details."); return new ValidationFailure(string.Empty, _localizationService.GetLocalizedString("ImportListsValidationUnableToConnectException", new Dictionary<string, object> { { "exceptionMessage", ex.Message } }));
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.Error(ex, "Unable to connect to import list."); _logger.Error(ex, "Unable to connect to import list.");
return new ValidationFailure(string.Empty, $"Unable to connect to import list: {ex.Message}. Check the log surrounding this error for details."); return new ValidationFailure(string.Empty, _localizationService.GetLocalizedString("ImportListsValidationUnableToConnectException", new Dictionary<string, object> { { "exceptionMessage", ex.Message } }));
} }
return null; return null;

View File

@ -1,6 +1,8 @@
using System.Collections.Generic;
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
namespace NzbDrone.Core.ImportLists.Trakt.List namespace NzbDrone.Core.ImportLists.Trakt.List
@ -12,12 +14,13 @@ namespace NzbDrone.Core.ImportLists.Trakt.List
IImportListStatusService netImportStatusService, IImportListStatusService netImportStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, logger) : base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, localizationService, logger)
{ {
} }
public override string Name => "Trakt List"; public override string Name => _localizationService.GetLocalizedString("TypeOfList", new Dictionary<string, object> { { "typeOfList", "Trakt" } });
public override IImportListRequestGenerator GetRequestGenerator() public override IImportListRequestGenerator GetRequestGenerator()
{ {

View File

@ -17,10 +17,10 @@ namespace NzbDrone.Core.ImportLists.Trakt.List
{ {
protected override AbstractValidator<TraktListSettings> Validator => new TraktListSettingsValidator(); protected override AbstractValidator<TraktListSettings> Validator => new TraktListSettingsValidator();
[FieldDefinition(1, Label = "Username", HelpText = "Username for the List to import from")] [FieldDefinition(1, Label = "Username", HelpText = "ImportListsTraktSettingsUsernameHelpText")]
public string Username { get; set; } public string Username { get; set; }
[FieldDefinition(2, Label = "List Name", HelpText = "List name for import, list must be public or you must have access to the list")] [FieldDefinition(2, Label = "ImportListsTraktSettingsListName", HelpText = "ImportListsTraktSettingsListNameHelpText")]
public string Listname { get; set; } public string Listname { get; set; }
} }
} }

View File

@ -1,6 +1,7 @@
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
namespace NzbDrone.Core.ImportLists.Trakt.Popular namespace NzbDrone.Core.ImportLists.Trakt.Popular
@ -12,12 +13,13 @@ namespace NzbDrone.Core.ImportLists.Trakt.Popular
IImportListStatusService netImportStatusService, IImportListStatusService netImportStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, logger) : base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, localizationService, logger)
{ {
} }
public override string Name => "Trakt Popular List"; public override string Name => _localizationService.GetLocalizedString("ImportListsTraktSettingsPopularName");
public override IParseImportListResponse GetParser() public override IParseImportListResponse GetParser()
{ {

View File

@ -1,31 +1,30 @@
using System.Runtime.Serialization; using NzbDrone.Core.Annotations;
namespace NzbDrone.Core.ImportLists.Trakt.Popular namespace NzbDrone.Core.ImportLists.Trakt.Popular
{ {
public enum TraktPopularListType public enum TraktPopularListType
{ {
[EnumMember(Value = "Trending Shows")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeTrendingShows")]
Trending = 0, Trending = 0,
[EnumMember(Value = "Popular Shows")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypePopularShows")]
Popular = 1, Popular = 1,
[EnumMember(Value = "Anticipated Shows")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeAnticipatedShows")]
Anticipated = 2, Anticipated = 2,
[FieldOption(Label = "ImportListsTraktSettingsPopularListTypeTopWeekShows")]
[EnumMember(Value = "Top Watched Shows By Week")]
TopWatchedByWeek = 3, TopWatchedByWeek = 3,
[EnumMember(Value = "Top Watched Shows By Month")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeTopMonthShows")]
TopWatchedByMonth = 4, TopWatchedByMonth = 4,
[EnumMember(Value = "Top Watched Shows By Year")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeTopYearShows")]
TopWatchedByYear = 5, TopWatchedByYear = 5,
[EnumMember(Value = "Top Watched Shows Of All Time")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeTopAllTimeShows")]
TopWatchedByAllTime = 6, TopWatchedByAllTime = 6,
[EnumMember(Value = "Recommended Shows By Week")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeRecommendedWeekShows")]
RecommendedByWeek = 7, RecommendedByWeek = 7,
[EnumMember(Value = "Recommended Shows By Month")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeRecommendedMonthShows")]
RecommendedByMonth = 8, RecommendedByMonth = 8,
[EnumMember(Value = "Recommended Shows By Year")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeRecommendedYearShows")]
RecommendedByYear = 9, RecommendedByYear = 9,
[EnumMember(Value = "Recommended Shows Of All Time")] [FieldOption(Label = "ImportListsTraktSettingsPopularListTypeRecommendedAllTimeShows")]
RecommendedByAllTime = 10 RecommendedByAllTime = 10
} }
} }

View File

@ -35,16 +35,16 @@ namespace NzbDrone.Core.ImportLists.Trakt.Popular
TraktListType = (int)TraktPopularListType.Popular; TraktListType = (int)TraktPopularListType.Popular;
} }
[FieldDefinition(1, Label = "List Type", Type = FieldType.Select, SelectOptions = typeof(TraktPopularListType), HelpText = "Type of list you're seeking to import from")] [FieldDefinition(1, Label = "ImportListsTraktSettingsListType", Type = FieldType.Select, SelectOptions = typeof(TraktPopularListType), HelpText = "ImportListsTraktSettingsListTypeHelpText")]
public int TraktListType { get; set; } public int TraktListType { get; set; }
[FieldDefinition(2, Label = "Rating", HelpText = "Filter series by rating range (0-100)")] [FieldDefinition(2, Label = "ImportListsTraktSettingsRating", HelpText = "ImportListsTraktSettingsRatingHelpText")]
public string Rating { get; set; } public string Rating { get; set; }
[FieldDefinition(4, Label = "Genres", HelpText = "Filter series by Trakt Genre Slug (Comma Separated) Only for Popular Lists")] [FieldDefinition(4, Label = "ImportListsTraktSettingsGenres", HelpText = "ImportListsTraktSettingsGenresHelpText")]
public string Genres { get; set; } public string Genres { get; set; }
[FieldDefinition(5, Label = "Years", HelpText = "Filter series by year or year range")] [FieldDefinition(5, Label = "ImportListsTraktSettingsYears", HelpText = "ImportListsTraktSettingsYearsHelpText")]
public string Years { get; set; } public string Years { get; set; }
} }
} }

View File

@ -4,6 +4,7 @@ using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@ -28,8 +29,9 @@ namespace NzbDrone.Core.ImportLists.Trakt
IImportListStatusService importListStatusService, IImportListStatusService importListStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(httpClient, importListStatusService, configService, parsingService, logger) : base(httpClient, importListStatusService, configService, parsingService, localizationService, logger)
{ {
_importListRepository = netImportRepository; _importListRepository = netImportRepository;
} }

View File

@ -48,25 +48,25 @@ namespace NzbDrone.Core.ImportLists.Trakt
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
[FieldDefinition(0, Label = "Access Token", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsAccessToken", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string AccessToken { get; set; } public string AccessToken { get; set; }
[FieldDefinition(0, Label = "Refresh Token", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsRefreshToken", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string RefreshToken { get; set; } public string RefreshToken { get; set; }
[FieldDefinition(0, Label = "Expires", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsExpires", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public DateTime Expires { get; set; } public DateTime Expires { get; set; }
[FieldDefinition(0, Label = "Auth User", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)] [FieldDefinition(0, Label = "ImportListsSettingsAuthUser", Type = FieldType.Textbox, Hidden = HiddenType.Hidden)]
public string AuthUser { get; set; } public string AuthUser { get; set; }
[FieldDefinition(5, Label = "Limit", HelpText = "Limit the number of series to get")] [FieldDefinition(5, Label = "ImportListsTraktSettingsLimit", HelpText = "ImportListsTraktSettingsLimitHelpText")]
public int Limit { get; set; } public int Limit { get; set; }
[FieldDefinition(6, Label = "Additional Parameters", HelpText = "Additional Trakt API parameters", Advanced = true)] [FieldDefinition(6, Label = "ImportListsTraktSettingsAdditionalParameters", HelpText = "ImportListsTraktSettingsAdditionalParametersHelpText", Advanced = true)]
public string TraktAdditionalParameters { get; set; } public string TraktAdditionalParameters { get; set; }
[FieldDefinition(99, Label = "Authenticate with Trakt", Type = FieldType.OAuth)] [FieldDefinition(99, Label = "ImportListsTraktSettingsAuthenticateWithTrakt", Type = FieldType.OAuth)]
public string SignIn { get; set; } public string SignIn { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

View File

@ -1,6 +1,7 @@
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Parser; using NzbDrone.Core.Parser;
namespace NzbDrone.Core.ImportLists.Trakt.User namespace NzbDrone.Core.ImportLists.Trakt.User
@ -12,12 +13,13 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
IImportListStatusService netImportStatusService, IImportListStatusService netImportStatusService,
IConfigService configService, IConfigService configService,
IParsingService parsingService, IParsingService parsingService,
ILocalizationService localizationService,
Logger logger) Logger logger)
: base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, logger) : base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, localizationService, logger)
{ {
} }
public override string Name => "Trakt User"; public override string Name => _localizationService.GetLocalizedString("ImportListsTraktSettingsUserListName");
public override IParseImportListResponse GetParser() public override IParseImportListResponse GetParser()
{ {

View File

@ -4,11 +4,11 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
{ {
public enum TraktUserListType public enum TraktUserListType
{ {
[FieldOption(Label = "User Watch List")] [FieldOption(Label = "ImportListsTraktSettingsUserListTypeWatch")]
UserWatchList = 0, UserWatchList = 0,
[FieldOption(Label = "User Watched List")] [FieldOption(Label = "ImportListsTraktSettingsUserListTypeWatched")]
UserWatchedList = 1, UserWatchedList = 1,
[FieldOption(Label = "User Collection List")] [FieldOption(Label = "ImportListsTraktSettingsUserListTypeCollection")]
UserCollectionList = 2 UserCollectionList = 2
} }
} }

View File

@ -25,16 +25,16 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
TraktWatchSorting = (int)TraktUserWatchSorting.Rank; TraktWatchSorting = (int)TraktUserWatchSorting.Rank;
} }
[FieldDefinition(1, Label = "List Type", Type = FieldType.Select, SelectOptions = typeof(TraktUserListType), HelpText = "Type of list you're seeking to import from")] [FieldDefinition(1, Label = "ImportListsTraktSettingsListType", Type = FieldType.Select, SelectOptions = typeof(TraktUserListType), HelpText = "ImportListsTraktSettingsListTypeHelpText")]
public int TraktListType { get; set; } public int TraktListType { get; set; }
[FieldDefinition(2, Label = "Watched List Filter", Type = FieldType.Select, SelectOptions = typeof(TraktUserWatchedListType), HelpText = "If List Type is Watched. Series do you want to import from")] [FieldDefinition(2, Label = "ImportListsTraktSettingsWatchedListFilter", Type = FieldType.Select, SelectOptions = typeof(TraktUserWatchedListType), HelpText = "ImportListsTraktSettingsWatchedListFilterHelpText")]
public int TraktWatchedListType { get; set; } public int TraktWatchedListType { get; set; }
[FieldDefinition(3, Label = "Watch List Sorting", Type = FieldType.Select, SelectOptions = typeof(TraktUserWatchSorting), HelpText = "If List Type is Watch")] [FieldDefinition(3, Label = "ImportListsTraktSettingsWatchedListSorting", Type = FieldType.Select, SelectOptions = typeof(TraktUserWatchSorting), HelpText = "ImportListsTraktSettingsWatchedListSortingHelpText")]
public int TraktWatchSorting { get; set; } public int TraktWatchSorting { get; set; }
[FieldDefinition(4, Label = "Username", HelpText = "Username for the List to import from (empty to use Auth User)")] [FieldDefinition(4, Label = "Username", HelpText = "ImportListsTraktSettingsUserListUsernameHelpText")]
public string Username { get; set; } public string Username { get; set; }
} }

View File

@ -4,11 +4,11 @@ namespace NzbDrone.Core.ImportLists.Trakt.User
{ {
public enum TraktUserWatchedListType public enum TraktUserWatchedListType
{ {
[FieldOption(Label = "All")] [FieldOption(Label = "ImportListsTraktSettingsWatchedListTypeAll")]
All = 0, All = 0,
[FieldOption(Label = "In Progress")] [FieldOption(Label = "ImportListsTraktSettingsWatchedListTypeInProgress")]
InProgress = 1, InProgress = 1,
[FieldOption(Label = "100% Watched")] [FieldOption(Label = "ImportListsTraktSettingsWatchedListTypeCompleted")]
CompletelyWatched = 2 CompletelyWatched = 2
} }
} }

View File

@ -127,6 +127,14 @@
"AutoTaggingLoadError": "Unable to load auto tagging", "AutoTaggingLoadError": "Unable to load auto tagging",
"AutoTaggingNegateHelpText": "If checked, the auto tagging rule will not apply if this {implementationName} condition matches.", "AutoTaggingNegateHelpText": "If checked, the auto tagging rule will not apply if this {implementationName} condition matches.",
"AutoTaggingRequiredHelpText": "This {implementationName} condition must match for the auto tagging rule to apply. Otherwise a single {implementationName} match is sufficient.", "AutoTaggingRequiredHelpText": "This {implementationName} condition must match for the auto tagging rule to apply. Otherwise a single {implementationName} match is sufficient.",
"AutoTaggingSpecificationGenre": "Genre(s)",
"AutoTaggingSpecificationMaximumYear": "Maximum Year",
"AutoTaggingSpecificationMinimumYear": "Minimum Year",
"AutoTaggingSpecificationOriginalLanguage": "Language",
"AutoTaggingSpecificationQualityProfile": "Quality Profile",
"AutoTaggingSpecificationRootFolder": "Root Folder",
"AutoTaggingSpecificationSeriesType": "Series Type",
"AutoTaggingSpecificationStatus": "Status",
"Automatic": "Automatic", "Automatic": "Automatic",
"AutomaticAdd": "Automatic Add", "AutomaticAdd": "Automatic Add",
"AutomaticSearch": "Automatic Search", "AutomaticSearch": "Automatic Search",
@ -257,6 +265,16 @@
"CustomFormatsLoadError": "Unable to load Custom Formats", "CustomFormatsLoadError": "Unable to load Custom Formats",
"CustomFormatsSettings": "Custom Formats Settings", "CustomFormatsSettings": "Custom Formats Settings",
"CustomFormatsSettingsSummary": "Custom Formats and Settings", "CustomFormatsSettingsSummary": "Custom Formats and Settings",
"CustomFormatsSpecificationLanguage": "Language",
"CustomFormatsSpecificationMaximumSize": "Maximum Size",
"CustomFormatsSpecificationMaximumSizeHelpText": "Release must be less than or equal to this size",
"CustomFormatsSpecificationMinimumSize": "Minimum Size",
"CustomFormatsSpecificationMinimumSizeHelpText": "Release must be greater than this size",
"CustomFormatsSpecificationRegularExpression": "Language",
"CustomFormatsSpecificationRegularExpressionHelpText": "Custom Format RegEx is Case Insensitive",
"CustomFormatsSpecificationReleaseGroup": "Release Group",
"CustomFormatsSpecificationResolution": "Resolution",
"CustomFormatsSpecificationSource": "Source",
"Cutoff": "Cutoff", "Cutoff": "Cutoff",
"CutoffUnmet": "Cutoff Unmet", "CutoffUnmet": "Cutoff Unmet",
"CutoffUnmetLoadError": "Error loading cutoff unmet items", "CutoffUnmetLoadError": "Error loading cutoff unmet items",
@ -759,8 +777,108 @@
"ImportListStatusAllUnavailableHealthCheckMessage": "All lists are unavailable due to failures", "ImportListStatusAllUnavailableHealthCheckMessage": "All lists are unavailable due to failures",
"ImportListStatusUnavailableHealthCheckMessage": "Lists unavailable due to failures: {importListNames}", "ImportListStatusUnavailableHealthCheckMessage": "Lists unavailable due to failures: {importListNames}",
"ImportLists": "Import Lists", "ImportLists": "Import Lists",
"ImportListsAniListSettingsAuthenticateWithAniList": "Authenticate with AniList",
"ImportListsAniListSettingsImportCancelled": "Import Cancelled",
"ImportListsAniListSettingsImportCancelledHelpText": "Media: Series is cancelled",
"ImportListsAniListSettingsImportCompleted": "Import Completed",
"ImportListsAniListSettingsImportCompletedHelpText": "List: Completed Watching",
"ImportListsAniListSettingsImportDropped": "Import Dropped",
"ImportListsAniListSettingsImportDroppedHelpText": "List: Dropped",
"ImportListsAniListSettingsImportFinished": "Import Finished",
"ImportListsAniListSettingsImportFinishedHelpText": "Media: All episodes have aired",
"ImportListsAniListSettingsImportHiatus": "Import Hiatus",
"ImportListsAniListSettingsImportHiatusHelpText": "Media: Series on Hiatus",
"ImportListsAniListSettingsImportNotYetReleased": "Import Not Yet Released",
"ImportListsAniListSettingsImportNotYetReleasedHelpText": "Media: Airing has not yet started",
"ImportListsAniListSettingsImportPaused": "Import Paused",
"ImportListsAniListSettingsImportPausedHelpText": "List: On Hold",
"ImportListsAniListSettingsImportPlanning": "Import Planning",
"ImportListsAniListSettingsImportPlanningHelpText": "List: Planning to Watch",
"ImportListsAniListSettingsImportReleasing": "Import Releasing",
"ImportListsAniListSettingsImportReleasingHelpText": "Media: Currently airing new episodes",
"ImportListsAniListSettingsImportRepeating": "Import Repeating",
"ImportListsAniListSettingsImportRepeatingHelpText": "List: Currently Re-watching",
"ImportListsAniListSettingsImportWatching": "Import Watching",
"ImportListsAniListSettingsImportWatchingHelpText": "List: Currently Watching",
"ImportListsAniListSettingsUsernameHelpText": "Username for the List to import from",
"ImportListsCustomListSettingsName": "Custom List",
"ImportListsCustomListSettingsUrl": "List URL",
"ImportListsCustomListSettingsUrlHelpText": "The URL for the series list",
"ImportListsCustomListValidationAuthenticationFailure": "Authentication Failure",
"ImportListsCustomListValidationConnectionError": "Unable to make the request to that URL. StatusCode: {exceptionStatusCode}",
"ImportListsImdbSettingsListId": "List ID",
"ImportListsImdbSettingsListIdHelpText": "IMDb list ID (e.g ls12345678)",
"ImportListsLoadError": "Unable to load Import Lists", "ImportListsLoadError": "Unable to load Import Lists",
"ImportListsPlexSettingsAuthenticateWithPlex": "Authenticate with Plex.tv",
"ImportListsPlexSettingsWatchlistName": "Plex Watchlist",
"ImportListsPlexSettingsWatchlistRSSName": "Plex Watchlist RSS",
"ImportListsSettingsAccessToken": "Access Token",
"ImportListsSettingsAuthUser": "Auth User",
"ImportListsSettingsExpires": "Expires",
"ImportListsSettingsRefreshToken": "Refresh Token",
"ImportListsSettingsRssUrl": "RSS URL",
"ImportListsSettingsSummary": "Import from another {appName} instance or Trakt lists and manage list exclusions", "ImportListsSettingsSummary": "Import from another {appName} instance or Trakt lists and manage list exclusions",
"ImportListsSimklSettingsAuthenticatewithSimkl": "Authenticate with Simkl",
"ImportListsSimklSettingsListType": "List Type",
"ImportListsSimklSettingsListTypeHelpText": "Type of list you're seeking to import from",
"ImportListsSimklSettingsName": "Simkl User Watchlist",
"ImportListsSimklSettingsShowType": "Show Type",
"ImportListsSimklSettingsShowTypeHelpText": "Type of show you're seeking to import from",
"ImportListsSimklSettingsUserListTypeCompleted": "Completed",
"ImportListsSimklSettingsUserListTypeDropped": "Dropped",
"ImportListsSimklSettingsUserListTypeHold": "Hold",
"ImportListsSimklSettingsUserListTypePlanToWatch": "Plan To Watch",
"ImportListsSimklSettingsUserListTypeWatching": "Watching",
"ImportListsSonarrSettingsApiKeyHelpText": "API Key of the {appName} instance to import from",
"ImportListsSonarrSettingsFullUrl": "Full URL",
"ImportListsSonarrSettingsFullUrlHelpText": "URL, including port, of the {appName} instance to import from",
"ImportListsSonarrSettingsQualityProfilesHelpText": "Quality Profiles from the source instance to import from",
"ImportListsSonarrSettingsRootFoldersHelpText": "Root Folders from the source instance to import from",
"ImportListsSonarrSettingsTagsHelpText": "Tags from the source instance to import from",
"ImportListsSonarrValidationInvalidUrl": "{appName} URL is invalid, are you missing a URL base?",
"ImportListsTraktSettingsAdditionalParameters": "Additional Parameters",
"ImportListsTraktSettingsAdditionalParametersHelpText": "Additional Trakt API parameters",
"ImportListsTraktSettingsAuthenticateWithTrakt": "Authenticate with Trakt",
"ImportListsTraktSettingsGenres": "Genres",
"ImportListsTraktSettingsGenresHelpText": "Filter series by Trakt Genre Slug (Comma Separated) Only for Popular Lists",
"ImportListsTraktSettingsLimit": "Limit",
"ImportListsTraktSettingsLimitHelpText": "Limit the number of series to get",
"ImportListsTraktSettingsListName": "List Name",
"ImportListsTraktSettingsListNameHelpText": "List name for import, list must be public or you must have access to the list",
"ImportListsTraktSettingsListType": "List Type",
"ImportListsTraktSettingsListTypeHelpText": "Type of list you're seeking to import from",
"ImportListsTraktSettingsPopularListTypeAnticipatedShows": "Anticipated Shows",
"ImportListsTraktSettingsPopularListTypePopularShows": "Popular Shows",
"ImportListsTraktSettingsPopularListTypeRecommendedAllTimeShows": "Recommended Shows Of All Time",
"ImportListsTraktSettingsPopularListTypeRecommendedMonthShows": "Recommended Shows By Month",
"ImportListsTraktSettingsPopularListTypeRecommendedWeekShows": "Recommended Shows By Week",
"ImportListsTraktSettingsPopularListTypeRecommendedYearShows": "Recommended Shows By Year",
"ImportListsTraktSettingsPopularListTypeTopAllTimeShows": "Top Watched Shows Of All Time",
"ImportListsTraktSettingsPopularListTypeTopMonthShows": "Top Watched Shows By Month",
"ImportListsTraktSettingsPopularListTypeTopWeekShows": "Top Watched Shows By Week",
"ImportListsTraktSettingsPopularListTypeTopYearShows": "Top Watched Shows By Year",
"ImportListsTraktSettingsPopularListTypeTrendingShows": "Trending Shows",
"ImportListsTraktSettingsPopularName": "Trakt Popular List",
"ImportListsTraktSettingsRating": "Rating",
"ImportListsTraktSettingsRatingHelpText": "Filter series by rating range (0-100)",
"ImportListsTraktSettingsUserListName": "Trakt User",
"ImportListsTraktSettingsUserListTypeCollection": "User Collection List",
"ImportListsTraktSettingsUserListTypeWatch": "User Watch List",
"ImportListsTraktSettingsUserListTypeWatched": "User Watched List",
"ImportListsTraktSettingsUserListUsernameHelpText": "Username for the List to import from (leave empty to use Auth User)",
"ImportListsTraktSettingsUsernameHelpText": "Username for the List to import from",
"ImportListsTraktSettingsWatchedListFilter": "Watched List Filter",
"ImportListsTraktSettingsWatchedListFilterHelpText": "If List Type is Watched, select the series type you want to import",
"ImportListsTraktSettingsWatchedListSorting": "Watch List Sorting",
"ImportListsTraktSettingsWatchedListSortingHelpText": "If List Type is Watched, select the order to sort the list",
"ImportListsTraktSettingsWatchedListTypeAll": "All",
"ImportListsTraktSettingsWatchedListTypeCompleted": "100% Watched",
"ImportListsTraktSettingsWatchedListTypeInProgress": "In Progress",
"ImportListsTraktSettingsYears": "Years",
"ImportListsTraktSettingsYearsHelpText": "Filter series by year or year range",
"ImportListsValidationInvalidApiKey": "API Key is invalid",
"ImportListsValidationTestFailed": "Test was aborted due to an error: {exceptionMessage}",
"ImportListsValidationUnableToConnectException": "Unable to connect to import list: {exceptionMessage}. Check the log surrounding this error for details.",
"ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "Enable Completed Download Handling if possible", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "Enable Completed Download Handling if possible",
"ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage": "Enable Completed Download Handling if possible (Multi-Computer unsupported)", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage": "Enable Completed Download Handling if possible (Multi-Computer unsupported)",
"ImportMechanismHandlingDisabledHealthCheckMessage": "Enable Completed Download Handling", "ImportMechanismHandlingDisabledHealthCheckMessage": "Enable Completed Download Handling",
@ -959,12 +1077,26 @@
"Message": "Message", "Message": "Message",
"Metadata": "Metadata", "Metadata": "Metadata",
"MetadataLoadError": "Unable to load Metadata", "MetadataLoadError": "Unable to load Metadata",
"MetadataPlexSettingsSeriesPlexMatchFile": "Series Plex Match File",
"MetadataPlexSettingsSeriesPlexMatchFileHelpText": "Creates a .plexmatch file in the series folder",
"MetadataProvidedBy": "Metadata is provided by {provider}", "MetadataProvidedBy": "Metadata is provided by {provider}",
"MetadataSettings": "Metadata Settings", "MetadataSettings": "Metadata Settings",
"MetadataSettingsEpisodeImages": "Episode Images",
"MetadataSettingsEpisodeMetadata": "Episode Metadata",
"MetadataSettingsEpisodeMetadataImageThumbs": "Episode Metadata Image Thumbs",
"MetadataSettingsSeasonImages": "Season Images",
"MetadataSettingsSeriesImages": "Series Images",
"MetadataSettingsSeriesMetadata": "Series Metadata",
"MetadataSettingsSeriesMetadataEpisodeGuide": "Series Metadata Episode Guide",
"MetadataSettingsSeriesMetadataUrl": "Series Metadata URL",
"MetadataSettingsSeriesSummary": "Create metadata files when episodes are imported or series are refreshed", "MetadataSettingsSeriesSummary": "Create metadata files when episodes are imported or series are refreshed",
"MetadataSource": "Metadata Source", "MetadataSource": "Metadata Source",
"MetadataSourceSettings": "Metadata Source Settings", "MetadataSourceSettings": "Metadata Source Settings",
"MetadataSourceSettingsSeriesSummary": "Information on where {appName} gets series and episode information", "MetadataSourceSettingsSeriesSummary": "Information on where {appName} gets series and episode information",
"MetadataXmbcSettingsEpisodeMetadataImageThumbsHelpText": "Include image thumb tags in <filename>.nfo (Requires 'Episode Metadata')",
"MetadataXmbcSettingsSeriesMetadataEpisodeGuideHelpText": "Include JSON formatted episode guide element in tvshow.nfo (Requires 'Series Metadata')",
"MetadataXmbcSettingsSeriesMetadataHelpText": "tvshow.nfo with full series metadata",
"MetadataXmbcSettingsSeriesMetadataUrlHelpText": "Include TheTVDB show URL in tvshow.nfo (can be combined with 'Series Metadata')",
"MidseasonFinale": "Midseason Finale", "MidseasonFinale": "Midseason Finale",
"Min": "Min", "Min": "Min",
"MinimumAge": "Minimum Age", "MinimumAge": "Minimum Age",

View File

@ -228,10 +228,15 @@ namespace Sonarr.Http.ClientSchema
if (attrib != null) if (attrib != null)
{ {
var label = attrib.Label.IsNotNullOrWhiteSpace()
? _localizationService.GetLocalizedString(attrib.Label,
GetTokens(selectOptions, attrib.Label, TokenField.Label))
: attrib.Label;
return new SelectOption return new SelectOption
{ {
Value = value, Value = value,
Name = attrib.Label ?? name, Name = label ?? name,
Order = attrib.Order, Order = attrib.Order,
Hint = attrib.Hint ?? $"({value})" Hint = attrib.Hint ?? $"({value})"
}; };