mirror of
https://github.com/Radarr/Radarr.git
synced 2026-03-05 13:21:25 -05:00
Compare commits
19 Commits
v5.28.0.10
...
v6.0.0.102
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3429fe0696 | ||
|
|
100e121afc | ||
|
|
24be516fdb | ||
|
|
f49c35563d | ||
|
|
6e23750705 | ||
|
|
30fc50e049 | ||
|
|
8000abc2be | ||
|
|
62a05e2765 | ||
|
|
f04bff8e91 | ||
|
|
84593502a3 | ||
|
|
d478b404df | ||
|
|
80a9fa68de | ||
|
|
8eb9fc71b8 | ||
|
|
6b1567ddae | ||
|
|
265e931451 | ||
|
|
2a886fb26a | ||
|
|
2235823af3 | ||
|
|
f99162b8ee | ||
|
|
a00ee08750 |
@@ -2,7 +2,7 @@
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
|
||||
{
|
||||
"name": "Radarr",
|
||||
"image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0",
|
||||
"image": "mcr.microsoft.com/devcontainers/dotnet:1-8.0",
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/node:1": {
|
||||
"nodeGypDependencies": true,
|
||||
|
||||
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@@ -10,7 +10,7 @@
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build dotnet",
|
||||
// If you have changed target frameworks, make sure to update the program path.
|
||||
"program": "${workspaceFolder}/_output/net6.0/Radarr",
|
||||
"program": "${workspaceFolder}/_output/net8.0/Radarr",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
||||
|
||||
@@ -9,13 +9,13 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '5.28.0'
|
||||
majorVersion: '6.0.0'
|
||||
minorVersion: $[counter('minorVersion', 2000)]
|
||||
radarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
||||
sentryOrg: 'servarr'
|
||||
sentryUrl: 'https://sentry.servarr.com'
|
||||
dotnetVersion: '6.0.427'
|
||||
dotnetVersion: '8.0.405'
|
||||
nodeVersion: '20.X'
|
||||
innoVersion: '6.2.2'
|
||||
windowsImage: 'windows-2022'
|
||||
@@ -106,7 +106,7 @@ stages:
|
||||
echo "Extra platforms already enabled"
|
||||
else
|
||||
echo "Enabling extra platform support"
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' "$BUNDLEDVERSIONS"
|
||||
fi
|
||||
displayName: Enable Extra Platform Support
|
||||
- bash: ./build.sh --backend --enable-extra-platforms
|
||||
@@ -122,27 +122,23 @@ stages:
|
||||
artifact: '$(osName)Backend'
|
||||
displayName: Publish Backend
|
||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||
- publish: '$(testsFolder)/net6.0/win-x64/publish'
|
||||
- publish: '$(testsFolder)/net8.0/win-x64/publish'
|
||||
artifact: win-x64-tests
|
||||
displayName: Publish win-x64 Test Package
|
||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
|
||||
- publish: '$(testsFolder)/net8.0/linux-x64/publish'
|
||||
artifact: linux-x64-tests
|
||||
displayName: Publish linux-x64 Test Package
|
||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||
- publish: '$(testsFolder)/net6.0/linux-x86/publish'
|
||||
artifact: linux-x86-tests
|
||||
displayName: Publish linux-x86 Test Package
|
||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
|
||||
- publish: '$(testsFolder)/net8.0/linux-musl-x64/publish'
|
||||
artifact: linux-musl-x64-tests
|
||||
displayName: Publish linux-musl-x64 Test Package
|
||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
|
||||
- publish: '$(testsFolder)/net8.0/freebsd-x64/publish'
|
||||
artifact: freebsd-x64-tests
|
||||
displayName: Publish freebsd-x64 Test Package
|
||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
|
||||
- publish: '$(testsFolder)/net8.0/osx-x64/publish'
|
||||
artifact: osx-x64-tests
|
||||
displayName: Publish osx-x64 Test Package
|
||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||
@@ -189,7 +185,7 @@ stages:
|
||||
artifact: '$(osName)Frontend'
|
||||
displayName: Publish Frontend
|
||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||
|
||||
|
||||
- stage: Installer
|
||||
dependsOn:
|
||||
- Build_Backend
|
||||
@@ -260,21 +256,21 @@ stages:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip'
|
||||
archiveType: 'zip'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/win-x64/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create win-x86 zip
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x86.zip'
|
||||
archiveType: 'zip'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/win-x86/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create osx-x64 app
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-x64.zip'
|
||||
archiveType: 'zip'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create osx-x64 tar
|
||||
inputs:
|
||||
@@ -282,14 +278,14 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-x64/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create osx-arm64 app
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-arm64.zip'
|
||||
archiveType: 'zip'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create osx-arm64 tar
|
||||
inputs:
|
||||
@@ -297,7 +293,7 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create linux-x64 tar
|
||||
inputs:
|
||||
@@ -305,7 +301,7 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-x64/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create linux-musl-x64 tar
|
||||
inputs:
|
||||
@@ -313,15 +309,7 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create linux-x86 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-x86.tar.gz'
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-x86/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create linux-arm tar
|
||||
inputs:
|
||||
@@ -329,7 +317,7 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-arm/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create linux-musl-arm tar
|
||||
inputs:
|
||||
@@ -337,7 +325,7 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create linux-arm64 tar
|
||||
inputs:
|
||||
@@ -345,7 +333,7 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create linux-musl-arm64 tar
|
||||
inputs:
|
||||
@@ -353,7 +341,7 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net8.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create freebsd-x64 tar
|
||||
inputs:
|
||||
@@ -361,7 +349,7 @@ stages:
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net6.0
|
||||
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net8.0
|
||||
- publish: $(Build.ArtifactStagingDirectory)
|
||||
artifact: 'Packages'
|
||||
displayName: Publish Packages
|
||||
@@ -392,7 +380,7 @@ stages:
|
||||
SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr)
|
||||
SENTRY_ORG: $(sentryOrg)
|
||||
SENTRY_URL: $(sentryUrl)
|
||||
|
||||
|
||||
- stage: Unit_Test
|
||||
displayName: Unit Tests
|
||||
dependsOn: Build_Backend
|
||||
@@ -493,29 +481,19 @@ stages:
|
||||
testName: 'Musl Net Core'
|
||||
artifactName: linux-musl-x64-tests
|
||||
containerImage: ghcr.io/servarr/testimages:alpine
|
||||
linux-x86:
|
||||
testName: 'linux-x86'
|
||||
artifactName: linux-x86-tests
|
||||
containerImage: ghcr.io/servarr/testimages:linux-x86
|
||||
|
||||
pool:
|
||||
vmImage: ${{ variables.linuxImage }}
|
||||
|
||||
|
||||
container: $[ variables['containerImage'] ]
|
||||
|
||||
timeoutInMinutes: 10
|
||||
|
||||
|
||||
steps:
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Install .NET'
|
||||
inputs:
|
||||
version: $(dotnetVersion)
|
||||
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
|
||||
- bash: |
|
||||
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
|
||||
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
|
||||
displayName: 'Install .NET'
|
||||
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
|
||||
- checkout: none
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Test Artifact
|
||||
@@ -559,7 +537,7 @@ stages:
|
||||
vmImage: ${{ variables.linuxImage }}
|
||||
|
||||
timeoutInMinutes: 10
|
||||
|
||||
|
||||
steps:
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Install .net core'
|
||||
@@ -611,12 +589,12 @@ stages:
|
||||
Radarr__Postgres__Port: '5432'
|
||||
Radarr__Postgres__User: 'radarr'
|
||||
Radarr__Postgres__Password: 'radarr'
|
||||
|
||||
|
||||
pool:
|
||||
vmImage: ${{ variables.linuxImage }}
|
||||
|
||||
timeoutInMinutes: 10
|
||||
|
||||
|
||||
steps:
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Install .net core'
|
||||
@@ -699,7 +677,7 @@ stages:
|
||||
|
||||
pool:
|
||||
vmImage: $(imageName)
|
||||
|
||||
|
||||
steps:
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Install .net core'
|
||||
@@ -721,7 +699,7 @@ stages:
|
||||
targetPath: $(Build.ArtifactStagingDirectory)
|
||||
- task: ExtractFiles@1
|
||||
inputs:
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
|
||||
displayName: Extract Package
|
||||
- bash: |
|
||||
@@ -776,7 +754,7 @@ stages:
|
||||
targetPath: $(Build.ArtifactStagingDirectory)
|
||||
- task: ExtractFiles@1
|
||||
inputs:
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
|
||||
displayName: Extract Package
|
||||
- bash: |
|
||||
@@ -840,7 +818,7 @@ stages:
|
||||
targetPath: $(Build.ArtifactStagingDirectory)
|
||||
- task: ExtractFiles@1
|
||||
inputs:
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
|
||||
displayName: Extract Package
|
||||
- bash: |
|
||||
@@ -926,29 +904,18 @@ stages:
|
||||
artifactName: linux-musl-x64-tests
|
||||
containerImage: ghcr.io/servarr/testimages:alpine
|
||||
pattern: 'Radarr.*.linux-musl-core-x64.tar.gz'
|
||||
linux-x86:
|
||||
testName: 'linux-x86'
|
||||
artifactName: linux-x86-tests
|
||||
containerImage: ghcr.io/servarr/testimages:linux-x86
|
||||
pattern: 'Radarr.*.linux-core-x86.tar.gz'
|
||||
pool:
|
||||
vmImage: ${{ variables.linuxImage }}
|
||||
|
||||
container: $[ variables['containerImage'] ]
|
||||
|
||||
timeoutInMinutes: 15
|
||||
|
||||
|
||||
steps:
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Install .NET'
|
||||
inputs:
|
||||
version: $(dotnetVersion)
|
||||
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
|
||||
- bash: |
|
||||
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
|
||||
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
|
||||
displayName: 'Install .NET'
|
||||
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
|
||||
- checkout: none
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Test Artifact
|
||||
@@ -965,7 +932,7 @@ stages:
|
||||
targetPath: $(Build.ArtifactStagingDirectory)
|
||||
- task: ExtractFiles@1
|
||||
inputs:
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
|
||||
displayName: Extract Package
|
||||
- bash: |
|
||||
@@ -988,7 +955,7 @@ stages:
|
||||
- stage: Automation
|
||||
displayName: Automation
|
||||
dependsOn: Packages
|
||||
|
||||
|
||||
jobs:
|
||||
- job: Automation
|
||||
strategy:
|
||||
@@ -1014,7 +981,7 @@ stages:
|
||||
|
||||
pool:
|
||||
vmImage: $(imageName)
|
||||
|
||||
|
||||
steps:
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Install .net core'
|
||||
@@ -1036,7 +1003,7 @@ stages:
|
||||
targetPath: $(Build.ArtifactStagingDirectory)
|
||||
- task: ExtractFiles@1
|
||||
inputs:
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
|
||||
displayName: Extract Package
|
||||
- bash: |
|
||||
@@ -1161,7 +1128,7 @@ stages:
|
||||
- checkout: self
|
||||
submodules: true
|
||||
persistCredentials: true
|
||||
fetchDepth: 1
|
||||
fetchDepth: 1
|
||||
- bash: ./docs.sh Windows
|
||||
displayName: Create openapi.json
|
||||
- bash: |
|
||||
@@ -1230,13 +1197,13 @@ stages:
|
||||
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
|
||||
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
|
||||
- bash: |
|
||||
./build.sh --backend -f net6.0 -r win-x64
|
||||
TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage
|
||||
./build.sh --backend -f net8.0 -r win-x64
|
||||
TEST_DIR=_tests/net8.0/win-x64/publish/ ./test.sh Windows Unit Coverage
|
||||
displayName: Coverage Unit Tests
|
||||
- task: SonarCloudAnalyze@3
|
||||
condition: eq(variables['System.PullRequest.IsFork'], 'False')
|
||||
displayName: Publish SonarCloud Results
|
||||
- task: reportgenerator@5.3.11
|
||||
- task: reportgenerator@5
|
||||
displayName: Generate Coverage Report
|
||||
inputs:
|
||||
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
|
||||
@@ -1274,4 +1241,3 @@ stages:
|
||||
DISCORDCHANNELID: $(discordChannelId)
|
||||
DISCORDWEBHOOKKEY: $(discordWebhookKey)
|
||||
DISCORDTHREADID: $(discordThreadId)
|
||||
|
||||
|
||||
52
build.sh
52
build.sh
@@ -33,14 +33,14 @@ EnableExtraPlatformsInSDK()
|
||||
echo "Extra platforms already enabled"
|
||||
else
|
||||
echo "Enabling extra platform support"
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' "$BUNDLEDVERSIONS"
|
||||
fi
|
||||
}
|
||||
|
||||
EnableExtraPlatforms()
|
||||
{
|
||||
if grep -qv freebsd-x64 src/Directory.Build.props; then
|
||||
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64;linux-x86</RuntimeIdentifiers>^g" src/Directory.Build.props
|
||||
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64</RuntimeIdentifiers>^g" src/Directory.Build.props
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -79,9 +79,9 @@ Build()
|
||||
|
||||
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
||||
then
|
||||
dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids
|
||||
dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids
|
||||
else
|
||||
dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids
|
||||
dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids
|
||||
fi
|
||||
|
||||
ProgressEnd 'Build'
|
||||
@@ -137,7 +137,7 @@ PackageLinux()
|
||||
|
||||
echo "Adding Radarr.Mono to UpdatePackage"
|
||||
cp $folder/Radarr.Mono.* $folder/Radarr.Update
|
||||
if [ "$framework" = "net6.0" ]; then
|
||||
if [ "$framework" = "net8.0" ]; then
|
||||
cp $folder/Mono.Posix.NETStandard.* $folder/Radarr.Update
|
||||
cp $folder/libMonoPosixHelper.* $folder/Radarr.Update
|
||||
fi
|
||||
@@ -165,7 +165,7 @@ PackageMacOS()
|
||||
|
||||
echo "Adding Radarr.Mono to UpdatePackage"
|
||||
cp $folder/Radarr.Mono.* $folder/Radarr.Update
|
||||
if [ "$framework" = "net6.0" ]; then
|
||||
if [ "$framework" = "net8.0" ]; then
|
||||
cp $folder/Mono.Posix.NETStandard.* $folder/Radarr.Update
|
||||
cp $folder/libMonoPosixHelper.* $folder/Radarr.Update
|
||||
fi
|
||||
@@ -377,15 +377,14 @@ then
|
||||
Build
|
||||
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
||||
then
|
||||
PackageTests "net6.0" "win-x64"
|
||||
PackageTests "net6.0" "win-x86"
|
||||
PackageTests "net6.0" "linux-x64"
|
||||
PackageTests "net6.0" "linux-musl-x64"
|
||||
PackageTests "net6.0" "osx-x64"
|
||||
PackageTests "net8.0" "win-x64"
|
||||
PackageTests "net8.0" "win-x86"
|
||||
PackageTests "net8.0" "linux-x64"
|
||||
PackageTests "net8.0" "linux-musl-x64"
|
||||
PackageTests "net8.0" "osx-x64"
|
||||
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||
then
|
||||
PackageTests "net6.0" "freebsd-x64"
|
||||
PackageTests "net6.0" "linux-x86"
|
||||
PackageTests "net8.0" "freebsd-x64"
|
||||
fi
|
||||
else
|
||||
PackageTests "$FRAMEWORK" "$RID"
|
||||
@@ -413,20 +412,19 @@ then
|
||||
|
||||
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
||||
then
|
||||
Package "net6.0" "win-x64"
|
||||
Package "net6.0" "win-x86"
|
||||
Package "net6.0" "linux-x64"
|
||||
Package "net6.0" "linux-musl-x64"
|
||||
Package "net6.0" "linux-arm64"
|
||||
Package "net6.0" "linux-musl-arm64"
|
||||
Package "net6.0" "linux-arm"
|
||||
Package "net6.0" "linux-musl-arm"
|
||||
Package "net6.0" "osx-x64"
|
||||
Package "net6.0" "osx-arm64"
|
||||
Package "net8.0" "win-x64"
|
||||
Package "net8.0" "win-x86"
|
||||
Package "net8.0" "linux-x64"
|
||||
Package "net8.0" "linux-musl-x64"
|
||||
Package "net8.0" "linux-arm64"
|
||||
Package "net8.0" "linux-musl-arm64"
|
||||
Package "net8.0" "linux-arm"
|
||||
Package "net8.0" "linux-musl-arm"
|
||||
Package "net8.0" "osx-x64"
|
||||
Package "net8.0" "osx-arm64"
|
||||
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||
then
|
||||
Package "net6.0" "freebsd-x64"
|
||||
Package "net6.0" "linux-x86"
|
||||
Package "net8.0" "freebsd-x64"
|
||||
fi
|
||||
else
|
||||
Package "$FRAMEWORK" "$RID"
|
||||
@@ -436,7 +434,7 @@ fi
|
||||
if [ "$INSTALLER" = "YES" ];
|
||||
then
|
||||
InstallInno
|
||||
BuildInstaller "net6.0" "win-x64"
|
||||
BuildInstaller "net6.0" "win-x86"
|
||||
BuildInstaller "net8.0" "win-x64"
|
||||
BuildInstaller "net8.0" "win-x86"
|
||||
RemoveInno
|
||||
fi
|
||||
|
||||
4
docs.sh
4
docs.sh
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
FRAMEWORK="net6.0"
|
||||
FRAMEWORK="net8.0"
|
||||
PLATFORM=$1
|
||||
ARCHITECTURE="${2:-x64}"
|
||||
|
||||
@@ -38,7 +38,7 @@ dotnet clean $slnFile -c Release
|
||||
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
|
||||
|
||||
dotnet new tool-manifest
|
||||
dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli
|
||||
dotnet tool install --version 8.1.4 Swashbuckle.AspNetCore.Cli
|
||||
|
||||
dotnet tool run swagger tofile --output ./src/Radarr.Api.V3/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v3 &
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -30,7 +30,9 @@ export const authenticationMethodOptions = [
|
||||
key: 'basic',
|
||||
get value() {
|
||||
return translate('AuthBasic');
|
||||
}
|
||||
},
|
||||
isDisabled: true,
|
||||
isHidden: true
|
||||
},
|
||||
{
|
||||
key: 'forms',
|
||||
|
||||
5
global.json
Normal file
5
global.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"sdk": {
|
||||
"version": "8.0.405"
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@
|
||||
"@fortawesome/free-solid-svg-icons": "6.7.2",
|
||||
"@fortawesome/react-fontawesome": "0.2.2",
|
||||
"@juggle/resize-observer": "3.4.0",
|
||||
"@microsoft/signalr": "6.0.25",
|
||||
"@microsoft/signalr": "8.0.7",
|
||||
"@sentry/browser": "7.119.1",
|
||||
"@sentry/integrations": "7.119.1",
|
||||
"@tanstack/react-query": "5.74.3",
|
||||
|
||||
@@ -99,13 +99,6 @@
|
||||
<RootNamespace Condition="'$(RadarrProject)'=='true'">$(MSBuildProjectName.Replace('Radarr','NzbDrone'))</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TestProject)'!='true'">
|
||||
<!-- Annotates .NET assemblies with repository information including SHA -->
|
||||
<!-- Sentry uses this to link directly to GitHub at the exact version/file/line -->
|
||||
<!-- This is built-in on .NET 8 and can be removed once the project is updated -->
|
||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Sentry specific configuration: Only in Release mode -->
|
||||
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||
<!-- https://docs.sentry.io/platforms/dotnet/configuration/msbuild/ -->
|
||||
@@ -136,7 +129,7 @@
|
||||
<PackageReference Include="NunitXml.TestLogger" Version="3.0.131" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TestProject)'=='true' and '$(TargetFramework)'=='net6.0'">
|
||||
<ItemGroup Condition="'$(TestProject)'=='true' and '$(TargetFramework)'=='net8.0'">
|
||||
<PackageReference Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="NBuilder" Version="6.1.0" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Selenium.Support" Version="3.141.0" />
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace NzbDrone.Common.Test.EnvironmentInfo
|
||||
[Test]
|
||||
public void should_return_version()
|
||||
{
|
||||
BuildInfo.Version.Major.Should().BeOneOf(5, 10);
|
||||
BuildInfo.Version.Major.Should().BeOneOf(6, 10);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace NzbDrone.Common.Disk
|
||||
{
|
||||
@@ -24,10 +23,5 @@ namespace NzbDrone.Common.Disk
|
||||
: base(message, innerException)
|
||||
{
|
||||
}
|
||||
|
||||
protected DestinationAlreadyExistsException(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,6 +75,17 @@ namespace NzbDrone.Common.EnvironmentInfo
|
||||
{
|
||||
try
|
||||
{
|
||||
if (OsInfo.IsOsx)
|
||||
{
|
||||
var userAppDataFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile, Environment.SpecialFolderOption.DoNotVerify), ".config", "Radarr");
|
||||
|
||||
if (_diskProvider.FolderExists(userAppDataFolder) && !_diskProvider.FileExists(_appFolderInfo.GetConfigPath()))
|
||||
{
|
||||
_diskTransferService.MirrorFolder(userAppDataFolder, _appFolderInfo.AppDataFolder);
|
||||
_diskProvider.DeleteFolder(userAppDataFolder, true);
|
||||
}
|
||||
}
|
||||
|
||||
var oldDbFile = Path.Combine(_appFolderInfo.AppDataFolder, "nzbdrone.db");
|
||||
|
||||
if (_startupContext.Args.ContainsKey(StartupContext.APPDATA))
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
<DefineConstants Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64' or '$(RuntimeIdentifier)' == 'linux-musl-arm64'">ISMUSL</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
|
||||
<PackageReference Include="IPAddressRange" Version="6.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="NLog" Version="5.4.0" />
|
||||
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" />
|
||||
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.10" />
|
||||
<PackageReference Include="Npgsql" Version="9.0.3" />
|
||||
<PackageReference Include="Sentry" Version="4.0.2" />
|
||||
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
|
||||
<PackageReference Include="SharpZipLib" Version="1.4.2" />
|
||||
<PackageReference Include="System.Text.Json" Version="6.0.10" />
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.5" />
|
||||
<PackageReference Include="System.ValueTuple" Version="4.6.1" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
|
||||
<PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.1" />
|
||||
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
|
||||
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
|
||||
<PackageReference Include="System.ServiceProcess.ServiceController" Version="6.0.1" />
|
||||
<PackageReference Include="System.ServiceProcess.ServiceController" Version="8.0.1" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Update="EnsureThat\Resources\ExceptionMessages.Designer.cs">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
|
||||
<ApplicationIcon>..\NzbDrone.Host\Radarr.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -9,7 +9,7 @@ using NzbDrone.Core.Test.Framework;
|
||||
namespace NzbDrone.Core.Test.Datastore.Migration
|
||||
{
|
||||
[TestFixture]
|
||||
public class collectionsFixture : MigrationTest<collections>
|
||||
public class collectionsFixture : MigrationTest<add_collections>
|
||||
{
|
||||
[Test]
|
||||
public void should_add_collection_from_movie_and_link_back_to_movie()
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Dapper" Version="2.0.151" />
|
||||
<PackageReference Include="Dapper" Version="2.1.66" />
|
||||
<PackageReference Include="NBuilder" Version="6.1.0" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
using System;
|
||||
|
||||
namespace NzbDrone.Core.Authentication
|
||||
{
|
||||
public enum AuthenticationType
|
||||
{
|
||||
None = 0,
|
||||
[Obsolete("Use Forms authentication instead")]
|
||||
Basic = 1,
|
||||
Forms = 2,
|
||||
External = 3
|
||||
|
||||
@@ -206,13 +206,24 @@ namespace NzbDrone.Core.Configuration
|
||||
|
||||
if (enabled)
|
||||
{
|
||||
SetValue("AuthenticationMethod", AuthenticationType.Basic);
|
||||
return AuthenticationType.Basic;
|
||||
SetValue("AuthenticationMethod", AuthenticationType.Forms);
|
||||
return AuthenticationType.Forms;
|
||||
}
|
||||
|
||||
return Enum.TryParse<AuthenticationType>(_authOptions.Method, out var enumValue)
|
||||
var value = Enum.TryParse<AuthenticationType>(_authOptions.Method, out var enumValue)
|
||||
? enumValue
|
||||
: GetValueEnum("AuthenticationMethod", AuthenticationType.None);
|
||||
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
if (value == AuthenticationType.Basic)
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
{
|
||||
SetValue("AuthenticationMethod", AuthenticationType.Forms);
|
||||
|
||||
return AuthenticationType.Forms;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -386,6 +397,12 @@ namespace NzbDrone.Core.Configuration
|
||||
{
|
||||
SetValue("EnableSsl", false);
|
||||
}
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
if (AuthenticationMethod == AuthenticationType.Basic)
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
{
|
||||
SetValue("AuthenticationMethod", AuthenticationType.Forms);
|
||||
}
|
||||
}
|
||||
|
||||
private void DeleteOldValues()
|
||||
|
||||
@@ -12,7 +12,7 @@ using NzbDrone.Core.Parser;
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
[Migration(208)]
|
||||
public class collections : NzbDroneMigrationBase
|
||||
public class add_collections : NzbDroneMigrationBase
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
|
||||
{
|
||||
return new HealthCheck(
|
||||
GetType(),
|
||||
HealthCheckResult.Warning,
|
||||
HealthCheckResult.Error,
|
||||
_localizationService.GetLocalizedString(
|
||||
"NamingConfigMovieFolderFormatDeprecatedHealthCheckMessage", new Dictionary<string, object>
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"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",
|
||||
@@ -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",
|
||||
@@ -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",
|
||||
@@ -1077,9 +1077,9 @@
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak",
|
||||
"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}",
|
||||
"AddConditionImplementation": "Dodaj warunek – {implementationName}",
|
||||
"AddConnectionImplementation": "Dodaj Connection - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}",
|
||||
"No": "Nie",
|
||||
@@ -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,35 @@
|
||||
"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ń"
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
"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,6 +1,5 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace NzbDrone.Core.MediaFiles.MovieImport
|
||||
{
|
||||
@@ -19,10 +18,5 @@ namespace NzbDrone.Core.MediaFiles.MovieImport
|
||||
: base(message, innerException)
|
||||
{
|
||||
}
|
||||
|
||||
protected RecycleBinException(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace NzbDrone.Core.MediaFiles.MovieImport
|
||||
{
|
||||
@@ -19,10 +18,5 @@ namespace NzbDrone.Core.MediaFiles.MovieImport
|
||||
: base(message, innerException)
|
||||
{
|
||||
}
|
||||
|
||||
protected RootFolderNotFoundException(SerializationInfo info, StreamingContext context)
|
||||
: base(info, context)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,29 +174,13 @@ namespace NzbDrone.Core.Organizer
|
||||
namingConfig = _namingConfigService.GetConfig();
|
||||
}
|
||||
|
||||
var pattern = namingConfig.MovieFolderFormat;
|
||||
var multipleTokens = TitleRegex.Matches(pattern).Count > 1;
|
||||
|
||||
var tokenHandlers = new Dictionary<string, Func<TokenMatch, string>>(FileNameBuilderTokenEqualityComparer.Instance);
|
||||
|
||||
AddMovieTokens(tokenHandlers, movie);
|
||||
AddReleaseDateTokens(tokenHandlers, movie.Year);
|
||||
AddIdTokens(tokenHandlers, movie);
|
||||
|
||||
var movieFile = movie.MovieFile;
|
||||
|
||||
if (movie.MovieFile != null)
|
||||
{
|
||||
AddQualityTokens(tokenHandlers, movie, movieFile);
|
||||
AddMediaInfoTokens(tokenHandlers, movieFile);
|
||||
AddMovieFileTokens(tokenHandlers, movieFile, multipleTokens);
|
||||
AddEditionTagsTokens(tokenHandlers, movieFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddMovieFileTokens(tokenHandlers, new MovieFile { SceneName = $"{movie.Title} {movie.Year}", RelativePath = $"{movie.Title} {movie.Year}" }, multipleTokens);
|
||||
}
|
||||
|
||||
var pattern = namingConfig.MovieFolderFormat;
|
||||
var splitPatterns = pattern.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
var components = new List<string>();
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ namespace NzbDrone.Core.Organizer
|
||||
{
|
||||
ruleBuilder.SetValidator(new NotEmptyValidator(null));
|
||||
ruleBuilder.SetValidator(new IllegalCharactersValidator());
|
||||
ruleBuilder.SetValidator(new IllegalMovieFolderTokensValidator());
|
||||
|
||||
return ruleBuilder.SetValidator(new ValidMovieFolderFormatValidator());
|
||||
}
|
||||
@@ -59,9 +60,31 @@ namespace NzbDrone.Core.Organizer
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: Deprecate OriginalTokenRegex use for Movie Folder Format
|
||||
return FileNameBuilder.MovieTitleRegex.IsMatch(value) ||
|
||||
FileNameValidation.OriginalTokenRegex.IsMatch(value);
|
||||
return FileNameBuilder.MovieTitleRegex.IsMatch(value);
|
||||
}
|
||||
}
|
||||
|
||||
public class IllegalMovieFolderTokensValidator : PropertyValidator
|
||||
{
|
||||
protected override string GetDefaultMessageTemplate() => "Must not contain deprecated tokens derived from file properties: {tokens}";
|
||||
|
||||
protected override bool IsValid(PropertyValidatorContext context)
|
||||
{
|
||||
if (context.PropertyValue is not string value)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var match = FileNameValidation.DeprecatedMovieFolderTokensRegex.Matches(value);
|
||||
|
||||
if (match.Any())
|
||||
{
|
||||
context.MessageFormatter.AppendArgument("tokens", string.Join(", ", match.Select(c => c.Value).ToArray()));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -260,7 +260,7 @@ namespace NzbDrone.Core.Profiles.Qualities
|
||||
Name = name,
|
||||
Cutoff = profileCutoff,
|
||||
Items = items,
|
||||
Language = Language.English,
|
||||
Language = Language.Original,
|
||||
MinFormatScore = 0,
|
||||
CutoffFormatScore = 0,
|
||||
MinUpgradeFormatScore = 1,
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Dapper" Version="2.0.151" />
|
||||
<PackageReference Include="Dapper" Version="2.1.66" />
|
||||
<PackageReference Include="Diacritical.Net" Version="1.0.4" />
|
||||
<PackageReference Include="Equ" Version="2.3.0" />
|
||||
<PackageReference Include="MailKit" Version="4.8.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.35" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.10" />
|
||||
<PackageReference Include="MailKit" Version="4.13.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.17" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.1.1" />
|
||||
<PackageReference Include="Npgsql" Version="9.0.3" />
|
||||
<PackageReference Include="Polly" Version="8.6.0" />
|
||||
<PackageReference Include="Servarr.FFMpegCore" Version="4.7.0-26" />
|
||||
<PackageReference Include="Servarr.FFprobe" Version="5.1.4.112" />
|
||||
<PackageReference Include="System.Memory" Version="4.6.3" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
||||
<PackageReference Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" />
|
||||
<PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" />
|
||||
<PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
|
||||
@@ -26,7 +26,8 @@
|
||||
<PackageReference Include="NLog" Version="5.4.0" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
<PackageReference Include="MonoTorrent" Version="2.0.7" />
|
||||
<PackageReference Include="System.Text.Json" Version="6.0.10" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.5" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
<OutputType>Library</OutputType>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="8.1.4" />
|
||||
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
|
||||
<PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
<OutputType>Library</OutputType>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.35" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.17" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<!--
|
||||
The netstandard version here doesn't work in net framework
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
</PropertyGroup>
|
||||
<!--
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
<OutputType>Library</OutputType>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace NzbDrone.Test.Common
|
||||
|
||||
if (BuildInfo.IsDebug)
|
||||
{
|
||||
Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", "net6.0", consoleExe));
|
||||
Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", "net8.0", consoleExe));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="FluentAssertions" Version="6.12.1" />
|
||||
<PackageReference Include="FluentValidation" Version="9.5.4" />
|
||||
<PackageReference Include="Moq" Version="4.16.1" />
|
||||
<PackageReference Include="Moq" Version="4.17.2" />
|
||||
<PackageReference Include="NLog" Version="5.4.0" />
|
||||
<PackageReference Include="NUnit" Version="3.14.0" />
|
||||
<PackageReference Include="RestSharp" Version="106.15.0" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Common.Test\Radarr.Common.Test.csproj" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFrameworks>net6.0-windows</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0-windows</TargetFrameworks>
|
||||
<RuntimeIdentifiers>win-x64;win-x86</RuntimeIdentifiers>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ApplicationIcon>..\NzbDrone.Host\Radarr.ico</ApplicationIcon>
|
||||
<GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Resources.Extensions" Version="6.0.0" />
|
||||
<PackageReference Include="System.Resources.Extensions" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />
|
||||
|
||||
@@ -40,10 +40,14 @@ namespace Radarr.Api.V3.Config
|
||||
SharedValidator.RuleFor(c => c.UrlBase).ValidUrlBase();
|
||||
SharedValidator.RuleFor(c => c.InstanceName).ContainsRadarr().When(c => c.InstanceName.IsNotNullOrWhiteSpace());
|
||||
|
||||
SharedValidator.RuleFor(c => c.Username).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Basic ||
|
||||
c.AuthenticationMethod == AuthenticationType.Forms);
|
||||
SharedValidator.RuleFor(c => c.Password).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Basic ||
|
||||
c.AuthenticationMethod == AuthenticationType.Forms);
|
||||
SharedValidator.RuleFor(c => c.Username).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Forms);
|
||||
SharedValidator.RuleFor(c => c.Password).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Forms);
|
||||
|
||||
SharedValidator.RuleFor(c => c.AuthenticationMethod)
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
.NotEqual(AuthenticationType.Basic)
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
.WithMessage("'Basic' is no longer supported, switch to 'Forms' instead.");
|
||||
|
||||
SharedValidator.RuleFor(c => c.PasswordConfirmation)
|
||||
.Must((resource, p) => IsMatchingPassword(resource)).WithMessage("Must match Password");
|
||||
|
||||
@@ -172,10 +172,10 @@ namespace Radarr.Api.V3.Queue
|
||||
var filteredQueue = includeUnknownMovieItems ? queue : queue.Where(q => q.Movie != null);
|
||||
var pending = _pendingReleaseService.GetPendingQueue();
|
||||
|
||||
var hasMovieIdFilter = movieIds.Any();
|
||||
var hasLanguageFilter = languages.Any();
|
||||
var hasQualityFilter = quality.Any();
|
||||
var hasStatusFilter = status.Any();
|
||||
var hasMovieIdFilter = movieIds is { Count: > 0 };
|
||||
var hasLanguageFilter = languages is { Count: > 0 };
|
||||
var hasQualityFilter = quality is { Count: > 0 };
|
||||
var hasStatusFilter = status is { Count: > 0 };
|
||||
|
||||
var fullQueue = filteredQueue.Concat(pending).Where(q =>
|
||||
{
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="FluentValidation" Version="9.5.4" />
|
||||
<PackageReference Include="Ical.Net" Version="4.3.1" />
|
||||
<PackageReference Include="NLog" Version="5.4.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.6.2" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="8.1.4" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="8.1.4" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Core\Radarr.Core.csproj" />
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using FluentValidation;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Core.AutoTagging;
|
||||
@@ -25,7 +26,10 @@ namespace Radarr.Api.V3.Tags
|
||||
{
|
||||
_tagService = tagService;
|
||||
|
||||
SharedValidator.RuleFor(c => c.Label).NotEmpty();
|
||||
SharedValidator.RuleFor(c => c.Label).Cascade(CascadeMode.Stop)
|
||||
.NotEmpty()
|
||||
.Matches("^[a-z0-9-]+$", RegexOptions.IgnoreCase)
|
||||
.WithMessage("Allowed characters a-z, 0-9 and -");
|
||||
}
|
||||
|
||||
protected override TagResource GetResourceById(int id)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"openapi": "3.0.1",
|
||||
"openapi": "3.0.4",
|
||||
"info": {
|
||||
"title": "Radarr",
|
||||
"description": "Radarr API docs",
|
||||
|
||||
@@ -27,9 +27,8 @@ namespace Radarr.Http.Authentication
|
||||
public ApiKeyAuthenticationHandler(IOptionsMonitor<ApiKeyAuthenticationOptions> options,
|
||||
ILoggerFactory logger,
|
||||
UrlEncoder encoder,
|
||||
ISystemClock clock,
|
||||
IConfigFileProvider config)
|
||||
: base(options, logger, encoder, clock)
|
||||
: base(options, logger, encoder)
|
||||
{
|
||||
_apiKey = config.ApiKey;
|
||||
}
|
||||
|
||||
@@ -18,11 +18,6 @@ namespace Radarr.Http.Authentication
|
||||
return authenticationBuilder.AddScheme<ApiKeyAuthenticationOptions, ApiKeyAuthenticationHandler>(name, options);
|
||||
}
|
||||
|
||||
public static AuthenticationBuilder AddBasic(this AuthenticationBuilder authenticationBuilder, string name)
|
||||
{
|
||||
return authenticationBuilder.AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>(name, options => { });
|
||||
}
|
||||
|
||||
public static AuthenticationBuilder AddNone(this AuthenticationBuilder authenticationBuilder, string name)
|
||||
{
|
||||
return authenticationBuilder.AddScheme<AuthenticationSchemeOptions, NoAuthenticationHandler>(name, options => { });
|
||||
@@ -35,7 +30,7 @@ namespace Radarr.Http.Authentication
|
||||
|
||||
public static AuthenticationBuilder AddAppAuthentication(this IServiceCollection services)
|
||||
{
|
||||
services.AddOptions<CookieAuthenticationOptions>(AuthenticationType.Forms.ToString())
|
||||
services.AddOptions<CookieAuthenticationOptions>(nameof(AuthenticationType.Forms))
|
||||
.Configure<IConfigFileProvider>((options, configFileProvider) =>
|
||||
{
|
||||
// Replace diacritics and replace non-word characters to ensure cookie name doesn't contain any valid URL characters not allowed in cookie names
|
||||
@@ -52,10 +47,9 @@ namespace Radarr.Http.Authentication
|
||||
});
|
||||
|
||||
return services.AddAuthentication()
|
||||
.AddNone(AuthenticationType.None.ToString())
|
||||
.AddExternal(AuthenticationType.External.ToString())
|
||||
.AddBasic(AuthenticationType.Basic.ToString())
|
||||
.AddCookie(AuthenticationType.Forms.ToString())
|
||||
.AddNone(nameof(AuthenticationType.None))
|
||||
.AddExternal(nameof(AuthenticationType.External))
|
||||
.AddCookie(nameof(AuthenticationType.Forms))
|
||||
.AddApiKey("API", options =>
|
||||
{
|
||||
options.HeaderName = "X-Api-Key";
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Claims;
|
||||
using System.Text;
|
||||
using System.Text.Encodings.Web;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Core.Authentication;
|
||||
|
||||
namespace Radarr.Http.Authentication
|
||||
{
|
||||
public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
|
||||
{
|
||||
private readonly IAuthenticationService _authService;
|
||||
|
||||
public BasicAuthenticationHandler(IAuthenticationService authService,
|
||||
IOptionsMonitor<AuthenticationSchemeOptions> options,
|
||||
ILoggerFactory logger,
|
||||
UrlEncoder encoder,
|
||||
ISystemClock clock)
|
||||
: base(options, logger, encoder, clock)
|
||||
{
|
||||
_authService = authService;
|
||||
}
|
||||
|
||||
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
|
||||
{
|
||||
if (!Request.Headers.ContainsKey("Authorization"))
|
||||
{
|
||||
return Task.FromResult(AuthenticateResult.Fail("Authorization header missing."));
|
||||
}
|
||||
|
||||
// Get authorization key
|
||||
var authorizationHeader = Request.Headers["Authorization"].ToString();
|
||||
var authHeaderRegex = new Regex(@"Basic (.*)");
|
||||
|
||||
if (!authHeaderRegex.IsMatch(authorizationHeader))
|
||||
{
|
||||
return Task.FromResult(AuthenticateResult.Fail("Authorization code not formatted properly."));
|
||||
}
|
||||
|
||||
var authBase64 = Encoding.UTF8.GetString(Convert.FromBase64String(authHeaderRegex.Replace(authorizationHeader, "$1")));
|
||||
var authSplit = authBase64.Split(':', 2);
|
||||
var authUsername = authSplit[0];
|
||||
var authPassword = authSplit.Length > 1 ? authSplit[1] : throw new Exception("Unable to get password");
|
||||
|
||||
var user = _authService.Login(Request, authUsername, authPassword);
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
return Task.FromResult(AuthenticateResult.Fail("The username or password is not correct."));
|
||||
}
|
||||
|
||||
var claims = new List<Claim>
|
||||
{
|
||||
new Claim("user", user.Username),
|
||||
new Claim("identifier", user.Identifier.ToString()),
|
||||
new Claim("AuthType", AuthenticationType.Basic.ToString())
|
||||
};
|
||||
|
||||
var identity = new ClaimsIdentity(claims, "Basic", "user", "identifier");
|
||||
var principal = new ClaimsPrincipal(identity);
|
||||
var ticket = new AuthenticationTicket(principal, "Basic");
|
||||
|
||||
return Task.FromResult(AuthenticateResult.Success(ticket));
|
||||
}
|
||||
|
||||
protected override Task HandleChallengeAsync(AuthenticationProperties properties)
|
||||
{
|
||||
Response.Headers.Add("WWW-Authenticate", $"Basic realm=\"{BuildInfo.AppName}\"");
|
||||
Response.StatusCode = 401;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
protected override Task HandleForbiddenAsync(AuthenticationProperties properties)
|
||||
{
|
||||
Response.StatusCode = 403;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,9 +13,8 @@ namespace Radarr.Http.Authentication
|
||||
{
|
||||
public NoAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
|
||||
ILoggerFactory logger,
|
||||
UrlEncoder encoder,
|
||||
ISystemClock clock)
|
||||
: base(options, logger, encoder, clock)
|
||||
UrlEncoder encoder)
|
||||
: base(options, logger, encoder)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace NzbDrone.Http.Authentication
|
||||
{
|
||||
public class UiAuthorizationPolicyProvider : IAuthorizationPolicyProvider
|
||||
{
|
||||
private const string POLICY_NAME = "UI";
|
||||
private const string PolicyName = "UI";
|
||||
private readonly IConfigFileProvider _config;
|
||||
|
||||
public DefaultAuthorizationPolicyProvider FallbackPolicyProvider { get; }
|
||||
@@ -26,7 +26,7 @@ namespace NzbDrone.Http.Authentication
|
||||
|
||||
public Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
|
||||
{
|
||||
if (policyName.Equals(POLICY_NAME, StringComparison.OrdinalIgnoreCase))
|
||||
if (policyName.Equals(PolicyName, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var policy = new AuthorizationPolicyBuilder(_config.AuthenticationMethod.ToString())
|
||||
.AddRequirements(new BypassableDenyAnonymousAuthorizationRequirement());
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Radarr.Http.Middleware
|
||||
{
|
||||
if (context.Request.IsApiRequest() && !context.Response.Headers.ContainsKey(VERSIONHEADER))
|
||||
{
|
||||
context.Response.Headers.Add(VERSIONHEADER, _version);
|
||||
context.Response.Headers[VERSIONHEADER] = _version;
|
||||
}
|
||||
|
||||
await _next(context);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="FluentValidation" Version="9.5.4" />
|
||||
<PackageReference Include="ImpromptuInterface" Version="7.0.1" />
|
||||
<PackageReference Include="ImpromptuInterface" Version="8.0.6" />
|
||||
<PackageReference Include="NLog" Version="5.4.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" />
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" />
|
||||
|
||||
7
test.sh
7
test.sh
@@ -37,11 +37,14 @@ fi
|
||||
if [ "$PLATFORM" = "Windows" ]; then
|
||||
mkdir -p "$ProgramData/Radarr"
|
||||
WHERE="$WHERE&Category!=LINUX"
|
||||
elif [ "$PLATFORM" = "Linux" ] || [ "$PLATFORM" = "Mac" ] ; then
|
||||
elif [ "$PLATFORM" = "Linux" ]; then
|
||||
mkdir -p ~/.config/Radarr
|
||||
WHERE="$WHERE&Category!=WINDOWS"
|
||||
elif [ "$PLATFORM" = "Mac" ]; then
|
||||
mkdir -p ~/Library/Application\ Support/Radarr
|
||||
WHERE="$WHERE&Category!=WINDOWS"
|
||||
else
|
||||
echo "Platform must be provided as first arguement: Windows, Linux or Mac"
|
||||
echo "Platform must be provided as first argument: Windows, Linux or Mac"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
48
yarn.lock
48
yarn.lock
@@ -1163,14 +1163,14 @@
|
||||
resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
|
||||
integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
|
||||
|
||||
"@microsoft/signalr@6.0.25":
|
||||
version "6.0.25"
|
||||
resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.25.tgz#009f043066d383e2de41a483bd7e02bfd74d3cf8"
|
||||
integrity sha512-8AzrpxS+E0yn1tXSlv7+UlURLmSxTQDgbvOT0pGKXjZT7MkhnDP+/GLuk7veRtUjczou/x32d9PHhYlr2NBy6Q==
|
||||
"@microsoft/signalr@8.0.7":
|
||||
version "8.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-8.0.7.tgz#94419ddbf9418753e493f4ae4c13990316ec2ea5"
|
||||
integrity sha512-PHcdMv8v5hJlBkRHAuKG5trGViQEkPYee36LnJQx4xHOQ5LL4X0nEWIxOp5cCtZ7tu+30quz5V3k0b1YNuc6lw==
|
||||
dependencies:
|
||||
abort-controller "^3.0.0"
|
||||
eventsource "^1.0.7"
|
||||
fetch-cookie "^0.11.0"
|
||||
eventsource "^2.0.2"
|
||||
fetch-cookie "^2.0.3"
|
||||
node-fetch "^2.6.7"
|
||||
ws "^7.4.5"
|
||||
|
||||
@@ -3360,10 +3360,10 @@ events@^3.2.0:
|
||||
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
|
||||
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
|
||||
|
||||
eventsource@^1.0.7:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.2.tgz#bc75ae1c60209e7cb1541231980460343eaea7c2"
|
||||
integrity sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA==
|
||||
eventsource@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508"
|
||||
integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==
|
||||
|
||||
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
|
||||
version "3.1.3"
|
||||
@@ -3420,12 +3420,13 @@ faye-websocket@~0.10.0:
|
||||
dependencies:
|
||||
websocket-driver ">=0.5.1"
|
||||
|
||||
fetch-cookie@^0.11.0:
|
||||
version "0.11.0"
|
||||
resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407"
|
||||
integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==
|
||||
fetch-cookie@^2.0.3:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-2.2.0.tgz#01086b6b5b1c3e08f15ffd8647b02ca100377365"
|
||||
integrity sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==
|
||||
dependencies:
|
||||
tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
|
||||
set-cookie-parser "^2.4.8"
|
||||
tough-cookie "^4.0.0"
|
||||
|
||||
file-entry-cache@^6.0.1:
|
||||
version "6.0.1"
|
||||
@@ -5469,11 +5470,13 @@ prr@~1.0.1:
|
||||
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
|
||||
|
||||
psl@^1.1.33:
|
||||
version "1.9.0"
|
||||
resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
|
||||
integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
|
||||
version "1.15.0"
|
||||
resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6"
|
||||
integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==
|
||||
dependencies:
|
||||
punycode "^2.3.1"
|
||||
|
||||
punycode@^2.1.0, punycode@^2.1.1:
|
||||
punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
|
||||
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
|
||||
@@ -6223,6 +6226,11 @@ serialize-javascript@^6.0.1:
|
||||
dependencies:
|
||||
randombytes "^2.1.0"
|
||||
|
||||
set-cookie-parser@^2.4.8:
|
||||
version "2.7.1"
|
||||
resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943"
|
||||
integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==
|
||||
|
||||
set-function-length@^1.2.1, set-function-length@^1.2.2:
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
|
||||
@@ -6774,7 +6782,7 @@ toggle-selection@^1.0.6:
|
||||
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
|
||||
integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
|
||||
|
||||
"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
|
||||
tough-cookie@^4.0.0:
|
||||
version "4.1.4"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
|
||||
integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
|
||||
|
||||
Reference in New Issue
Block a user