mirror of
https://github.com/Radarr/Radarr.git
synced 2026-03-08 14:51:41 -04:00
Compare commits
29 Commits
v6-develop
...
v6.0.1.102
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64b2a10b3f | ||
|
|
97c226c23c | ||
|
|
9959c658be | ||
|
|
eaeb668eb5 | ||
|
|
bb6713f1d2 | ||
|
|
9906b95893 | ||
|
|
8c94581cb6 | ||
|
|
6bdbc9c600 | ||
|
|
f28691e48d | ||
|
|
e7bddaeedd | ||
|
|
94ced8cff9 | ||
|
|
3429fe0696 | ||
|
|
100e121afc | ||
|
|
24be516fdb | ||
|
|
f49c35563d | ||
|
|
6e23750705 | ||
|
|
30fc50e049 | ||
|
|
8000abc2be | ||
|
|
62a05e2765 | ||
|
|
f04bff8e91 | ||
|
|
84593502a3 | ||
|
|
d478b404df | ||
|
|
80a9fa68de | ||
|
|
8eb9fc71b8 | ||
|
|
6b1567ddae | ||
|
|
265e931451 | ||
|
|
2a886fb26a | ||
|
|
2235823af3 | ||
|
|
f99162b8ee |
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '6.0.0'
|
||||
majorVersion: '6.0.1'
|
||||
minorVersion: $[counter('minorVersion', 2000)]
|
||||
radarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
||||
@@ -1194,7 +1194,7 @@ stages:
|
||||
extraProperties: |
|
||||
sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*,./frontend/**,**/ExternalModules/**,./src/Libraries/**
|
||||
sonar.coverage.exclusions=**/Radarr.Api.V3/**/*
|
||||
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
|
||||
sonar.cs.cobertura.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml
|
||||
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
|
||||
- bash: |
|
||||
./build.sh --backend -f net8.0 -r win-x64
|
||||
@@ -1206,10 +1206,11 @@ stages:
|
||||
- task: reportgenerator@5
|
||||
displayName: Generate Coverage Report
|
||||
inputs:
|
||||
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
|
||||
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml'
|
||||
targetdir: '$(Build.SourcesDirectory)/CoverageResults/combined'
|
||||
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
|
||||
publishCodeCoverageResults: true
|
||||
sourcedirs: src
|
||||
|
||||
- stage: Report_Out
|
||||
dependsOn:
|
||||
|
||||
@@ -54,7 +54,7 @@ export default function AuthenticationRequiredModalContent() {
|
||||
dispatch(fetchGeneralSettings());
|
||||
|
||||
return () => {
|
||||
dispatch(clearPendingChanges());
|
||||
dispatch(clearPendingChanges({ section: `settings.${SECTION}` }));
|
||||
};
|
||||
}, [dispatch]);
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ class MovieFileEditorRow extends Component {
|
||||
>
|
||||
{indexerFlags ? (
|
||||
<Popover
|
||||
anchor={<Icon name={icons.FLAG} kind={kinds.PRIMARY} />}
|
||||
anchor={<Icon name={icons.FLAG} />}
|
||||
title={translate('IndexerFlags')}
|
||||
body={<IndexerFlags indexerFlags={indexerFlags} />}
|
||||
position={tooltipPositions.LEFT}
|
||||
|
||||
@@ -114,6 +114,11 @@ const movieTokens = [
|
||||
example: 'The Movie Collection',
|
||||
footNotes: '1',
|
||||
},
|
||||
{
|
||||
token: '{Movie CollectionThe}',
|
||||
example: 'Movie Collection, The',
|
||||
footNotes: '1',
|
||||
},
|
||||
{ token: '{Movie Certification}', example: 'R' },
|
||||
{ token: '{Release Year}', example: '2009' },
|
||||
];
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
<Deterministic Condition="$(AssemblyVersion.EndsWith('*'))">False</Deterministic>
|
||||
|
||||
<PathMap>$(MSBuildProjectDirectory)=./$(MSBuildProjectName)/</PathMap>
|
||||
<PathMap>$(MSBuildThisFileDirectory)=./</PathMap>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Set the AssemblyConfiguration attribute for projects -->
|
||||
@@ -123,14 +123,11 @@
|
||||
|
||||
<!-- Standard testing packages -->
|
||||
<ItemGroup Condition="'$(TestProject)'=='true'">
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.4" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
|
||||
<PackageReference Include="NUnit" Version="3.14.0" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
|
||||
<PackageReference Include="NunitXml.TestLogger" Version="3.0.131" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TestProject)'=='true' and '$(TargetFramework)'=='net8.0'">
|
||||
<PackageReference Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
|
||||
<PackageReference Include="NunitXml.TestLogger" Version="3.1.20" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(RadarrProject)'=='true' and '$(EnableAnalyzers)'=='false'">
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
<add key="dotnet-bsd-crossbuild" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/dotnet-bsd-crossbuild/nuget/v3/index.json" />
|
||||
<add key="Mono.Posix.NETStandard" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/Mono.Posix.NETStandard/nuget/v3/index.json" />
|
||||
<add key="SQLite" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/SQLite/nuget/v3/index.json" />
|
||||
<add key="coverlet-nightly" value="https://pkgs.dev.azure.com/Servarr/coverlet/_packaging/coverlet-nightly/nuget/v3/index.json" />
|
||||
<add key="FFMpegCore" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/FFMpegCore/nuget/v3/index.json" />
|
||||
<add key="FluentMigrator" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/FluentMigrator/nuget/v3/index.json" />
|
||||
</packageSources>
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using FizzWare.NBuilder;
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.CustomFormats;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.Movies;
|
||||
using NzbDrone.Core.Organizer;
|
||||
using NzbDrone.Core.Qualities;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests
|
||||
{
|
||||
[TestFixture]
|
||||
public class CollectionTheFixture : CoreTest<FileNameBuilder>
|
||||
{
|
||||
private Movie _movie;
|
||||
private MovieFile _movieFile;
|
||||
private NamingConfig _namingConfig;
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
_movie = Builder<Movie>
|
||||
.CreateNew()
|
||||
.With(e => e.Title = "Movie Title")
|
||||
.Build();
|
||||
|
||||
_movieFile = new MovieFile { Quality = new QualityModel(Quality.HDTV720p), ReleaseGroup = "RadarrTest" };
|
||||
|
||||
_namingConfig = NamingConfig.Default;
|
||||
_namingConfig.RenameMovies = true;
|
||||
|
||||
Mocker.GetMock<INamingConfigService>()
|
||||
.Setup(c => c.GetConfig()).Returns(_namingConfig);
|
||||
|
||||
Mocker.GetMock<IQualityDefinitionService>()
|
||||
.Setup(v => v.Get(Moq.It.IsAny<Quality>()))
|
||||
.Returns<Quality>(v => Quality.DefaultQualityDefinitions.First(c => c.Quality == v));
|
||||
|
||||
Mocker.GetMock<ICustomFormatService>()
|
||||
.Setup(v => v.All())
|
||||
.Returns(new List<CustomFormat>());
|
||||
}
|
||||
|
||||
[TestCase("The Badger Collection", "Badger Collection, The")]
|
||||
[TestCase("The Mover Collection", "Mover Collection, The")]
|
||||
[TestCase("A Stupid Collection", "Stupid Collection, A")]
|
||||
[TestCase("An Astounding Collection", "Astounding Collection, An")]
|
||||
[TestCase("The Amazing Animal-Hero Collection (2001)", "Amazing Animal-Hero Collection, The (2001)")]
|
||||
[TestCase("A Different Movie (AU)", "Different Movie, A (AU)")]
|
||||
[TestCase("The Repairer (ZH) (2015)", "Repairer, The (ZH) (2015)")]
|
||||
[TestCase("The Eighth Sense 2 (Thai)", "Eighth Sense 2, The (Thai)")]
|
||||
[TestCase("The Astonishing Jog (Latin America)", "Astonishing Jog, The (Latin America)")]
|
||||
[TestCase("The Hampster Pack (B&F)", "Hampster Pack, The (B&F)")]
|
||||
[TestCase("The Gasm: I (Almost) Got Away With It (1900)", "Gasm - I (Almost) Got Away With It, The (1900)")]
|
||||
public void should_get_expected_title_back(string collection, string expected)
|
||||
{
|
||||
SetCollectionName(_movie, collection);
|
||||
_namingConfig.StandardMovieFormat = "{Movie CollectionThe}";
|
||||
|
||||
Subject.BuildFileName(_movie, _movieFile)
|
||||
.Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("A")]
|
||||
[TestCase("Anne")]
|
||||
[TestCase("Theodore")]
|
||||
[TestCase("3%")]
|
||||
public void should_not_change_title(string collection)
|
||||
{
|
||||
SetCollectionName(_movie, collection);
|
||||
_namingConfig.StandardMovieFormat = "{Movie CollectionThe}";
|
||||
|
||||
Subject.BuildFileName(_movie, _movieFile)
|
||||
.Should().Be(collection);
|
||||
}
|
||||
|
||||
private void SetCollectionName(Movie movie, string collectionName)
|
||||
{
|
||||
var metadata = new MovieMetadata()
|
||||
{
|
||||
CollectionTitle = collectionName,
|
||||
};
|
||||
movie.MovieMetadata = new Core.Datastore.LazyLoaded<MovieMetadata>(metadata);
|
||||
movie.MovieMetadata.Value.CollectionTitle = collectionName;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,14 +55,14 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
[TestCase("Movie.Title.2019.1080p.AMZN.WEB-Rip.DDP.5.1.HEVC", null)]
|
||||
[TestCase("Movie Name (2017) [2160p REMUX] [HEVC DV HYBRID HDR10+ Dolby TrueHD Atmos 7 1 24-bit Audio English] [Data Lass]", null)]
|
||||
[TestCase("Movie Name (2017) [2160p REMUX] [HEVC DV HYBRID HDR10+ Dolby TrueHD Atmos 7 1 24-bit Audio English]-DataLass", "DataLass")]
|
||||
[TestCase("Movie Name (2017) (Showtime) (1080p.BD.DD5.1.x265-TheSickle[TAoE])", "TheSickle")]
|
||||
[TestCase("Movie Name (2017) (Showtime) (1080p.BD.DD5.1.x265-TheSickle[TAoE])", "TAoE")]
|
||||
public void should_parse_release_group(string title, string expected)
|
||||
{
|
||||
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
Parser.ReleaseGroupParser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("Movie Name (2020) [2160p x265 10bit S82 Joy]", "Joy")]
|
||||
[TestCase("Movie Name (2003) (2160p BluRay X265 HEVC 10bit HDR AAC 7.1 Tigole) [QxR]", "Tigole")]
|
||||
[TestCase("Movie Name (2003) (2160p BluRay X265 HEVC 10bit HDR AAC 7.1 Tigole) [QxR]", "QxR")]
|
||||
[TestCase("Ode To Joy (2009) (2160p BluRay x265 10bit HDR Joy)", "Joy")]
|
||||
[TestCase("Movie Name (2001) 1080p NF WEB-DL DDP2.0 x264-E.N.D", "E.N.D")]
|
||||
[TestCase("Movie Name (2020) [1080p] [WEBRip] [5.1] [YTS.MX]", "YTS.MX")]
|
||||
@@ -109,7 +109,8 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
[TestCase("Movie Title (2022) (2160p ATV WEB-DL Hybrid H265 DV HDR DDP Atmos 5.1 English - HONE)", "HONE")]
|
||||
[TestCase("Movie Title (2009) (2160p PMTP WEB-DL Hybrid H265 DV HDR10+ DDP Atmos 5.1 English - HONE)", "HONE")]
|
||||
[TestCase("Why.Cant.You.Use.Normal.Characters.2021.2160p.UHD.HDR10+.BluRay.TrueHD.Atmos.7.1.x265-ZØNEHD", "ZØNEHD")]
|
||||
[TestCase("Movie.Should.Not.Use.Dots.2022.1080p.BluRay.x265.10bit.Tigole", "Tigole")]
|
||||
[TestCase("Movie.Should.Not.Use.Dots.2022.1080p.BluRay.x265.10bit.Tigole)", "Tigole")]
|
||||
[TestCase("Movie.Should.Not.Use.Dots.2022.1080p.BluRay.x265.10bit.Tigole", null)]
|
||||
[TestCase("Movie.Title.2005.2160p.UHD.BluRay.TrueHD 7.1.Atmos.x265 - HQMUX", "HQMUX")]
|
||||
[TestCase("Movie.Name.2022.1080p.BluRay.x264-VARYG (Blue Lock, Multi-Subs)", "VARYG")]
|
||||
[TestCase("Movie Title (2023) (1080p BluRay x265 SDR AAC 2.0 English Vyndros)", "Vyndros")]
|
||||
@@ -117,8 +118,8 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
[TestCase("Movie Title (2011) [BluRay] [1080p] [YTS.MX] [YIFY]", "YIFY")]
|
||||
[TestCase("Movie Title (2014) [BluRay] [1080p] [YIFY] [YTS]", "YTS")]
|
||||
[TestCase("Movie Title (2018) [BluRay] [1080p] [YIFY] [YTS.LT]", "YTS.LT")]
|
||||
[TestCase("Movie Title (2016) (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5 1 RZeroX) QxR", "RZeroX")]
|
||||
[TestCase("Movie Title (2016) (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5 1 Garshasp) QxR", "Garshasp")]
|
||||
[TestCase("Movie Title (2016) (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5 1 RZeroX) QxR", "QxR")]
|
||||
[TestCase("Movie Title (2016) (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5 1 Garshasp) QxR", "QxR")]
|
||||
[TestCase("Movie Title 2024 mUHD 10Bits DoVi HDR10 2160p BluRay DD 5 1 x265 - TMd", "TMd")]
|
||||
[TestCase("Movie Title 2024 mUHD 10Bits DoVi HDR10 2160p BluRay DD 5 1 x265 TMd", "TMd")]
|
||||
[TestCase("Movie Title (2024) 2160p WEB-DL ESP DD+ 5.1 ING DD+ 5.1 Atmos DV HDR H.265-Eml HDTeam", "Eml HDTeam")]
|
||||
@@ -126,15 +127,16 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
[TestCase("Movie Title (2022) BDFull 1080p DTS-HD MA 5.1 AVC LMain", "LMain")]
|
||||
[TestCase("Movie Title (2024) (1080p BluRay x265 SDR DDP 5.1 English - DarQ)", "DarQ")]
|
||||
[TestCase("Movie Title (2024) (1080p BluRay x265 SDR DDP 5.1 English -BEN THE MEN", "BEN THE MEN")]
|
||||
[TestCase("Movie Title 2024 2160p WEB-DL DoVi HDR10+ H265 DDP 5.1 Atmos-126811", "126811")]
|
||||
public void should_parse_exception_release_group(string title, string expected)
|
||||
{
|
||||
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
Parser.ReleaseGroupParser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase(@"C:\Test\Doctor.Series.2005.s01e01.internal.bdrip.x264-archivist.mkv", "archivist")]
|
||||
public void should_not_include_extension_in_release_group(string title, string expected)
|
||||
{
|
||||
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
Parser.ReleaseGroupParser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("Some.Movie.S02E04.720p.WEBRip.x264-SKGTV English", "SKGTV")]
|
||||
@@ -143,7 +145,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
|
||||
public void should_not_include_language_in_release_group(string title, string expected)
|
||||
{
|
||||
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
Parser.ReleaseGroupParser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("Some.Movie.2019.1080p.BDRip.X264.AC3-EVO-RP", "EVO")]
|
||||
@@ -173,7 +175,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
|
||||
public void should_not_include_bad_suffix_in_release_group(string title, string expected)
|
||||
{
|
||||
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
Parser.ReleaseGroupParser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("[FFF] Invaders of the Movies!! - S01E11 - Someday, With Movies", "FFF")]
|
||||
@@ -184,13 +186,13 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
|
||||
public void should_parse_anime_release_groups(string title, string expected)
|
||||
{
|
||||
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
Parser.ReleaseGroupParser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("Terrible.Anime.Title.2020.DBOX.480p.x264-iKaos [v3] [6AFFEF6B]")]
|
||||
public void should_not_parse_anime_hash_as_release_group(string title)
|
||||
{
|
||||
Parser.Parser.ParseReleaseGroup(title).Should().BeNull();
|
||||
Parser.ReleaseGroupParser.ParseReleaseGroup(title).Should().BeNull();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
[TestCase("Movie Title Future 2023 DVDRip XviD RUNNER[www.allstate.net]", null)]
|
||||
public void should_not_parse_url_in_group(string title, string expected)
|
||||
{
|
||||
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
Parser.ReleaseGroupParser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.MediaFiles.MediaInfo;
|
||||
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
@@ -809,7 +810,7 @@ namespace NzbDrone.Core.Datastore.Migration
|
||||
|
||||
private static string GetSceneNameMatch(string sceneName, params string[] tokens)
|
||||
{
|
||||
sceneName = sceneName.IsNotNullOrWhiteSpace() ? Parser.Parser.RemoveFileExtension(sceneName) : string.Empty;
|
||||
sceneName = sceneName.IsNotNullOrWhiteSpace() ? FileExtensions.RemoveFileExtension(sceneName) : string.Empty;
|
||||
|
||||
foreach (var token in tokens)
|
||||
{
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace NzbDrone.Core.ImportLists.RadarrList2.IMDbList
|
||||
|
||||
public override IParseImportListResponse GetParser()
|
||||
{
|
||||
return new IMDbListParser(Settings);
|
||||
return new IMDbListParser(Settings, _logger);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.MetadataSource.SkyHook.Resource;
|
||||
@@ -11,10 +12,12 @@ namespace NzbDrone.Core.ImportLists.RadarrList2.IMDbList
|
||||
public class IMDbListParser : RadarrList2Parser
|
||||
{
|
||||
private readonly IMDbListSettings _settings;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public IMDbListParser(IMDbListSettings settings)
|
||||
public IMDbListParser(IMDbListSettings settings, Logger logger)
|
||||
{
|
||||
_settings = settings;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public override IList<ImportListMovie> ParseResponse(ImportListResponse importListResponse)
|
||||
@@ -25,6 +28,7 @@ namespace NzbDrone.Core.ImportLists.RadarrList2.IMDbList
|
||||
|
||||
if (!PreProcess(importResponse))
|
||||
{
|
||||
_logger.Debug("IMDb List {0}: Found {1} movies", _settings.ListId, movies.Count);
|
||||
return movies;
|
||||
}
|
||||
|
||||
@@ -34,20 +38,19 @@ namespace NzbDrone.Core.ImportLists.RadarrList2.IMDbList
|
||||
var rows = importResponse.Content.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
movies = rows.Skip(1).SelectList(m => m.Split(',')).Where(m => m.Length > 5).SelectList(i => new ImportListMovie { ImdbId = i[1], Title = i[5] });
|
||||
|
||||
return movies;
|
||||
}
|
||||
else
|
||||
{
|
||||
var jsonResponse = JsonConvert.DeserializeObject<List<MovieResource>>(importResponse.Content);
|
||||
|
||||
if (jsonResponse == null)
|
||||
if (jsonResponse != null)
|
||||
{
|
||||
return movies;
|
||||
movies = jsonResponse.SelectList(m => new ImportListMovie { TmdbId = m.TmdbId });
|
||||
}
|
||||
|
||||
return jsonResponse.SelectList(m => new ImportListMovie { TmdbId = m.TmdbId });
|
||||
}
|
||||
|
||||
_logger.Debug("IMDb List {0}: Found {1} movies", _settings.ListId, movies.Count);
|
||||
return movies;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,16 +9,22 @@ namespace NzbDrone.Core.ImportLists.RadarrList2.IMDbList
|
||||
|
||||
protected override HttpRequest GetHttpRequest()
|
||||
{
|
||||
Logger.Info("IMDb List {0}: Importing movies", Settings.ListId);
|
||||
|
||||
// Use IMDb list Export for user lists to bypass RadarrAPI caching
|
||||
if (Settings.ListId.StartsWith("ls", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
throw new Exception("IMDb lists of the form 'ls12345678' are no longer supported. Feel free to remove this list after you review your Clean Library Level.");
|
||||
}
|
||||
|
||||
return RequestBuilder.Create()
|
||||
var request = RequestBuilder.Create()
|
||||
.SetSegment("route", $"list/imdb/{Settings.ListId}")
|
||||
.Accept(HttpAccept.Json)
|
||||
.Build();
|
||||
|
||||
Logger.Trace("IMDb List {0}: Request URL: {1}", Settings.ListId, request.Url);
|
||||
|
||||
return request;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1386,5 +1386,141 @@
|
||||
"RemotePathMappingCheckFilesBadDockerPath": "Používáte docker; klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
|
||||
"RemotePathMappingCheckDockerFolderMissing": "Používáte docker; klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka v tomto konejneru neexistuje. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
|
||||
"RemotePathMappingsInfo": "Mapování vzdálených cest je potřeba pouze ve výjimečných případech. Pokud {appName} a klient pro stahování je na stejném systému, je lepší cesty tak, aby byly všude stejné. Více informací naleznete na [wiki]({wikiLink}).",
|
||||
"RemotePathMappingCheckRemoteDownloadClient": "Vzdálený klient pro stahování {downloadClientName} hlásí soubory v {path}, ale vypadá to, že taková složka neexistuje. Pravděpodobně chybí nastavení mapování vzdálených cest."
|
||||
"RemotePathMappingCheckRemoteDownloadClient": "Vzdálený klient pro stahování {downloadClientName} hlásí soubory v {path}, ale vypadá to, že taková složka neexistuje. Pravděpodobně chybí nastavení mapování vzdálených cest.",
|
||||
"SmartReplaceHint": "Pomlčka nebo mezera pomlčka, podle jména",
|
||||
"EnableProfileHelpText": "Zaškrnutím zapnete profil vydání",
|
||||
"NotificationsEmbySettingsUpdateLibraryHelpText": "Aktualizovat knihovnu při importu, přejmenování nebo smazání?",
|
||||
"NotificationsKodiSettingsDisplayTime": "Zobrazit čas",
|
||||
"LogSizeLimit": "Limit velikosti logových souborů",
|
||||
"LogSizeLimitHelpText": "Maximální velikost souboru s logy v MB před jeho archivací. Výchozí je 1MB.",
|
||||
"Logout": "Odhlásit",
|
||||
"NoCustomFormatsFound": "Nenalezeny žádné vlastní formáty",
|
||||
"NotificationsKodiSettingsCleanLibrary": "Vyčistit knihovnu",
|
||||
"RemoveQueueItem": "Odebrat - {sourceTitle}",
|
||||
"RemoveSelectedItem": "Odebrat vybranou položku",
|
||||
"Started": "Běží",
|
||||
"UseSsl": "Použít SSL",
|
||||
"LastSearched": "Poslední hledání",
|
||||
"OnHealthRestored": "Při obnovení zdraví",
|
||||
"InstanceName": "Jméno instance",
|
||||
"InfoUrl": "Info URL",
|
||||
"DownloadClientSettingsPostImportCategoryHelpText": "Kategorie, kterou {appName} nastaví po importu staženého souboru. {appName} nebude odebírat torrenty této kategorie i když už nebudou dále seedovány. Nechte prázdné pro ponechání stejné kategorie.",
|
||||
"IgnoreDownloadHint": "Zabrání {appName} v dalším zpracování tohoto stahování",
|
||||
"IndexerSettingsSeedRatio": "Poměr sdílení",
|
||||
"NotificationsKodiSettingAlwaysUpdateHelpText": "Aktualizovat knihovnu i když se přehrává video?",
|
||||
"NotificationsPlexSettingsAuthenticateWithPlexTv": "Autentizovat s Plex.tv",
|
||||
"ParseModalHelpTextDetails": "{appName} se pokusí zpracovat název a ukáže vám výsledek",
|
||||
"PendingDownloadClientUnavailable": "Čeká - klient pro stahování není dostupný",
|
||||
"Period": "Období",
|
||||
"ResetQualityDefinitions": "Obnovit definice kvality",
|
||||
"SelectReleaseGroup": "Vybrat skupinu vydání",
|
||||
"IgnoreDownload": "Ignorovat stažení",
|
||||
"IndexerSettingsApiUrlHelpText": "Neměňte tohle, pokud nevíte, co děláte. Váš API klíč bude odeslán na toho hosta.",
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashes": "Odmítnout blacklistované hashe torrentů při stahování",
|
||||
"MassSearchCancelWarning": "Akce nemůže být po spuštění zastavena jinak, než restartem {appName} nebo vypnutím všech indexerů.",
|
||||
"MonitorSelected": "Monitorovat vybrané",
|
||||
"NotificationsKodiSettingAlwaysUpdate": "Vždy aktualizovat",
|
||||
"NotificationsKodiSettingsUpdateLibraryHelpText": "Aktualizovat knihovnu při importu a přejmenování?",
|
||||
"NotificationsSettingsUseSslHelpText": "Připojovat se k {serviceName} pomocí HTTPS místo HTTP",
|
||||
"Parse": "Zpracování",
|
||||
"ParseModalHelpText": "Zadejte název vydání do pole výše",
|
||||
"RemoveCompletedDownloads": "Odebrat dokončená stahování",
|
||||
"SkipRedownloadHelpText": "Zabraňuje {appName} zkoušet stahovat alternativní vydání pro odebrané položky",
|
||||
"SmartReplace": "Chytré nahrazení",
|
||||
"NotificationsPlexSettingsAuthToken": "Autorizační token",
|
||||
"NotificationsTelegramSettingsIncludeAppName": "Vložit {appName} do titulku",
|
||||
"NotificationsTelegramSettingsIncludeAppNameHelpText": "Přidat {appName} před titulek zprávy pro odlišení notifikací z jiných aplikací",
|
||||
"PostImportCategory": "Kategorie po importu",
|
||||
"PreferProtocol": "Preferovat {preferredProtocol}",
|
||||
"PreviouslyInstalled": "Minulá instalace",
|
||||
"ListRefreshInterval": "Interval obnovení seznamu",
|
||||
"NotificationsSettingsUpdateLibrary": "Aktualizovat knihovnu",
|
||||
"NotificationsSettingsUpdateMapPathsTo": "Mapovat cestu na",
|
||||
"RemoveCompleted": "Odebrat dokončené",
|
||||
"NotificationsEmbySettingsSendNotifications": "Poslat notifikace",
|
||||
"NotificationsKodiSettingsGuiNotification": "GUI notifikace",
|
||||
"QueueFilterHasNoItems": "Vybraný filtr fronty nemá žádné položky",
|
||||
"TestParsing": "Test parsování",
|
||||
"MissingNoItems": "Žádné chybějící položky",
|
||||
"SelectIndexerFlags": "Vybrat příznaky indexeru",
|
||||
"RegularExpressionsTutorialLink": "Více detailů o regulárních výrazech naleznete [zde]({url}).",
|
||||
"RemoveFailed": "Odebrání selhalo",
|
||||
"RemoveQueueItemRemovalMethod": "Metoda odebrání",
|
||||
"UnmonitorSelected": "Nemonitorovat vybrané",
|
||||
"SizeLimit": "Limit velikosti",
|
||||
"Space": "Mezera",
|
||||
"False": "Nepravda",
|
||||
"IgnoreDownloads": "Ignorovat stahování",
|
||||
"NotificationsKodiSettingsCleanLibraryHelpText": "Vyčistit knihovnu po aktualizaci",
|
||||
"DownloadClientSettingsOlderPriority": "Starší priorita",
|
||||
"FormatShortTimeSpanHours": "{hours} hodin(a/y)",
|
||||
"FormatRuntimeMinutes": "{minutes}m",
|
||||
"FormatShortTimeSpanMinutes": "{minutes} minut(a/y)",
|
||||
"OnApplicationUpdate": "Při aktualizaci aplikace",
|
||||
"Rejections": "Odmítnutí",
|
||||
"RemoveMultipleFromDownloadClientHint": "Odebrat stahování a soubory z klienta pro stahování",
|
||||
"RemoveTagsAutomatically": "Automaticky odebrat tagy",
|
||||
"RemoveTagsAutomaticallyHelpText": "Automaticky odebrat tagy, pokud podmínky nejsou splněny",
|
||||
"Repack": "Repack",
|
||||
"RootFolderPath": "Cesta kořenového adresáře",
|
||||
"ManageClients": "Spravovat klienty",
|
||||
"ErrorLoadingContent": "Nastala chyba při načítání obsahu",
|
||||
"ErrorLoadingItem": "Nastala chyba při načítání této položky",
|
||||
"ErrorLoadingPage": "Nastala chyba při načítání této stránky",
|
||||
"IndexerSettingsSeedRatioHelpText": "Poměr, kterého by torrent měl dosáhnout před zastavením sdílení, prázdná hodnota použije výchozí hodnotu klienta stahování. Poměr sdílení by měl být alespoň 1.0 a měl by plnit pravidla indexeru",
|
||||
"IndexerSettingsSeedTimeHelpText": "Doba, po kterou bude torrent sdílen před zastavením, prázdná hodnota použije výchozí hodnotu klienta stahování",
|
||||
"Install": "Instalovat",
|
||||
"InteractiveSearchModalHeaderTitle": "Interaktivní hledání - {title}",
|
||||
"InvalidUILanguage": "Vaše UI má nastaveno neplatný jazyk, opravte jej a uložte nastavení",
|
||||
"LabelIsRequired": "Název je vyžadován",
|
||||
"LogFilesLocation": "Soubory s logy jsou uloževy v {location}",
|
||||
"ManageCustomFormats": "Spravovat vlastní formáty",
|
||||
"ManageDownloadClients": "Spravovat klienty stahování",
|
||||
"ManageFormats": "Spravovat formáty",
|
||||
"ManageImportLists": "Spravovat importní seznamy",
|
||||
"ManageIndexers": "Spravovat indexery",
|
||||
"ManageLists": "Spravovat seznamy",
|
||||
"Menu": "Menu",
|
||||
"NoDownloadClientsFound": "Nenalezen žádný klient stahování",
|
||||
"NoImportListsFound": "Nenalezen žádný importní seznam",
|
||||
"NoIndexersFound": "Nenalezen žádný indexer",
|
||||
"NotificationsSettingsWebhookHeaders": "Hlavičky",
|
||||
"RemoveFromDownloadClientHint": "Odebrat stahování a soubor(y) z klienta pro stahování",
|
||||
"RemoveQueueItemRemovalMethodHelpTextWarning": "'Odebrat z klienta pro stahování' odebere stahování soubor(y) z klienta pro stahování.",
|
||||
"RemoveSelectedItems": "Odebrat vybrané položky",
|
||||
"ResetQualityDefinitionsMessageText": "Opravdu chcete obnovit definice kvality?",
|
||||
"ResetTitles": "Obnovit názvy",
|
||||
"ResetDefinitions": "Obnovit definice",
|
||||
"UnableToImportAutomatically": "Automatický import se nezdařil",
|
||||
"SkipRedownload": "Přeskočit opětovné stažení",
|
||||
"FormatShortTimeSpanSeconds": "{seconds} vteřin(a/y)",
|
||||
"Never": "Nikdy",
|
||||
"True": "Pravda",
|
||||
"EnableRssHelpText": "Bude použito, když {appName} pravidelně vyhledává vydání pomocí RSS",
|
||||
"DownloadClientPriorityHelpText": "Priorita klienta pro stahování od 1 (nejvyšší) do 50 (nejnižší). Výchozí: 1. Pro klienty se stejnou prioritou se používá funkce Round-Robin.",
|
||||
"IgnoreDownloadsHint": "Zabrání {appName} v dalším zpracování těchto stahování",
|
||||
"ParseModalErrorParsing": "Chyba zpracování, zkuste to prosím znovu.",
|
||||
"ParseModalUnableToParse": "Nepodařilo se zpracovat zadaný název, zkuste to prosím znovu.",
|
||||
"PasswordConfirmation": "Potvrzení hesla",
|
||||
"RemoveDownloadsAlert": "Natavení \"Odebrání\" byla přesunuta do jednotlivých klientů pro stahování v tabulce výše.",
|
||||
"RemoveFailedDownloads": "Odebrat neúspěšná stahování",
|
||||
"RemoveQueueItemsRemovalMethodHelpTextWarning": "'Odebrat z klienta pro stahování' odebere stahování soubory z klienta pro stahování.",
|
||||
"ResetDefinitionTitlesHelpText": "Obnovit názvy definice včetně jejich hodnot",
|
||||
"ListRootFolderHelpText": "Kořenová složka, do které budou přidány položky seznamu",
|
||||
"ThemeHelpText": "Změnit motiv UI, možnost „Auto“ kopíruje nastavení OS pro výběr tmavého nebo světlého režimu. Inspirováno theme.park",
|
||||
"UpdateAvailableHealthCheckMessage": "Nová verze je k dispozici: {version}",
|
||||
"SkipFreeSpaceCheckHelpText": "Použijte v případě, kdy {appName} správně nedetekuje volné místo vaší kořenové složky",
|
||||
"UpdateFiltered": "Aktualizace filtrována",
|
||||
"EditSelectedCustomFormats": "Upravit vybrané vlastní formáty",
|
||||
"FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}",
|
||||
"FormatRuntimeHours": "{hours}h",
|
||||
"FormatTimeSpanDays": "{days}d {time}",
|
||||
"NotificationsKodiSettingsDisplayTimeHelpText": "Jak dlouho má zůstat notifikace zobrazena (s)",
|
||||
"IndexerSettingsSeedTime": "Doba sdílení",
|
||||
"InstallMajorVersionUpdate": "Instalovat aktualizaci",
|
||||
"InstallMajorVersionUpdateMessage": "Tato aktualizace nainstaluje novou major verzi, která nemusí být kompatibilní s vaším systémem. Pokračovat v instalaci?",
|
||||
"InstallMajorVersionUpdateMessageLink": "Pro více informací prosím navštivte [{domain}]({url}).",
|
||||
"InstanceNameHelpText": "Jméno instance v záložce a v syslogu",
|
||||
"SetIndexerFlags": "Nastavit příznaky indexeru",
|
||||
"ReleaseProfileIndexerHelpText": "Výběr, jakých indexerů se profil týká"
|
||||
}
|
||||
|
||||
@@ -2036,5 +2036,6 @@
|
||||
"NotificationsPushcutSettingsIncludePoster": "Incluir póster",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Incluir póster con notificación",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Enlaces de metadatos",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Añade un enlace a los metadatos de las series cuando se envían notificaciones"
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Añade un enlace a los metadatos de las series cuando se envían notificaciones",
|
||||
"FilterMoviePropertiesOnlyNotFileWarning": "Los filtros están disponibles solo para las propiedades de una película, no para las propiedades del archivo(s) que puedas tener para esa película."
|
||||
}
|
||||
|
||||
@@ -2036,5 +2036,6 @@
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Lien de métadonnées",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Ajouter un lien vers les métadonnées de la série lors de l'envoi de notifications",
|
||||
"ImportListsTraktSettingsGenresMovieHelpText": "Filtrer les films par genre Trakt (séparés par des virgules) Uniquement pour les listes populaires",
|
||||
"ReleasePush": "Poussée de version"
|
||||
"ReleasePush": "Poussée de version",
|
||||
"FilterMoviePropertiesOnlyNotFileWarning": "Les filtres sont seulement disponibles pour les propriétés d'un film, ils ne sont pas disponibles pour les propriétés du ou des fichiers que vous pouvez avoir pour ce film."
|
||||
}
|
||||
|
||||
@@ -1265,5 +1265,95 @@
|
||||
"IndexerHDBitsSettingsCodecs": "Codec",
|
||||
"IndexerHDBitsSettingsMediums": "Gemiddeld",
|
||||
"IndexerSettingsCategories": "Categorieën",
|
||||
"ReleaseProfile": "releaseprofiel"
|
||||
"ReleaseProfile": "releaseprofiel",
|
||||
"DownloadClientFloodSettingsAddPaused": "Toevoegen gepauzeerd",
|
||||
"ImportListsTraktSettingsAdditionalParameters": "Aanvullende parameters",
|
||||
"IndexerHDBitsSettingsCategoriesHelpText": "Als niet gespecificeerd, worden alle opties gebruikt.",
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Als een torrent wordt geblokkeerd op basis van de hash, kan het zijn dat deze niet correct wordt geweigerd tijdens RSS/Search bij sommige indexers. Als je deze optie inschakelt, wordt de torrent alsnog geweigerd nadat hij is opgehaald, maar voordat hij naar de client wordt gestuurd.",
|
||||
"NotificationsDiscordSettingsAuthor": "Auteur",
|
||||
"NotificationsGotifySettingsAppToken": "App Token",
|
||||
"UsenetBlackholeNzbFolder": "Nzb map",
|
||||
"IndexerSettingsApiUrl": "API URL",
|
||||
"DefaultNameCopiedSpecification": "{name} - Kopie",
|
||||
"DefaultNameCopiedImportList": "{name} - Kopie",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Bent u zeker dat u de indexeerder '{count}' wilt verwijderen?",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "App ID die wordt gegeven bij het aanmaken van toegang tot de Freebox API (bijv. 'app_id')",
|
||||
"DownloadClientFreeboxSettingsAppToken": "App Token",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "App token dat wordt verkregen bij het aanmaken van toegang tot de Freebox API (bijv. 'app_token')",
|
||||
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Deze map moet bereikbaar zijn vanuit XBMC",
|
||||
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Als je dit inschakelt, worden torrents en magnet-links in rTorrent in een gestopte staat toegevoegd. Dit kan magnet-bestanden laten mislukken.",
|
||||
"DownloadClientSettingsUseSslHelpText": "Gebruik een beveiligde verbinding bij het verbinden met {clientName}",
|
||||
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de {clientName} RPC-URL, bijvoorbeeld {url}, standaard is '{defaultUrl}'",
|
||||
"DownloadClientValidationSslConnectFailureDetail": "{appName} kan niet verbinden met {clientName} via SSL. Dit probleem kan computergerelateerd zijn. Probeer alstublieft om {appName} en {clientName} te configureren om geen SSL te gebruiken.",
|
||||
"DownloadClientValidationTestTorrents": "Kon de lijst van torrents niet verkrijgen: {exceptionMessage}",
|
||||
"External": "Extern",
|
||||
"Implementation": "Implementatie",
|
||||
"IndexerSettingsApiUser": "API Gebruiker",
|
||||
"DownloadClientValidationCategoryMissingDetail": "De ingevoerde categorie bestaat niet in {clientName}. Voeg deze eerst toe in {clientName}.",
|
||||
"FailedToFetchUpdates": "Updates ophalen mislukt",
|
||||
"IndexerSettingsAdditionalParameters": "Aanvullende parameters",
|
||||
"DownloadClientDelugeSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de Deluge JSON-URL, zie {url}",
|
||||
"DownloadClientPneumaticSettingsStrmFolder": "Strm Map",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Of de ingestelde inhoudsindeling van qBittorrent gebruikt moet worden, de originele indeling van de torrent, of altijd een submap moet worden aangemaakt (qBittorrent 4.3.2+)",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Eerste en laatste eerst",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Download eerste en laatste stukjes eerst (qBittorrent 4.1.0+)",
|
||||
"DownloadClientRTorrentSettingsDirectoryHelpText": "Optionele locatie om downloads op te slaan, leeg laten om de standaardlocatie van rTorrent te gebruiken",
|
||||
"DownloadClientRTorrentSettingsUrlPathHelpText": "Pad naar het XMLRPC-eindpunt, zie {url}. Dit is meestal RPC2 of [pad naar ruTorrent]{url2} bij gebruik van ruTorrent.",
|
||||
"DownloadClientSettingsAddPaused": "Toevoegen gepauzeerd",
|
||||
"DownloadClientValidationAuthenticationFailure": "Authenticatiefout",
|
||||
"DownloadClientValidationAuthenticationFailureDetail": "Gelieve uw gebruikersnaam en wachtwoord te verifiëren. Verifieer ook of de host waar {appName} op draait niet geblokkeerd is voor toegang tot {clientName} door Whitelist limitaties in de {clientName} instellingen.",
|
||||
"DownloadClientValidationCategoryMissing": "Categorie bestaat niet",
|
||||
"DownloadClientValidationVerifySsl": "Verifieer SSL instellingen",
|
||||
"DownloadClientValidationVerifySslDetail": "Gelieve uw SSL-configuratie te verifiëren in zowel {clientName} als {appName}",
|
||||
"IndexerHDBitsSettingsCodecsHelpText": "Als niet gespecificeerd, worden alle opties gebruikt.",
|
||||
"IndexerSettingsApiPath": "API pad",
|
||||
"IndexerSettingsApiPathHelpText": "Pad naar de API, meestal {url}",
|
||||
"DownloadClientFloodSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de Flood API, zoals {url}",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Stel de basis-URL van de Freebox API in met API-versie, bijvoorbeeld '{url}', standaard is '{defaultApiUrl}'",
|
||||
"DownloadClientFreeboxSettingsAppId": "App ID",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Hostnaam of IP-adres van de Freebox, standaard '{url}' (werkt alleen als je op hetzelfde netwerk zit)",
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "Poort die wordt gebruikt om toegang te krijgen tot de Freebox-interface, standaard '{port}'",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "Deze optie vereist minimaal NzbGet versie 16.0",
|
||||
"DownloadClientQbittorrentSettingsUseSslHelpText": "Gebruik een beveiligde verbinding. Zie Opties -> Web UI -> 'Gebruik HTTPS in plaats van HTTP' in qBittorrent.",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexeerders met ongeldige downloadclients: {indexerNames}.",
|
||||
"IndexerHDBitsSettingsMediumsHelpText": "Als niet gespecificeerd, worden alle opties gebruikt.",
|
||||
"IndexerNewznabSettingsAdditionalParametersHelpText": "Aanvullende Newznab-parameters",
|
||||
"Default": "Standaard",
|
||||
"Destination": "Bestemming",
|
||||
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Optionele gedeelde map om downloads in te plaatsen, leeg laten om de standaardlocatie van Download Station te gebruiken",
|
||||
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Voegt eigenschappen van media toe als tags. Hints zijn voorbeelden.",
|
||||
"DownloadClientFloodSettingsTagsHelpText": "Initiële tags van een download. Om herkend te worden, moet een download alle initiële tags hebben. Dit voorkomt conflicten met niet-gerelateerde downloads.",
|
||||
"DownloadClientFreeboxSettingsApiUrl": "API URL",
|
||||
"DownloadClientRTorrentSettingsAddStopped": "Toevoegen gestopt",
|
||||
"DownloadClientRTorrentSettingsUrlPath": "Url pad",
|
||||
"DownloadClientSettingsInitialState": "Initiële staat",
|
||||
"DownloadClientUTorrentTorrentStateError": "uTorrent rapporteert een fout",
|
||||
"DownloadClientTransmissionSettingsDirectoryHelpText": "Optionele locatie om downloads op te slaan, laat leeg om de standaardlocatie van Transmission te gebruiken",
|
||||
"DownloadClientValidationGroupMissingDetail": "De ingevoerde groep bestaat niet in {clientName}. Voeg deze eerst toe in {clientName}.",
|
||||
"DownloadClientValidationSslConnectFailure": "Kan niet verbinden via SSL",
|
||||
"DownloadClientValidationTestNzbs": "Kon de lijst van NZBs niet verkrijgen: {exceptionMessage}",
|
||||
"DownloadClientValidationUnableToConnectDetail": "Gelieve de hostnaam en poort te verifiëren.",
|
||||
"DownloadClientVuzeValidationErrorVersion": "Protocolversie niet ondersteund, gebruik Vuze 5.0.0.0 of hoger met de Vuze Web Remote plugin.",
|
||||
"IndexerSettingsCookie": "Cookie",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Optionele locatie om downloads op te slaan, leeg laten om de standaardlocatie van Aria2 te gebruiken",
|
||||
"DownloadClientFloodSettingsAdditionalTags": "Additionele Tags",
|
||||
"DownloadClientPneumaticSettingsStrmFolderHelpText": ".strm-bestanden in deze map worden geïmporteerd door Drone",
|
||||
"DefaultNameCopiedProfile": "{name} - Kopie",
|
||||
"DeleteSelectedIndexersMessageText": "Bent u zeker dat u de indexeerder '{count}' wilt verwijderen?",
|
||||
"DownloadClientSettingsDestinationHelpText": "Geef handmatig de downloadbestemming op, laat leeg om de standaardlocatie te gebruiken",
|
||||
"DownloadClientSettingsInitialStateHelpText": "Begintoestand voor torrents die aan {clientName} worden toegevoegd",
|
||||
"DownloadClientValidationErrorVersion": "{clientName} versie moet tenminste {requiredVersion} zijn. Gerapporteerde versie is {reportedVersion}",
|
||||
"DownloadClientValidationGroupMissing": "Groep bestaat niet",
|
||||
"DownloadClientValidationUnableToConnect": "Kon niet verbinden met {clientName}",
|
||||
"DownloadClientUTorrentProviderMessage": "uTorrent heeft een geschiedenis van het bevatten van cryptominers, malware en advertenties. We raden je sterk aan om een andere client te kiezen.",
|
||||
"DownloadClientValidationApiKeyIncorrect": "API-sleutel Incorrect",
|
||||
"DownloadClientValidationApiKeyRequired": "API-sleutel Nodig",
|
||||
"EditSelectedDownloadClients": "Geselecteerde downloadclients bewerken",
|
||||
"EditSelectedIndexers": "Geselecteerde indexeerders bewerken",
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "Nzb map",
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Begintoestand voor torrents die aan qBittorrent worden toegevoegd. Let op: Gedwongen torrents houden zich niet aan seeding-beperkingen",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrder": "Opeenvolgende volgorde",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Download in opeenvolgende volgorde (qBittorrent 4.1.0+)",
|
||||
"DownloadClientValidationUnknownException": "Onbekende fout: {exception}",
|
||||
"Donate": "Doneer"
|
||||
}
|
||||
|
||||
@@ -10,16 +10,16 @@
|
||||
"AppDataLocationHealthCheckMessage": "Aktualizacja nie będzie możliwa w celu uniknięcia usunięcia danych aplikacji",
|
||||
"Analytics": "Analityka",
|
||||
"All": "Wszystkie",
|
||||
"Agenda": "Lista",
|
||||
"Agenda": "Terminarz",
|
||||
"AddNewTmdbIdMessage": "Możesz również użyć ID TMDb, np. 'tmdb:71663'",
|
||||
"AddNewMessage": "Dodanie nowego filmu jest bardzo łatwe, po prostu zacznij wpisywać nazwę jakiegoś filmu",
|
||||
"AddNewMessage": "Dodanie nowego filmu jest bardzo łatwe, po prostu zacznij wpisywać nazwę",
|
||||
"AddNew": "Dodaj nowy",
|
||||
"AddMovies": "Dodaj filmy",
|
||||
"AddExclusion": "Dodaj wyjątek",
|
||||
"Added": "Dodane",
|
||||
"Activity": "Aktywność",
|
||||
"Actions": "Akcje",
|
||||
"About": "O",
|
||||
"About": "Informacje",
|
||||
"Component": "Składnik",
|
||||
"DeleteMovieFolder": "Usuń folder filmu",
|
||||
"FileNameTokens": "Tokeny nazw plików",
|
||||
@@ -74,7 +74,7 @@
|
||||
"CustomFormatHelpText": "{appName} ocenia każde wydanie, używając sumy wyników za dopasowanie niestandardowych formatów. Jeśli nowa wersja poprawiłaby wynik, przy tej samej lub lepszej jakości, {appName} ją złapie.",
|
||||
"CustomFormats": "Formaty niestandardowe",
|
||||
"Ended": "Zakończone",
|
||||
"CutoffUnmet": "Odcięcie niespełnione",
|
||||
"CutoffUnmet": "Nie spełnia wymagań",
|
||||
"Deleted": "Usunięto",
|
||||
"DeleteFile": "Usunąć plik",
|
||||
"DeleteSelectedMovieFiles": "Usuń wybrane pliki filmowe",
|
||||
@@ -85,7 +85,7 @@
|
||||
"EditCustomFormat": "Edytuj format niestandardowy",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Automatycznie importuj ukończone pliki do pobrania z klienta pobierania",
|
||||
"SearchIsNotSupportedWithThisIndexer": "Wyszukiwanie nie jest obsługiwane przez ten indeksator",
|
||||
"AnalyseVideoFilesHelpText": "Wyodrębnij z plików informacje wideo, takie jak rozdzielczość, czas działania i kodeki. Wymaga to odczytu przez {appName} części pliku, które mogą powodować dużą aktywność dysku lub sieci podczas skanowania.",
|
||||
"AnalyseVideoFilesHelpText": "Wyodrębnij z plików informacje o wideo, takie jak rozdzielczość, czas trwania i kodeki. Wymaga to odczytu przez {appName} części pliku, które mogą powodować dużą aktywność dysku lub sieci podczas skanowania.",
|
||||
"ChangeFileDateHelpText": "Zmień datę pliku przy imporcie / ponownym skanowaniu",
|
||||
"FollowPerson": "Śledź osobę",
|
||||
"Genres": "Gatunki",
|
||||
@@ -124,9 +124,9 @@
|
||||
"TagsSettingsSummary": "Zobacz wszystkie tagi i sposób ich używania. Nieużywane tagi można usunąć",
|
||||
"TheLogLevelDefault": "Poziom dziennika jest domyślnie ustawiony na „Informacje” i można go zmienić w",
|
||||
"TorrentDelayTime": "Opóźnienie torrenta: {0}",
|
||||
"AddIndexerError": "Nie można dodać nowego indeksatora, spróbuj ponownie.",
|
||||
"AddQualityProfileError": "Nie udało się dodać nowego profilu jakości, spróbuj później.",
|
||||
"AddRemotePathMappingError": "Nie można dodać nowego mapowania ścieżki zdalnej, spróbuj ponownie.",
|
||||
"AddIndexerError": "Nie można dodać nowego indeksera, spróbuj ponownie.",
|
||||
"AddQualityProfileError": "Nie udało się dodać nowego profilu jakości, spróbuj ponownie.",
|
||||
"AddRemotePathMappingError": "Nie udało się dodać nowego mapowania ścieżki zdalnej, spróbuj ponownie.",
|
||||
"BackupsLoadError": "Nie można załadować kopii zapasowych",
|
||||
"ListOptionsLoadError": "Nie można załadować opcji listy",
|
||||
"UnableToLoadRestrictions": "Nie można załadować ograniczeń",
|
||||
@@ -157,7 +157,7 @@
|
||||
"Date": "Data",
|
||||
"AddToDownloadQueue": "Dodaj do kolejki pobierania",
|
||||
"Add": "Dodaj",
|
||||
"AddCustomFormat": "Dodaj format niestandardowy",
|
||||
"AddCustomFormat": "Dodaj niestandardowy format",
|
||||
"AddDelayProfile": "Dodaj profil opóźnienia",
|
||||
"AddDownloadClient": "Dodaj klienta pobierania",
|
||||
"AfterManualRefresh": "Po ręcznym odświeżeniu",
|
||||
@@ -172,7 +172,7 @@
|
||||
"EnableSsl": "Włącz SSL",
|
||||
"EditGroups": "Edytuj grupy",
|
||||
"AllMoviesInPathHaveBeenImported": "Wszystkie filmy w {path} zostały zaimportowane",
|
||||
"AllResultsHiddenFilter": "Wszystkie wyniki są ukrywane przez zastosowany filtr",
|
||||
"AllResultsHiddenFilter": "Wszystkie wyniki są ukryte przez zastosowany filtr",
|
||||
"Always": "Zawsze",
|
||||
"HomePage": "Strona główna",
|
||||
"Hours": "godziny",
|
||||
@@ -389,7 +389,7 @@
|
||||
"FileBrowserPlaceholderText": "Zacznij pisać lub wybierz ścieżkę poniżej",
|
||||
"ApiKey": "Klucz API",
|
||||
"StartupDirectory": "Katalog Startowy",
|
||||
"AddImportListExclusion": "Dodaj wykluczenie z listy",
|
||||
"AddImportListExclusion": "Dodaj wykluczenie z listy importu",
|
||||
"AnalyseVideoFiles": "Analizuj pliki wideo",
|
||||
"Age": "Wiek",
|
||||
"AgeWhenGrabbed": "Wiek (przy złapaniu)",
|
||||
@@ -397,7 +397,7 @@
|
||||
"AllowHardcodedSubsHelpText": "Wykryte wbudowane napisy zostaną automatycznie pobrane",
|
||||
"AlreadyInYourLibrary": "Już w Twojej bibliotece",
|
||||
"SystemTimeHealthCheckMessage": "Czas systemowy jest wyłączony o więcej niż 1 dzień. Zaplanowane zadania mogą nie działać poprawnie, dopóki czas nie zostanie skorygowany",
|
||||
"AnalyticsEnabledHelpText": "Wysyłaj anonimowe informacje o użytkowaniu i błędach do serwerów {appName}. Obejmuje to informacje o Twojej przeglądarce, z których stron {appName} WebUI korzystasz, raportowanie błędów, a także wersję systemu operacyjnego i środowiska wykonawczego. Wykorzystamy te informacje, aby nadać priorytet funkcjom i poprawkom błędów.",
|
||||
"AnalyticsEnabledHelpText": "Wysyłaj anonimowe informacje o użytkowaniu i błędach do serwerów {appName}. Obejmuje to informacje o Twojej przeglądarce, których stron interfejsu webowego {appName} używasz, raportowanie błędów, a także wersję systemu operacyjnego i środowiska wykonawczego. Wykorzystamy te informacje, aby nadać priorytet funkcjom i poprawkom błędów.",
|
||||
"MinimumFreeSpace": "Minimalna wolna przestrzeń",
|
||||
"MinimumLimits": "Minimalne limity",
|
||||
"ReleaseRejected": "Wersja odrzucona",
|
||||
@@ -591,7 +591,7 @@
|
||||
"History": "Historia",
|
||||
"Host": "Gospodarz",
|
||||
"ICalLink": "Łącze do iCal",
|
||||
"IconForCutoffUnmet": "Ikona Cutoff Unmet",
|
||||
"IconForCutoffUnmet": "Ikona dla „Nie spełnia wymagań”",
|
||||
"IgnoredAddresses": "Ignorowane adresy",
|
||||
"UnmonitorDeletedMovies": "Nie monitoruj usuniętych filmów",
|
||||
"IgnoredHelpText": "Zgoda zostanie odrzucona, jeśli zawiera co najmniej jeden termin (bez rozróżniania wielkości liter)",
|
||||
@@ -765,7 +765,7 @@
|
||||
"Script": "Scenariusz",
|
||||
"ScriptPath": "Ścieżka do Skryptu",
|
||||
"SearchAll": "Wyszukaj wszystko",
|
||||
"SearchCutoffUnmet": "Niespełnione Parametry Wyszukiwania",
|
||||
"SearchCutoffUnmet": "Szukaj pozycji niespełniających wymagań",
|
||||
"SearchFailedPleaseTryAgainLater": "Wyszukiwanie nie powiodło się, spróbuj ponownie później.",
|
||||
"SearchFiltered": "Szukaj przefiltrowane",
|
||||
"SearchForMissing": "Wyszukaj brakujące",
|
||||
@@ -797,7 +797,7 @@
|
||||
"WeekColumnHeaderHelpText": "Wyświetlany nad każdą kolumną, gdy tydzień jest aktywnym widokiem",
|
||||
"ListMonitorMovieHelpText": "Czy filmy dodane przez tę listę mają być dodawane i monitorowane",
|
||||
"ICalShowAsAllDayEvents": "Pokaż jako wydarzenia całodniowe",
|
||||
"IconForCutoffUnmetHelpText": "Pokaż ikonę dla plików, gdy odcięcie nie zostało osiągnięte",
|
||||
"IconForCutoffUnmetHelpText": "Pokaż ikonę dla plików, które nie spełniają wymagań",
|
||||
"ShowDateAdded": "Pokaż datę dodania",
|
||||
"ShowMonitoredHelpText": "Pokaż monitorowany status pod plakatem",
|
||||
"ShowMovieInformation": "Pokaż informacje o filmie",
|
||||
@@ -838,7 +838,7 @@
|
||||
"Status": "Status",
|
||||
"Studio": "Studio",
|
||||
"Style": "Styl",
|
||||
"AddNewMovieRootFolderHelpText": "Podfolder „{0}” zostanie utworzony automatycznie",
|
||||
"AddNewMovieRootFolderHelpText": "Podfolder '{folder}' zostanie utworzony automatycznie",
|
||||
"Sunday": "niedziela",
|
||||
"Table": "Stół",
|
||||
"TableOptions": "Opcje tabeli",
|
||||
@@ -875,9 +875,9 @@
|
||||
"AddConditionError": "Nie można dodać nowego warunku, spróbuj ponownie.",
|
||||
"AddCustomFormatError": "Nie można dodać nowego formatu niestandardowego, spróbuj ponownie.",
|
||||
"AddDownloadClientError": "Nie można dodać nowego klienta pobierania, spróbuj ponownie.",
|
||||
"AddImportListExclusionError": "Nie można dodać nowego wykluczenia listy, spróbuj ponownie.",
|
||||
"AddImportListExclusionError": "Nie można dodać nowego wyjątku listy, spróbuj ponownie.",
|
||||
"AddListError": "Nie można dodać nowej listy, spróbuj ponownie.",
|
||||
"AddNotificationError": "Nie udało się dodać nowego powiadomienia, spróbuj później.",
|
||||
"AddNotificationError": "Nie udało się dodać nowego powiadomienia, spróbuj ponownie.",
|
||||
"CustomFormatsLoadError": "Nie można załadować formatów niestandardowych",
|
||||
"DelayProfilesLoadError": "Nie można załadować profili opóźnień",
|
||||
"DownloadClientOptionsLoadError": "Nie można załadować opcji klienta pobierania",
|
||||
@@ -923,7 +923,7 @@
|
||||
"Version": "Wersja",
|
||||
"VisitTheWikiForMoreDetails": "Odwiedź wiki, aby uzyskać więcej informacji: ",
|
||||
"WaitingToProcess": "Czekam na przetworzenie",
|
||||
"Wanted": "Chciał",
|
||||
"Wanted": "Poszukiwany",
|
||||
"Warn": "Ostrzeż",
|
||||
"Week": "Tydzień",
|
||||
"Weeks": "Tygodni",
|
||||
@@ -1045,7 +1045,7 @@
|
||||
"CollectionShowOverviewsHelpText": "Pokaż przegląd kolekcji",
|
||||
"TotalMovies": "Filmów całkowicie",
|
||||
"RottenTomatoesRating": "Ocena Tomato",
|
||||
"ApplicationUrlHelpText": "Zewnętrzny URL tej aplikacji zawierający http(s)://, port i adres URL",
|
||||
"ApplicationUrlHelpText": "Zewnętrzny link tej aplikacji zawierający http(s)://, port i adres URL",
|
||||
"ApplicationURL": "Link do aplikacji",
|
||||
"File": "Plik",
|
||||
"Language": "Język",
|
||||
@@ -1065,22 +1065,22 @@
|
||||
"DeleteImportListExclusionMessageText": "Czy na pewno chcesz usunąć to wykluczenie listy importu?",
|
||||
"RemoveSelectedItemQueueMessageText": "Czy na pewno chcesz usunąć {0} element {1} z kolejki?",
|
||||
"ApplyTagsHelpTextAdd": "Dodaj: dodaj tagi do istniejącej listy tagów",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak zastosować tagi do wybranych indeksatorów",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak stosować tagi do wybranych indekserów",
|
||||
"ApplyTagsHelpTextRemove": "Usuń: usuń wprowadzone tagi",
|
||||
"ApplyTagsHelpTextReplace": "Zastąp: Zastąp tagi wprowadzonymi tagami (nie wprowadzaj tagów, aby usunąć wszystkie tagi)",
|
||||
"ApplyTagsHelpTextHowToApplyMovies": "Jak zastosować tagi do wybranych filmów",
|
||||
"ApplyTagsHelpTextHowToApplyMovies": "Jak stosować tagi do wybranych filmów",
|
||||
"ApplyChanges": "Zastosuj zmiany",
|
||||
"AddCondition": "Dodaj warunek",
|
||||
"AutoTagging": "Automatyczne tagowanie",
|
||||
"AllTitles": "Wszystkie tytuły",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Jak zastosować tagi do wybranych list",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Jak stosować tagi do wybranych list importu",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak stosować tagi do wybranych klientów pobierania",
|
||||
"ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {length} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny",
|
||||
"AddAutoTag": "Dodaj automatyczne tagi",
|
||||
"AutoTaggingNegateHelpText": "Jeśli zaznaczone, zasada automatycznego tagowania nie będzie zastosowana, jeśli ten {0} warunek będzie spełniony",
|
||||
"AutoTaggingNegateHelpText": "Jeśli zaznaczone, reguła automatycznego tagowania nie zostanie zastosowana, jeśli warunek {implementationName} zostanie spełniony.",
|
||||
"AddConnection": "Dodaj połączenie",
|
||||
"AddConditionImplementation": "Dodaj condition - {implementationName}",
|
||||
"AddConnectionImplementation": "Dodaj Connection - {implementationName}",
|
||||
"AddConditionImplementation": "Dodaj warunek – {implementationName}",
|
||||
"AddConnectionImplementation": "Dodaj połączenie - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}",
|
||||
"No": "Nie",
|
||||
"QueueLoadError": "Nie udało się załadować kolejki",
|
||||
@@ -1094,7 +1094,7 @@
|
||||
"BlocklistLoadError": "Nie można załadować czarnej listy",
|
||||
"QualityCutoffNotMet": "Odcięcie jakości nie zostało osiągnięte",
|
||||
"TablePageSizeHelpText": "Liczba elementów do pokazania na każdej stronie",
|
||||
"AddIndexerImplementation": "Dodaj indeks - {implementationName}",
|
||||
"AddIndexerImplementation": "Dodaj indekser - {implementationName}",
|
||||
"RemoveQueueItemConfirmation": "Czy na pewno chcesz usunąć elementy ({0}) z kolejki?",
|
||||
"Directory": "Folder",
|
||||
"DeleteReleaseProfile": "Usuń profil opóźnienia",
|
||||
@@ -1128,9 +1128,9 @@
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Listy niedostępne z powodu błędów: {notificationNames}",
|
||||
"Lists": "Listy",
|
||||
"Yes": "tak",
|
||||
"AddRootFolderError": "Nie można dodać folderu głównego",
|
||||
"AddRootFolderError": "Nie udało się dodać folderu głównego",
|
||||
"DelayingDownloadUntil": "Opóźnianie pobierania do {0} o {1}",
|
||||
"AddListExclusion": "Dodaj wykluczenie z listy",
|
||||
"AddListExclusion": "Dodaj wyjątek z listy",
|
||||
"ConditionUsingRegularExpressions": "Ten warunek pasuje przy użyciu wyrażeń regularnych. Zwróć uwagę, że znaki {0} mają specjalne znaczenie i muszą być poprzedzone znakiem {1}",
|
||||
"CustomFilter": "Filtry niestandardowe",
|
||||
"DeleteSpecification": "Usuń powiadomienie",
|
||||
@@ -1152,7 +1152,7 @@
|
||||
"DeletedReasonMovieMissingFromDisk": "{appName} nie mógł znaleźć pliku na dysku, więc został usunięty",
|
||||
"DeleteSelectedMovieFilesHelpText": "Czy na pewno chcesz usunąć wybrane pliki filmowe?",
|
||||
"IMDbId": "Identyfikator TMDb",
|
||||
"AddDelayProfileError": "Nie można dodać nowego profilu opóźnienia, spróbuj później.",
|
||||
"AddDelayProfileError": "Nie można dodać nowego profilu opóźnienia, spróbuj ponownie.",
|
||||
"MovieFileDeletedTooltip": "Usuń plik filmowy",
|
||||
"DeleteMovieFolders": "Usuń folder filmu",
|
||||
"DeleteMovieFoldersHelpText": "Usuń folder z filmami i jego zawartość",
|
||||
@@ -1160,14 +1160,14 @@
|
||||
"DeleteSelectedImportListExclusionsMessageText": "Czy na pewno chcesz usunąć to wykluczenie listy importu?",
|
||||
"Any": "Dowolny",
|
||||
"AddImportList": "Dodaj listę importu",
|
||||
"AddImportListImplementation": "Dodaj Listę Importu - {implementationName}",
|
||||
"AddImportListImplementation": "Dodaj listę importu - {implementationName}",
|
||||
"AuthenticationRequired": "Wymagana Autoryzacja",
|
||||
"AudioLanguages": "Języki Dźwięku",
|
||||
"AuthenticationMethodHelpTextWarning": "Wybierz prawidłową metodę autoryzacji",
|
||||
"AuthenticationMethod": "Metoda Autoryzacji",
|
||||
"AppUpdatedVersion": "{appName} został zaktualizowany do wersji `{version}`, by uzyskać nowe zmiany należy przeładować {appName}",
|
||||
"AddReleaseProfile": "Dodaj Profil Wydania",
|
||||
"AppUpdated": "{appName} Zaktualizowany",
|
||||
"AddReleaseProfile": "Dodaj profil wydania",
|
||||
"AppUpdated": "{appName} zaktualizowany",
|
||||
"Theme": "Motyw",
|
||||
"AutoTaggingSpecificationTag": "Etykieta",
|
||||
"EditReleaseProfile": "Dodaj Profil Wydania",
|
||||
@@ -1175,7 +1175,7 @@
|
||||
"PreferredProtocol": "Preferowany protokół",
|
||||
"ReleaseProfiles": "profil wydania",
|
||||
"Label": "Etykieta",
|
||||
"AutoTaggingRequiredHelpText": "Warunek {implementationName} musi być zgodny, aby format niestandardowy został zastosowany. W przeciwnym razie wystarczy jedno dopasowanie {implementationName}.",
|
||||
"AutoTaggingRequiredHelpText": "Ten warunek {implementationName} musi zostać spełniony, aby reguła automatycznego tagowania została zastosowana. W przeciwnym razie wystarczy pojedyncze dopasowanie {implementationName}.",
|
||||
"DeleteSelectedCustomFormats": "Usuń format niestandardowy",
|
||||
"ReleaseDate": "Daty wydania",
|
||||
"ShowDigitalReleaseDate": "Pokaż datę premiery w kinie",
|
||||
@@ -1209,5 +1209,107 @@
|
||||
"IndexerHDBitsSettingsCodecs": "Kodek",
|
||||
"IndexerHDBitsSettingsMediums": "Średni",
|
||||
"IndexerSettingsCategories": "Kategorie",
|
||||
"ReleaseProfile": "profil wydania"
|
||||
"ReleaseProfile": "profil wydania",
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Jeżeli torrent jest zablokowany przez hasha może zostać nieprawidłowo odrzucony podczas RSS/Szukania przez niektóre indeksery, włączenie tej opcji pozwoli na jego odrzucenie po zgarnięciu, ale przed wysłaniem do klienta.",
|
||||
"FormatAgeDays": "dni",
|
||||
"IndexerSettingsApiUrl": "Link API",
|
||||
"NotificationsDiscordSettingsAuthor": "Autor",
|
||||
"DefaultNameCopiedSpecification": "{name} - Kopia",
|
||||
"DownloadClientFloodSettingsAddPaused": "Dodaj zapauzowany",
|
||||
"ImportListsTraktSettingsAdditionalParameters": "Dodatkowe parametry",
|
||||
"NotificationsGotifySettingsAppToken": "Token aplikacji",
|
||||
"IndexerSettingsMinimumSeeders": "Minimalni seederzy",
|
||||
"IndexerHDBitsSettingsCategoriesHelpText": "Jeżeli niesprecyzowano wszystkie opcje są wykorzystywane.",
|
||||
"DefaultNameCopiedImportList": "{name} - Kopia",
|
||||
"AnnouncedMovieAvailabilityDescription": "Filmy są uważane za dostępne od momentu dodania do {appName}.",
|
||||
"AutoTaggingSpecificationKeyword": "Słowo(a) kluczowe",
|
||||
"AutoTaggingSpecificationMaximumRuntime": "Maksymalny czas trwania",
|
||||
"AutoTaggingSpecificationMaximumYear": "Maksymalny rok",
|
||||
"AutoTaggingSpecificationMinimumRuntime": "Minimalny czas trwania",
|
||||
"AutoTaggingSpecificationMinimumYear": "Minimalny rok",
|
||||
"AutoTaggingSpecificationStudio": "Studio(a)",
|
||||
"AutomaticAdd": "Automatyczne dodawanie",
|
||||
"SearchForCutoffUnmetMovies": "Szukaj wszystkich filmów niespełniających wymagań",
|
||||
"CutoffUnmetLoadError": "Błąd podczas ładowania pozycji niespełniających wymagań",
|
||||
"SearchForCutoffUnmetMoviesConfirmationCount": "Czy na pewno chcesz wyszukać wszystkie filmy ({totalRecords}) niespełniające wymagań?",
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Automatycznie wyszukaj i spróbuj pobrać inną wersję, jeśli nie udało się pobrać wersji z wyszukiwania interaktywnego",
|
||||
"AutoTaggingLoadError": "Nie można załadować automatycznego tagowania",
|
||||
"AutoTaggingSpecificationGenre": "Gatunek(i)",
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "Ponowne pobieranie z wyszukiwania interaktywnego nie powiodło się",
|
||||
"AutomaticUpdatesDisabledDocker": "Automatyczne aktualizacje nie są bezpośrednio obsługiwane podczas korzystania z mechanizmu aktualizacji Docker. Konieczne będzie zaktualizowanie kontenera poza {appName} lub użycie skryptu",
|
||||
"BlackholeWatchFolder": "Folder obserwowany",
|
||||
"BlackholeWatchFolderHelpText": "Folder z którego {appName} powinien importować zakończone pobrania",
|
||||
"CutoffUnmetNoItems": "Brak pozycji niespełniających wymagań",
|
||||
"DeleteSelectedCustomFormatsMessageText": "Czy na pewno chcesz usunąć {count} wybranych niestandardowych formatów?",
|
||||
"DeleteSelectedImportLists": "Usuń listy importu",
|
||||
"DeleteSelectedImportListsMessageText": "Czy na pewno chcesz usunąć {count} wybranych list importu?",
|
||||
"DoNotBlocklistHint": "Usuń bez blokowania",
|
||||
"DownloadClientDelugeSettingsDirectoryCompleted": "Katalog do przenoszenia po zakończeniu",
|
||||
"DownloadClientDelugeValidationLabelPluginFailure": "Konfiguracja etykiety nie powiodła się",
|
||||
"DownloadClientDelugeValidationLabelPluginInactive": "Plugin etykiet nie jest aktywowany",
|
||||
"BlocklistReleaseHelpText": "Blokuje tą premierę przed ponownym pobraniem przez {appName} poprzez RSS albo automatyczne wyszukiwanie",
|
||||
"BypassDelayIfAboveCustomFormatScoreHelpText": "Włącz pomijanie kiedy premiera ma wagę wyższą niż skonfigurowane minimum niestandardowego formatu",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "Minimalna waga niestandardowego formatu wymagana by pominąć opóźnienie dla preferowanego protokołu",
|
||||
"ChangeCategory": "Zmień kategorię",
|
||||
"ChangeCategoryMultipleHint": "Zmień pobierania na 'Kategorię po imporcie' z klienta pobierania",
|
||||
"Complete": "Zakończone",
|
||||
"Completed": "Zakończone",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Dodaj prefix do URL {connectionName}, np. {url}",
|
||||
"CustomFormatsSpecificationExceptLanguage": "Wyklucz język",
|
||||
"CustomFormatsSpecificationExceptLanguageHelpText": "Dopasowuje jeżeli występuje jakikolwiek inny język poza wybranym",
|
||||
"CustomFormatsSpecificationFlag": "Flaga",
|
||||
"DefaultNotFoundMessage": "Musiałeś się zgubić, nic tutaj nie ma.",
|
||||
"DeleteAutoTag": "Usuń automatyczny tag",
|
||||
"DeleteImportList": "Usuń listę importu",
|
||||
"Disposition": "Stan",
|
||||
"DoNotBlocklist": "Nie blokuj",
|
||||
"DownloadClientDelugeSettingsDirectory": "Katalog pobierania",
|
||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Opcjonalna lokalizacja dla pobrań, pozostaw puste by korzystać z domyślnej lokalizacji Deluge",
|
||||
"DownloadClientDelugeValidationLabelPluginFailureDetail": "{appName} nie mógł dodać etykiety do {clientName}.",
|
||||
"DownloadClientDownloadStationProviderMessage": "{appName} nie jest w stanie połączyć się ze stacją pobierania jeżeli dwuetapowa autoryzacja nie jest włączona w Twoim koncie DSM",
|
||||
"DownloadClientDelugeValidationLabelPluginInactiveDetail": "Musisz mieć włączony plugin etykiet w {clientName} by korzystać z kategorii.",
|
||||
"CustomFormatsSpecificationMaximumYear": "Maksymalny rok",
|
||||
"CustomFormatsSpecificationMinimumSize": "Minimalny rozmiar",
|
||||
"CustomFormatsSpecificationRegularExpression": "Wyrażenie regularne",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "RegEx niestandardowego formatu nie rozróżnia wielkości liter",
|
||||
"CutoffNotMet": "Limit nieosiągnięty",
|
||||
"CinemaRelease": "Premiera kinowa",
|
||||
"ClearBlocklist": "Wyczyść listę blokowania",
|
||||
"ClickToChangeIndexerFlags": "Kliknij aby zmienić flagi indeksera",
|
||||
"ClearBlocklistMessageText": "Czy na pewno chcesz wyczyścić wszystkie elementy listy blokowania?",
|
||||
"CloneCondition": "Klonuj warunek",
|
||||
"CloneAutoTag": "Klonuj automatyczny tag",
|
||||
"CountCustomFormatsSelected": "Wybrano {count} niestandardowych formatów",
|
||||
"CountImportListsSelected": "Wybrano {count} list importu",
|
||||
"CountVotes": "{votes} głosów",
|
||||
"DeleteCondition": "Usuń warunek",
|
||||
"DeleteMovieFolderCountWithFilesConfirmation": "Czy na pewno chcesz usunąć {count} wybranych filmów i całą zawartość?",
|
||||
"DeletedReasonManual": "Plik został usunięty przez {appName}, ręcznie lub przez API",
|
||||
"DownloadClientDelugeTorrentStateError": "Deluge zgłasza błąd",
|
||||
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Opcjonalna lokalizacja do przenoszenia ukończonych pobrań, pozostaw puste by korzystać z domyślnej lokalizacji Deluge",
|
||||
"BlocklistAndSearch": "Lista blokowania i wyszukiwanie",
|
||||
"BlocklistAndSearchHint": "Rozpocznij wyszukiwanie po zamiennik po dodaniu do listy blokowania",
|
||||
"BlocklistAndSearchMultipleHint": "Rozpocznij wyszukiwania po zamienniki po dodaniu do listy blokowania",
|
||||
"BlocklistFilterHasNoItems": "Wybrane filtry listy blokowania nie zawierają pozycji",
|
||||
"BlocklistMultipleOnlyHint": "Blokuj bez wyszukiwania zamienników",
|
||||
"BlocklistOnly": "Tylko zablokuj",
|
||||
"BlocklistOnlyHint": "Zablokuj bez szukania zamiennika",
|
||||
"BlocklistedAt": "Zablokowany {date}",
|
||||
"BypassDelayIfAboveCustomFormatScore": "Pomiń jeśli powyżej wagi niestandardowego formatu",
|
||||
"ChangeCategoryHint": "Zmień pobieranie na 'Kategorię po imporcie' z klienta pobierania",
|
||||
"ChownGroup": "Zmień grupę właściciela (chown)",
|
||||
"CloneImportList": "Klonuj listę importu",
|
||||
"CountMissingMoviesFromLibrary": "{count} brakujących filmów z biblioteki",
|
||||
"CustomFormatJson": "JSON niestandardowego formatu",
|
||||
"CustomFormatsSettingsTriggerInfo": "Niestandardowy format zostanie zastosowany do premiery lub pliku kiedy spełni co najmniej jeden z każdego typu wybranych warunków.",
|
||||
"CustomFormatsSpecificationMaximumSizeHelpText": "Premiera musi mieć rozmiar mniejszy lub równy z tym",
|
||||
"CustomFormatsSpecificationMinimumSizeHelpText": "Premiera musi być większa niż ten rozmiar",
|
||||
"CustomFormatsSpecificationMinimumYear": "Minimalny rok",
|
||||
"CustomFormatsSpecificationQualityModifier": "Modyfikator jakości",
|
||||
"DayOfWeekAt": "{day} {time}",
|
||||
"DelayMinutes": "{delay} minut",
|
||||
"DelayProfileProtocol": "Protokół: {preferredProtocol}",
|
||||
"DeleteMovieFolderCountConfirmation": "Czy na pewno chcesz usunąć {count} wybranych filmów?",
|
||||
"DeleteMovieFolderMovieCount": "{movieFileCount} plików filmu o rozmiarze {size}",
|
||||
"DeleteSelected": "Usuń wybrane"
|
||||
}
|
||||
|
||||
@@ -2036,5 +2036,6 @@
|
||||
"NotificationsPushcutSettingsIncludePoster": "Incluir Pôster",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Incluir pôster com notificação",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Links de metadados",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Adicionar links para os metadados da série ao enviar notificações"
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Adicionar links para os metadados da série ao enviar notificações",
|
||||
"FilterMoviePropertiesOnlyNotFileWarning": "Os filtros estão disponíveis apenas para as propriedades de um filme, eles não estão disponíveis para as propriedades do(s) arquivo(s) que você pode ter para esse filme."
|
||||
}
|
||||
|
||||
@@ -2036,5 +2036,6 @@
|
||||
"NotificationsPushcutSettingsIncludePoster": "Добавить постер",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Добавляет постер в уведомление",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Ссылки на метаданные",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Добавляет ссылки на метаданные сериала при отправке уведомлений"
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Добавляет ссылки на метаданные сериала при отправке уведомлений",
|
||||
"FilterMoviePropertiesOnlyNotFileWarning": "Фильтры доступны только для свойств фильма, они недоступны для свойств файл(ов), которые могут быть у вас для этого фильма."
|
||||
}
|
||||
|
||||
@@ -2036,5 +2036,6 @@
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Bildirim içeriğine poster ekleyin",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Meta Veri Bağlantıları",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Poster'i ekle",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Bildirim gönderirken dizi meta verilerine bağlantılar ekleyin"
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Bildirim gönderirken dizi meta verilerine bağlantılar ekleyin",
|
||||
"FilterMoviePropertiesOnlyNotFileWarning": "Filtreler yalnızca bir filmin özellikleri için kullanılabilir, o filme ait sahip olduğunuz dosyanın/dosyaların özellikleri için kullanılamaz."
|
||||
}
|
||||
|
||||
@@ -531,7 +531,7 @@
|
||||
"AddExclusion": "添加排除",
|
||||
"AddedToDownloadQueue": "已加入下载队列",
|
||||
"Added": "添加日期",
|
||||
"Actions": "动作",
|
||||
"Actions": "操作",
|
||||
"IMDb": "IMDb",
|
||||
"PendingChangesDiscardChanges": "舍弃修改并退出",
|
||||
"Pending": "挂起",
|
||||
@@ -719,7 +719,7 @@
|
||||
"ReleaseRejected": "发布资源已拒绝",
|
||||
"UnmappedFilesOnly": "仅限未映射的文件",
|
||||
"Quality": "质量",
|
||||
"TheLogLevelDefault": "默认的日志等级为 \"Info\",可以在 [常规设置] 中修改 (/settings/general)",
|
||||
"TheLogLevelDefault": "預設的日誌等級為「Info」,可在[通用設定]中修改 (/settings/general)",
|
||||
"RestartReloadNote": "注意:{appName}将在恢复过程中自动重启并重新加载UI。",
|
||||
"PhysicalRelease": "碟片版发布日期",
|
||||
"Trace": "追踪",
|
||||
@@ -1987,5 +1987,55 @@
|
||||
"EditMovieCollectionModalHeader": "编辑 - {title}",
|
||||
"DefaultNameCopiedImportList": "{name} - 复制",
|
||||
"ReleaseProfile": "发行配置文件",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "元数据链接"
|
||||
"NotificationsPushcutSettingsMetadataLinks": "元数据链接",
|
||||
"IndexerFileListSettingsCategoriesHelpText": "如果未指定,則使用所有選項。",
|
||||
"Keywords": "關鍵字",
|
||||
"CountMissingMoviesFromLibrary": "媒體庫中缺少 {count} 部電影",
|
||||
"AutoTaggingSpecificationKeyword": "關鍵字",
|
||||
"AutoTaggingSpecificationStudio": "工作室",
|
||||
"FilterMoviePropertiesOnlyNotFileWarning": "此篩選器僅適用於電影屬性,不適用於檔案屬性。",
|
||||
"ICalReleaseTypes": "發行類型",
|
||||
"ICalReleaseTypesMoviesHelpText": "選擇要在 iCal 訂閱中包含的發行類型",
|
||||
"ImportListsRadarrSettingsRootFoldersHelpText": "您想從中匯入的 {appName} 實例的根目錄資料夾 ID(以逗號分隔)",
|
||||
"IndexerNewznabSettingsAdditionalParametersHelpText": "額外的 Newznab 參數(例如 `&t=search&cat=2000,2010&extended=1`)",
|
||||
"IndexerNewznabSettingsCategoriesHelpText": "要查詢的 Newznab 分類 ID(以逗號分隔)",
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "PassThePopcorn 的 API 使用者",
|
||||
"IndexerSettingsApiUser": "API 使用者",
|
||||
"IndexerSettingsBaseUrl": "基礎 URL",
|
||||
"IndexerSettingsFailDownloads": "將下載標記為失敗",
|
||||
"IndexerSettingsRemoveYear": "從標題中移除年份",
|
||||
"IndexerSettingsRemoveYearHelpText": "從發行版本標題中移除年份以改進解析",
|
||||
"IndexerSettingsRequiredFlagsHelpText": "發行版本必須包含的旗標 (以逗號分隔)",
|
||||
"MediaInfoFootNote2": "語言代碼應為 ISO 639-2 (3字元) 格式,但 ISO 639-1 (2字元) 也受支援。",
|
||||
"MetadataMediaBrowserDeprecated": "MediaBrowser (Ember) 將不再被建立,支援將在 v6 版本中完全移除。",
|
||||
"MovieEditRootFolderHelpText": "變更電影的根目錄資料夾將會移動電影資料夾及其所有內容。",
|
||||
"NamingConfigMovieFolderFormatDeprecatedHealthCheckMessage": "「電影資料夾格式」設定已被棄用。請改用「設定」 -> 「媒體管理」中的「電影命名」設定。",
|
||||
"NotificationsPushcutSettingsIncludePoster": "包含海報",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "在通知中包含電影海報",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "在通知中新增一個指向電影元資料的連結",
|
||||
"RemoveRootFolderMoviesMessageText": "此根目錄資料夾包含 {count} 部電影。您想如何處理這些電影?",
|
||||
"SelectMovieModalTitle": "{modalTitle} - 選擇電影",
|
||||
"ShowCinemaRelease": "顯示院線上映日期",
|
||||
"ShowCinemaReleaseCalendarHelpText": "在日曆上顯示院線上映日期",
|
||||
"ShowDigitalRelease": "顯示數位版發行日期",
|
||||
"ShowDigitalReleaseCalendarHelpText": "在日曆上顯示數位版發行日期",
|
||||
"ShowPhysicalReleaseCalendarHelpText": "在日曆上顯示實體版發行日期",
|
||||
"ShowPhysicalRelease": "顯示實體版發行日期",
|
||||
"MovieFolderFormatHelpTextDeprecatedWarning": "電影資料夾格式設定已移至 設定 -> 媒體管理 -> 電影命名",
|
||||
"IndexerSettingsFailDownloadsHelpText": "如果下載項目符合此索引器的做種規則但下載失敗,則將其標記為失敗而不是警告。",
|
||||
"IndexerSettingsRequiredFlags": "必要旗標",
|
||||
"FileSize": "檔案大小",
|
||||
"NotificationsAppriseSettingsIncludePoster": "包含海報",
|
||||
"NotificationsAppriseSettingsIncludePosterHelpText": "在通知中包含電影海報圖片",
|
||||
"UpdateMoviePath": "更新電影路徑",
|
||||
"UpdatePath": "更新路徑",
|
||||
"ImportListsRadarrSettingsFullUrl": "完整的 {appName} URL",
|
||||
"ImportListsRadarrSettingsFullUrlHelpText": "您想從中匯入的 {appName} 實例的完整 URL",
|
||||
"ImportListsRadarrSettingsApiKeyHelpText": "您想從中匯入的 {appName} 實例的 API 金鑰",
|
||||
"ImportListsRadarrSettingsQualityProfilesHelpText": "您想從中匯入的 {appName} 實例的品質設定檔 ID(以逗號分隔)",
|
||||
"ImportListsRadarrSettingsTagsHelpText": "您想從中匯入的 {appName} 實例的標籤(以逗號分隔)",
|
||||
"CinemaRelease": "院線上映",
|
||||
"CustomFormatsSpecificationQualityModifier": "品質修飾詞",
|
||||
"CloneImportList": "複製匯入清單",
|
||||
"DownloadClientItemErrorMessage": "下載用戶端回報錯誤:{message}"
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,21 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace NzbDrone.Core.MediaFiles
|
||||
{
|
||||
internal static class FileExtensions
|
||||
public static class FileExtensions
|
||||
{
|
||||
private static List<string> _archiveExtensions = new List<string>
|
||||
private static readonly Regex FileExtensionRegex = new (@"\.[a-z0-9]{2,4}$",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly HashSet<string> UsenetExtensions = new HashSet<string>()
|
||||
{
|
||||
".par2",
|
||||
".nzb"
|
||||
};
|
||||
|
||||
public static HashSet<string> ArchiveExtensions => new (StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
".7z",
|
||||
".bz2",
|
||||
@@ -20,8 +30,7 @@ namespace NzbDrone.Core.MediaFiles
|
||||
".tgz",
|
||||
".zip"
|
||||
};
|
||||
|
||||
private static List<string> _dangerousExtensions = new List<string>
|
||||
public static HashSet<string> DangerousExtensions => new (StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
".arj",
|
||||
".lnk",
|
||||
@@ -31,8 +40,7 @@ namespace NzbDrone.Core.MediaFiles
|
||||
".vbs",
|
||||
".zipx"
|
||||
};
|
||||
|
||||
private static List<string> _executableExtensions = new List<string>
|
||||
public static HashSet<string> ExecutableExtensions => new (StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
".bat",
|
||||
".cmd",
|
||||
@@ -40,8 +48,20 @@ namespace NzbDrone.Core.MediaFiles
|
||||
".sh"
|
||||
};
|
||||
|
||||
public static HashSet<string> ArchiveExtensions => new HashSet<string>(_archiveExtensions, StringComparer.OrdinalIgnoreCase);
|
||||
public static HashSet<string> DangerousExtensions => new HashSet<string>(_dangerousExtensions, StringComparer.OrdinalIgnoreCase);
|
||||
public static HashSet<string> ExecutableExtensions => new HashSet<string>(_executableExtensions, StringComparer.OrdinalIgnoreCase);
|
||||
public static string RemoveFileExtension(string title)
|
||||
{
|
||||
title = FileExtensionRegex.Replace(title, m =>
|
||||
{
|
||||
var extension = m.Value.ToLower();
|
||||
if (MediaFileExtensions.Extensions.Contains(extension) || UsenetExtensions.Contains(extension))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return m.Value;
|
||||
});
|
||||
|
||||
return title;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -293,7 +293,7 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
|
||||
|
||||
private static string GetSceneNameMatch(string sceneName, params string[] tokens)
|
||||
{
|
||||
sceneName = sceneName.IsNotNullOrWhiteSpace() ? Parser.Parser.RemoveFileExtension(sceneName) : string.Empty;
|
||||
sceneName = sceneName.IsNotNullOrWhiteSpace() ? FileExtensions.RemoveFileExtension(sceneName) : string.Empty;
|
||||
|
||||
foreach (var token in tokens)
|
||||
{
|
||||
|
||||
@@ -144,7 +144,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Manual
|
||||
|
||||
var downloadClientItem = GetTrackedDownload(downloadId)?.DownloadItem;
|
||||
var finalReleaseGroup = releaseGroup.IsNullOrWhiteSpace()
|
||||
? Parser.Parser.ParseReleaseGroup(path)
|
||||
? ReleaseGroupParser.ParseReleaseGroup(path)
|
||||
: releaseGroup;
|
||||
var finalQuality = (quality?.Quality ?? Quality.Unknown) == Quality.Unknown ? QualityParser.ParseQuality(path) : quality;
|
||||
var finalLanguages =
|
||||
@@ -282,7 +282,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Manual
|
||||
{
|
||||
var localMovie = new LocalMovie();
|
||||
localMovie.Path = file;
|
||||
localMovie.ReleaseGroup = Parser.Parser.ParseReleaseGroup(file);
|
||||
localMovie.ReleaseGroup = ReleaseGroupParser.ParseReleaseGroup(file);
|
||||
localMovie.Quality = QualityParser.ParseQuality(file);
|
||||
localMovie.Languages = LanguageParser.ParseLanguages(file);
|
||||
localMovie.Size = _diskProvider.GetFileSize(file);
|
||||
@@ -327,7 +327,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Manual
|
||||
localMovie.Path = file;
|
||||
localMovie.Quality = new QualityModel(Quality.Unknown);
|
||||
localMovie.Languages = new List<Language> { Language.Unknown };
|
||||
localMovie.ReleaseGroup = Parser.Parser.ParseReleaseGroup(file);
|
||||
localMovie.ReleaseGroup = ReleaseGroupParser.ParseReleaseGroup(file);
|
||||
localMovie.Size = _diskProvider.GetFileSize(file);
|
||||
|
||||
items.Add(MapItem(new ImportDecision(localMovie), rootFolder, null, null));
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport
|
||||
|
||||
if (!otherVideoFiles && downloadClientInfo != null)
|
||||
{
|
||||
return Parser.Parser.RemoveFileExtension(downloadClientInfo.ReleaseTitle);
|
||||
return FileExtensions.RemoveFileExtension(downloadClientInfo.ReleaseTitle);
|
||||
}
|
||||
|
||||
var fileName = Path.GetFileNameWithoutExtension(localMovie.Path.CleanFilePath());
|
||||
|
||||
@@ -268,6 +268,7 @@ namespace NzbDrone.Core.Organizer
|
||||
|
||||
tokenHandlers["{Movie Certification}"] = m => movie.MovieMetadata.Value.Certification ?? string.Empty;
|
||||
tokenHandlers["{Movie Collection}"] = m => Truncate(movie.MovieMetadata.Value.CollectionTitle, m.CustomFormat) ?? string.Empty;
|
||||
tokenHandlers["{Movie CollectionThe}"] = m => Truncate(TitleThe(movie.MovieMetadata.Value.CollectionTitle), m.CustomFormat) ?? string.Empty;
|
||||
}
|
||||
|
||||
private string GetLanguageTitle(Movie movie, string isoCodes)
|
||||
|
||||
@@ -6,6 +6,7 @@ using System.Text.RegularExpressions;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Instrumentation;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
||||
namespace NzbDrone.Core.Parser
|
||||
@@ -21,8 +22,6 @@ namespace NzbDrone.Core.Parser
|
||||
private static readonly Regex HardcodedSubsRegex = new Regex(@"\b((?<hcsub>(\w+(?<!SOFT|MULTI|HORRIBLE)SUBS?))|(?<hc>(HC|SUBBED)))\b",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
|
||||
|
||||
private static readonly RegexReplace[] PreSubstitutionRegex = Array.Empty<RegexReplace>();
|
||||
|
||||
private static readonly Regex[] ReportMovieTitleRegex = new[]
|
||||
{
|
||||
// Anime [Subgroup] and Year
|
||||
@@ -110,9 +109,6 @@ namespace NzbDrone.Core.Parser
|
||||
private static readonly Regex NormalizeRegex = new Regex(@"((?:\b|_)(?<!^|[^a-zA-Z0-9_']\w[^a-zA-Z0-9_'])([aà](?!$|[^a-zA-Z0-9_']\w[^a-zA-Z0-9_'])|an|the|and|or|of)(?!$)(?:\b|_))|\W|_",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex FileExtensionRegex = new Regex(@"\.[a-z0-9]{2,4}$",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex ReportImdbId = new Regex(@"(?<imdbid>tt\d{7,8})", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
private static readonly Regex ReportTmdbId = new Regex(@"tmdb(id)?-(?<tmdbid>\d+)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
@@ -123,44 +119,13 @@ namespace NzbDrone.Core.Parser
|
||||
private static readonly Regex SimpleReleaseTitleRegex = new Regex(@"\s*(?:[<>?*|])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
// Valid TLDs http://data.iana.org/TLD/tlds-alpha-by-domain.txt
|
||||
private static readonly RegexReplace WebsitePrefixRegex = new RegexReplace(@"^(?:(?:\[|\()\s*)?(?:www\.)?[-a-z0-9-]{1,256}\.(?<!Naruto-Kun\.)(?:[a-z]{2,6}\.[a-z]{2,6}|xn--[a-z0-9-]{4,}|[a-z]{2,})\b(?:\s*(?:\]|\))|[ -]{2,})[ -]*",
|
||||
string.Empty,
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly RegexReplace WebsitePostfixRegex = new RegexReplace(@"(?:\[\s*)?(?:www\.)?[-a-z0-9-]{1,256}\.(?:xn--[a-z0-9-]{4,}|[a-z]{2,6})\b(?:\s*\])$",
|
||||
string.Empty,
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly RegexReplace CleanReleaseGroupRegex = new RegexReplace(@"(-(RP|1|NZBGeek|Obfuscated|Obfuscation|Scrambled|sample|Pre|postbot|xpost|Rakuv[a-z0-9]*|WhiteRev|BUYMORE|AsRequested|AlternativeToRequested|GEROV|Z0iDS3N|Chamele0n|4P|4Planet|AlteZachen|RePACKPOST))+$",
|
||||
string.Empty,
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly RegexReplace CleanTorrentSuffixRegex = new RegexReplace(@"\[(?:ettv|rartv|rarbg|cttv|publichd)\]$",
|
||||
string.Empty,
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex CleanQualityBracketsRegex = new Regex(@"\[[a-z0-9 ._-]+\]$",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex ReleaseGroupRegex = new Regex(@"-(?<releasegroup>[a-z0-9]+(?<part2>-[a-z0-9]+)?(?!.+?(?:480p|576p|720p|1080p|2160p)))(?<!(?:WEB-(DL|Rip)|Blu-Ray|480p|576p|720p|1080p|2160p|DTS-HD|DTS-X|DTS-MA|DTS-ES|-ES|-EN|-CAT|-ENG|-JAP|-GER|-FRA|-FRE|-ITA|-HDRip|\d{1,2}-bit|[ ._]\d{4}-\d{2}|-\d{2}|tmdb(id)?-(?<tmdbid>\d+)|(?<imdbid>tt\d{7,8}))(?:\k<part2>)?)(?:\b|[-._ ]|$)|[-._ ]\[(?<releasegroup>[a-z0-9]+)\]$",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex InvalidReleaseGroupRegex = new Regex(@"^([se]\d+|[0-9a-f]{8})$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex AnimeReleaseGroupRegex = new Regex(@"^(?:\[(?<subgroup>(?!\s).+?(?<!\s))\](?:_|-|\s|\.)?)",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex YearInTitleRegex = new Regex(@"^(?<title>.+?)(?:\W|_.)?[\(\[]?(?<year>\d{4})[\]\)]?",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
// Handle Exception Release Groups that don't follow -RlsGrp; Manual List
|
||||
// groups whose releases end with RlsGroup) or RlsGroup]
|
||||
private static readonly Regex ExceptionReleaseGroupRegex = new Regex(@"(?<=[._ \[])(?<releasegroup>(Silence|afm72|Panda|Ghost|MONOLITH|Tigole|Joy|ImE|UTR|t3nzin|Anime Time|Project Angel|Hakata Ramen|HONE|Vyndros|SEV|Garshasp|Kappa|Natty|RCVR|SAMPA|YOGI|r00t|EDGE2020|RZeroX|FreetheFish|Anna|Bandi|Qman|theincognito|HDO|DusIctv|DHD|CtrlHD|-ZR-|ADC|XZVN|RH|Kametsu|Garshasp)(?=\]|\)))", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
// Handle Exception Release Groups that don't follow -RlsGrp; Manual List
|
||||
// name only...BE VERY CAREFUL WITH THIS, HIGH CHANCE OF FALSE POSITIVES
|
||||
private static readonly Regex ExceptionReleaseGroupRegexExact = new Regex(@"\b(?<releasegroup>KRaLiMaRKo|E\.N\.D|D\-Z0N3|Koten_Gars|BluDragon|ZØNEHD|Tigole|HQMUX|VARYG|YIFY|YTS(.(MX|LT|AG))?|TMd|Eml HDTeam|LMain|DarQ|BEN THE MEN)\b", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex SpecialCharRegex = new Regex(@"(\&|\:|\\|\/)+", RegexOptions.Compiled);
|
||||
private static readonly Regex PunctuationRegex = new Regex(@"[^\w\s]", RegexOptions.Compiled);
|
||||
private static readonly Regex ArticleWordRegex = new Regex(@"^(a|an|the)\s", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
@@ -215,7 +180,7 @@ namespace NzbDrone.Core.Parser
|
||||
|
||||
if (ReversedTitleRegex.IsMatch(title))
|
||||
{
|
||||
var titleWithoutExtension = RemoveFileExtension(title).ToCharArray();
|
||||
var titleWithoutExtension = FileExtensions.RemoveFileExtension(title).ToCharArray();
|
||||
Array.Reverse(titleWithoutExtension);
|
||||
|
||||
title = $"{titleWithoutExtension}{title.Substring(titleWithoutExtension.Length)}";
|
||||
@@ -223,14 +188,14 @@ namespace NzbDrone.Core.Parser
|
||||
Logger.Debug("Reversed name detected. Converted to '{0}'", title);
|
||||
}
|
||||
|
||||
var releaseTitle = RemoveFileExtension(title);
|
||||
var releaseTitle = FileExtensions.RemoveFileExtension(title);
|
||||
|
||||
// Trim dashes from end
|
||||
releaseTitle = releaseTitle.Trim('-', '_');
|
||||
|
||||
releaseTitle = releaseTitle.Replace("【", "[").Replace("】", "]");
|
||||
|
||||
foreach (var replace in PreSubstitutionRegex)
|
||||
foreach (var replace in ParserCommon.PreSubstitutionRegex)
|
||||
{
|
||||
if (replace.TryReplace(ref releaseTitle))
|
||||
{
|
||||
@@ -242,10 +207,10 @@ namespace NzbDrone.Core.Parser
|
||||
var simpleTitle = SimpleTitleRegex.Replace(releaseTitle);
|
||||
|
||||
// TODO: Quick fix stripping [url] - prefixes.
|
||||
simpleTitle = WebsitePrefixRegex.Replace(simpleTitle);
|
||||
simpleTitle = WebsitePostfixRegex.Replace(simpleTitle);
|
||||
simpleTitle = ParserCommon.WebsitePrefixRegex.Replace(simpleTitle);
|
||||
simpleTitle = ParserCommon.WebsitePostfixRegex.Replace(simpleTitle);
|
||||
|
||||
simpleTitle = CleanTorrentSuffixRegex.Replace(simpleTitle);
|
||||
simpleTitle = ParserCommon.CleanTorrentSuffixRegex.Replace(simpleTitle);
|
||||
|
||||
simpleTitle = CleanQualityBracketsRegex.Replace(simpleTitle, m =>
|
||||
{
|
||||
@@ -295,7 +260,7 @@ namespace NzbDrone.Core.Parser
|
||||
}
|
||||
}
|
||||
|
||||
result.ReleaseGroup = ParseReleaseGroup(simpleReleaseTitle);
|
||||
result.ReleaseGroup = ReleaseGroupParser.ParseReleaseGroup(simpleReleaseTitle);
|
||||
|
||||
var subGroup = GetSubGroup(match);
|
||||
if (!subGroup.IsNullOrWhiteSpace())
|
||||
@@ -521,74 +486,6 @@ namespace NzbDrone.Core.Parser
|
||||
return null;
|
||||
}
|
||||
|
||||
public static string ParseReleaseGroup(string title)
|
||||
{
|
||||
title = title.Trim();
|
||||
title = RemoveFileExtension(title);
|
||||
title = WebsitePrefixRegex.Replace(title);
|
||||
title = CleanTorrentSuffixRegex.Replace(title);
|
||||
|
||||
var animeMatch = AnimeReleaseGroupRegex.Match(title);
|
||||
|
||||
if (animeMatch.Success)
|
||||
{
|
||||
return animeMatch.Groups["subgroup"].Value;
|
||||
}
|
||||
|
||||
title = CleanReleaseGroupRegex.Replace(title);
|
||||
|
||||
var exceptionReleaseGroupRegex = ExceptionReleaseGroupRegex.Matches(title);
|
||||
|
||||
if (exceptionReleaseGroupRegex.Count != 0)
|
||||
{
|
||||
return exceptionReleaseGroupRegex.OfType<Match>().Last().Groups["releasegroup"].Value;
|
||||
}
|
||||
|
||||
var exceptionExactMatch = ExceptionReleaseGroupRegexExact.Matches(title);
|
||||
|
||||
if (exceptionExactMatch.Count != 0)
|
||||
{
|
||||
return exceptionExactMatch.OfType<Match>().Last().Groups["releasegroup"].Value;
|
||||
}
|
||||
|
||||
var matches = ReleaseGroupRegex.Matches(title);
|
||||
|
||||
if (matches.Count != 0)
|
||||
{
|
||||
var group = matches.OfType<Match>().Last().Groups["releasegroup"].Value;
|
||||
|
||||
if (int.TryParse(group, out _))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (InvalidReleaseGroupRegex.IsMatch(group))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return group;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static string RemoveFileExtension(string title)
|
||||
{
|
||||
title = FileExtensionRegex.Replace(title, m =>
|
||||
{
|
||||
var extension = m.Value.ToLower();
|
||||
if (MediaFiles.MediaFileExtensions.Extensions.Contains(extension) || new[] { ".par2", ".nzb" }.Contains(extension))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return m.Value;
|
||||
});
|
||||
|
||||
return title;
|
||||
}
|
||||
|
||||
public static bool HasMultipleLanguages(string title)
|
||||
{
|
||||
return MultiRegex.IsMatch(title);
|
||||
@@ -697,7 +594,7 @@ namespace NzbDrone.Core.Parser
|
||||
return false;
|
||||
}
|
||||
|
||||
var titleWithoutExtension = RemoveFileExtension(title);
|
||||
var titleWithoutExtension = FileExtensions.RemoveFileExtension(title);
|
||||
|
||||
if (RejectHashedReleasesRegex.Any(v => v.IsMatch(titleWithoutExtension)))
|
||||
{
|
||||
|
||||
23
src/NzbDrone.Core/Parser/ParserCommon.cs
Normal file
23
src/NzbDrone.Core/Parser/ParserCommon.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace NzbDrone.Core.Parser;
|
||||
|
||||
// These are functions shared between different parser functions
|
||||
// they are not intended to be used outside of them parsing.
|
||||
internal static class ParserCommon
|
||||
{
|
||||
internal static readonly RegexReplace[] PreSubstitutionRegex = System.Array.Empty<RegexReplace>();
|
||||
|
||||
// Valid TLDs http://data.iana.org/TLD/tlds-alpha-by-domain.txt
|
||||
internal static readonly RegexReplace WebsitePrefixRegex = new (@"^(?:(?:\[|\()\s*)?(?:www\.)?[-a-z0-9-]{1,256}\.(?<!Naruto-Kun\.)(?:[a-z]{2,6}\.[a-z]{2,6}|xn--[a-z0-9-]{4,}|[a-z]{2,})\b(?:\s*(?:\]|\))|[ -]{2,})[ -]*",
|
||||
string.Empty,
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
internal static readonly RegexReplace WebsitePostfixRegex = new (@"(?:\[\s*)?(?:www\.)?[-a-z0-9-]{1,256}\.(?:xn--[a-z0-9-]{4,}|[a-z]{2,6})\b(?:\s*\])$",
|
||||
string.Empty,
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
internal static readonly RegexReplace CleanTorrentSuffixRegex = new (@"\[(?:ettv|rartv|rarbg|cttv|publichd)\]$",
|
||||
string.Empty,
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
}
|
||||
87
src/NzbDrone.Core/Parser/ReleaseGroupParser.cs
Normal file
87
src/NzbDrone.Core/Parser/ReleaseGroupParser.cs
Normal file
@@ -0,0 +1,87 @@
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
|
||||
namespace NzbDrone.Core.Parser;
|
||||
|
||||
public static class ReleaseGroupParser
|
||||
{
|
||||
private static readonly Regex ReleaseGroupRegex = new (@"-(?<releasegroup>[a-z0-9]+(?<part2>-[a-z0-9]+)?(?!.+?(?:480p|576p|720p|1080p|2160p)))(?<!(?:WEB-(DL|Rip)|Blu-Ray|480p|576p|720p|1080p|2160p|DTS-HD|DTS-X|DTS-MA|DTS-ES|-ES|-EN|-CAT|-ENG|-JAP|-GER|-FRA|-FRE|-ITA|-HDRip|\d{1,2}-bit|[ ._]\d{4}-\d{2}|-\d{2}|tmdb(id)?-(?<tmdbid>\d+)|(?<imdbid>tt\d{7,8}))(?:\k<part2>)?)(?:\b|[-._ ]|$)|[-._ ]\[(?<releasegroup>[a-z0-9]+)\]$",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex InvalidReleaseGroupRegex = new (@"^([se]\d+|[0-9a-f]{8})$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex AnimeReleaseGroupRegex = new (@"^(?:\[(?<subgroup>(?!\s).+?(?<!\s))\](?:_|-|\s|\.)?)",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
// Handle Exception Release Groups that don't follow -RlsGrp; Manual List
|
||||
// name only...be very careful with this last; high chance of false positives
|
||||
private static readonly Regex ExceptionReleaseGroupRegexExact = new (@"\b(?<releasegroup>KRaLiMaRKo|E\.N\.D|D\-Z0N3|Koten_Gars|BluDragon|ZØNEHD|HQMUX|VARYG|YIFY|YTS(.(MX|LT|AG))?|TMd|Eml HDTeam|LMain|DarQ|BEN THE MEN|TAoE|QxR|126811)\b", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
// groups whose releases end with RlsGroup) or RlsGroup]
|
||||
private static readonly Regex ExceptionReleaseGroupRegex = new (@"(?<=[._ \[])(?<releasegroup>(Silence|afm72|Panda|Ghost|MONOLITH|Tigole|Joy|ImE|UTR|t3nzin|Anime Time|Project Angel|Hakata Ramen|HONE|Vyndros|SEV|Garshasp|Kappa|Natty|RCVR|SAMPA|YOGI|r00t|EDGE2020|RZeroX|FreetheFish|Anna|Bandi|Qman|theincognito|HDO|DusIctv|DHD|CtrlHD|-ZR-|ADC|XZVN|RH|Kametsu)(?=\]|\)))", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private static readonly RegexReplace CleanReleaseGroupRegex = new (@"(-(RP|1|NZBGeek|Obfuscated|Obfuscation|Scrambled|sample|Pre|postbot|xpost|Rakuv[a-z0-9]*|WhiteRev|BUYMORE|AsRequested|AlternativeToRequested|GEROV|Z0iDS3N|Chamele0n|4P|4Planet|AlteZachen|RePACKPOST))+$",
|
||||
string.Empty,
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
public static string ParseReleaseGroup(string title)
|
||||
{
|
||||
title = title.Trim();
|
||||
title = FileExtensions.RemoveFileExtension(title);
|
||||
foreach (var replace in ParserCommon.PreSubstitutionRegex)
|
||||
{
|
||||
if (replace.TryReplace(ref title))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
title = ParserCommon.WebsitePrefixRegex.Replace(title);
|
||||
title = ParserCommon.CleanTorrentSuffixRegex.Replace(title);
|
||||
|
||||
var animeMatch = AnimeReleaseGroupRegex.Match(title);
|
||||
|
||||
if (animeMatch.Success)
|
||||
{
|
||||
return animeMatch.Groups["subgroup"].Value;
|
||||
}
|
||||
|
||||
title = CleanReleaseGroupRegex.Replace(title);
|
||||
|
||||
var exceptionExactMatch = ExceptionReleaseGroupRegexExact.Matches(title);
|
||||
|
||||
if (exceptionExactMatch.Count != 0)
|
||||
{
|
||||
return exceptionExactMatch.OfType<Match>().Last().Groups["releasegroup"].Value;
|
||||
}
|
||||
|
||||
var exceptionReleaseGroupRegex = ExceptionReleaseGroupRegex.Matches(title);
|
||||
|
||||
if (exceptionReleaseGroupRegex.Count != 0)
|
||||
{
|
||||
return exceptionReleaseGroupRegex.OfType<Match>().Last().Groups["releasegroup"].Value;
|
||||
}
|
||||
|
||||
var matches = ReleaseGroupRegex.Matches(title);
|
||||
|
||||
if (matches.Count != 0)
|
||||
{
|
||||
var group = matches.OfType<Match>().Last().Groups["releasegroup"].Value;
|
||||
|
||||
if (int.TryParse(group, out _))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (InvalidReleaseGroupRegex.IsMatch(group))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return group;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"openapi": "3.0.1",
|
||||
"openapi": "3.0.4",
|
||||
"info": {
|
||||
"title": "Radarr",
|
||||
"description": "Radarr API docs",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<DataCollectors>
|
||||
<DataCollector friendlyName="XPlat code coverage">
|
||||
<Configuration>
|
||||
<Format>opencover</Format>
|
||||
<Format>cobertura</Format>
|
||||
<Exclude>[Radarr.*.Test]*,[Radarr.Test.*]*,[Radarr.Api*]*,[Marr.Data]*,[MonoTorrent]*</Exclude>
|
||||
</Configuration>
|
||||
</DataCollector>
|
||||
|
||||
Reference in New Issue
Block a user