1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-17 21:26:22 -04:00

Compare commits

...

22 Commits

Author SHA1 Message Date
bogdan
4c1b3a7b82 Bump MailKit and Microsoft.Data.SqlClient 2025-09-07 10:45:27 -05:00
Mark McDowall
6396d83fa7 Change authentication to Forms if set to Basic
(cherry picked from commit dfb6fdfbeb7ce85b287b41fed80f2511727353e5)
2025-09-07 10:44:48 -05:00
Bogdan
bd203d841a Fixed: Validation for tags label 2025-09-07 10:44:48 -05:00
Bogdan
e96d7580f4 Fixed: Removed support for movie file tokens in Movie Folder Format 2025-09-07 10:44:48 -05:00
Bogdan
eb0f7c62b6 New: Validation for movie file tokens in Movie Folder Format 2025-09-07 10:44:48 -05:00
Mark McDowall
41fa0de230 New: Remove Basic Auth
(cherry picked from commit 0f9e063e2146812f6e963363eee70a524612f354)
2025-09-07 10:44:48 -05:00
bakerboy448
cdc6a6dd27 New: Default wanted language for quality profiles changed to Original 2025-09-07 10:44:48 -05:00
Bogdan
1891ac1536 Bump Swashbuckle to 8.1.4 2025-09-07 10:44:48 -05:00
Bogdan
2539d46f7c Bump version to 6.0.0 2025-09-07 10:44:43 -05:00
Bogdan
32fe345144 New: Support removed for linux-x86 2025-09-07 10:44:20 -05:00
Bogdan
9d2193636e New: Migrate appdata folder for .NET 8 on OSX 2025-09-07 10:44:20 -05:00
Bogdan
1e898c2647 New: Bump to .NET 8
Co-authored-by: Qstick <qstick@gmail.com>
2025-09-07 10:44:20 -05:00
bakerboy448
a00ee08750 Bump to 5.28.1 2025-09-07 00:31:28 -05:00
Michon van Dooren
54cbbe05d9 New: (NFO Metadata) Include the TMDB Collection ID (#11164) 2025-09-06 05:58:07 -05:00
Mark McDowall
57f602eb02 New: Changing icon during import to blue 2025-09-03 17:02:22 -05:00
bakerboy448
e841c9b764 Bump to 5.28.0 2025-09-03 07:07:57 -05:00
bakerboy448
81bbaf8946 Fixed: Add missing translation keys 2025-09-01 11:29:59 -05:00
bakerboy448
8b4288fa18 New: UI Note that Filters are for movie properties only
Co-authored-by: PearsonFlyer <john@theediguy.com>

Closes #11200
2025-09-01 11:29:59 -05:00
Weblate
9aa3061e8e Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Gallyam Biktashev <gallyamb@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Xoores <servarr-35466@xoores.cz>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/tr/
Translation: Servarr/Radarr
2025-08-30 12:09:23 -05:00
Weblate
308c58f729 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: ReDFiRe <wwsoft@abv.bg>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: rtme <pps.kmg@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ru/
Translation: Servarr/Radarr
2025-08-21 21:39:34 +01:00
grapexy
d38492188a New: Georgian language support (#11209) 2025-08-17 22:11:49 -05:00
bakerboy448
50e75e1362 Bump to 5.27.5 2025-08-17 14:44:46 -04:00
81 changed files with 364 additions and 375 deletions

View File

@@ -2,7 +2,7 @@
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet // README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
{ {
"name": "Radarr", "name": "Radarr",
"image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0", "image": "mcr.microsoft.com/devcontainers/dotnet:1-8.0",
"features": { "features": {
"ghcr.io/devcontainers/features/node:1": { "ghcr.io/devcontainers/features/node:1": {
"nodeGypDependencies": true, "nodeGypDependencies": true,

2
.vscode/launch.json vendored
View File

@@ -10,7 +10,7 @@
"request": "launch", "request": "launch",
"preLaunchTask": "build dotnet", "preLaunchTask": "build dotnet",
// If you have changed target frameworks, make sure to update the program path. // 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": [], "args": [],
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console

View File

@@ -9,13 +9,13 @@ variables:
testsFolder: './_tests' testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '5.27.4' majorVersion: '6.0.0'
minorVersion: $[counter('minorVersion', 2000)] minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)' radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)' buildName: '$(Build.SourceBranchName).$(radarrVersion)'
sentryOrg: 'servarr' sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com' sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '6.0.427' dotnetVersion: '8.0.405'
nodeVersion: '20.X' nodeVersion: '20.X'
innoVersion: '6.2.2' innoVersion: '6.2.2'
windowsImage: 'windows-2022' windowsImage: 'windows-2022'
@@ -106,7 +106,7 @@ stages:
echo "Extra platforms already enabled" echo "Extra platforms already enabled"
else else
echo "Enabling extra platform support" 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 fi
displayName: Enable Extra Platform Support displayName: Enable Extra Platform Support
- bash: ./build.sh --backend --enable-extra-platforms - bash: ./build.sh --backend --enable-extra-platforms
@@ -122,27 +122,23 @@ stages:
artifact: '$(osName)Backend' artifact: '$(osName)Backend'
displayName: Publish Backend displayName: Publish Backend
condition: and(succeeded(), eq(variables['osName'], 'Windows')) 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 artifact: win-x64-tests
displayName: Publish win-x64 Test Package displayName: Publish win-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) 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 artifact: linux-x64-tests
displayName: Publish linux-x64 Test Package displayName: Publish linux-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net6.0/linux-x86/publish' - publish: '$(testsFolder)/net8.0/linux-musl-x64/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'
artifact: linux-musl-x64-tests artifact: linux-musl-x64-tests
displayName: Publish linux-musl-x64 Test Package displayName: Publish linux-musl-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) 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 artifact: freebsd-x64-tests
displayName: Publish freebsd-x64 Test Package displayName: Publish freebsd-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) 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 artifact: osx-x64-tests
displayName: Publish osx-x64 Test Package displayName: Publish osx-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
@@ -189,7 +185,7 @@ stages:
artifact: '$(osName)Frontend' artifact: '$(osName)Frontend'
displayName: Publish Frontend displayName: Publish Frontend
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Installer - stage: Installer
dependsOn: dependsOn:
- Build_Backend - Build_Backend
@@ -260,21 +256,21 @@ stages:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/win-x64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create win-x86 zip displayName: Create win-x86 zip
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x86.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x86.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0 rootFolderOrFile: $(artifactsFolder)/win-x86/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create osx-x64 app displayName: Create osx-x64 app
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-x64.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-x64.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0 rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create osx-x64 tar displayName: Create osx-x64 tar
inputs: inputs:
@@ -282,14 +278,14 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/osx-x64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create osx-arm64 app displayName: Create osx-arm64 app
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-arm64.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-arm64.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0 rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create osx-arm64 tar displayName: Create osx-arm64 tar
inputs: inputs:
@@ -297,7 +293,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0 rootFolderOrFile: $(artifactsFolder)/osx-arm64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-x64 tar displayName: Create linux-x64 tar
inputs: inputs:
@@ -305,7 +301,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-x64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-musl-x64 tar displayName: Create linux-musl-x64 tar
inputs: inputs:
@@ -313,15 +309,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net8.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
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-arm tar displayName: Create linux-arm tar
inputs: inputs:
@@ -329,7 +317,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-arm/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-musl-arm tar displayName: Create linux-musl-arm tar
inputs: inputs:
@@ -337,7 +325,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-arm64 tar displayName: Create linux-arm64 tar
inputs: inputs:
@@ -345,7 +333,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-arm64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-musl-arm64 tar displayName: Create linux-musl-arm64 tar
inputs: inputs:
@@ -353,7 +341,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create freebsd-x64 tar displayName: Create freebsd-x64 tar
inputs: inputs:
@@ -361,7 +349,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net8.0
- publish: $(Build.ArtifactStagingDirectory) - publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages' artifact: 'Packages'
displayName: Publish Packages displayName: Publish Packages
@@ -392,7 +380,7 @@ stages:
SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr) SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr)
SENTRY_ORG: $(sentryOrg) SENTRY_ORG: $(sentryOrg)
SENTRY_URL: $(sentryUrl) SENTRY_URL: $(sentryUrl)
- stage: Unit_Test - stage: Unit_Test
displayName: Unit Tests displayName: Unit Tests
dependsOn: Build_Backend dependsOn: Build_Backend
@@ -493,29 +481,19 @@ stages:
testName: 'Musl Net Core' testName: 'Musl Net Core'
artifactName: linux-musl-x64-tests artifactName: linux-musl-x64-tests
containerImage: ghcr.io/servarr/testimages:alpine containerImage: ghcr.io/servarr/testimages:alpine
linux-x86:
testName: 'linux-x86'
artifactName: linux-x86-tests
containerImage: ghcr.io/servarr/testimages:linux-x86
pool: pool:
vmImage: ${{ variables.linuxImage }} vmImage: ${{ variables.linuxImage }}
container: $[ variables['containerImage'] ] container: $[ variables['containerImage'] ]
timeoutInMinutes: 10 timeoutInMinutes: 10
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .NET' displayName: 'Install .NET'
inputs: inputs:
version: $(dotnetVersion) 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 - checkout: none
- task: DownloadPipelineArtifact@2 - task: DownloadPipelineArtifact@2
displayName: Download Test Artifact displayName: Download Test Artifact
@@ -559,7 +537,7 @@ stages:
vmImage: ${{ variables.linuxImage }} vmImage: ${{ variables.linuxImage }}
timeoutInMinutes: 10 timeoutInMinutes: 10
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .net core' displayName: 'Install .net core'
@@ -611,12 +589,12 @@ stages:
Radarr__Postgres__Port: '5432' Radarr__Postgres__Port: '5432'
Radarr__Postgres__User: 'radarr' Radarr__Postgres__User: 'radarr'
Radarr__Postgres__Password: 'radarr' Radarr__Postgres__Password: 'radarr'
pool: pool:
vmImage: ${{ variables.linuxImage }} vmImage: ${{ variables.linuxImage }}
timeoutInMinutes: 10 timeoutInMinutes: 10
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .net core' displayName: 'Install .net core'
@@ -699,7 +677,7 @@ stages:
pool: pool:
vmImage: $(imageName) vmImage: $(imageName)
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .net core' displayName: 'Install .net core'
@@ -721,7 +699,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -776,7 +754,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -840,7 +818,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -926,29 +904,18 @@ stages:
artifactName: linux-musl-x64-tests artifactName: linux-musl-x64-tests
containerImage: ghcr.io/servarr/testimages:alpine containerImage: ghcr.io/servarr/testimages:alpine
pattern: 'Radarr.*.linux-musl-core-x64.tar.gz' 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: pool:
vmImage: ${{ variables.linuxImage }} vmImage: ${{ variables.linuxImage }}
container: $[ variables['containerImage'] ] container: $[ variables['containerImage'] ]
timeoutInMinutes: 15 timeoutInMinutes: 15
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .NET' displayName: 'Install .NET'
inputs: inputs:
version: $(dotnetVersion) 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 - checkout: none
- task: DownloadPipelineArtifact@2 - task: DownloadPipelineArtifact@2
displayName: Download Test Artifact displayName: Download Test Artifact
@@ -965,7 +932,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -988,7 +955,7 @@ stages:
- stage: Automation - stage: Automation
displayName: Automation displayName: Automation
dependsOn: Packages dependsOn: Packages
jobs: jobs:
- job: Automation - job: Automation
strategy: strategy:
@@ -1014,7 +981,7 @@ stages:
pool: pool:
vmImage: $(imageName) vmImage: $(imageName)
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .net core' displayName: 'Install .net core'
@@ -1036,7 +1003,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -1161,7 +1128,7 @@ stages:
- checkout: self - checkout: self
submodules: true submodules: true
persistCredentials: true persistCredentials: true
fetchDepth: 1 fetchDepth: 1
- bash: ./docs.sh Windows - bash: ./docs.sh Windows
displayName: Create openapi.json displayName: Create openapi.json
- bash: | - bash: |
@@ -1230,13 +1197,13 @@ stages:
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
- bash: | - bash: |
./build.sh --backend -f net6.0 -r win-x64 ./build.sh --backend -f net8.0 -r win-x64
TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage TEST_DIR=_tests/net8.0/win-x64/publish/ ./test.sh Windows Unit Coverage
displayName: Coverage Unit Tests displayName: Coverage Unit Tests
- task: SonarCloudAnalyze@3 - task: SonarCloudAnalyze@3
condition: eq(variables['System.PullRequest.IsFork'], 'False') condition: eq(variables['System.PullRequest.IsFork'], 'False')
displayName: Publish SonarCloud Results displayName: Publish SonarCloud Results
- task: reportgenerator@5.3.11 - task: reportgenerator@5
displayName: Generate Coverage Report displayName: Generate Coverage Report
inputs: inputs:
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml' reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
@@ -1274,4 +1241,3 @@ stages:
DISCORDCHANNELID: $(discordChannelId) DISCORDCHANNELID: $(discordChannelId)
DISCORDWEBHOOKKEY: $(discordWebhookKey) DISCORDWEBHOOKKEY: $(discordWebhookKey)
DISCORDTHREADID: $(discordThreadId) DISCORDTHREADID: $(discordThreadId)

View File

@@ -33,14 +33,14 @@ EnableExtraPlatformsInSDK()
echo "Extra platforms already enabled" echo "Extra platforms already enabled"
else else
echo "Enabling extra platform support" 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 fi
} }
EnableExtraPlatforms() EnableExtraPlatforms()
{ {
if grep -qv freebsd-x64 src/Directory.Build.props; then 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 fi
} }
@@ -79,9 +79,9 @@ Build()
if [[ -z "$RID" || -z "$FRAMEWORK" ]]; if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then 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 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 fi
ProgressEnd 'Build' ProgressEnd 'Build'
@@ -137,7 +137,7 @@ PackageLinux()
echo "Adding Radarr.Mono to UpdatePackage" echo "Adding Radarr.Mono to UpdatePackage"
cp $folder/Radarr.Mono.* $folder/Radarr.Update 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/Mono.Posix.NETStandard.* $folder/Radarr.Update
cp $folder/libMonoPosixHelper.* $folder/Radarr.Update cp $folder/libMonoPosixHelper.* $folder/Radarr.Update
fi fi
@@ -165,7 +165,7 @@ PackageMacOS()
echo "Adding Radarr.Mono to UpdatePackage" echo "Adding Radarr.Mono to UpdatePackage"
cp $folder/Radarr.Mono.* $folder/Radarr.Update 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/Mono.Posix.NETStandard.* $folder/Radarr.Update
cp $folder/libMonoPosixHelper.* $folder/Radarr.Update cp $folder/libMonoPosixHelper.* $folder/Radarr.Update
fi fi
@@ -377,15 +377,14 @@ then
Build Build
if [[ -z "$RID" || -z "$FRAMEWORK" ]]; if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then then
PackageTests "net6.0" "win-x64" PackageTests "net8.0" "win-x64"
PackageTests "net6.0" "win-x86" PackageTests "net8.0" "win-x86"
PackageTests "net6.0" "linux-x64" PackageTests "net8.0" "linux-x64"
PackageTests "net6.0" "linux-musl-x64" PackageTests "net8.0" "linux-musl-x64"
PackageTests "net6.0" "osx-x64" PackageTests "net8.0" "osx-x64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ]; if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then then
PackageTests "net6.0" "freebsd-x64" PackageTests "net8.0" "freebsd-x64"
PackageTests "net6.0" "linux-x86"
fi fi
else else
PackageTests "$FRAMEWORK" "$RID" PackageTests "$FRAMEWORK" "$RID"
@@ -413,20 +412,19 @@ then
if [[ -z "$RID" || -z "$FRAMEWORK" ]]; if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then then
Package "net6.0" "win-x64" Package "net8.0" "win-x64"
Package "net6.0" "win-x86" Package "net8.0" "win-x86"
Package "net6.0" "linux-x64" Package "net8.0" "linux-x64"
Package "net6.0" "linux-musl-x64" Package "net8.0" "linux-musl-x64"
Package "net6.0" "linux-arm64" Package "net8.0" "linux-arm64"
Package "net6.0" "linux-musl-arm64" Package "net8.0" "linux-musl-arm64"
Package "net6.0" "linux-arm" Package "net8.0" "linux-arm"
Package "net6.0" "linux-musl-arm" Package "net8.0" "linux-musl-arm"
Package "net6.0" "osx-x64" Package "net8.0" "osx-x64"
Package "net6.0" "osx-arm64" Package "net8.0" "osx-arm64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ]; if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then then
Package "net6.0" "freebsd-x64" Package "net8.0" "freebsd-x64"
Package "net6.0" "linux-x86"
fi fi
else else
Package "$FRAMEWORK" "$RID" Package "$FRAMEWORK" "$RID"
@@ -436,7 +434,7 @@ fi
if [ "$INSTALLER" = "YES" ]; if [ "$INSTALLER" = "YES" ];
then then
InstallInno InstallInno
BuildInstaller "net6.0" "win-x64" BuildInstaller "net8.0" "win-x64"
BuildInstaller "net6.0" "win-x86" BuildInstaller "net8.0" "win-x86"
RemoveInno RemoveInno
fi fi

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
FRAMEWORK="net6.0" FRAMEWORK="net8.0"
PLATFORM=$1 PLATFORM=$1
ARCHITECTURE="${2:-x64}" 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 msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
dotnet new tool-manifest 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 & dotnet tool run swagger tofile --output ./src/Radarr.Api.V3/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v3 &

View File

@@ -26,7 +26,7 @@ function BlocklistDetailsModal(props: BlocklistDetailsModalProps) {
return ( return (
<Modal isOpen={isOpen} onModalClose={onModalClose}> <Modal isOpen={isOpen} onModalClose={onModalClose}>
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader>Details</ModalHeader> <ModalHeader>{translate('Details')}</ModalHeader>
<ModalBody> <ModalBody>
<DescriptionList> <DescriptionList>

View File

@@ -304,7 +304,7 @@ function Queue() {
<PageToolbar> <PageToolbar>
<PageToolbarSection> <PageToolbarSection>
<PageToolbarButton <PageToolbarButton
label="Refresh" label={translate('Refresh')}
iconName={icons.REFRESH} iconName={icons.REFRESH}
isSpinning={isRefreshing} isSpinning={isRefreshing}
onPress={handleRefreshPress} onPress={handleRefreshPress}

View File

@@ -90,7 +90,7 @@ function QueueStatus(props: QueueStatusProps) {
if (trackedDownloadState === 'importing') { if (trackedDownloadState === 'importing') {
title += ` - ${translate('Importing')}`; title += ` - ${translate('Importing')}`;
iconKind = kinds.PURPLE; iconKind = kinds.PRIMARY;
} }
if (trackedDownloadState === 'failedPending') { if (trackedDownloadState === 'failedPending') {

View File

@@ -56,6 +56,8 @@ function CustomFiltersModalContent(props) {
{translate('AddCustomFilter')} {translate('AddCustomFilter')}
</Button> </Button>
</div> </div>
<br />
{translate('FilterMoviePropertiesOnlyNotFileWarning')}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>

View File

@@ -26,6 +26,10 @@
color: var(--warningColor); color: var(--warningColor);
} }
.primary {
color: var(--primaryColor);
}
.purple { .purple {
color: var(--purple); color: var(--purple);
} }

View File

@@ -6,6 +6,7 @@ interface CssExports {
'disabled': string; 'disabled': string;
'info': string; 'info': string;
'pink': string; 'pink': string;
'primary': string;
'purple': string; 'purple': string;
'success': string; 'success': string;
'warning': string; 'warning': string;

View File

@@ -284,7 +284,7 @@ const MovieIndex = withScrollPosition((props: MovieIndexProps) => {
/> />
<MovieIndexSelectAllButton <MovieIndexSelectAllButton
label="SelectAll" label={translate('SelectAll')}
isSelectMode={isSelectMode} isSelectMode={isSelectMode}
overflowComponent={MovieIndexSelectAllMenuItem} overflowComponent={MovieIndexSelectAllMenuItem}
/> />

View File

@@ -30,7 +30,9 @@ export const authenticationMethodOptions = [
key: 'basic', key: 'basic',
get value() { get value() {
return translate('AuthBasic'); return translate('AuthBasic');
} },
isDisabled: true,
isHidden: true
}, },
{ {
key: 'forms', key: 'forms',

View File

@@ -100,7 +100,7 @@ function ImportList({
<TagList tags={tags} tagList={tagList} /> <TagList tags={tags} tagList={tagList} />
<div className={styles.enabled}> <div className={styles.enabled}>
<Label kind={kinds.DEFAULT} title="List Refresh Interval"> <Label kind={kinds.DEFAULT} title={translate('ListRefreshInterval')}>
{`${translate('Refresh')}: ${formatShortTimeSpan( {`${translate('Refresh')}: ${formatShortTimeSpan(
minRefreshInterval minRefreshInterval
)}`} )}`}

5
global.json Normal file
View File

@@ -0,0 +1,5 @@
{
"sdk": {
"version": "8.0.405"
}
}

View File

@@ -29,7 +29,7 @@
"@fortawesome/free-solid-svg-icons": "6.7.2", "@fortawesome/free-solid-svg-icons": "6.7.2",
"@fortawesome/react-fontawesome": "0.2.2", "@fortawesome/react-fontawesome": "0.2.2",
"@juggle/resize-observer": "3.4.0", "@juggle/resize-observer": "3.4.0",
"@microsoft/signalr": "6.0.25", "@microsoft/signalr": "8.0.7",
"@sentry/browser": "7.119.1", "@sentry/browser": "7.119.1",
"@sentry/integrations": "7.119.1", "@sentry/integrations": "7.119.1",
"@tanstack/react-query": "5.74.3", "@tanstack/react-query": "5.74.3",

View File

@@ -99,13 +99,6 @@
<RootNamespace Condition="'$(RadarrProject)'=='true'">$(MSBuildProjectName.Replace('Radarr','NzbDrone'))</RootNamespace> <RootNamespace Condition="'$(RadarrProject)'=='true'">$(MSBuildProjectName.Replace('Radarr','NzbDrone'))</RootNamespace>
</PropertyGroup> </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 --> <!-- Sentry specific configuration: Only in Release mode -->
<PropertyGroup Condition="'$(Configuration)' == 'Release'"> <PropertyGroup Condition="'$(Configuration)' == 'Release'">
<!-- https://docs.sentry.io/platforms/dotnet/configuration/msbuild/ --> <!-- https://docs.sentry.io/platforms/dotnet/configuration/msbuild/ -->
@@ -136,7 +129,7 @@
<PackageReference Include="NunitXml.TestLogger" Version="3.0.131" /> <PackageReference Include="NunitXml.TestLogger" Version="3.0.131" />
</ItemGroup> </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" /> <PackageReference Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" />
</ItemGroup> </ItemGroup>

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="NBuilder" Version="6.1.0" /> <PackageReference Include="NBuilder" Version="6.1.0" />

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Selenium.Support" Version="3.141.0" /> <PackageReference Include="Selenium.Support" Version="3.141.0" />

View File

@@ -10,7 +10,7 @@ namespace NzbDrone.Common.Test.EnvironmentInfo
[Test] [Test]
public void should_return_version() public void should_return_version()
{ {
BuildInfo.Version.Major.Should().BeOneOf(5, 10); BuildInfo.Version.Major.Should().BeOneOf(6, 10);
} }
[Test] [Test]

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" /> <ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />

View File

@@ -1,6 +1,5 @@
using System; using System;
using System.IO; using System.IO;
using System.Runtime.Serialization;
namespace NzbDrone.Common.Disk namespace NzbDrone.Common.Disk
{ {
@@ -24,10 +23,5 @@ namespace NzbDrone.Common.Disk
: base(message, innerException) : base(message, innerException)
{ {
} }
protected DestinationAlreadyExistsException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
} }
} }

View File

@@ -75,6 +75,17 @@ namespace NzbDrone.Common.EnvironmentInfo
{ {
try 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"); var oldDbFile = Path.Combine(_appFolderInfo.AppDataFolder, "nzbdrone.db");
if (_startupContext.Args.ContainsKey(StartupContext.APPDATA)) if (_startupContext.Args.ContainsKey(StartupContext.APPDATA))

View File

@@ -1,28 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<DefineConstants Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64' or '$(RuntimeIdentifier)' == 'linux-musl-arm64'">ISMUSL</DefineConstants> <DefineConstants Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64' or '$(RuntimeIdentifier)' == 'linux-musl-arm64'">ISMUSL</DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="IPAddressRange" Version="6.2.0" /> <PackageReference Include="IPAddressRange" Version="6.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NLog" Version="5.4.0" /> <PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" /> <PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" /> <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="Sentry" Version="4.0.2" />
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" /> <PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageReference Include="SharpZipLib" Version="1.4.2" /> <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.ValueTuple" Version="4.6.1" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> <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.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.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>
<ItemGroup> <ItemGroup>
<Compile Update="EnsureThat\Resources\ExceptionMessages.Designer.cs"> <Compile Update="EnsureThat\Resources\ExceptionMessages.Designer.cs">

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<ApplicationIcon>..\NzbDrone.Host\Radarr.ico</ApplicationIcon> <ApplicationIcon>..\NzbDrone.Host\Radarr.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>

View File

@@ -9,7 +9,7 @@ using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.Datastore.Migration namespace NzbDrone.Core.Test.Datastore.Migration
{ {
[TestFixture] [TestFixture]
public class collectionsFixture : MigrationTest<collections> public class collectionsFixture : MigrationTest<add_collections>
{ {
[Test] [Test]
public void should_add_collection_from_movie_and_link_back_to_movie() public void should_add_collection_from_movie_and_link_back_to_movie()

View File

@@ -68,7 +68,8 @@ namespace NzbDrone.Core.Test.Languages
new object[] { 53, Language.Tagalog }, new object[] { 53, Language.Tagalog },
new object[] { 54, Language.Urdu }, new object[] { 54, Language.Urdu },
new object[] { 55, Language.Romansh }, new object[] { 55, Language.Romansh },
new object[] { 56, Language.Mongolian } new object[] { 56, Language.Mongolian },
new object[] { 57, Language.Georgian }
}; };
public static object[] ToIntCases = public static object[] ToIntCases =
@@ -131,7 +132,8 @@ namespace NzbDrone.Core.Test.Languages
new object[] { Language.Tagalog, 53 }, new object[] { Language.Tagalog, 53 },
new object[] { Language.Urdu, 54 }, new object[] { Language.Urdu, 54 },
new object[] { Language.Romansh, 55 }, new object[] { Language.Romansh, 55 },
new object[] { Language.Mongolian, 56 } new object[] { Language.Mongolian, 56 },
new object[] { Language.Georgian, 57 }
}; };
[Test] [Test]

View File

@@ -407,6 +407,8 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests
[TestCase("nor", "NO")] [TestCase("nor", "NO")]
[TestCase("khk", "MN")] [TestCase("khk", "MN")]
[TestCase("mvf", "MN")] [TestCase("mvf", "MN")]
[TestCase("geo", "KA")]
[TestCase("kat", "KA")]
public void should_format_languagecodes_properly(string language, string code) public void should_format_languagecodes_properly(string language, string code)
{ {
_namingConfig.StandardMovieFormat = "{Movie.Title}.{MEDIAINFO.FULL}"; _namingConfig.StandardMovieFormat = "{Movie.Title}.{MEDIAINFO.FULL}";

View File

@@ -119,5 +119,15 @@ namespace NzbDrone.Core.Test.ParserTests
var result = IsoLanguages.Find(isoCode); var result = IsoLanguages.Find(isoCode);
result.Language.Should().Be(Language.Bengali); result.Language.Should().Be(Language.Bengali);
} }
[TestCase("ka")]
[TestCase("geo")]
[TestCase("kat")]
[TestCase("ka-GE")]
public void should_return_georgian(string isoCode)
{
var result = IsoLanguages.Find(isoCode);
result.Language.Should().Be(Language.Georgian);
}
} }
} }

View File

@@ -521,6 +521,16 @@ namespace NzbDrone.Core.Test.ParserTests
result.Should().Contain(Language.Mongolian); result.Should().Contain(Language.Mongolian);
} }
[TestCase("Movie.Title.1994.Georgian.WEB-DL.h264")]
[TestCase("Movie.Title.2016.Geo.WEB-DL.h264")]
[TestCase("Movie.Title.2016.KA.WEB-DL.h264")]
[TestCase("Movie.Title.2016.RU-KA.WEB-DL.h264")]
public void should_parse_language_georgian(string postTitle)
{
var result = LanguageParser.ParseLanguages(postTitle);
result.Should().Contain(Language.Georgian);
}
[TestCase("Movie.Title.en.sub")] [TestCase("Movie.Title.en.sub")]
[TestCase("Movie Title.eng.sub")] [TestCase("Movie Title.eng.sub")]
[TestCase("Movie.Title.eng.forced.sub")] [TestCase("Movie.Title.eng.forced.sub")]

View File

@@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.0.151" /> <PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="NBuilder" Version="6.1.0" /> <PackageReference Include="NBuilder" Version="6.1.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> <PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
</ItemGroup> </ItemGroup>

View File

@@ -1,8 +1,11 @@
using System;
namespace NzbDrone.Core.Authentication namespace NzbDrone.Core.Authentication
{ {
public enum AuthenticationType public enum AuthenticationType
{ {
None = 0, None = 0,
[Obsolete("Use Forms authentication instead")]
Basic = 1, Basic = 1,
Forms = 2, Forms = 2,
External = 3 External = 3

View File

@@ -206,13 +206,24 @@ namespace NzbDrone.Core.Configuration
if (enabled) if (enabled)
{ {
SetValue("AuthenticationMethod", AuthenticationType.Basic); SetValue("AuthenticationMethod", AuthenticationType.Forms);
return AuthenticationType.Basic; return AuthenticationType.Forms;
} }
return Enum.TryParse<AuthenticationType>(_authOptions.Method, out var enumValue) var value = Enum.TryParse<AuthenticationType>(_authOptions.Method, out var enumValue)
? enumValue ? enumValue
: GetValueEnum("AuthenticationMethod", AuthenticationType.None); : 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); 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() private void DeleteOldValues()

View File

@@ -12,7 +12,7 @@ using NzbDrone.Core.Parser;
namespace NzbDrone.Core.Datastore.Migration namespace NzbDrone.Core.Datastore.Migration
{ {
[Migration(208)] [Migration(208)]
public class collections : NzbDroneMigrationBase public class add_collections : NzbDroneMigrationBase
{ {
protected override void MainDbUpgrade() protected override void MainDbUpgrade()
{ {

View File

@@ -280,6 +280,7 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
{ {
var setElement = new XElement("set"); var setElement = new XElement("set");
setElement.SetAttributeValue("tmdbcolid", movie.MovieMetadata.Value.CollectionTmdbId);
setElement.Add(new XElement("name", movie.MovieMetadata.Value.CollectionTitle)); setElement.Add(new XElement("name", movie.MovieMetadata.Value.CollectionTitle));
setElement.Add(new XElement("overview")); setElement.Add(new XElement("overview"));

View File

@@ -30,7 +30,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
{ {
return new HealthCheck( return new HealthCheck(
GetType(), GetType(),
HealthCheckResult.Warning, HealthCheckResult.Error,
_localizationService.GetLocalizedString( _localizationService.GetLocalizedString(
"NamingConfigMovieFolderFormatDeprecatedHealthCheckMessage", new Dictionary<string, object> "NamingConfigMovieFolderFormatDeprecatedHealthCheckMessage", new Dictionary<string, object>
{ {

View File

@@ -75,6 +75,8 @@ namespace NzbDrone.Core.ImportLists.TMDb
[FieldOption(Hint = "Raeto-Romance")] [FieldOption(Hint = "Raeto-Romance")]
rm, rm,
[FieldOption(Hint = "Mongolian")] [FieldOption(Hint = "Mongolian")]
mn mn,
[FieldOption(Hint = "Georgian")]
ka
} }
} }

View File

@@ -127,6 +127,7 @@ namespace NzbDrone.Core.Languages
public static Language Urdu => new Language(54, "Urdu"); public static Language Urdu => new Language(54, "Urdu");
public static Language Romansh => new Language(55, "Romansh"); public static Language Romansh => new Language(55, "Romansh");
public static Language Mongolian => new Language(56, "Mongolian"); public static Language Mongolian => new Language(56, "Mongolian");
public static Language Georgian => new Language(57, "Georgian");
public static Language Any => new Language(-1, "Any"); public static Language Any => new Language(-1, "Any");
public static Language Original => new Language(-2, "Original"); public static Language Original => new Language(-2, "Original");
@@ -193,6 +194,7 @@ namespace NzbDrone.Core.Languages
Urdu, Urdu,
Romansh, Romansh,
Mongolian, Mongolian,
Georgian,
Any, Any,
Original Original
}; };

View File

@@ -1204,5 +1204,19 @@
"IndexerHDBitsSettingsCategories": "Категории", "IndexerHDBitsSettingsCategories": "Категории",
"IndexerHDBitsSettingsMediums": "Среден", "IndexerHDBitsSettingsMediums": "Среден",
"IndexerSettingsCategories": "Категории", "IndexerSettingsCategories": "Категории",
"ReleaseProfile": "Профил за издания" "ReleaseProfile": "Профил за издания",
"CinemaRelease": "Пуснат по кината",
"BlocklistedAt": "Блокиран на {date}",
"Complete": "Завърши",
"DeleteSelected": "Изтрийте избраните",
"CollectionShowDetailsHelpText": "Покажи статуса и свойствата на колекцията",
"AutoTaggingSpecificationStudio": "Студио(я)",
"Completed": "Завършено",
"DelayMinutes": "{delay} Минути",
"Category": "Категория",
"AutoTaggingSpecificationKeyword": "Ключова(и) дума(и)",
"ChangeCategory": "Промени категорията",
"DefaultNotFoundMessage": "Трябва да сте се изгубили, няма какво да видите тук.",
"ClearBlocklist": "Изчисти списъка с блокирани",
"CountMissingMoviesFromLibrary": "Липсващи филми от библеотеката : {count}"
} }

View File

@@ -46,7 +46,7 @@
"DeleteRestrictionHelpText": "Opravdu chcete toto omezení smazat?", "DeleteRestrictionHelpText": "Opravdu chcete toto omezení smazat?",
"DeleteTagMessageText": "Opravdu chcete smazat značku „{0}“?", "DeleteTagMessageText": "Opravdu chcete smazat značku „{0}“?",
"DetailedProgressBar": "Podrobný ukazatel průběhu", "DetailedProgressBar": "Podrobný ukazatel průběhu",
"Discord": "Svár", "Discord": "Discord",
"DownloadClients": "Stáhnout klienty", "DownloadClients": "Stáhnout klienty",
"DownloadClientsSettingsSummary": "Stahování klientů, zpracování stahování a mapování vzdálených cest", "DownloadClientsSettingsSummary": "Stahování klientů, zpracování stahování a mapování vzdálených cest",
"DownloadPropersAndRepacks": "Sponzoři a přebalení", "DownloadPropersAndRepacks": "Sponzoři a přebalení",
@@ -190,7 +190,7 @@
"DeleteCustomFormat": "Odstranit vlastní formát", "DeleteCustomFormat": "Odstranit vlastní formát",
"DeletedMovieDescription": "Film byl odstraněn z TMDb", "DeletedMovieDescription": "Film byl odstraněn z TMDb",
"DeleteMovieFolder": "Odstranit složku filmu", "DeleteMovieFolder": "Odstranit složku filmu",
"DockerUpdater": "aktualizujte kontejner dockeru, abyste aktualizaci obdrželi", "DockerUpdater": "Pro získání aktualizace je třeba aktualizovat docker kontejner",
"AddToDownloadQueue": "Přidat stahování do fronty", "AddToDownloadQueue": "Přidat stahování do fronty",
"AfterManualRefresh": "Po manuálním obnovení", "AfterManualRefresh": "Po manuálním obnovení",
"AllFiles": "Všechny soubory", "AllFiles": "Všechny soubory",
@@ -347,12 +347,12 @@
"Local": "Místní", "Local": "Místní",
"ManualImport": "Ruční import", "ManualImport": "Ruční import",
"MarkAsFailed": "Označit jako neúspěšné", "MarkAsFailed": "Označit jako neúspěšné",
"MaximumSizeHelpText": "Maximální velikost uvolnění, která se má zachytit v MB. Nastavit na nulu nastavit na neomezený", "MaximumSizeHelpText": "Maximální velikost vydání, která se mají stahovat v MB. Nula znamená bez omezení",
"Mechanism": "Mechanismus", "Mechanism": "Mechanismus",
"MediaInfo": "Informace o médiích", "MediaInfo": "Informace o médiích",
"MediaManagement": "Správa médií", "MediaManagement": "Správa médií",
"MediaManagementSettings": "Nastavení správy médií", "MediaManagementSettings": "Nastavení správy médií",
"MediaManagementSettingsSummary": "Nastavení pojmenování a správy souborů", "MediaManagementSettingsSummary": "Nastavení jmenné konvence a správy souborů",
"Hostname": "Název hostitele", "Hostname": "Název hostitele",
"Missing": "Chybějící", "Missing": "Chybějící",
"Month": "Měsíc", "Month": "Měsíc",
@@ -436,7 +436,7 @@
"RestartRequiredHelpTextWarning": "Vyžaduje restart, aby se projevilo", "RestartRequiredHelpTextWarning": "Vyžaduje restart, aby se projevilo",
"Restore": "Obnovit", "Restore": "Obnovit",
"RestoreBackup": "Obnovit zálohu", "RestoreBackup": "Obnovit zálohu",
"RootFolder": "Kořenový adresář", "RootFolder": "Kořenová složka",
"RootFolderCheckMultipleMessage": "Chybí více kořenových složek: {rootFolderPaths}", "RootFolderCheckMultipleMessage": "Chybí více kořenových složek: {rootFolderPaths}",
"SendAnonymousUsageData": "Odesílejte anonymní údaje o používání", "SendAnonymousUsageData": "Odesílejte anonymní údaje o používání",
"FileBrowserPlaceholderText": "Začněte psát nebo vyberte cestu níže", "FileBrowserPlaceholderText": "Začněte psát nebo vyberte cestu níže",
@@ -495,7 +495,7 @@
"CustomFormatsSettingsSummary": "Vlastní formáty a nastavení", "CustomFormatsSettingsSummary": "Vlastní formáty a nastavení",
"CustomFormatUnknownConditionOption": "Neznámá možnost „{key}“ pro podmínku „{implementation}“", "CustomFormatUnknownConditionOption": "Neznámá možnost „{key}“ pro podmínku „{implementation}“",
"Cutoff": "Odříznout", "Cutoff": "Odříznout",
"UpgradeUntilMovieHelpText": "Jakmile je této kvality dosaženo, {appName} již nebude stahovat filmy", "UpgradeUntilMovieHelpText": "Jakmile stažený film dosáhne nebo překročí nastavenou kvalitu, {appName} nebude dále stahovat další vydání",
"CutoffUnmet": "Mezní hodnota nesplněna", "CutoffUnmet": "Mezní hodnota nesplněna",
"Days": "Dny", "Days": "Dny",
"Debug": "Ladit", "Debug": "Ladit",
@@ -503,7 +503,7 @@
"DefaultDelayProfileMovie": "Toto je výchozí profil. Platí pro všechny filmy, které nemají explicitní profil.", "DefaultDelayProfileMovie": "Toto je výchozí profil. Platí pro všechny filmy, které nemají explicitní profil.",
"DelayProfile": "Zpožděný profil", "DelayProfile": "Zpožděný profil",
"DelayProfiles": "Profily zpoždění", "DelayProfiles": "Profily zpoždění",
"Delete": "Vymazat", "Delete": "Smazat",
"DeleteBackupMessageText": "Opravdu chcete odstranit zálohu '{name}'?", "DeleteBackupMessageText": "Opravdu chcete odstranit zálohu '{name}'?",
"Deleted": "Smazáno", "Deleted": "Smazáno",
"DeleteDelayProfile": "Smazat profil zpoždění", "DeleteDelayProfile": "Smazat profil zpoždění",
@@ -649,7 +649,7 @@
"LinkHere": "tady", "LinkHere": "tady",
"Links": "Odkazy", "Links": "Odkazy",
"ImportLists": "Seznamy", "ImportLists": "Seznamy",
"ImportListSettings": "Nastavení seznamu", "ImportListSettings": "Nastavení seznamu pro import",
"ListSyncLevelHelpText": "Filmy v knihovně budou zpracovány na základě vašeho výběru, pokud vypadnou nebo se neobjeví na vašich seznamech", "ListSyncLevelHelpText": "Filmy v knihovně budou zpracovány na základě vašeho výběru, pokud vypadnou nebo se neobjeví na vašich seznamech",
"LogFiles": "Záznam souborů", "LogFiles": "Záznam souborů",
"Logging": "Protokolování", "Logging": "Protokolování",
@@ -836,7 +836,7 @@
"SourcePath": "Cesta zdroje", "SourcePath": "Cesta zdroje",
"SourceRelativePath": "Cesta relativního zdroje", "SourceRelativePath": "Cesta relativního zdroje",
"SourceTitle": "Název zdroje", "SourceTitle": "Název zdroje",
"SslCertPassword": "Heslo SSL Cert", "SslCertPassword": "Heslo SSL Certifikátu",
"SslCertPasswordHelpText": "Heslo pro soubor pfx", "SslCertPasswordHelpText": "Heslo pro soubor pfx",
"SslCertPath": "Cesta certifikátu SSL", "SslCertPath": "Cesta certifikátu SSL",
"SslCertPathHelpText": "Cesta k souboru pfx", "SslCertPathHelpText": "Cesta k souboru pfx",
@@ -979,7 +979,7 @@
"DeleteDelayProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?", "DeleteDelayProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
"DeleteFormatMessageText": "Opravdu chcete smazat značku formátu {0}?", "DeleteFormatMessageText": "Opravdu chcete smazat značku formátu {0}?",
"RemoveSelectedItemQueueMessageText": "Opravdu chcete odebrat {0} položku {1} z fronty?", "RemoveSelectedItemQueueMessageText": "Opravdu chcete odebrat {0} položku {1} z fronty?",
"RemoveSelectedItemsQueueMessageText": "Opravdu chcete odebrat {selectedCount} položky z fronty?", "RemoveSelectedItemsQueueMessageText": "Opravdu chcete odebrat {selectedCount} položek z fronty?",
"ApplyTagsHelpTextAdd": "Přidat: Přidat štítky do existujícího seznamu štítků", "ApplyTagsHelpTextAdd": "Přidat: Přidat štítky do existujícího seznamu štítků",
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít štítky na vybrané indexery", "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít štítky na vybrané indexery",
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané štítky", "ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané štítky",
@@ -1037,7 +1037,7 @@
"CollectionShowPostersHelpText": "Zobrazit plakáty položek v kolekci", "CollectionShowPostersHelpText": "Zobrazit plakáty položek v kolekci",
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.", "ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude potřeba ho znovu načíst.", "ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude potřeba ho znovu načíst.",
"CountDownloadClientsSelected": "{count} vybraných klientů pro stahování", "CountDownloadClientsSelected": "{count} klientů ke stahování vybráno",
"DefaultNameCopiedProfile": "{name} - Kopírovat", "DefaultNameCopiedProfile": "{name} - Kopírovat",
"DefaultNameCopiedSpecification": "{name} - Kopírovat", "DefaultNameCopiedSpecification": "{name} - Kopírovat",
"DelayingDownloadUntil": "Odložení stahování do {date} v {time}", "DelayingDownloadUntil": "Odložení stahování do {date} v {time}",
@@ -1078,7 +1078,7 @@
"CountImportListsSelected": "{count} vybraných seznamů pro import", "CountImportListsSelected": "{count} vybraných seznamů pro import",
"CollectionShowDetailsHelpText": "Zobrazit stav a vlastnosti kolekce", "CollectionShowDetailsHelpText": "Zobrazit stav a vlastnosti kolekce",
"AutoTaggingNegateHelpText": "Pokud je zaškrtnuto, pravidlo automatického označování se nepoužije, pokud odpovídá této podmínce {implementationName}.", "AutoTaggingNegateHelpText": "Pokud je zaškrtnuto, pravidlo automatického označování se nepoužije, pokud odpovídá této podmínce {implementationName}.",
"DownloadClientSortingCheckMessage": "Klient pro stahování {downloadClientName} má nastaveno třídění {sortingMode} pro kategorii {appName}. Ve svém klientovi pro stahování byste měli třídění zakázat, abyste se vyhnuli problémům s importem.", "DownloadClientSortingCheckMessage": "Klient pro stahování {downloadClientName} má nastaveno třídění {sortingMode} pro kategorie {appName}. Je doporučeno toto třídění vypnout, abyste se vyhli případným problémům s importem.",
"EditSelectedImportLists": "Upravit vybrané seznamy k importu", "EditSelectedImportLists": "Upravit vybrané seznamy k importu",
"EditSelectedIndexers": "Upravit vybrané indexery", "EditSelectedIndexers": "Upravit vybrané indexery",
"DisabledForLocalAddresses": "Zakázáno pro místní adresy", "DisabledForLocalAddresses": "Zakázáno pro místní adresy",
@@ -1278,7 +1278,7 @@
"CutoffUnmetLoadError": "Chybné načítání nesplněných položek", "CutoffUnmetLoadError": "Chybné načítání nesplněných položek",
"CutoffUnmetNoItems": "Žádné neodpovídající nesplněné položky", "CutoffUnmetNoItems": "Žádné neodpovídající nesplněné položky",
"ClickToChangeIndexerFlags": "Kliknutím změníte značky indexeru", "ClickToChangeIndexerFlags": "Kliknutím změníte značky indexeru",
"RecycleBinUnableToWriteHealthCheck": "Nelze zapisovat do nakonfigurované složky koše: {path}. Ujistěte se, že tato cesta existuje a že do ní může zapisovat uživatel se spuštěnou {appName}", "RecycleBinUnableToWriteHealthCheck": "Nelze zapisovat do nakonfigurované složky koše: {path}. Ujistěte se, že tato cesta existuje a že do ní může zapisovat uživatel, pod kterým běží {appName}",
"AutoTaggingSpecificationMaximumYear": "Maximální Rok", "AutoTaggingSpecificationMaximumYear": "Maximální Rok",
"AutoTaggingSpecificationMinimumYear": "Minimální Rok", "AutoTaggingSpecificationMinimumYear": "Minimální Rok",
"ChangeCategoryHint": "Změní stahování do kategorie „Post-Import“ z aplikace Download Client", "ChangeCategoryHint": "Změní stahování do kategorie „Post-Import“ z aplikace Download Client",
@@ -1367,5 +1367,24 @@
"CloneImportList": "Klonovat seznam Importu", "CloneImportList": "Klonovat seznam Importu",
"DefaultNameCopiedImportList": "{name} - Kopírovat", "DefaultNameCopiedImportList": "{name} - Kopírovat",
"ReleaseProfile": "profil vydání", "ReleaseProfile": "profil vydání",
"NotificationsPushcutSettingsIncludePoster": "Zahrnout plakát" "NotificationsPushcutSettingsIncludePoster": "Zahrnout plakát",
"RemotePathMappingCheckFilesLocalWrongOSPath": "Lokální klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Zkontrolujte nastavení klienta pro stahování.",
"RemotePathMappingCheckLocalWrongOSPath": "Lokální klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka v {osName} neexistuje. Ověřte nastavení klienta pro stahování.",
"TaskUserAgentTooltip": "User-Agent je poskytován aplikací, která volá API",
"RemotePathMappingCheckFilesGenericPermissions": "Klient pro stahování {downloadClientName} hlásí soubory v {path}, ale {appName} tento adresář nevidí. Možná je nutné upravit práva této složky.",
"RemotePathMappingCheckGenericPermissions": "Klient pro stahování {downloadClientName} ukládá soubory do {path}, ale {appName} tento adresář nevidí. Možná je nutné upravit práva této složky.",
"RemotePathMappingCheckFileRemoved": "Soubor {path} byl smazán v průběhu zpracování.",
"RemotePathMappingCheckWrongOSPath": "Vzdálený klient pro stahování {downloadClientName}ukládá stažené soubory do {path}, ale toto není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
"Loading": "Načítání",
"NotificationsEmbySettingsSendNotificationsHelpText": "Nechat Emby poslat notifikace nastaveným poskytovatelům. Nefunguje s Jellyfin.",
"RemotePathMappingCheckImportFailed": "{appName} nemohl importovat film. Detaily naleznete v logu.",
"RemotePathMappingCheckBadDockerPath": "Používáte docker; klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale to není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
"RemotePathMappingCheckFolderPermissions": "{appName} vidí, ale nemůže přistupovat do adresáře stahování {path}. Pravděpodobně jde o chybně nastavené oprávnění.{appName}.",
"RemotePathMappingCheckLocalFolderMissing": "Vzdálený klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka neexistuje. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
"IndexerJackettAll": "Indexery, které používají nepodporovaný Jackett endpoint 'all': {indexerNames}",
"RemotePathMappingCheckFilesWrongOSPath": "Vzdálený klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Zkontrolujte mapování vzdálených cest a nastavení klienta pro stahování.",
"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."
} }

View File

@@ -698,6 +698,7 @@
"FilterNotInNext": "not in the next", "FilterNotInNext": "not in the next",
"FilterStartsWith": "starts with", "FilterStartsWith": "starts with",
"Filters": "Filters", "Filters": "Filters",
"FilterMoviePropertiesOnlyNotFileWarning": "Filters are available only for the properties of a movie, they are not available for properties of the file(s) you may have for that movie.",
"FirstDayOfWeek": "First Day of Week", "FirstDayOfWeek": "First Day of Week",
"Fixed": "Fixed", "Fixed": "Fixed",
"Folder": "Folder", "Folder": "Folder",
@@ -2037,4 +2038,4 @@
"Yesterday": "Yesterday", "Yesterday": "Yesterday",
"YesterdayAt": "Yesterday at {time}", "YesterdayAt": "Yesterday at {time}",
"YouCanAlsoSearch": "You can also search using TMDb ID or IMDb ID of a movie. e.g. `tmdb:71663`" "YouCanAlsoSearch": "You can also search using TMDb ID or IMDb ID of a movie. e.g. `tmdb:71663`"
} }

View File

@@ -416,7 +416,7 @@
"PrioritySettings": "Приоритет: {priority}", "PrioritySettings": "Приоритет: {priority}",
"Priority": "Приоритет", "Priority": "Приоритет",
"PreviewRenameHelpText": "Совет: для предварительного просмотра переименования ... выберите \"Отмена\", затем щелкните название любого фильма и используйте", "PreviewRenameHelpText": "Совет: для предварительного просмотра переименования ... выберите \"Отмена\", затем щелкните название любого фильма и используйте",
"PreviewRename": "Предпросмотр\nпереименования", "PreviewRename": ереименовать предпросмотр",
"Presets": "Пресеты", "Presets": "Пресеты",
"PreferUsenet": "Предпочитать Usenet", "PreferUsenet": "Предпочитать Usenet",
"PreferTorrent": "Предпочитать торрент", "PreferTorrent": "Предпочитать торрент",
@@ -1290,7 +1290,7 @@
"DownloadClientNzbgetValidationKeepHistoryOverMax": "Для параметра NzbGet KeepHistory должно быть меньше 25000", "DownloadClientNzbgetValidationKeepHistoryOverMax": "Для параметра NzbGet KeepHistory должно быть меньше 25000",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Загружать первые и последние части сначала (qBittorrent 4.1.0+)", "DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Загружать первые и последние части сначала (qBittorrent 4.1.0+)",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Необязательное место для сохранения загрузок, оставьте поле пустым, чтобы использовать расположение rTorrent по умолчанию", "DownloadClientRTorrentSettingsDirectoryHelpText": "Необязательное место для сохранения загрузок, оставьте поле пустым, чтобы использовать расположение rTorrent по умолчанию",
"DownloadClientQbittorrentTorrentStateStalled": "Загрузка останавливается без подключения", "DownloadClientQbittorrentTorrentStateStalled": "Загрузка не активна, т.к. нет соединений",
"DownloadClientSabnzbdValidationUnknownVersion": "Неизвестная версия: {rawVersion}", "DownloadClientSabnzbdValidationUnknownVersion": "Неизвестная версия: {rawVersion}",
"DownloadClientSettingsInitialState": "Начальное состояние", "DownloadClientSettingsInitialState": "Начальное состояние",
"DownloadClientValidationUnableToConnect": "Невозможно подключиться к {clientName}", "DownloadClientValidationUnableToConnect": "Невозможно подключиться к {clientName}",

View File

@@ -1782,7 +1782,7 @@
"DeleteMovieFolderMovieCount": "{size} boyutunda {movieFileCount} film dosyası", "DeleteMovieFolderMovieCount": "{size} boyutunda {movieFileCount} film dosyası",
"NotificationsPlexSettingsServer": "Sunucu", "NotificationsPlexSettingsServer": "Sunucu",
"NotificationsPlexSettingsServerHelpText": "Kimlik doğrulamasından sonra plex.tv hesabından sunucuyu seçin", "NotificationsPlexSettingsServerHelpText": "Kimlik doğrulamasından sonra plex.tv hesabından sunucuyu seçin",
"UnableToImportAutomatically": "Otomatikman İçe Aktarılamıyor", "UnableToImportAutomatically": "Otomatik Olarak İçe Aktarılamıyor",
"ShowTags": "Etiketleri göster", "ShowTags": "Etiketleri göster",
"ShowTagsHelpText": "Etiketleri posterin altında göster", "ShowTagsHelpText": "Etiketleri posterin altında göster",
"Any": "Herhangi", "Any": "Herhangi",

View File

@@ -1,6 +1,5 @@
using System; using System;
using System.IO; using System.IO;
using System.Runtime.Serialization;
namespace NzbDrone.Core.MediaFiles.MovieImport namespace NzbDrone.Core.MediaFiles.MovieImport
{ {
@@ -19,10 +18,5 @@ namespace NzbDrone.Core.MediaFiles.MovieImport
: base(message, innerException) : base(message, innerException)
{ {
} }
protected RecycleBinException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
} }
} }

View File

@@ -1,6 +1,5 @@
using System; using System;
using System.IO; using System.IO;
using System.Runtime.Serialization;
namespace NzbDrone.Core.MediaFiles.MovieImport namespace NzbDrone.Core.MediaFiles.MovieImport
{ {
@@ -19,10 +18,5 @@ namespace NzbDrone.Core.MediaFiles.MovieImport
: base(message, innerException) : base(message, innerException)
{ {
} }
protected RootFolderNotFoundException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
} }
} }

View File

@@ -174,29 +174,13 @@ namespace NzbDrone.Core.Organizer
namingConfig = _namingConfigService.GetConfig(); namingConfig = _namingConfigService.GetConfig();
} }
var pattern = namingConfig.MovieFolderFormat;
var multipleTokens = TitleRegex.Matches(pattern).Count > 1;
var tokenHandlers = new Dictionary<string, Func<TokenMatch, string>>(FileNameBuilderTokenEqualityComparer.Instance); var tokenHandlers = new Dictionary<string, Func<TokenMatch, string>>(FileNameBuilderTokenEqualityComparer.Instance);
AddMovieTokens(tokenHandlers, movie); AddMovieTokens(tokenHandlers, movie);
AddReleaseDateTokens(tokenHandlers, movie.Year); AddReleaseDateTokens(tokenHandlers, movie.Year);
AddIdTokens(tokenHandlers, movie); AddIdTokens(tokenHandlers, movie);
var movieFile = movie.MovieFile; var pattern = namingConfig.MovieFolderFormat;
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 splitPatterns = pattern.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries); var splitPatterns = pattern.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries);
var components = new List<string>(); var components = new List<string>();

View File

@@ -27,6 +27,7 @@ namespace NzbDrone.Core.Organizer
{ {
ruleBuilder.SetValidator(new NotEmptyValidator(null)); ruleBuilder.SetValidator(new NotEmptyValidator(null));
ruleBuilder.SetValidator(new IllegalCharactersValidator()); ruleBuilder.SetValidator(new IllegalCharactersValidator());
ruleBuilder.SetValidator(new IllegalMovieFolderTokensValidator());
return ruleBuilder.SetValidator(new ValidMovieFolderFormatValidator()); return ruleBuilder.SetValidator(new ValidMovieFolderFormatValidator());
} }
@@ -59,9 +60,31 @@ namespace NzbDrone.Core.Organizer
return false; return false;
} }
// TODO: Deprecate OriginalTokenRegex use for Movie Folder Format return FileNameBuilder.MovieTitleRegex.IsMatch(value);
return FileNameBuilder.MovieTitleRegex.IsMatch(value) || }
FileNameValidation.OriginalTokenRegex.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;
} }
} }

View File

@@ -65,7 +65,8 @@ namespace NzbDrone.Core.Parser
new IsoLanguage("tl", "", "tgl", "Tagalog", Language.Tagalog), new IsoLanguage("tl", "", "tgl", "Tagalog", Language.Tagalog),
new IsoLanguage("ur", "", "urd", "Urdu", Language.Urdu), new IsoLanguage("ur", "", "urd", "Urdu", Language.Urdu),
new IsoLanguage("rm", "", "roh", "Romansh", Language.Romansh), new IsoLanguage("rm", "", "roh", "Romansh", Language.Romansh),
new IsoLanguage("mn", "", "mon", "Mongolian", Language.Mongolian) new IsoLanguage("mn", "", "mon", "Mongolian", Language.Mongolian),
new IsoLanguage("ka", "", "kat", "Georgian", Language.Georgian)
}; };
private static readonly Dictionary<string, Language> AlternateIsoCodeMappings = new () private static readonly Dictionary<string, Language> AlternateIsoCodeMappings = new ()

View File

@@ -40,6 +40,7 @@ namespace NzbDrone.Core.Parser
(?<urdu>\burdu\b)| (?<urdu>\burdu\b)|
(?<romansh>\b(?:romansh|rumantsch|romansch)\b)| (?<romansh>\b(?:romansh|rumantsch|romansch)\b)|
(?<mongolian>\b(?:mongolian|khalkha)\b)| (?<mongolian>\b(?:mongolian|khalkha)\b)|
(?<georgian>\b(?:georgian|geo|ka|kat)\b)|
(?<original>\b(?:orig|original)\b)", (?<original>\b(?:orig|original)\b)",
RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace); RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);
@@ -438,6 +439,11 @@ namespace NzbDrone.Core.Parser
languages.Add(Language.Mongolian); languages.Add(Language.Mongolian);
} }
if (match.Groups["georgian"].Success)
{
languages.Add(Language.Georgian);
}
if (match.Groups["original"].Success) if (match.Groups["original"].Success)
{ {
languages.Add(Language.Original); languages.Add(Language.Original);

View File

@@ -260,7 +260,7 @@ namespace NzbDrone.Core.Profiles.Qualities
Name = name, Name = name,
Cutoff = profileCutoff, Cutoff = profileCutoff,
Items = items, Items = items,
Language = Language.English, Language = Language.Original,
MinFormatScore = 0, MinFormatScore = 0,
CutoffFormatScore = 0, CutoffFormatScore = 0,
MinUpgradeFormatScore = 1, MinUpgradeFormatScore = 1,

View File

@@ -1,22 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <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="Diacritical.Net" Version="1.0.4" />
<PackageReference Include="Equ" Version="2.3.0" /> <PackageReference Include="Equ" Version="2.3.0" />
<PackageReference Include="MailKit" Version="4.8.0" /> <PackageReference Include="MailKit" Version="4.13.0" />
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.35" /> <PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.17" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" /> <PackageReference Include="Microsoft.Data.SqlClient" Version="6.1.1" />
<PackageReference Include="Npgsql" Version="7.0.10" /> <PackageReference Include="Npgsql" Version="9.0.3" />
<PackageReference Include="Polly" Version="8.6.0" /> <PackageReference Include="Polly" Version="8.6.0" />
<PackageReference Include="Servarr.FFMpegCore" Version="4.7.0-26" /> <PackageReference Include="Servarr.FFMpegCore" Version="4.7.0-26" />
<PackageReference Include="Servarr.FFprobe" Version="5.1.4.112" /> <PackageReference Include="Servarr.FFprobe" Version="5.1.4.112" />
<PackageReference Include="System.Memory" Version="4.6.3" /> <PackageReference Include="System.Memory" Version="4.6.3" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.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" Version="3.3.2.9" />
<PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" 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" /> <PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
@@ -26,7 +26,8 @@
<PackageReference Include="NLog" Version="5.4.0" /> <PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> <PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="MonoTorrent" Version="2.0.7" /> <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>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" /> <ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" /> <ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />

View File

@@ -1,12 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" /> <PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="8.1.4" />
<PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" /> <PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
</ItemGroup> </ItemGroup>

View File

@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.35" /> <PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.17" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" /> <ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" /> <ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<!-- <!--
The netstandard version here doesn't work in net framework The netstandard version here doesn't work in net framework

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup> </PropertyGroup>
<!-- <!--

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@@ -55,7 +55,7 @@ namespace NzbDrone.Test.Common
if (BuildInfo.IsDebug) if (BuildInfo.IsDebug)
{ {
Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", "net6.0", consoleExe)); Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", "net8.0", consoleExe));
} }
else else
{ {

View File

@@ -1,11 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FluentAssertions" Version="6.12.1" /> <PackageReference Include="FluentAssertions" Version="6.12.1" />
<PackageReference Include="FluentValidation" Version="9.5.4" /> <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="NLog" Version="5.4.0" />
<PackageReference Include="NUnit" Version="3.14.0" /> <PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="RestSharp" Version="106.15.0" /> <PackageReference Include="RestSharp" Version="106.15.0" />

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" /> <ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.dll" Version="5.4.3" />

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Common.Test\Radarr.Common.Test.csproj" /> <ProjectReference Include="..\NzbDrone.Common.Test\Radarr.Common.Test.csproj" />

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,14 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFrameworks>net6.0-windows</TargetFrameworks> <TargetFrameworks>net8.0-windows</TargetFrameworks>
<RuntimeIdentifiers>win-x64;win-x86</RuntimeIdentifiers> <RuntimeIdentifiers>win-x64;win-x86</RuntimeIdentifiers>
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<ApplicationIcon>..\NzbDrone.Host\Radarr.ico</ApplicationIcon> <ApplicationIcon>..\NzbDrone.Host\Radarr.ico</ApplicationIcon>
<GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources> <GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Resources.Extensions" Version="6.0.0" /> <PackageReference Include="System.Resources.Extensions" Version="8.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" /> <ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />

View File

@@ -40,10 +40,14 @@ namespace Radarr.Api.V3.Config
SharedValidator.RuleFor(c => c.UrlBase).ValidUrlBase(); SharedValidator.RuleFor(c => c.UrlBase).ValidUrlBase();
SharedValidator.RuleFor(c => c.InstanceName).ContainsRadarr().When(c => c.InstanceName.IsNotNullOrWhiteSpace()); SharedValidator.RuleFor(c => c.InstanceName).ContainsRadarr().When(c => c.InstanceName.IsNotNullOrWhiteSpace());
SharedValidator.RuleFor(c => c.Username).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Basic || SharedValidator.RuleFor(c => c.Username).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Forms);
c.AuthenticationMethod == AuthenticationType.Forms); SharedValidator.RuleFor(c => c.Password).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Forms);
SharedValidator.RuleFor(c => c.Password).NotEmpty().When(c => c.AuthenticationMethod == AuthenticationType.Basic ||
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) SharedValidator.RuleFor(c => c.PasswordConfirmation)
.Must((resource, p) => IsMatchingPassword(resource)).WithMessage("Must match Password"); .Must((resource, p) => IsMatchingPassword(resource)).WithMessage("Must match Password");

View File

@@ -172,10 +172,10 @@ namespace Radarr.Api.V3.Queue
var filteredQueue = includeUnknownMovieItems ? queue : queue.Where(q => q.Movie != null); var filteredQueue = includeUnknownMovieItems ? queue : queue.Where(q => q.Movie != null);
var pending = _pendingReleaseService.GetPendingQueue(); var pending = _pendingReleaseService.GetPendingQueue();
var hasMovieIdFilter = movieIds.Any(); var hasMovieIdFilter = movieIds is { Count: > 0 };
var hasLanguageFilter = languages.Any(); var hasLanguageFilter = languages is { Count: > 0 };
var hasQualityFilter = quality.Any(); var hasQualityFilter = quality is { Count: > 0 };
var hasStatusFilter = status.Any(); var hasStatusFilter = status is { Count: > 0 };
var fullQueue = filteredQueue.Concat(pending).Where(q => var fullQueue = filteredQueue.Concat(pending).Where(q =>
{ {

View File

@@ -1,12 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="FluentValidation" Version="9.5.4" />
<PackageReference Include="Ical.Net" Version="4.3.1" /> <PackageReference Include="Ical.Net" Version="4.3.1" />
<PackageReference Include="NLog" Version="5.4.0" /> <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>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Core\Radarr.Core.csproj" /> <ProjectReference Include="..\NzbDrone.Core\Radarr.Core.csproj" />

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.RegularExpressions;
using FluentValidation; using FluentValidation;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using NzbDrone.Core.AutoTagging; using NzbDrone.Core.AutoTagging;
@@ -25,7 +26,10 @@ namespace Radarr.Api.V3.Tags
{ {
_tagService = tagService; _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) protected override TagResource GetResourceById(int id)

View File

@@ -27,9 +27,8 @@ namespace Radarr.Http.Authentication
public ApiKeyAuthenticationHandler(IOptionsMonitor<ApiKeyAuthenticationOptions> options, public ApiKeyAuthenticationHandler(IOptionsMonitor<ApiKeyAuthenticationOptions> options,
ILoggerFactory logger, ILoggerFactory logger,
UrlEncoder encoder, UrlEncoder encoder,
ISystemClock clock,
IConfigFileProvider config) IConfigFileProvider config)
: base(options, logger, encoder, clock) : base(options, logger, encoder)
{ {
_apiKey = config.ApiKey; _apiKey = config.ApiKey;
} }

View File

@@ -18,11 +18,6 @@ namespace Radarr.Http.Authentication
return authenticationBuilder.AddScheme<ApiKeyAuthenticationOptions, ApiKeyAuthenticationHandler>(name, options); 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) public static AuthenticationBuilder AddNone(this AuthenticationBuilder authenticationBuilder, string name)
{ {
return authenticationBuilder.AddScheme<AuthenticationSchemeOptions, NoAuthenticationHandler>(name, options => { }); return authenticationBuilder.AddScheme<AuthenticationSchemeOptions, NoAuthenticationHandler>(name, options => { });
@@ -35,7 +30,7 @@ namespace Radarr.Http.Authentication
public static AuthenticationBuilder AddAppAuthentication(this IServiceCollection services) public static AuthenticationBuilder AddAppAuthentication(this IServiceCollection services)
{ {
services.AddOptions<CookieAuthenticationOptions>(AuthenticationType.Forms.ToString()) services.AddOptions<CookieAuthenticationOptions>(nameof(AuthenticationType.Forms))
.Configure<IConfigFileProvider>((options, configFileProvider) => .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 // 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() return services.AddAuthentication()
.AddNone(AuthenticationType.None.ToString()) .AddNone(nameof(AuthenticationType.None))
.AddExternal(AuthenticationType.External.ToString()) .AddExternal(nameof(AuthenticationType.External))
.AddBasic(AuthenticationType.Basic.ToString()) .AddCookie(nameof(AuthenticationType.Forms))
.AddCookie(AuthenticationType.Forms.ToString())
.AddApiKey("API", options => .AddApiKey("API", options =>
{ {
options.HeaderName = "X-Api-Key"; options.HeaderName = "X-Api-Key";

View File

@@ -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;
}
}
}

View File

@@ -13,9 +13,8 @@ namespace Radarr.Http.Authentication
{ {
public NoAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, public NoAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger, ILoggerFactory logger,
UrlEncoder encoder, UrlEncoder encoder)
ISystemClock clock) : base(options, logger, encoder)
: base(options, logger, encoder, clock)
{ {
} }

View File

@@ -8,7 +8,7 @@ namespace NzbDrone.Http.Authentication
{ {
public class UiAuthorizationPolicyProvider : IAuthorizationPolicyProvider public class UiAuthorizationPolicyProvider : IAuthorizationPolicyProvider
{ {
private const string POLICY_NAME = "UI"; private const string PolicyName = "UI";
private readonly IConfigFileProvider _config; private readonly IConfigFileProvider _config;
public DefaultAuthorizationPolicyProvider FallbackPolicyProvider { get; } public DefaultAuthorizationPolicyProvider FallbackPolicyProvider { get; }
@@ -26,7 +26,7 @@ namespace NzbDrone.Http.Authentication
public Task<AuthorizationPolicy> GetPolicyAsync(string policyName) 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()) var policy = new AuthorizationPolicyBuilder(_config.AuthenticationMethod.ToString())
.AddRequirements(new BypassableDenyAnonymousAuthorizationRequirement()); .AddRequirements(new BypassableDenyAnonymousAuthorizationRequirement());

View File

@@ -22,7 +22,7 @@ namespace Radarr.Http.Middleware
{ {
if (context.Request.IsApiRequest() && !context.Response.Headers.ContainsKey(VERSIONHEADER)) if (context.Request.IsApiRequest() && !context.Response.Headers.ContainsKey(VERSIONHEADER))
{ {
context.Response.Headers.Add(VERSIONHEADER, _version); context.Response.Headers[VERSIONHEADER] = _version;
} }
await _next(context); await _next(context);

View File

@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FluentValidation" Version="9.5.4" /> <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" /> <PackageReference Include="NLog" Version="5.4.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" /> <PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" />

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" /> <PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" />

View File

@@ -37,11 +37,14 @@ fi
if [ "$PLATFORM" = "Windows" ]; then if [ "$PLATFORM" = "Windows" ]; then
mkdir -p "$ProgramData/Radarr" mkdir -p "$ProgramData/Radarr"
WHERE="$WHERE&Category!=LINUX" WHERE="$WHERE&Category!=LINUX"
elif [ "$PLATFORM" = "Linux" ] || [ "$PLATFORM" = "Mac" ] ; then elif [ "$PLATFORM" = "Linux" ]; then
mkdir -p ~/.config/Radarr mkdir -p ~/.config/Radarr
WHERE="$WHERE&Category!=WINDOWS" WHERE="$WHERE&Category!=WINDOWS"
elif [ "$PLATFORM" = "Mac" ]; then
mkdir -p ~/Library/Application\ Support/Radarr
WHERE="$WHERE&Category!=WINDOWS"
else 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 exit 1
fi fi

View File

@@ -1163,14 +1163,14 @@
resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
"@microsoft/signalr@6.0.25": "@microsoft/signalr@8.0.7":
version "6.0.25" version "8.0.7"
resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.25.tgz#009f043066d383e2de41a483bd7e02bfd74d3cf8" resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-8.0.7.tgz#94419ddbf9418753e493f4ae4c13990316ec2ea5"
integrity sha512-8AzrpxS+E0yn1tXSlv7+UlURLmSxTQDgbvOT0pGKXjZT7MkhnDP+/GLuk7veRtUjczou/x32d9PHhYlr2NBy6Q== integrity sha512-PHcdMv8v5hJlBkRHAuKG5trGViQEkPYee36LnJQx4xHOQ5LL4X0nEWIxOp5cCtZ7tu+30quz5V3k0b1YNuc6lw==
dependencies: dependencies:
abort-controller "^3.0.0" abort-controller "^3.0.0"
eventsource "^1.0.7" eventsource "^2.0.2"
fetch-cookie "^0.11.0" fetch-cookie "^2.0.3"
node-fetch "^2.6.7" node-fetch "^2.6.7"
ws "^7.4.5" ws "^7.4.5"
@@ -3360,10 +3360,10 @@ events@^3.2.0:
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
eventsource@^1.0.7: eventsource@^2.0.2:
version "1.1.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.2.tgz#bc75ae1c60209e7cb1541231980460343eaea7c2" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508"
integrity sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA== integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3" version "3.1.3"
@@ -3420,12 +3420,13 @@ faye-websocket@~0.10.0:
dependencies: dependencies:
websocket-driver ">=0.5.1" websocket-driver ">=0.5.1"
fetch-cookie@^0.11.0: fetch-cookie@^2.0.3:
version "0.11.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407" resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-2.2.0.tgz#01086b6b5b1c3e08f15ffd8647b02ca100377365"
integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA== integrity sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==
dependencies: 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: file-entry-cache@^6.0.1:
version "6.0.1" version "6.0.1"
@@ -5469,11 +5470,13 @@ prr@~1.0.1:
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
psl@^1.1.33: psl@^1.1.33:
version "1.9.0" version "1.15.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6"
integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== 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" version "2.3.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
@@ -6223,6 +6226,11 @@ serialize-javascript@^6.0.1:
dependencies: dependencies:
randombytes "^2.1.0" 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: set-function-length@^1.2.1, set-function-length@^1.2.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" 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" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== 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" version "4.1.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==