mirror of
https://github.com/Readarr/Readarr.git
synced 2026-03-18 16:24:07 -04:00
Compare commits
17 Commits
changelog-
...
sonarr-pul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c0943449b | ||
|
|
b4fd1340c2 | ||
|
|
1da27b0978 | ||
|
|
b0a3ddef9c | ||
|
|
a59706ceb4 | ||
|
|
ce58e6ecdb | ||
|
|
d01ce8b908 | ||
|
|
575f995916 | ||
|
|
c17c8815ef | ||
|
|
8445941510 | ||
|
|
32ae18ae6f | ||
|
|
b91ec241a6 | ||
|
|
17ce8187fd | ||
|
|
41615fe026 | ||
|
|
9cff8f31e9 | ||
|
|
21538b972d | ||
|
|
5a7b4d41d8 |
@@ -15,7 +15,7 @@ variables:
|
||||
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
|
||||
sentryOrg: 'servarr'
|
||||
sentryUrl: 'https://sentry.servarr.com'
|
||||
dotnetVersion: '6.0.201'
|
||||
dotnetVersion: '6.0.300'
|
||||
innoVersion: '6.2.0'
|
||||
windowsImage: 'windows-2022'
|
||||
linuxImage: 'ubuntu-20.04'
|
||||
@@ -66,16 +66,13 @@ stages:
|
||||
inputs:
|
||||
version: $(dotnetVersion)
|
||||
- bash: |
|
||||
BUNDLEDVERSIONS=${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}/Microsoft.NETCoreSdk.BundledVersions.props
|
||||
echo $BUNDLEDVERSIONS
|
||||
grep osx-x64 $BUNDLEDVERSIONS
|
||||
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||
echo "BSD already enabled"
|
||||
else
|
||||
echo "Enabling BSD support"
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' $BUNDLEDVERSIONS
|
||||
SDK_PATH="${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}"
|
||||
BUNDLEDVERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
|
||||
|
||||
if ! grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||
fi
|
||||
displayName: Enable FreeBSD Support
|
||||
displayName: Extra Platform Support
|
||||
- task: Cache@2
|
||||
inputs:
|
||||
key: 'nuget | "$(Agent.OS)" | $(Build.SourcesDirectory)/src/Directory.Packages.props'
|
||||
@@ -87,29 +84,27 @@ stages:
|
||||
NUGET_PACKAGES: $(nugetCacheFolder)
|
||||
- powershell: Get-ChildItem _output\net6.0*,_output\*.Update\* -Recurse | Where { $_.Fullname -notlike "*\publish\*" -and $_.attributes -notlike "*directory*" } | Remove-Item
|
||||
displayName: Clean up intermediate output
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: $(outputFolder)
|
||||
artifact: '$(osName)Backend'
|
||||
artifactType: 'pipeline'
|
||||
parallel: true
|
||||
parallelCount: 100
|
||||
- publish: $(outputFolder)
|
||||
artifact: '$(osName)Backend'
|
||||
displayName: Publish Backend
|
||||
- publish: '$(testsFolder)/net6.0/win-x64/publish'
|
||||
artifact: WindowsCoreTests
|
||||
displayName: Publish Windows Test Package
|
||||
artifact: win-x64-tests
|
||||
displayName: Publish win-x64 Test Package
|
||||
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
|
||||
artifact: LinuxCoreTests
|
||||
displayName: Publish Linux Test Package
|
||||
artifact: linux-x64-tests
|
||||
displayName: Publish linux-x64 Test Package
|
||||
- publish: '$(testsFolder)/net6.0/linux-x86/publish'
|
||||
artifact: linux-x86-tests
|
||||
displayName: Publish linux-x86 Test Package
|
||||
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
|
||||
artifact: LinuxMuslCoreTests
|
||||
displayName: Publish Linux Musl Test Package
|
||||
artifact: linux-musl-x64-tests
|
||||
displayName: Publish linux-musl-x64 Test Package
|
||||
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
|
||||
artifact: FreebsdCoreTests
|
||||
displayName: Publish FreeBSD Test Package
|
||||
artifact: freebsd-x64-tests
|
||||
displayName: Publish freebsd-x64 Test Package
|
||||
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
|
||||
artifact: MacCoreTests
|
||||
displayName: Publish MacOS Test Package
|
||||
artifact: osx-x64-tests
|
||||
displayName: Publish osx-x64 Test Package
|
||||
|
||||
- stage: Build_Backend_Other
|
||||
displayName: Build Backend (Other OS)
|
||||
@@ -141,25 +136,29 @@ stages:
|
||||
inputs:
|
||||
version: $(dotnetVersion)
|
||||
- bash: |
|
||||
BUNDLEDVERSIONS=${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}/Microsoft.NETCoreSdk.BundledVersions.props
|
||||
echo $BUNDLEDVERSIONS
|
||||
grep osx-x64 $BUNDLEDVERSIONS
|
||||
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||
echo "BSD already enabled"
|
||||
else
|
||||
echo "Enabling BSD support"
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' $BUNDLEDVERSIONS
|
||||
SDK_PATH="${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}"
|
||||
BUNDLEDVERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
|
||||
|
||||
if ! grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||
fi
|
||||
displayName: Enable FreeBSD Support
|
||||
displayName: Extra Platform Support
|
||||
- task: Cache@2
|
||||
inputs:
|
||||
key: 'nuget | "$(Agent.OS)" | $(Build.SourcesDirectory)/src/Directory.Packages.props'
|
||||
path: $(nugetCacheFolder)
|
||||
displayName: Cache NuGet packages
|
||||
- bash: ./build.sh --backend --enable-bsd
|
||||
- bash: ./build.sh --backend --enable-extra-platforms
|
||||
displayName: Build Readarr Backend
|
||||
env:
|
||||
NUGET_PACKAGES: $(nugetCacheFolder)
|
||||
- bash: |
|
||||
find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
|
||||
find ${OUTPUTFOLDER} -depth -empty -type d -exec rm -r "{}" \;
|
||||
find ${TESTSFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
|
||||
find ${TESTSFOLDER} -depth -empty -type d -exec rm -r "{}" \;
|
||||
displayName: Clean up intermediate output
|
||||
condition: and(succeeded(), ne(variables['osName'], 'Windows'))
|
||||
|
||||
- stage: Build_Frontend
|
||||
displayName: Frontend
|
||||
@@ -262,35 +261,35 @@ stages:
|
||||
artifactName: WindowsFrontend
|
||||
targetPath: _output
|
||||
displayName: Fetch Frontend
|
||||
- bash: ./build.sh --packages --enable-bsd
|
||||
- bash: ./build.sh --packages --enable-extra-platforms
|
||||
displayName: Create Packages
|
||||
- bash: |
|
||||
find . -name "Readarr" -exec chmod a+x {} \;
|
||||
find . -name "Readarr.Update" -exec chmod a+x {} \;
|
||||
displayName: Set executable bits
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create Windows Core zip
|
||||
displayName: Create win-x64 zip
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).windows-core-x64.zip'
|
||||
archiveType: 'zip'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create Windows x86 Core zip
|
||||
displayName: Create win-x86 zip
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).windows-core-x86.zip'
|
||||
archiveType: 'zip'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create MacOS x64 Core app
|
||||
displayName: Create osx-x64 app
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).osx-app-core-x64.zip'
|
||||
archiveType: 'zip'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create MacOS x64 Core tar
|
||||
displayName: Create osx-x64 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).osx-core-x64.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -298,14 +297,14 @@ stages:
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create MacOS arm64 Core app
|
||||
displayName: Create osx-arm64 app
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).osx-app-core-arm64.zip'
|
||||
archiveType: 'zip'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create MacOS arm64 Core tar
|
||||
displayName: Create osx-arm64 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).osx-core-arm64.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -313,7 +312,7 @@ stages:
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create Linux Core tar
|
||||
displayName: Create linux-x64 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-x64.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -321,7 +320,7 @@ stages:
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create Linux Musl Core tar
|
||||
displayName: Create linux-musl-x64 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-musl-core-x64.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -329,7 +328,15 @@ stages:
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create ARM32 Linux Core tar
|
||||
displayName: Create linux-x86 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-x86.tar.gz'
|
||||
archiveType: 'tar'
|
||||
tarCompression: 'gz'
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-x86/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create linux-arm tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-arm.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -337,7 +344,7 @@ stages:
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create ARM32 Linux Musl Core tar
|
||||
displayName: Create linux-musl-arm tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-musl-core-arm.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -345,7 +352,7 @@ stages:
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create Linux arm64 Core tar
|
||||
displayName: Create linux-arm64 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-arm64.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -353,7 +360,7 @@ stages:
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create ARM64 Linux Musl Core tar
|
||||
displayName: Create linux-musl-arm64 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-musl-core-arm64.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -361,7 +368,7 @@ stages:
|
||||
includeRootFolder: false
|
||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0
|
||||
- task: ArchiveFiles@2
|
||||
displayName: Create FreeBSD Core Core tar
|
||||
displayName: Create freebsd-x64 tar
|
||||
inputs:
|
||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).freebsd-core-x64.tar.gz'
|
||||
archiveType: 'tar'
|
||||
@@ -413,22 +420,22 @@ stages:
|
||||
matrix:
|
||||
MacCore:
|
||||
osName: 'Mac'
|
||||
testName: 'MacCore'
|
||||
testName: 'osx-x64'
|
||||
poolName: 'Azure Pipelines'
|
||||
imageName: ${{ variables.macImage }}
|
||||
WindowsCore:
|
||||
osName: 'Windows'
|
||||
testName: 'WindowsCore'
|
||||
testName: 'win-x64'
|
||||
poolName: 'Azure Pipelines'
|
||||
imageName: ${{ variables.windowsImage }}
|
||||
LinuxCore:
|
||||
osName: 'Linux'
|
||||
testName: 'LinuxCore'
|
||||
testName: 'linux-x64'
|
||||
poolName: 'Azure Pipelines'
|
||||
imageName: ${{ variables.linuxImage }}
|
||||
FreebsdCore:
|
||||
osName: 'Linux'
|
||||
testName: 'FreebsdCore'
|
||||
testName: 'freebsd-x64'
|
||||
poolName: 'FreeBSD'
|
||||
imageName:
|
||||
|
||||
@@ -447,7 +454,7 @@ stages:
|
||||
displayName: Download Test Artifact
|
||||
inputs:
|
||||
buildType: 'current'
|
||||
artifactName: '$(testName)Tests'
|
||||
artifactName: '$(testName)-tests'
|
||||
targetPath: $(testsFolder)
|
||||
- powershell: Set-Service SCardSvr -StartupType Manual
|
||||
displayName: Enable Windows Test Service
|
||||
@@ -475,8 +482,12 @@ stages:
|
||||
matrix:
|
||||
alpine:
|
||||
testName: 'Musl Net Core'
|
||||
artifactName: LinuxMuslCoreTests
|
||||
artifactName: linux-musl-x64-tests
|
||||
containerImage: ghcr.io/servarr/testimages:alpine
|
||||
linux-x86:
|
||||
testName: 'linux-x86'
|
||||
artifactName: linux-x86-tests
|
||||
containerImage: ghcr.io/servarr/testimages:linux-x86
|
||||
|
||||
pool:
|
||||
vmImage: ${{ variables.linuxImage }}
|
||||
@@ -487,9 +498,15 @@ stages:
|
||||
|
||||
steps:
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Install .net core'
|
||||
displayName: 'Install .NET'
|
||||
inputs:
|
||||
version: $(dotnetVersion)
|
||||
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
|
||||
- bash: |
|
||||
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
|
||||
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
|
||||
displayName: 'Install .NET'
|
||||
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
|
||||
- checkout: none
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Test Artifact
|
||||
@@ -523,17 +540,17 @@ stages:
|
||||
matrix:
|
||||
MacCore:
|
||||
osName: 'Mac'
|
||||
testName: 'MacCore'
|
||||
testName: 'osx-x64'
|
||||
imageName: ${{ variables.macImage }}
|
||||
pattern: 'Readarr.*.osx-core-x64.tar.gz'
|
||||
WindowsCore:
|
||||
osName: 'Windows'
|
||||
testName: 'WindowsCore'
|
||||
testName: 'win-x64'
|
||||
imageName: ${{ variables.windowsImage }}
|
||||
pattern: 'Readarr.*.windows-core-x64.zip'
|
||||
LinuxCore:
|
||||
osName: 'Linux'
|
||||
testName: 'LinuxCore'
|
||||
testName: 'linux-x64'
|
||||
imageName: ${{ variables.linuxImage }}
|
||||
pattern: 'Readarr.*.linux-core-x64.tar.gz'
|
||||
|
||||
@@ -550,7 +567,7 @@ stages:
|
||||
displayName: Download Test Artifact
|
||||
inputs:
|
||||
buildType: 'current'
|
||||
artifactName: '$(testName)Tests'
|
||||
artifactName: '$(testName)-tests'
|
||||
targetPath: $(testsFolder)
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Build Artifact
|
||||
@@ -595,7 +612,7 @@ stages:
|
||||
displayName: Download Test Artifact
|
||||
inputs:
|
||||
buildType: 'current'
|
||||
artifactName: 'FreebsdCoreTests'
|
||||
artifactName: 'freebsd-x64-tests'
|
||||
targetPath: $(testsFolder)
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Build Artifact
|
||||
@@ -629,11 +646,15 @@ stages:
|
||||
strategy:
|
||||
matrix:
|
||||
alpine:
|
||||
testName: 'Musl Net Core'
|
||||
artifactName: LinuxMuslCoreTests
|
||||
testName: 'linux-musl-x64'
|
||||
artifactName: linux-musl-x64-tests
|
||||
containerImage: ghcr.io/servarr/testimages:alpine
|
||||
pattern: 'Readarr.*.linux-musl-core-x64.tar.gz'
|
||||
|
||||
linux-x86:
|
||||
testName: 'linux-x86'
|
||||
artifactName: linux-x86-tests
|
||||
containerImage: ghcr.io/servarr/testimages:linux-x86
|
||||
pattern: 'Readarr.*.linux-core-x86.tar.gz'
|
||||
pool:
|
||||
vmImage: ${{ variables.linuxImage }}
|
||||
|
||||
@@ -643,9 +664,15 @@ stages:
|
||||
|
||||
steps:
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Install .net core'
|
||||
displayName: 'Install .NET'
|
||||
inputs:
|
||||
version: $(dotnetVersion)
|
||||
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
|
||||
- bash: |
|
||||
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
|
||||
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
|
||||
displayName: 'Install .NET'
|
||||
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
|
||||
- checkout: none
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Test Artifact
|
||||
@@ -691,14 +718,17 @@ stages:
|
||||
matrix:
|
||||
Linux:
|
||||
osName: 'Linux'
|
||||
artifactName: 'linux-x64'
|
||||
imageName: ${{ variables.linuxImage }}
|
||||
pattern: 'Readarr.*.linux-core-x64.tar.gz'
|
||||
Mac:
|
||||
osName: 'Mac'
|
||||
artifactName: 'osx-x64'
|
||||
imageName: ${{ variables.macImage }}
|
||||
pattern: 'Readarr.*.osx-core-x64.tar.gz'
|
||||
Windows:
|
||||
osName: 'Windows'
|
||||
artifactName: 'win-x64'
|
||||
imageName: ${{ variables.windowsImage }}
|
||||
pattern: 'Readarr.*.windows-core-x64.zip'
|
||||
|
||||
@@ -715,7 +745,7 @@ stages:
|
||||
displayName: Download Test Artifact
|
||||
inputs:
|
||||
buildType: 'current'
|
||||
artifactName: '$(osName)CoreTests'
|
||||
artifactName: '$(artifactName)-tests'
|
||||
targetPath: $(testsFolder)
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Build Artifact
|
||||
|
||||
45
build.sh
45
build.sh
@@ -27,15 +27,22 @@ UpdateVersionNumber()
|
||||
fi
|
||||
}
|
||||
|
||||
EnableBsdSupport()
|
||||
EnableExtraPlatformsInSDK()
|
||||
{
|
||||
#todo enable sdk with
|
||||
#SDK_PATH=$(dotnet --list-sdks | grep -P '5\.\d\.\d+' | head -1 | sed 's/\(5\.[0-9]*\.[0-9]*\).*\[\(.*\)\]/\2\/\1/g')
|
||||
# BUNDLED_VERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
|
||||
SDK_PATH=$(dotnet --list-sdks | grep -P '6\.\d\.\d+' | head -1 | sed 's/\(6\.[0-9]*\.[0-9]*\).*\[\(.*\)\]/\2\/\1/g')
|
||||
BUNDLEDVERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
|
||||
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||
echo "Extra platforms already enabled"
|
||||
else
|
||||
echo "Enabling extra platform support"
|
||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||
fi
|
||||
}
|
||||
|
||||
EnableExtraPlatforms()
|
||||
{
|
||||
if grep -qv freebsd-x64 src/Directory.Build.props; then
|
||||
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64</RuntimeIdentifiers>^g" src/Directory.Build.props
|
||||
sed -i'' -e "s^<ExcludedRuntimeFrameworkPairs>\(.*\)</ExcludedRuntimeFrameworkPairs>^<ExcludedRuntimeFrameworkPairs>\1;freebsd-x64:net472</ExcludedRuntimeFrameworkPairs>^g" src/Directory.Build.props
|
||||
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64;linux-x86</RuntimeIdentifiers>^g" src/Directory.Build.props
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -292,7 +299,8 @@ if [ $# -eq 0 ]; then
|
||||
PACKAGES=YES
|
||||
INSTALLER=NO
|
||||
LINT=YES
|
||||
ENABLE_BSD=NO
|
||||
ENABLE_EXTRA_PLATFORMS=NO
|
||||
ENABLE_EXTRA_PLATFORMS_IN_SDK=NO
|
||||
fi
|
||||
|
||||
while [[ $# -gt 0 ]]
|
||||
@@ -304,8 +312,12 @@ case $key in
|
||||
BACKEND=YES
|
||||
shift # past argument
|
||||
;;
|
||||
--enable-bsd)
|
||||
ENABLE_BSD=YES
|
||||
--enable-bsd|--enable-extra-platforms)
|
||||
ENABLE_EXTRA_PLATFORMS=YES
|
||||
shift # past argument
|
||||
;;
|
||||
--enable-extra-platforms-in-sdk)
|
||||
ENABLE_EXTRA_PLATFORMS_IN_SDK=YES
|
||||
shift # past argument
|
||||
;;
|
||||
-r|--runtime)
|
||||
@@ -349,12 +361,17 @@ esac
|
||||
done
|
||||
set -- "${POSITIONAL[@]}" # restore positional parameters
|
||||
|
||||
if [ "$ENABLE_EXTRA_PLATFORMS_IN_SDK" = "YES" ];
|
||||
then
|
||||
EnableExtraPlatformsInSDK
|
||||
fi
|
||||
|
||||
if [ "$BACKEND" = "YES" ];
|
||||
then
|
||||
UpdateVersionNumber
|
||||
if [ "$ENABLE_BSD" = "YES" ];
|
||||
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||
then
|
||||
EnableBsdSupport
|
||||
EnableExtraPlatforms
|
||||
fi
|
||||
Build
|
||||
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
||||
@@ -364,9 +381,10 @@ then
|
||||
PackageTests "net6.0" "linux-x64"
|
||||
PackageTests "net6.0" "linux-musl-x64"
|
||||
PackageTests "net6.0" "osx-x64"
|
||||
if [ "$ENABLE_BSD" = "YES" ];
|
||||
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||
then
|
||||
PackageTests "net6.0" "freebsd-x64"
|
||||
PackageTests "net6.0" "linux-x86"
|
||||
fi
|
||||
else
|
||||
PackageTests "$FRAMEWORK" "$RID"
|
||||
@@ -405,9 +423,10 @@ then
|
||||
Package "net6.0" "linux-musl-arm"
|
||||
Package "net6.0" "osx-x64"
|
||||
Package "net6.0" "osx-arm64"
|
||||
if [ "$ENABLE_BSD" = "YES" ];
|
||||
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||
then
|
||||
Package "net6.0" "freebsd-x64"
|
||||
Package "net6.0" "linux-x86"
|
||||
fi
|
||||
else
|
||||
Package "$FRAMEWORK" "$RID"
|
||||
|
||||
@@ -8,17 +8,17 @@ function AuthorMonitorNewItemsOptionsPopoverContent() {
|
||||
<DescriptionList>
|
||||
<DescriptionListItem
|
||||
title={translate('AllBooks')}
|
||||
data="Monitor all new books"
|
||||
data={translate('DataNewAllBooks')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('NewBooks')}
|
||||
data="Monitor new books released after the newest existing book"
|
||||
data={translate('DataNewBooks')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('None')}
|
||||
data="Don't monitor any new books"
|
||||
data={translate('DataNewNone')}
|
||||
/>
|
||||
</DescriptionList>
|
||||
);
|
||||
|
||||
@@ -8,42 +8,42 @@ function AuthorMonitoringOptionsPopoverContent() {
|
||||
return (
|
||||
<>
|
||||
<Alert>
|
||||
This is a one time adjustment to set which books are monitored
|
||||
{translate('MonitoringOptionsHelpText')}
|
||||
</Alert>
|
||||
<DescriptionList>
|
||||
<DescriptionListItem
|
||||
title={translate('AllBooks')}
|
||||
data="Monitor all books"
|
||||
data={translate('DataAllBooks')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('FutureBooks')}
|
||||
data="Monitor books that have not released yet"
|
||||
data={translate('DataFutureBooks')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('MissingBooks')}
|
||||
data="Monitor books that do not have files or have not released yet"
|
||||
data={translate('DataMissingBooks')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('ExistingBooks')}
|
||||
data="Monitor books that have files or have not released yet"
|
||||
data={translate('DataExistingBooks')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('FirstBook')}
|
||||
data="Monitor the first book. All other books will be ignored"
|
||||
data={translate('DataFirstBook')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('LatestBook')}
|
||||
data="Monitor the latest book and future books"
|
||||
data={translate('DataLatestBook')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('None')}
|
||||
data="No books will be monitored"
|
||||
data={translate('DataNone')}
|
||||
/>
|
||||
</DescriptionList>
|
||||
</>
|
||||
|
||||
@@ -8,7 +8,7 @@ import AppRoutes from './AppRoutes';
|
||||
|
||||
function App({ store, history }) {
|
||||
return (
|
||||
<DocumentTitle title="Readarr">
|
||||
<DocumentTitle title={window.Readarr.instanceName}>
|
||||
<Provider store={store}>
|
||||
<ConnectedRouter history={history}>
|
||||
<PageConnector>
|
||||
|
||||
@@ -267,7 +267,7 @@ class AuthorEditorFooter extends Component {
|
||||
isDisabled={!selectedCount || isOrganizingAuthor || isRetaggingAuthor}
|
||||
onPress={onOrganizeAuthorPress}
|
||||
>
|
||||
Rename Files
|
||||
{translate('RenameFiles')}
|
||||
</SpinnerButton>
|
||||
|
||||
<SpinnerButton
|
||||
@@ -277,7 +277,7 @@ class AuthorEditorFooter extends Component {
|
||||
isDisabled={!selectedCount || isOrganizingAuthor || isRetaggingAuthor}
|
||||
onPress={onRetagAuthorPress}
|
||||
>
|
||||
Write Metadata Tags
|
||||
{translate('WriteMetadataTags')}
|
||||
</SpinnerButton>
|
||||
|
||||
<SpinnerButton
|
||||
@@ -286,7 +286,7 @@ class AuthorEditorFooter extends Component {
|
||||
isDisabled={!selectedCount || isOrganizingAuthor || isRetaggingAuthor}
|
||||
onPress={this.onTagsPress}
|
||||
>
|
||||
Set Readarr Tags
|
||||
{translate('SetReadarrTags')}
|
||||
</SpinnerButton>
|
||||
|
||||
<SpinnerButton
|
||||
@@ -296,7 +296,7 @@ class AuthorEditorFooter extends Component {
|
||||
isDisabled={!selectedCount || isDeleting}
|
||||
onPress={this.onDeleteSelectedPress}
|
||||
>
|
||||
Delete
|
||||
{translate('Delete')}
|
||||
</SpinnerButton>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -8,6 +8,7 @@ import * as commandNames from 'Commands/commandNames';
|
||||
import { toggleBooksMonitored } from 'Store/Actions/bookActions';
|
||||
import { clearBookFiles, fetchBookFiles } from 'Store/Actions/bookFileActions';
|
||||
import { executeCommand } from 'Store/Actions/commandActions';
|
||||
import { clearEditions, fetchEditions } from 'Store/Actions/editionActions';
|
||||
import { cancelFetchReleases, clearReleases } from 'Store/Actions/releaseActions';
|
||||
import createAllAuthorSelector from 'Store/Selectors/createAllAuthorsSelector';
|
||||
import createCommandsSelector from 'Store/Selectors/createCommandsSelector';
|
||||
@@ -43,11 +44,12 @@ function createMapStateToProps() {
|
||||
(state, { titleSlug }) => titleSlug,
|
||||
selectBookFiles,
|
||||
(state) => state.books,
|
||||
(state) => state.editions,
|
||||
createAllAuthorSelector(),
|
||||
createCommandsSelector(),
|
||||
createUISettingsSelector(),
|
||||
createDimensionsSelector(),
|
||||
(titleSlug, bookFiles, books, authors, commands, uiSettings, dimensions) => {
|
||||
(titleSlug, bookFiles, books, editions, authors, commands, uiSettings, dimensions) => {
|
||||
const book = books.items.find((b) => b.titleSlug === titleSlug);
|
||||
const author = authors.find((a) => a.id === book.authorId);
|
||||
const sortedBooks = books.items.filter((b) => b.authorId === book.authorId);
|
||||
@@ -79,8 +81,8 @@ function createMapStateToProps() {
|
||||
isRefreshingCommand.body.bookId === book.id
|
||||
);
|
||||
|
||||
const isFetching = isBookFilesFetching;
|
||||
const isPopulated = isBookFilesPopulated;
|
||||
const isFetching = isBookFilesFetching || editions.isFetching;
|
||||
const isPopulated = isBookFilesPopulated && editions.isPopulated;
|
||||
|
||||
return {
|
||||
...book,
|
||||
@@ -104,6 +106,8 @@ const mapDispatchToProps = {
|
||||
executeCommand,
|
||||
fetchBookFiles,
|
||||
clearBookFiles,
|
||||
fetchEditions,
|
||||
clearEditions,
|
||||
clearReleases,
|
||||
cancelFetchReleases,
|
||||
toggleBooksMonitored
|
||||
@@ -121,7 +125,8 @@ class BookDetailsConnector extends Component {
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
if (!_.isEqual(getMonitoredEditions(prevProps), getMonitoredEditions(this.props)) ||
|
||||
if (prevProps.id !== this.props.id ||
|
||||
!_.isEqual(getMonitoredEditions(prevProps), getMonitoredEditions(this.props)) ||
|
||||
(prevProps.anyReleaseOk === false && this.props.anyReleaseOk === true)) {
|
||||
this.unpopulate();
|
||||
this.populate();
|
||||
@@ -140,12 +145,14 @@ class BookDetailsConnector extends Component {
|
||||
const bookId = this.props.id;
|
||||
|
||||
this.props.fetchBookFiles({ bookId });
|
||||
this.props.fetchEditions({ bookId });
|
||||
}
|
||||
|
||||
unpopulate = () => {
|
||||
this.props.cancelFetchReleases();
|
||||
this.props.clearReleases();
|
||||
this.props.clearBookFiles();
|
||||
this.props.clearEditions();
|
||||
}
|
||||
|
||||
//
|
||||
@@ -195,6 +202,8 @@ BookDetailsConnector.propTypes = {
|
||||
titleSlug: PropTypes.string.isRequired,
|
||||
fetchBookFiles: PropTypes.func.isRequired,
|
||||
clearBookFiles: PropTypes.func.isRequired,
|
||||
fetchEditions: PropTypes.func.isRequired,
|
||||
clearEditions: PropTypes.func.isRequired,
|
||||
clearReleases: PropTypes.func.isRequired,
|
||||
cancelFetchReleases: PropTypes.func.isRequired,
|
||||
toggleBooksMonitored: PropTypes.func.isRequired,
|
||||
|
||||
@@ -8,15 +8,25 @@ import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
||||
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||
import BookDetailsHeader from './BookDetailsHeader';
|
||||
|
||||
const selectOverview = createSelector(
|
||||
(state) => state.editions,
|
||||
(editions) => {
|
||||
const monitored = editions.items.find((e) => e.monitored === true);
|
||||
return monitored?.overview;
|
||||
}
|
||||
);
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
createBookSelector(),
|
||||
selectOverview,
|
||||
createUISettingsSelector(),
|
||||
createDimensionsSelector(),
|
||||
(book, uiSettings, dimensions) => {
|
||||
(book, overview, uiSettings, dimensions) => {
|
||||
|
||||
return {
|
||||
...book,
|
||||
overview,
|
||||
shortDateFormat: uiSettings.shortDateFormat,
|
||||
isSmallScreen: dimensions.isSmallScreen
|
||||
};
|
||||
|
||||
@@ -53,7 +53,7 @@ class EditBookModalContent extends Component {
|
||||
editions
|
||||
} = item;
|
||||
|
||||
const hasFile = statistics ? statistics.bookFileCount : 0;
|
||||
const hasFile = statistics ? statistics.bookFileCount > 0 : false;
|
||||
const errorMessage = getErrorMessage(error, 'Unable to load editions');
|
||||
|
||||
return (
|
||||
|
||||
@@ -4,7 +4,7 @@ import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { saveBook, setBookValue } from 'Store/Actions/bookActions';
|
||||
import { clearEditions, fetchEditions } from 'Store/Actions/editionActions';
|
||||
import { saveEditions } from 'Store/Actions/editionActions';
|
||||
import createAuthorSelector from 'Store/Selectors/createAuthorSelector';
|
||||
import createBookSelector from 'Store/Selectors/createBookSelector';
|
||||
import selectSettings from 'Store/Selectors/selectSettings';
|
||||
@@ -26,17 +26,14 @@ function createMapStateToProps() {
|
||||
const {
|
||||
isFetching,
|
||||
isPopulated,
|
||||
error,
|
||||
items
|
||||
error
|
||||
} = editionState;
|
||||
|
||||
book.editions = items;
|
||||
|
||||
const bookSettings = _.pick(book, [
|
||||
'monitored',
|
||||
'anyEditionOk',
|
||||
'editions'
|
||||
'anyEditionOk'
|
||||
]);
|
||||
bookSettings.editions = editionState.items;
|
||||
|
||||
const settings = selectSettings(bookSettings, pendingChanges, saveError);
|
||||
|
||||
@@ -58,10 +55,9 @@ function createMapStateToProps() {
|
||||
}
|
||||
|
||||
const mapDispatchToProps = {
|
||||
dispatchFetchEditions: fetchEditions,
|
||||
dispatchClearEditions: clearEditions,
|
||||
dispatchSetBookValue: setBookValue,
|
||||
dispatchSaveBook: saveBook
|
||||
dispatchSaveBook: saveBook,
|
||||
dispatchSaveEditions: saveEditions
|
||||
};
|
||||
|
||||
class EditBookModalContentConnector extends Component {
|
||||
@@ -69,20 +65,12 @@ class EditBookModalContentConnector extends Component {
|
||||
//
|
||||
// Lifecycle
|
||||
|
||||
componentDidMount() {
|
||||
this.props.dispatchFetchEditions({ bookId: this.props.bookId });
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps, prevState) {
|
||||
if (prevProps.isSaving && !this.props.isSaving && !this.props.saveError) {
|
||||
this.props.onModalClose();
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.props.dispatchClearEditions();
|
||||
}
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
@@ -94,6 +82,9 @@ class EditBookModalContentConnector extends Component {
|
||||
this.props.dispatchSaveBook({
|
||||
id: this.props.bookId
|
||||
});
|
||||
this.props.dispatchSaveEditions({
|
||||
id: this.props.bookId
|
||||
});
|
||||
}
|
||||
|
||||
//
|
||||
@@ -114,10 +105,9 @@ EditBookModalContentConnector.propTypes = {
|
||||
bookId: PropTypes.number,
|
||||
isSaving: PropTypes.bool.isRequired,
|
||||
saveError: PropTypes.object,
|
||||
dispatchFetchEditions: PropTypes.func.isRequired,
|
||||
dispatchClearEditions: PropTypes.func.isRequired,
|
||||
dispatchSetBookValue: PropTypes.func.isRequired,
|
||||
dispatchSaveBook: PropTypes.func.isRequired,
|
||||
dispatchSaveEditions: PropTypes.func.isRequired,
|
||||
onModalClose: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import * as commandNames from 'Commands/commandNames';
|
||||
import { executeCommand } from 'Store/Actions/commandActions';
|
||||
import createBookAuthorSelector from 'Store/Selectors/createBookAuthorSelector';
|
||||
import createBookQualityProfileSelector from 'Store/Selectors/createBookQualityProfileSelector';
|
||||
import createBookSelector from 'Store/Selectors/createBookSelector';
|
||||
import createExecutingCommandsSelector from 'Store/Selectors/createExecutingCommandsSelector';
|
||||
@@ -32,11 +33,13 @@ function selectShowSearchAction() {
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
createBookSelector(),
|
||||
createBookAuthorSelector(),
|
||||
createBookQualityProfileSelector(),
|
||||
selectShowSearchAction(),
|
||||
createExecutingCommandsSelector(),
|
||||
(
|
||||
book,
|
||||
author,
|
||||
qualityProfile,
|
||||
showSearchAction,
|
||||
executingCommands
|
||||
@@ -54,7 +57,7 @@ function createMapStateToProps() {
|
||||
const isRefreshingBook = executingCommands.some((command) => {
|
||||
return (
|
||||
(command.name === commandNames.REFRESH_AUTHOR &&
|
||||
command.body.authorId === book.author.id) ||
|
||||
command.body.authorId === book.authorId) ||
|
||||
(command.name === commandNames.REFRESH_BOOK &&
|
||||
command.body.bookId === book.id)
|
||||
);
|
||||
@@ -63,7 +66,7 @@ function createMapStateToProps() {
|
||||
const isSearchingBook = executingCommands.some((command) => {
|
||||
return (
|
||||
(command.name === commandNames.AUTHOR_SEARCH &&
|
||||
command.body.authorId === book.author.id) ||
|
||||
command.body.authorId === book.authorId) ||
|
||||
(command.name === commandNames.BOOK_SEARCH &&
|
||||
command.body.bookIds.includes(book.id))
|
||||
);
|
||||
@@ -71,6 +74,7 @@ function createMapStateToProps() {
|
||||
|
||||
return {
|
||||
...book,
|
||||
author,
|
||||
qualityProfile,
|
||||
showSearchAction,
|
||||
isRefreshingBook,
|
||||
|
||||
@@ -12,6 +12,7 @@ import SpinnerIconButton from 'Components/Link/SpinnerIconButton';
|
||||
import { icons } from 'Helpers/Props';
|
||||
import dimensions from 'Styles/Variables/dimensions';
|
||||
import fonts from 'Styles/Variables/fonts';
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
import stripHtml from 'Utilities/String/stripHtml';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import BookIndexOverviewInfo from './BookIndexOverviewInfo';
|
||||
@@ -42,10 +43,26 @@ class BookIndexOverview extends Component {
|
||||
|
||||
this.state = {
|
||||
isEditAuthorModalOpen: false,
|
||||
isDeleteAuthorModalOpen: false
|
||||
isDeleteAuthorModalOpen: false,
|
||||
overview: ''
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
const { id } = this.props;
|
||||
|
||||
// Note that this component is lazy loaded by the virtualised view.
|
||||
// We want to avoid storing overviews for *all* books which is
|
||||
// why it's not put into the redux store
|
||||
const promise = createAjaxRequest({
|
||||
url: `/book/${id}/overview`
|
||||
}).request;
|
||||
|
||||
promise.done((data) => {
|
||||
this.setState({ overview: data.overview });
|
||||
});
|
||||
}
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
@@ -84,7 +101,6 @@ class BookIndexOverview extends Component {
|
||||
const {
|
||||
id,
|
||||
title,
|
||||
overview,
|
||||
monitored,
|
||||
titleSlug,
|
||||
nextAiring,
|
||||
@@ -118,6 +134,7 @@ class BookIndexOverview extends Component {
|
||||
} = statistics;
|
||||
|
||||
const {
|
||||
overview,
|
||||
isEditAuthorModalOpen,
|
||||
isDeleteAuthorModalOpen
|
||||
} = this.state;
|
||||
@@ -267,7 +284,6 @@ class BookIndexOverview extends Component {
|
||||
BookIndexOverview.propTypes = {
|
||||
id: PropTypes.number.isRequired,
|
||||
title: PropTypes.string.isRequired,
|
||||
overview: PropTypes.string.isRequired,
|
||||
monitored: PropTypes.bool.isRequired,
|
||||
titleSlug: PropTypes.string.isRequired,
|
||||
nextAiring: PropTypes.string,
|
||||
|
||||
@@ -6,6 +6,7 @@ import SelectInput from 'Components/Form/SelectInput';
|
||||
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||
import PageContentFooter from 'Components/Page/PageContentFooter';
|
||||
import { kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './BookshelfFooter.css';
|
||||
|
||||
const NO_CHANGE = 'noChange';
|
||||
@@ -114,7 +115,7 @@ class BookshelfFooter extends Component {
|
||||
|
||||
<div className={styles.inputContainer}>
|
||||
<div className={styles.label}>
|
||||
Monitor Existing Books
|
||||
{translate('MonitorExistingBooks')}
|
||||
</div>
|
||||
|
||||
<MonitorBooksSelectInput
|
||||
@@ -128,7 +129,7 @@ class BookshelfFooter extends Component {
|
||||
|
||||
<div className={styles.inputContainer}>
|
||||
<div className={styles.label}>
|
||||
Monitor New Books
|
||||
{translate('MonitorNewBooks')}
|
||||
</div>
|
||||
|
||||
<MonitorNewItemsSelectInput
|
||||
@@ -152,7 +153,7 @@ class BookshelfFooter extends Component {
|
||||
isDisabled={!selectedCount || noChanges}
|
||||
onPress={this.onUpdateSelectedPress}
|
||||
>
|
||||
Update Selected
|
||||
{translate('UpdateSelected')}
|
||||
</SpinnerButton>
|
||||
</div>
|
||||
</PageContentFooter>
|
||||
|
||||
@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import Link from 'Components/Link/Link';
|
||||
import { inputTypes } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
// import translate from 'Utilities/String/translate';
|
||||
import AutoCompleteInput from './AutoCompleteInput';
|
||||
import BookEditionSelectInputConnector from './BookEditionSelectInputConnector';
|
||||
@@ -216,7 +217,7 @@ function FormInputGroup(props) {
|
||||
<Link
|
||||
to={helpLink}
|
||||
>
|
||||
More Info
|
||||
{translate('MoreInfo')}
|
||||
</Link>
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ function PageContent(props) {
|
||||
|
||||
return (
|
||||
<ErrorBoundary errorComponent={PageContentError}>
|
||||
<DocumentTitle title={title ? `${title} - Readarr` : 'Readarr'}>
|
||||
<DocumentTitle title={title ? `${title} - ${window.Readarr.instanceName}` : window.Readarr.instanceName}>
|
||||
<div className={className}>
|
||||
{children}
|
||||
</div>
|
||||
|
||||
@@ -126,7 +126,7 @@ class AddAuthorOptionsForm extends Component {
|
||||
|
||||
<FormGroup className={showMetadataProfile ? undefined : styles.hideMetadataProfile}>
|
||||
<FormLabel>
|
||||
Metadata Profile
|
||||
{translate('MetadataProfile')}
|
||||
|
||||
{
|
||||
includeNoneMetadataProfile &&
|
||||
|
||||
@@ -20,6 +20,7 @@ function HostSettings(props) {
|
||||
bindAddress,
|
||||
port,
|
||||
urlBase,
|
||||
instanceName,
|
||||
enableSsl,
|
||||
sslPort,
|
||||
sslCertPath,
|
||||
@@ -78,6 +79,22 @@ function HostSettings(props) {
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
>
|
||||
<FormLabel>{translate('InstanceName')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
name="instanceName"
|
||||
helpText={translate('InstanceNameHelpText')}
|
||||
helpTextWarning={translate('RestartRequiredHelpTextWarning')}
|
||||
onChange={onInputChange}
|
||||
{...instanceName}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
|
||||
@@ -28,17 +28,17 @@ function ImportListMonitoringOptionsPopoverContent() {
|
||||
<DescriptionList>
|
||||
<DescriptionListItem
|
||||
title={translate('None')}
|
||||
data="Do not monitor authors or books"
|
||||
data={translate('DataListMonitorNone')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('SpecificBook')}
|
||||
data="Monitor authors but only monitor books explicitly included in the list"
|
||||
data={translate('DataListMonitorSpecificBook')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title={translate('AllAuthorBooks')}
|
||||
data="Monitor authors and all books for each author included on the import list"
|
||||
data={translate('DataListMonitorAll')}
|
||||
/>
|
||||
</DescriptionList>
|
||||
);
|
||||
@@ -89,7 +89,7 @@ function EditImportListModalContent(props) {
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>
|
||||
{id ? 'Edit List' : 'Add List'}
|
||||
{id ? translate('EditList') : translate('AddList')}
|
||||
</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
@@ -148,7 +148,7 @@ function EditImportListModalContent(props) {
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
Monitor
|
||||
{translate('Monitor')}
|
||||
|
||||
<Popover
|
||||
anchor={
|
||||
@@ -318,7 +318,7 @@ function EditImportListModalContent(props) {
|
||||
kind={kinds.DANGER}
|
||||
onPress={onDeleteImportListPress}
|
||||
>
|
||||
Delete
|
||||
{translate('Delete')}
|
||||
</Button>
|
||||
}
|
||||
|
||||
@@ -327,13 +327,13 @@ function EditImportListModalContent(props) {
|
||||
error={saveError}
|
||||
onPress={onTestPress}
|
||||
>
|
||||
Test
|
||||
{translate('Test')}
|
||||
</SpinnerErrorButton>
|
||||
|
||||
<Button
|
||||
onPress={onModalClose}
|
||||
>
|
||||
Cancel
|
||||
{translate('Cancel')}
|
||||
</Button>
|
||||
|
||||
<SpinnerErrorButton
|
||||
@@ -341,7 +341,7 @@ function EditImportListModalContent(props) {
|
||||
error={saveError}
|
||||
onPress={onSavePress}
|
||||
>
|
||||
Save
|
||||
{translate('Save')}
|
||||
</SpinnerErrorButton>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
|
||||
@@ -346,7 +346,7 @@ function EditRootFolderModalContent(props) {
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
Convert to format
|
||||
{translate('ConvertToFormat')}
|
||||
<Popover
|
||||
anchor={
|
||||
<Icon
|
||||
@@ -371,7 +371,7 @@ function EditRootFolderModalContent(props) {
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
Calibre Output Profile
|
||||
{translate('CalibreOutputProfile')}
|
||||
<Popover
|
||||
anchor={
|
||||
<Icon
|
||||
@@ -423,14 +423,14 @@ function EditRootFolderModalContent(props) {
|
||||
kind={kinds.DANGER}
|
||||
onPress={onDeleteRootFolderPress}
|
||||
>
|
||||
Delete
|
||||
{translate('Delete')}
|
||||
</Button>
|
||||
}
|
||||
|
||||
<Button
|
||||
onPress={onModalClose}
|
||||
>
|
||||
Cancel
|
||||
{translate('Cancel')}
|
||||
</Button>
|
||||
|
||||
<SpinnerErrorButton
|
||||
@@ -438,7 +438,7 @@ function EditRootFolderModalContent(props) {
|
||||
error={saveError}
|
||||
onPress={onSavePress}
|
||||
>
|
||||
Save
|
||||
{translate('Save')}
|
||||
</SpinnerErrorButton>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
|
||||
@@ -78,12 +78,8 @@ export const actionHandlers = handleThunks({
|
||||
} = payload;
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
url: '/history/failed',
|
||||
method: 'POST',
|
||||
data: {
|
||||
id: historyId
|
||||
},
|
||||
dataType: 'json'
|
||||
url: `/history/failed/${historyId}`,
|
||||
method: 'POST'
|
||||
}).request;
|
||||
|
||||
promise.done(() => {
|
||||
|
||||
@@ -86,12 +86,8 @@ export const actionHandlers = handleThunks({
|
||||
} = payload;
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
url: '/history/failed',
|
||||
method: 'POST',
|
||||
data: {
|
||||
id: historyId
|
||||
},
|
||||
dataType: 'json'
|
||||
url: `/history/failed/${historyId}`,
|
||||
method: 'POST'
|
||||
}).request;
|
||||
|
||||
promise.done(() => {
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import { createAction } from 'redux-actions';
|
||||
import { batchActions } from 'redux-batched-actions';
|
||||
import { createThunk, handleThunks } from 'Store/thunks';
|
||||
import getProviderState from 'Utilities/State/getProviderState';
|
||||
import { updateItem } from './baseActions';
|
||||
import createFetchHandler from './Creators/createFetchHandler';
|
||||
import createHandleActions from './Creators/createHandleActions';
|
||||
import createClearReducer from './Creators/Reducers/createClearReducer';
|
||||
@@ -25,18 +28,39 @@ export const defaultState = {
|
||||
|
||||
export const FETCH_EDITIONS = 'editions/fetchEditions';
|
||||
export const CLEAR_EDITIONS = 'editions/clearEditions';
|
||||
export const SAVE_EDITIONS = 'editions/saveEditions';
|
||||
|
||||
//
|
||||
// Action Creators
|
||||
|
||||
export const fetchEditions = createThunk(FETCH_EDITIONS);
|
||||
export const clearEditions = createAction(CLEAR_EDITIONS);
|
||||
export const saveEditions = createThunk(SAVE_EDITIONS);
|
||||
|
||||
//
|
||||
// Action Handlers
|
||||
|
||||
export const actionHandlers = handleThunks({
|
||||
[FETCH_EDITIONS]: createFetchHandler(section, '/edition')
|
||||
[FETCH_EDITIONS]: createFetchHandler(section, '/edition'),
|
||||
|
||||
[SAVE_EDITIONS]: function(getState, payload, dispatch) {
|
||||
const {
|
||||
id,
|
||||
...otherPayload
|
||||
} = payload;
|
||||
|
||||
const saveData = getProviderState({ id, ...otherPayload }, getState, 'books');
|
||||
|
||||
dispatch(batchActions([
|
||||
...saveData.editions.map((edition) => {
|
||||
return updateItem({
|
||||
id: edition.id,
|
||||
section: 'editions',
|
||||
...edition
|
||||
});
|
||||
})
|
||||
]));
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
|
||||
@@ -246,11 +246,8 @@ export const actionHandlers = handleThunks({
|
||||
}));
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
url: '/history/failed',
|
||||
url: `/history/failed/${id}`,
|
||||
method: 'POST',
|
||||
data: {
|
||||
id
|
||||
},
|
||||
dataType: 'json'
|
||||
}).request;
|
||||
|
||||
|
||||
15
frontend/src/Store/Selectors/createBookAuthorSelector.js
Normal file
15
frontend/src/Store/Selectors/createBookAuthorSelector.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import { createSelector } from 'reselect';
|
||||
import createBookSelector from './createBookSelector';
|
||||
|
||||
function createBookAuthorSelector() {
|
||||
return createSelector(
|
||||
createBookSelector(),
|
||||
(state) => state.authors.itemMap,
|
||||
(state) => state.authors.items,
|
||||
(book, authorMap, allAuthors) => {
|
||||
return allAuthors[authorMap[book.authorId]];
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export default createBookAuthorSelector;
|
||||
@@ -1,18 +1,16 @@
|
||||
import { createSelector } from 'reselect';
|
||||
import createBookSelector from './createBookSelector';
|
||||
import createBookAuthorSelector from './createBookAuthorSelector';
|
||||
|
||||
function createBookQualityProfileSelector() {
|
||||
return createSelector(
|
||||
(state) => state.settings.qualityProfiles.items,
|
||||
createBookSelector(),
|
||||
(qualityProfiles, book) => {
|
||||
if (!book) {
|
||||
createBookAuthorSelector(),
|
||||
(qualityProfiles, author) => {
|
||||
if (!author) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return qualityProfiles.find((profile) => {
|
||||
return profile.id === book.author.qualityProfileId;
|
||||
});
|
||||
return qualityProfiles.find((profile) => profile.id === author.qualityProfileId);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
"@fortawesome/free-regular-svg-icons": "5.15.3",
|
||||
"@fortawesome/free-solid-svg-icons": "5.15.3",
|
||||
"@fortawesome/react-fontawesome": "0.1.14",
|
||||
"@microsoft/signalr": "6.0.3",
|
||||
"@microsoft/signalr": "6.0.5",
|
||||
"@sentry/browser": "6.18.2",
|
||||
"@sentry/integrations": "6.18.2",
|
||||
"ansi-colors": "4.1.1",
|
||||
|
||||
@@ -15,25 +15,26 @@
|
||||
<PackageVersion Include="ImpromptuInterface" Version="7.0.1" />
|
||||
<PackageVersion Include="LazyCache" Version="2.4.0" />
|
||||
<PackageVersion Include="Mailkit" Version="3.1.1" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.3" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.5" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
||||
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
||||
<PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr18" />
|
||||
<PackageVersion Include="MonoTorrent" Version="2.0.4" />
|
||||
<PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr22" />
|
||||
<PackageVersion Include="MonoTorrent" Version="2.0.5" />
|
||||
<PackageVersion Include="Moq" Version="4.17.2" />
|
||||
<PackageVersion Include="NBuilder" Version="6.1.0" />
|
||||
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<PackageVersion Include="NLog.Extensions.Logging" Version="1.7.4" />
|
||||
<PackageVersion Include="NLog" Version="4.7.14" />
|
||||
<PackageVersion Include="NLog.Targets.Syslog" Version="6.0.2" />
|
||||
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||
<PackageVersion Include="NUnit" Version="3.13.2" />
|
||||
<PackageVersion Include="NunitXml.TestLogger" Version="3.0.117" />
|
||||
<PackageVersion Include="PdfSharpCore" Version="1.3.13" />
|
||||
<PackageVersion Include="PdfSharpCore" Version="1.3.18" />
|
||||
<PackageVersion Include="RestSharp.Serializers.SystemTextJson" Version="106.15.0" />
|
||||
<PackageVersion Include="RestSharp" Version="106.15.0" />
|
||||
<PackageVersion Include="Selenium.Support" Version="3.141.0" />
|
||||
@@ -55,9 +56,9 @@
|
||||
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
|
||||
<PackageVersion Include="System.ServiceProcess.ServiceController" Version="6.0.0" />
|
||||
<PackageVersion Include="System.Text.Encoding.CodePages" Version="6.0.0" />
|
||||
<PackageVersion Include="System.Text.Json" Version="6.0.2" />
|
||||
<PackageVersion Include="System.Text.Json" Version="6.0.4" />
|
||||
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
|
||||
<PackageVersion Include="TagLibSharp-Lidarr" Version="2.2.0.19" />
|
||||
<PackageVersion Include="Unity" Version="5.11.10" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -9,4 +9,26 @@
|
||||
<add key="SQLite" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/SQLite/nuget/v3/index.json" />
|
||||
<add key="coverlet-nightly" value="https://pkgs.dev.azure.com/Servarr/coverlet/_packaging/coverlet-nightly/nuget/v3/index.json" />
|
||||
</packageSources>
|
||||
<packageSourceMapping>
|
||||
<!-- key value for <packageSource> should match key values from <packageSources> element -->
|
||||
<packageSource key="nuget.org">
|
||||
<package pattern="*" />
|
||||
</packageSource>
|
||||
<packageSource key="dotnet-bsd-crossbuild">
|
||||
<package pattern="*" />
|
||||
</packageSource>
|
||||
<packageSource key="FluentMigrator">
|
||||
<package pattern="FluentMigrator" />
|
||||
<package pattern="FluentMigrator.*" />
|
||||
</packageSource>
|
||||
<packageSource key="Mono.Posix.NETStandard">
|
||||
<package pattern="Mono.Posix.NETStandard" />
|
||||
</packageSource>
|
||||
<packageSource key="SQLite">
|
||||
<package pattern="System.Data.SQLite.Core.Servarr" />
|
||||
</packageSource>
|
||||
<packageSource key="coverlet-nightly">
|
||||
<package pattern="coverlet.*" />
|
||||
</packageSource>
|
||||
</packageSourceMapping>
|
||||
</configuration>
|
||||
|
||||
@@ -80,6 +80,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests
|
||||
|
||||
//GoodReads
|
||||
[TestCase(@"{""signatureMethod"": ""hmacSha1"",""signatureTreatment"": ""escaped"",""type"": ""protectedResource"",""method"": ""GET"",""token"": ""mytoken"",""tokenSecret"": ""mytokensecret"",""requestUrl"": ""https://www.goodreads.com/review/list.xml"",""parameters"": { ""_nc"": ""1"", ""v"": ""2"", ""id"": ""999999999"", ""shelf"": ""currently-reading"", ""per_page"": ""200"", ""page"": ""1""}")]
|
||||
[TestCase(@"https://www.goodreads.com/series/311911?key=1234530f422f4aacb6b301233210aaaa&_nc=1&format=xml")]
|
||||
public void should_cleanGoodRead_message(string message)
|
||||
{
|
||||
var cleansedMessage = CleanseLogMessage.Cleanse(message);
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
private static readonly Regex[] CleansingRules = new[]
|
||||
{
|
||||
// Url
|
||||
new Regex(@"(?<=\?|&|: )(apikey|(?:access[-_]?)?token|passkey|auth|authkey|user|uid|api|[a-z_]*apikey|account|passwd)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"(?<=\?|&|: )((?:api|auth|pass)?key|(?:access[-_]?)?token|auth|user|uid|api|[a-z_]*apikey|account|passwd)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"(?<=\?|&)[^=]*?(username|password)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"torrentleech\.org/(?!rss)(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"torrentleech\.org/rss/download/[0-9]+/(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
@@ -27,7 +27,6 @@ namespace NzbDrone.Core.Test.UpdateTests
|
||||
[Test]
|
||||
public void finds_update_when_version_lower()
|
||||
{
|
||||
NotBsd();
|
||||
UseRealHttp();
|
||||
Subject.GetLatestUpdate("nightly", new Version(0, 1)).Should().NotBeNull();
|
||||
}
|
||||
@@ -43,8 +42,6 @@ namespace NzbDrone.Core.Test.UpdateTests
|
||||
[Test]
|
||||
public void should_get_recent_updates()
|
||||
{
|
||||
NotBsd();
|
||||
|
||||
const string branch = "nightly";
|
||||
UseRealHttp();
|
||||
var recent = Subject.GetRecentUpdates(branch, new Version(0, 1));
|
||||
|
||||
@@ -41,9 +41,13 @@ namespace NzbDrone.Core.Configuration
|
||||
string SslCertPassword { get; }
|
||||
string UrlBase { get; }
|
||||
string UiFolder { get; }
|
||||
string InstanceName { get; }
|
||||
bool UpdateAutomatically { get; }
|
||||
UpdateMechanism UpdateMechanism { get; }
|
||||
string UpdateScriptPath { get; }
|
||||
string SyslogServer { get; }
|
||||
int SyslogPort { get; }
|
||||
string SyslogLevel { get; }
|
||||
}
|
||||
|
||||
public class ConfigFileProvider : IConfigFileProvider
|
||||
@@ -202,6 +206,7 @@ namespace NzbDrone.Core.Configuration
|
||||
}
|
||||
|
||||
public string UiFolder => BuildInfo.IsDebug ? Path.Combine("..", "UI") : "UI";
|
||||
public string InstanceName => GetValue("InstanceName", BuildInfo.AppName);
|
||||
|
||||
public bool UpdateAutomatically => GetValueBoolean("UpdateAutomatically", false, false);
|
||||
|
||||
@@ -209,6 +214,12 @@ namespace NzbDrone.Core.Configuration
|
||||
|
||||
public string UpdateScriptPath => GetValue("UpdateScriptPath", "", false);
|
||||
|
||||
public string SyslogServer => GetValue("SyslogServer", "", persist: false);
|
||||
|
||||
public int SyslogPort => GetValueInt("SyslogPort", 514, persist: false);
|
||||
|
||||
public string SyslogLevel => GetValue("SyslogLevel", LogLevel, false).ToLowerInvariant();
|
||||
|
||||
public int GetValueInt(string key, int defaultValue, bool persist = true)
|
||||
{
|
||||
return Convert.ToInt32(GetValue(key, defaultValue, persist));
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using FluentMigrator;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
[Migration(22)]
|
||||
public class EditionMonitoredIndex : NzbDroneMigrationBase
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
Create.Index().OnTable("Editions").OnColumn("Monitored");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,8 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NLog.Config;
|
||||
using NLog.Targets.Syslog;
|
||||
using NLog.Targets.Syslog.Settings;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Instrumentation;
|
||||
@@ -40,6 +42,12 @@ namespace NzbDrone.Core.Instrumentation
|
||||
minimumConsoleLogLevel = LogLevel.Info;
|
||||
}
|
||||
|
||||
if (_configFileProvider.SyslogServer.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
var syslogLevel = LogLevel.FromString(_configFileProvider.SyslogLevel);
|
||||
SetSyslogParameters(_configFileProvider.SyslogServer, _configFileProvider.SyslogPort, syslogLevel);
|
||||
}
|
||||
|
||||
var rules = LogManager.Configuration.LoggingRules;
|
||||
|
||||
//Console
|
||||
@@ -101,6 +109,24 @@ namespace NzbDrone.Core.Instrumentation
|
||||
}
|
||||
}
|
||||
|
||||
private void SetSyslogParameters(string syslogServer, int syslogPort, LogLevel minimumLogLevel)
|
||||
{
|
||||
var syslogTarget = new SyslogTarget();
|
||||
|
||||
syslogTarget.Name = "syslogTarget";
|
||||
syslogTarget.MessageSend.Protocol = ProtocolType.Udp;
|
||||
syslogTarget.MessageSend.Udp.Port = syslogPort;
|
||||
syslogTarget.MessageSend.Udp.Server = syslogServer;
|
||||
syslogTarget.MessageSend.Udp.ReconnectInterval = 500;
|
||||
syslogTarget.MessageCreation.Rfc = RfcNumber.Rfc5424;
|
||||
syslogTarget.MessageCreation.Rfc5424.AppName = _configFileProvider.InstanceName;
|
||||
|
||||
var loggingRule = new LoggingRule("*", minimumLogLevel, syslogTarget);
|
||||
|
||||
LogManager.Configuration.AddTarget("syslogTarget", syslogTarget);
|
||||
LogManager.Configuration.LoggingRules.Add(loggingRule);
|
||||
}
|
||||
|
||||
private List<LogLevel> GetLogLevels()
|
||||
{
|
||||
return new List<LogLevel>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"AddedAuthorSettings": "Added Author Settings",
|
||||
"AddImportListExclusionHelpText": "Prevent book from being added to Readarr by Import Lists or Author Refresh",
|
||||
"AddingTag": "Adding tag",
|
||||
"AddList": "Add List",
|
||||
"AddListExclusion": "Add List Exclusion",
|
||||
"AddMissing": "Add missing",
|
||||
"AddNewItem": "Add New Item",
|
||||
@@ -130,6 +131,7 @@
|
||||
"ContinuingAllBooksDownloaded": "Continuing (All books downloaded)",
|
||||
"ContinuingMoreBooksAreExpected": "More books are expected",
|
||||
"ContinuingNoAdditionalBooksAreExpected": "No additional books are expected",
|
||||
"ConvertToFormat": "Convert To Format",
|
||||
"CopyUsingHardlinksHelpText": "Use Hardlinks when trying to copy files from torrents that are still being seeded",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Occasionally, file locks may prevent renaming files that are being seeded. You may temporarily disable seeding and use Readarr's rename function as a work around.",
|
||||
"CouldntFindAnyResultsForTerm": "Couldn't find any results for '{0}'",
|
||||
@@ -139,6 +141,19 @@
|
||||
"CreateGroup": "Create group",
|
||||
"CutoffHelpText": "Once this quality is reached Readarr will no longer download books",
|
||||
"CutoffUnmet": "Cutoff Unmet",
|
||||
"DataAllBooks": "Monitor all books",
|
||||
"DataExistingBooks": "Monitor books that have files or have not released yet",
|
||||
"DataFirstBook": "Monitor the first book. All other books will be ignored",
|
||||
"DataFuturebooks": "Monitor books that have not released yet",
|
||||
"DataLatestBook": "Monitor the latest book and future books",
|
||||
"DataListMonitorAll": "Monitor authors and all books for each author included on the import list",
|
||||
"DataListMonitorNone": "Do not monitor authors or books",
|
||||
"DataListMonitorSpecificBook": "Monitor authors, but only monitor books explicitly included in the list",
|
||||
"DataMissingBooks": "Monitor books that do not have files or have not released yet",
|
||||
"DataNewAllBooks": "Monitor all new books",
|
||||
"DataNewBooks": "Monitor new books released after the newest existing book",
|
||||
"DataNewNone": "Don't monitor any new books",
|
||||
"DataNone": "No books will be monitored",
|
||||
"Dates": "Dates",
|
||||
"DBMigration": "DB Migration",
|
||||
"DefaultMetadataProfileIdHelpText": "Default Metadata Profile for authors detected in this folder",
|
||||
@@ -210,6 +225,7 @@
|
||||
"EditBook": "Edit Book",
|
||||
"Edition": "Edition",
|
||||
"EditionsHelpText": "Change edition for this book",
|
||||
"EditList": "Edit List",
|
||||
"EmbedMetadataHelpText": "Tell Calibre to write metadata into the actual book file",
|
||||
"EmbedMetadataInBookFiles": "Embed Metadata in Book Files",
|
||||
"Enable": "Enable",
|
||||
@@ -336,6 +352,8 @@
|
||||
"IndexersSettingsSummary": "Indexers and release restrictions",
|
||||
"IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures",
|
||||
"IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}",
|
||||
"InstanceName": "Instance Name",
|
||||
"InstanceNameHelpText": "Instance name in tab and for Syslog app name",
|
||||
"Interval": "Interval",
|
||||
"ISBN": "ISBN",
|
||||
"IsCalibreLibraryHelpText": "Use Calibre Content Server to manipulate library",
|
||||
@@ -423,9 +441,11 @@
|
||||
"MonitoredAuthorIsMonitored": "Author is monitored",
|
||||
"MonitoredAuthorIsUnmonitored": "Author is unmonitored",
|
||||
"MonitoredHelpText": "Readarr will search for and download book",
|
||||
"MonitorExistingBooks": "Monitor Existing Books",
|
||||
"Monitoring": "Monitoring",
|
||||
"MonitoringOptions": "Monitoring Options",
|
||||
"MonitoringOptionsHelpText": "Which books should be monitored after the author is added (one-time adjustment)",
|
||||
"MonitorNewBooks": "Monitor New Books",
|
||||
"MonitorNewItems": "Monitor New Books",
|
||||
"MonitorNewItemsHelpText": "Which new books should be monitored",
|
||||
"MonoVersion": "Mono Version",
|
||||
@@ -599,6 +619,7 @@
|
||||
"RemoveTagRemovingTag": "Removing tag",
|
||||
"RenameBooks": "Rename Books",
|
||||
"RenameBooksHelpText": "Readarr will use the existing file name if renaming is disabled",
|
||||
"RenameFiles": "Rename Files",
|
||||
"Reorder": "Reorder",
|
||||
"ReplaceIllegalCharacters": "Replace Illegal Characters",
|
||||
"ReplaceIllegalCharactersHelpText": "Replace illegal characters. If unchecked, Readarr will remove them instead",
|
||||
@@ -614,6 +635,7 @@
|
||||
"RestartNow": "Restart Now",
|
||||
"RestartReadarr": "Restart Readarr",
|
||||
"RestartReloadNote": "Note: Readarr will automatically restart and reload the UI during the restore process.",
|
||||
"RestartRequiredHelpTextWarning": "Requires restart to take effect",
|
||||
"Restore": "Restore",
|
||||
"RestoreBackup": "Restore Backup",
|
||||
"Result": "Result",
|
||||
@@ -656,6 +678,7 @@
|
||||
"SetPermissions": "Set Permissions",
|
||||
"SetPermissionsLinuxHelpText": "Should chmod be run when files are imported/renamed?",
|
||||
"SetPermissionsLinuxHelpTextWarning": "If you're unsure what these settings do, do not alter them.",
|
||||
"SetReadarrTags": "Set Readarr Tags",
|
||||
"Settings": "Settings",
|
||||
"SettingsRemotePathMappingLocalPath": "Local Path",
|
||||
"SettingsRemotePathMappingLocalPathHelpText": "Path that Readarr should use to access the remote path locally",
|
||||
@@ -734,6 +757,7 @@
|
||||
"TagsSettingsSummary": "Manage author, profile, restriction, and notification tags",
|
||||
"Tasks": "Tasks",
|
||||
"Term": "Term",
|
||||
"Test": "Test",
|
||||
"TestAll": "Test All",
|
||||
"TestAllClients": "Test All Clients",
|
||||
"TestAllIndexers": "Test All Indexers",
|
||||
@@ -805,6 +829,7 @@
|
||||
"UnselectAll": "Unselect All",
|
||||
"UpdateAll": "Update all",
|
||||
"UpdateAutomaticallyHelpText": "Automatically download and install updates. You will still be able to install from System: Updates",
|
||||
"UpdateAvailable": "New update is available",
|
||||
"UpdateCheckStartupNotWritableMessage": "Cannot install update because startup folder '{0}' is not writable by the user '{1}'.",
|
||||
"UpdateCheckStartupTranslocationMessage": "Cannot install update because startup folder '{0}' is in an App Translocation folder.",
|
||||
"UpdateCheckUINotWritableMessage": "Cannot install update because UI folder '{0}' is not writable by the user '{1}'.",
|
||||
@@ -842,12 +867,12 @@
|
||||
"WriteAudioTagsScrub": "Scrub Existing Tags",
|
||||
"WriteAudioTagsScrubHelp": "Remove existing tags from files, leaving only those added by Readarr.",
|
||||
"WriteBookTagsHelpTextWarning": "Selecting 'All files' will alter existing files when they are imported.",
|
||||
"WriteMetadataTags": "Write Metadata Tags",
|
||||
"WriteTagsAll": "All files; initial import only",
|
||||
"WriteTagsNew": "For new downloads only",
|
||||
"WriteTagsNo": "Never",
|
||||
"WriteTagsSync": "All files; keep in sync with Goodreads",
|
||||
"Year": "Year",
|
||||
"YesCancel": "Yes, Cancel",
|
||||
"Yesterday": "Yesterday",
|
||||
"UpdateAvailable": "New update is available"
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"AnalyticsEnabledHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
|
||||
"Delete": "Poista",
|
||||
"None": "Ei mitään",
|
||||
"RootFolder": "Pääkansio",
|
||||
"RootFolder": "Juurikansio",
|
||||
"ShowPath": "Näytä sijainti",
|
||||
"SslCertPasswordHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
|
||||
"20MinutesTwenty": "20 minuuttia: {0}",
|
||||
@@ -21,7 +21,7 @@
|
||||
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja sovelluksen palvelimille. Tämä sisältää tietoja selaimestasi, verkkokäyttöliittymän sivujen käytöstä, virheraportoinnista sekä käyttöjärjestelmästäsi ja versiosta. Käytämme näitä tietoja ominaisuuksien ja virhekorjauksien painotukseen.",
|
||||
"AppDataDirectory": "AppData-kansio",
|
||||
"ApplyTags": "Toimenpide tunnisteille",
|
||||
"ApplyTagsHelpTexts1": "Tunnisteisiin kohdistettavat toimenpiteet:",
|
||||
"ApplyTagsHelpTexts1": "Miten tunnisteita sovelletaan valittuun kirjailijaan",
|
||||
"ApplyTagsHelpTexts2": "– 'Lisää' syötetyt tunnisteet aiempiin tunnisteisiin",
|
||||
"ApplyTagsHelpTexts3": "– 'Poista' ainoastaan syötetyt tunnisteet",
|
||||
"ApplyTagsHelpTexts4": "– 'Korvaa' kaikki aiemmat tunnisteet tai poista kaikki tunnisteet jättämällä tyhjäksi",
|
||||
@@ -132,7 +132,7 @@
|
||||
"ExtraFileExtensionsHelpTexts1": "Pilkulla eroteltu lista tuotavista oheistiedostoista (.nfo tuodaan nimellä .nfo-orig).",
|
||||
"ExtraFileExtensionsHelpTexts2": "Esimerkkejä: '.sub, .nfo' tai 'sub, nfo'.",
|
||||
"FailedDownloadHandling": "Latauksen käsittely epäonnistui",
|
||||
"FileDateHelpText": "Tiedoston päiväyksen muutos tuonnin ja uudellentarkistuksen yhteydessä.",
|
||||
"FileDateHelpText": "Muuta tiedoston päiväys tuonnin ja uudelleentarkistuksen yhteydessä.",
|
||||
"FileManagement": "Tiedostojen hallinta",
|
||||
"FileNames": "Tiedostonimet",
|
||||
"Filename": "Tiedostonimi",
|
||||
@@ -141,7 +141,7 @@
|
||||
"Fixed": "Korjattu",
|
||||
"Folder": "Kansio",
|
||||
"Folders": "Kansioiden käsittely",
|
||||
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Lue lisää lataustyökalusta painamalla 'Lisätietoja'.",
|
||||
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Lue lisää yksittäisistä lataustyökaluista painamalla 'Lisätietoja'.",
|
||||
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Lue lisää tietolähteestä painamalla 'Lisätietoja'.",
|
||||
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Lue lisää tuontilistoista painamalla 'Lisätietoja'.",
|
||||
"GeneralSettings": "Yleiset asetukset",
|
||||
@@ -173,7 +173,7 @@
|
||||
"ImportedTo": "Tuotu kohteeseen",
|
||||
"Importing": "Tiedostojen tuonti",
|
||||
"IncludeHealthWarningsHelpText": "Sisällytä kuntovaroitukset",
|
||||
"IncludeUnknownAuthorItemsHelpText": "Näytä jonossa kohteet, joissa ei ole kirjailijaa. Tämä voi sisältää poistettuja kirjailijoita tai mitä tahansa muuta Readarrille luokiteltua.",
|
||||
"IncludeUnknownAuthorItemsHelpText": "Näytä jonossa kohteet, joille ei ole kirjailijaa. Tämä voi sisältää poistettuja kirjailijoita tai mitä tahansa muuta Readarrille luokiteltua.",
|
||||
"IncludeUnmonitored": "Sisällytä ei valvotut",
|
||||
"Indexer": "Tietolähde",
|
||||
"IndexerPriority": "Tietolähteiden painotus",
|
||||
@@ -302,8 +302,8 @@
|
||||
"ReplaceIllegalCharacters": "Korvaa kielletyt merkit",
|
||||
"RequiredHelpText": "Julkaisun tulee sisältää ainakin yksi näistä termeistä (kirjainkokoa ei huomioida).",
|
||||
"RequiredPlaceHolder": "Lisää rajoitus",
|
||||
"RescanAfterRefreshHelpTextWarning": "Readarr ei tunnista tiedostomuutoksia automaattisesti, jollei asetuksena ole 'Aina'.",
|
||||
"RescanAuthorFolderAfterRefresh": "Tarkista kirjailijakansio päivityksen jälkeen uudelleen",
|
||||
"RescanAfterRefreshHelpTextWarning": "Tiedostomuutoksia ei tunnisteta automaattisesti, jollei asetuksena ole 'Aina'.",
|
||||
"RescanAuthorFolderAfterRefresh": "Tutki kirjailijakansio päivityksen jälkeen uudelleen",
|
||||
"Reset": "Uudista",
|
||||
"ResetAPIKey": "Uudista API-avain",
|
||||
"ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?",
|
||||
@@ -316,7 +316,7 @@
|
||||
"Retention": "Säilytys",
|
||||
"RetentionHelpText": "Vain Usenet: Aseta nollaan asettamaan rajoittamaton säilytys",
|
||||
"RetryingDownloadInterp": "Yritetään ladata uudelleen {0} osoitteessa {1}",
|
||||
"RootFolders": "Pääkansiot",
|
||||
"RootFolders": "Juurikansiot",
|
||||
"RssSyncIntervalHelpText": "Aikaväli minuutteina. Poista käytöstä asettamalla arvoksi '0' (tämä lopettaa julkaisujen automaattisen sieppauksen).",
|
||||
"SSLCertPassword": "SSL-varmenteen salasana",
|
||||
"SSLCertPath": "SSL-varmenteen sijainti",
|
||||
@@ -349,7 +349,7 @@
|
||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Näkyy jokaisen sarakkeen yläpuolella käytettäessä viikkonäkymää.",
|
||||
"Size": " Koko",
|
||||
"SkipFreeSpaceCheck": "Ohita vapaan levytilan tarkistus",
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Käytä, kun vapaata tilaa ei tunnisteta kirjailijoidesi pääkansiosta",
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Käytä, kun vapaata tilaa ei tunnisteta kirjailijoidesi pääkansiosta.",
|
||||
"SorryThatAuthorCannotBeFound": "Valitettavasti kirjailijaa ei löydy.",
|
||||
"SorryThatBookCannotBeFound": "Valitettavasti elokuvaa ei löydy.",
|
||||
"Source": "Lähdekoodi",
|
||||
@@ -416,7 +416,7 @@
|
||||
"UnableToLoadQualityProfiles": "Laatuprofiilien lataus epäonnistui.",
|
||||
"UnableToLoadReleaseProfiles": "Viiveprofiileja ei voi ladata",
|
||||
"UnableToLoadRemotePathMappings": "Etäsijaintien kartoitusten lataus epäonnistui.",
|
||||
"UnableToLoadRootFolders": "Pääkansioiden lataus epäonnistui.",
|
||||
"UnableToLoadRootFolders": "Juurikansioiden lataus epäonnistui.",
|
||||
"UnableToLoadTags": "Tunnisteiden lataus epäonnistui.",
|
||||
"UnableToLoadTheCalendar": "Kalenterin lataus epäonnistui.",
|
||||
"UnableToLoadUISettings": "Käyttöliittymän asetuksien lataus epäonnistui.",
|
||||
@@ -449,7 +449,7 @@
|
||||
"ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
|
||||
"SslCertPathHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
|
||||
"UnableToLoadMetadataProfiles": "Metatietoprofiilien lataus epäonnistui.",
|
||||
"DownloadClientCheckDownloadingToRoot": "Lataustyökalu '{0}' sijoittaa lataukset pääkansioon '{1}' ja näin ei pitäisi tehdä, vaan lataukset tulee tallentaa erilliseen sijaintiin.",
|
||||
"DownloadClientCheckDownloadingToRoot": "Lataustyökalu '{0}' sijoittaa lataukset juurikansioon '{1}' ja näin ei pitäisi tehdä, vaan lataukset tulee tallentaa erilliseen sijaintiin.",
|
||||
"ReplaceIllegalCharactersHelpText": "Korvaa laittomat merkit. Jos ei käytössä, laittomat merkit poistetaan.",
|
||||
"OutputPath": "Tallennussijainti",
|
||||
"Progress": "Edistyminen",
|
||||
@@ -499,7 +499,7 @@
|
||||
"NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty. Lisää tunnisteita määrittääksesi kirjailijoille viiveprofiileja, rajoituksia tai ilmoituksia. Paina '{0}' lukeaksesi lisää tunnisteista.",
|
||||
"EnabledHelpText": "Käytä tätä julkaisuprofiilia.",
|
||||
"CreateEmptyAuthorFolders": "Luo kirjailijoille tyhjät kansiot",
|
||||
"RescanAfterRefreshHelpText": "Tarkista kirjailijakansion sisältö uudelleen elokuvan päivityksen jälkeen.",
|
||||
"RescanAfterRefreshHelpText": "Tutki kirjailijakansio uudelleen kirjailijan päivityksen jälkeen.",
|
||||
"ThisCannotBeCancelled": "Tämän peruminen on aloituksen jälkeen mahdollista vain poistamalla kaikki tietolähteet käytöstä.",
|
||||
"UnselectAll": "Poista kaikkien valinta",
|
||||
"DeleteFilesHelpText": "Poista kirjatiedostot ja kirjailijakansio",
|
||||
@@ -539,7 +539,7 @@
|
||||
"Series": "Sarja",
|
||||
"Term": "Ehto",
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Elokuvakansio '{0}' ja kaikki sen sisältö poistetaan.",
|
||||
"UpdateSelected": "Päivitä valittu",
|
||||
"UpdateSelected": "Päivitä valitut",
|
||||
"Wanted": "Halutut",
|
||||
"DefaultMetadataProfileIdHelpText": "Kansiosta löytyville kirjailijoille oletusarvoisesti asetettava metatietoprofiili.",
|
||||
"DeleteBookFileMessageText": "Haluatko varmasti poistaa sovellusprofiilin {0}?",
|
||||
@@ -636,7 +636,7 @@
|
||||
"SearchFiltered": "Etsi suodatettuja",
|
||||
"RemotePathMappingCheckFilesGenericPermissions": "Lataustyökalu '{0}' ilmoitti tiedostosijainniksi '{1}', mutta Radarr ei näe sitä. Saata joutua muokkaamaan kansion käyttöoikeuksia.",
|
||||
"RemotePathMappingCheckImportFailed": "Radarr ei voinut tuoda elokuvaa. Tarkista loki saadaksesi lisätietoja.",
|
||||
"CouldntFindAnyResultsForTerm": "Haku '{0}' ei tuottanut yhtään tuloksia.",
|
||||
"CouldntFindAnyResultsForTerm": "Haku '{0}' ei tuottanut tuloksia.",
|
||||
"IndexerSearchCheckNoAutomaticMessage": "Ei hakemistoja, joissa automaattinen haku on käytössä, Radarr ei tarjoa automaattisia hakutuloksia",
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Kaikki hakukelpoiset tietolähteet ovat tilapaisesti tavoittamattomissa viimeaikaisten tietolähdevirheiden vuoksi.",
|
||||
"RemotePathMappingCheckDockerFolderMissing": "Käytät Dockeria ja lataustyökalu '{0}' sijoittaa lataukset kohteeseen '{1}', mutta kansiota ei näytä olevan olemassa containerissa. Tarkista etäsijaintiesi kartoitukset ja containerin tallennusmedia-asetukset.",
|
||||
@@ -689,5 +689,6 @@
|
||||
"SizeLimit": "Kokorajoitus",
|
||||
"SystemTimeCheckMessage": "Järjestelmän aika on heittä yli vuorokauden verran. Ajoitetut tehtävät eivät luultavasti toimi oikein ennen ajan korjausta.",
|
||||
"UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa"
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa",
|
||||
"WatchLibraryForChangesHelpText": "Suorita automaattinen uudelleentutkinta, kun juurikansiossa havaitaan tiedostomuutoksia."
|
||||
}
|
||||
|
||||
@@ -849,5 +849,29 @@
|
||||
"TimeLeft": "Hátralévő idő",
|
||||
"UpdateCheckStartupNotWritableMessage": "A frissítés nem telepíthető, mert a (z) „{0}” indítási mappát a „{1}” felhasználó nem írhatja.",
|
||||
"UpdateCheckStartupTranslocationMessage": "Nem lehet telepíteni a frissítést, mert a (z) „{0}” indítási mappa az Alkalmazások Transzlokációs mappájában található.",
|
||||
"UpdateAvailable": "Új frissítés elérhető"
|
||||
"UpdateAvailable": "Új frissítés elérhető",
|
||||
"AddList": "Lista hozzáadása",
|
||||
"ConvertToFormat": "Konvertálás Formátumba",
|
||||
"DataAllBooks": "Összes könyv monitorozása",
|
||||
"InstanceName": "Példány Neve",
|
||||
"RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez",
|
||||
"DataExistingBooks": "Könyvek monitorozása, ha van fájl, vagy ha még meg sem jelent",
|
||||
"DataFirstBook": "Az első könyvet monitorozása. Az összes többi könyvet figyelmen kívül hagyja",
|
||||
"DataFuturebooks": "Meg nem jelent könyvek monitorozása",
|
||||
"DataLatestBook": "Legutolsó, és jövendőbeli könyvek monitorozása",
|
||||
"DataListMonitorAll": "Az importálási listán lévő szerzők összes könyvének monitorozása",
|
||||
"DataListMonitorNone": "Ne monitorozzon szerzőket vagy könyveket",
|
||||
"DataListMonitorSpecificBook": "Monitorozza a szerzőket, de csak a listán kifejezetten szereplő könyveket",
|
||||
"DataMissingBooks": "Könyvek monitorozása amelyekből nincsen fájl, vagy még nem jelent meg",
|
||||
"DataNewAllBooks": "Összes új könyv monitorozása",
|
||||
"DataNewBooks": "A legújabb letöltött könyv utáni könyv(ek) monitorozása",
|
||||
"DataNewNone": "Ne monitorozzon új könyveket",
|
||||
"DataNone": "Egyetlen könyv sem lesz monitorozva",
|
||||
"MonitorNewBooks": "Az új könyvek monitorozása",
|
||||
"SetReadarrTags": "Readarr címkék beállítása",
|
||||
"Test": "Teszt",
|
||||
"WriteMetadataTags": "Írjon metaadat-címkéket",
|
||||
"EditList": "Lista szerkesztése",
|
||||
"MonitorExistingBooks": "Meglévő könyvek monitorozása",
|
||||
"RenameFiles": "Fájl(ok) átnevezése"
|
||||
}
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
"APIKey": "Chiave API",
|
||||
"About": "Informazioni",
|
||||
"AddListExclusion": "Aggiungi Lista Esclusioni",
|
||||
"AddingTag": "Aggiungi tag",
|
||||
"AdvancedSettingsHiddenClickToShow": "Nascosto, premi per mostrare",
|
||||
"AddingTag": "Aggiungi etichetta",
|
||||
"AdvancedSettingsHiddenClickToShow": "Nascosto, clicca per mostrare",
|
||||
"AdvancedSettingsShownClickToHide": "Visibile, clicca per nascondere",
|
||||
"Fixed": "Fissato",
|
||||
"Local": "Locale",
|
||||
"Remove": "Rimuovi",
|
||||
"Source": "Fonte",
|
||||
"Tags": "Tag",
|
||||
"Tags": "Etichette",
|
||||
"UpgradeAllowedHelpText": "Se disabilitato la qualità non verrà incrementata",
|
||||
"Uptime": "Tempo di attività",
|
||||
"UseHardlinksInsteadOfCopy": "Usa Hardlink invece che copiare",
|
||||
@@ -22,48 +22,48 @@
|
||||
"UsenetDelayHelpText": "Minuti di attesa prima di prendere una release da Usenet",
|
||||
"Username": "Nome utente",
|
||||
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Branch da utilizzare per aggiornare Radarr",
|
||||
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branch utilizzato dal sistema di aggiornamento esterno",
|
||||
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Ramo utilizzato dal sistema di aggiornamento esterno",
|
||||
"Version": "Versione",
|
||||
"WeekColumnHeader": "Intestazione colonna settimana",
|
||||
"Year": "Anno",
|
||||
"YesCancel": "Si, annulla",
|
||||
"AgeWhenGrabbed": "Età (quando trovato)",
|
||||
"YesCancel": "Si, Cancella",
|
||||
"AgeWhenGrabbed": "Età (quando recuperato)",
|
||||
"AlreadyInYourLibrary": "Già presente nella tua libreria",
|
||||
"AlternateTitles": "Titoli alternativi",
|
||||
"AlternateTitles": "Titoli Alternativi",
|
||||
"Analytics": "Analitica",
|
||||
"AnalyticsEnabledHelpText": "Inviare informazioni anonime sull'utilizzo e sugli errori ai server di Radarr. Ciò include informazioni sul tuo browser, come le pagine di Radarr che utilizzi, la segnalazione di errori e la versione del sistema operativo e del runtime. Utilizzeremo queste informazioni per dare priorità alle funzioni e alle correzioni di bug.",
|
||||
"AnalyticsEnabledHelpText": "Inviare informazioni anonime sull'utilizzo e sugli errori ai server di Readarr. Ciò include informazioni sul tuo browser, quali pagine dell'interfaccia di Readarr usi, la segnalazione di errori così come la versione del sistema operativo e del runtime. Utilizzeremo queste informazioni per dare priorità alle nuove funzioni e alle correzioni di bug.",
|
||||
"AppDataDirectory": "Cartella AppData",
|
||||
"ApplyTags": "Applica Etichette",
|
||||
"ApplyTagsHelpTexts1": "Come applicare i tag ai film selezionati",
|
||||
"ApplyTagsHelpTexts2": "Aggiungi: Aggiungere le etichette alla lista esistente di etichette",
|
||||
"ApplyTagsHelpTexts3": "Rimuovere: rimuovi le etichette inserite",
|
||||
"ApplyTagsHelpTexts1": "Come applicare etichette agli autori selezionati",
|
||||
"ApplyTagsHelpTexts2": "Aggiungi: Aggiunge le etichette alla lista esistente di etichette",
|
||||
"ApplyTagsHelpTexts3": "Rimuovi: Rimuove le etichette inserite",
|
||||
"ApplyTagsHelpTexts4": "Sostituire: Sostituisce le etichette con quelle inserite (non inserire nessuna etichette per eliminarle tutte)",
|
||||
"Authentication": "Autenticazione",
|
||||
"AuthenticationMethodHelpText": "Utilizza nome utente e password per accedere a Radarr",
|
||||
"AuthorClickToChangeBook": "Clicca per cambiare film",
|
||||
"AutoRedownloadFailedHelpText": "Ricerca automatica e tentativo di scaricare un'altra versione",
|
||||
"AuthenticationMethodHelpText": "Utilizza nome utente e password per accedere a Readarr",
|
||||
"AuthorClickToChangeBook": "Clicca per cambiare libro",
|
||||
"AutoRedownloadFailedHelpText": "Cerca e prova a scaricare automaticamente un'altra versione",
|
||||
"Automatic": "Automatico",
|
||||
"BackupFolderHelpText": "I percorsi relativi saranno sotto la directory AppData di Radarr",
|
||||
"BackupFolderHelpText": "I percorsi relativi saranno nella cartella AppData di Readarr",
|
||||
"BackupNow": "Effettua il Backup adesso",
|
||||
"BackupRetentionHelpText": "I backup automatici più vecchi del periodo di conservazione verranno eliminati automaticamente",
|
||||
"Backups": "I Backup",
|
||||
"BindAddress": "Indirizzo di Bind",
|
||||
"BindAddressHelpText": "Indirizzo IPV4 valido o '*' per tutte le interfacce",
|
||||
"BindAddressHelpTextWarning": "Richiede il riavvio per avere effetti",
|
||||
"BookIsDownloading": "Film in Download",
|
||||
"BookIsDownloadingInterp": "Film in download - {0}% {1}",
|
||||
"BindAddressHelpText": "Indirizzo IPv4 valido o '*' per tutte le interfacce",
|
||||
"BindAddressHelpTextWarning": "Richiede il riavvio per avere effetto",
|
||||
"BookIsDownloading": "Libro in download",
|
||||
"BookIsDownloadingInterp": "Libro in download - {0}% {1}",
|
||||
"Branch": "Ramo",
|
||||
"BypassProxyForLocalAddresses": "Evita il Proxy per gli indirizzi locali",
|
||||
"BypassProxyForLocalAddresses": "Evita il Proxy per gli Indirizzi Locali",
|
||||
"Calendar": "Calendario",
|
||||
"CalendarWeekColumnHeaderHelpText": "Mostra sopra ogni colonna quando la settimana è la vista attiva",
|
||||
"Cancel": "Cancella",
|
||||
"Cancel": "Annulla",
|
||||
"CancelMessageText": "Sei sicuro di voler cancellare questa operazione in sospeso?",
|
||||
"CertificateValidation": "Convalida del certificato",
|
||||
"CertificateValidationHelpText": "Cambiare il \"grado di severità\" della convalida del certificato HTTPS",
|
||||
"ChangeFileDate": "Cambiare la data del file",
|
||||
"ChangeHasNotBeenSavedYet": "Il cambiamento non è ancora stato ancora salvato",
|
||||
"CertificateValidation": "Convalida del Certificato",
|
||||
"CertificateValidationHelpText": "Cambia quanto è rigorosa la convalida del certificato HTTPS. Non cambiare a meno che tu non comprenda i rischi.",
|
||||
"ChangeFileDate": "Cambiare la Data del File",
|
||||
"ChangeHasNotBeenSavedYet": "Il cambio non è stato ancora salvato",
|
||||
"ChmodFolder": "Permessi Cartella",
|
||||
"ChmodFolderHelpText": "Octal, applicato durante importazione/rinomina di cartelle e file (senza execute bits)",
|
||||
"ChmodFolderHelpText": "Octal, applicato durante l'importazione/rinomina verso cartelle e file (senza bits di esecuzione)",
|
||||
"ChmodFolderHelpTextWarning": "Funziona solo se l'utente di Radarr è il proprietario del file. E' meglio assicurarsi che i client di download impostino i permessi correttamente.",
|
||||
"ChownGroupHelpText": "Nome Gruppo o guida. Usa guida per sistemi remoti.",
|
||||
"ChownGroupHelpTextWarning": "Funziona solo se l'utente di Radarr è il proprietario del file. E' meglio assicurarsi che i client di download usino lo stesso gruppo di Radarr.",
|
||||
@@ -76,63 +76,63 @@
|
||||
"CompletedDownloadHandling": "Gestione dei Download Completati",
|
||||
"ConnectSettings": "Impostazioni di Connessione",
|
||||
"Connections": "Collegamenti",
|
||||
"CopyUsingHardlinksHelpText": "Utilizzare gli Hardlink quando si cerca di copiare file da un torrent che è ancora in fase di seeding",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Occasionalmente, i blocchi dei file possono impedire la ridenominazione dei file in fase di seeding. È possibile disattivare temporaneamente il seeding e utilizzare la funzione di rinomina di Radarr per evitare il problema.",
|
||||
"CopyUsingHardlinksHelpText": "Utilizzare gli Hardlink quando si cerca di copiare file di un torrent che è ancora in seeding",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Occasionalmente i file bloccatti possono impedire la rinomina dei file in seeding. Puoi disattivare temporaneamente il seeding e utilizzare la funzione di rinomina di Readarr per evitare il problema.",
|
||||
"CreateEmptyAuthorFoldersHelpText": "Crea le cartelle dei film mancanti durante la scansione del disco",
|
||||
"CreateGroup": "Crea gruppo",
|
||||
"CutoffHelpText": "Una volta raggiunta questa qualità, Radarr non scaricherà più film",
|
||||
"CutoffUnmet": "Soglia Non Raggiunta",
|
||||
"DBMigration": "Migrazione DB",
|
||||
"Dates": "Date",
|
||||
"DelayProfile": "Profili di Ritardo",
|
||||
"DelayProfile": "Profilo di Ritardo",
|
||||
"DelayProfiles": "Profili di Ritardo",
|
||||
"DelayingDownloadUntilInterp": "Ritardare il download fino al {0} a {1}",
|
||||
"Delete": "Cancella",
|
||||
"DeleteBackup": "Cancella Backup",
|
||||
"DeleteBackupMessageText": "Sei sicuro di voler cancellare il backup '{0}'?",
|
||||
"DeleteDelayProfile": "Cancellare il profilo di ritardo",
|
||||
"DeleteDelayProfile": "Cancella Profilo di Ritardo",
|
||||
"DeleteDelayProfileMessageText": "Sei sicuro di voler cancellare questo profilo di ritardo?",
|
||||
"DeleteDownloadClient": "Cancella il Client di Download",
|
||||
"DeleteDownloadClientMessageText": "Sei sicuro di voler eliminare il client di download '{0}'?",
|
||||
"DeleteEmptyFolders": "Cancellare le cartelle vuote",
|
||||
"DeleteEmptyFolders": "Cancella le cartelle vuote",
|
||||
"DeleteEmptyFoldersHelpText": "Cancellare le cartelle vuote dei film durante la scansione del disco e quando i file di film vengono cancellati",
|
||||
"DeleteImportListExclusion": "Cancellare la lista delle esclusioni",
|
||||
"DeleteImportListExclusion": "Rimuovi Esclusione dalla Lista Importazioni",
|
||||
"DeleteImportListExclusionMessageText": "Sei sicuro di voler cancellare questa lista di esclusioni delle importazioni?",
|
||||
"DeleteImportListMessageText": "Sei sicuro di voler eliminare la lista '{0}'?",
|
||||
"DeleteIndexer": "Cancella Indexer",
|
||||
"DeleteIndexerMessageText": "Sei sicuro di voler eliminare l'indexer '{0}'?",
|
||||
"DeleteIndexer": "Cancella Indicizzatore",
|
||||
"DeleteIndexerMessageText": "Sicuro di voler eliminare l'indicizzatore '{0}'?",
|
||||
"DeleteMetadataProfileMessageText": "Sicuro di voler cancellare il profilo di qualità {0}",
|
||||
"DeleteNotification": "Cancella la notifica",
|
||||
"DeleteNotification": "Cancella la Notifica",
|
||||
"DeleteNotificationMessageText": "Sei sicuro di voler eliminare la notifica '{0}'?",
|
||||
"DeleteQualityProfile": "Cancellare il profilo di qualità",
|
||||
"DeleteQualityProfile": "Cancella il Profilo di Qualità",
|
||||
"DeleteQualityProfileMessageText": "Sicuro di voler cancellare il profilo di qualità {0}",
|
||||
"DeleteReleaseProfile": "Cancellare il profilo di ritardo",
|
||||
"DeleteReleaseProfileMessageText": "Sei sicuro di voler cancellare questo profilo di ritardo?",
|
||||
"DeleteSelectedBookFiles": "Cancellare i film selezionati",
|
||||
"DeleteSelectedBookFilesMessageText": "Sei sicuro di voler eliminare i file del film selezionato?",
|
||||
"DeleteTag": "Cancella Tag",
|
||||
"DeleteTagMessageText": "Sei sicuro di voler eliminare il tag '{0}'?",
|
||||
"DestinationPath": "Percorso di destinazione",
|
||||
"DetailedProgressBar": "Barra di avanzamento dettagliata",
|
||||
"DeleteTag": "Elimina Etichetta",
|
||||
"DeleteTagMessageText": "Sei sicuro di voler eliminare l'etichetta '{0}'?",
|
||||
"DestinationPath": "Percorso di Destinazione",
|
||||
"DetailedProgressBar": "Barra di Avanzamento Dettagliata",
|
||||
"DiskSpace": "Spazio su Disco",
|
||||
"Docker": "Docker",
|
||||
"DownloadClient": "Client Download",
|
||||
"DownloadClientSettings": "Impostazioni del client di download",
|
||||
"DownloadClients": "Client Download",
|
||||
"DownloadClient": "Client di Download",
|
||||
"DownloadClientSettings": "Impostazioni del Client di Download",
|
||||
"DownloadClients": "Clients di Download",
|
||||
"DownloadFailedCheckDownloadClientForMoreDetails": "Download fallito: controllare il client di download per maggiori dettagli",
|
||||
"DownloadFailedInterp": "Download fallito: {0}",
|
||||
"DownloadPropersAndRepacksHelpTexts1": "Aggiornare o meno automaticamente a Proper/Repack",
|
||||
"DownloadWarningCheckDownloadClientForMoreDetails": "Problema di download: controllare il client di download per maggiori dettagli",
|
||||
"DownloadWarningCheckDownloadClientForMoreDetails": "Avviso di download: controllare il client di download per maggiori dettagli",
|
||||
"Edit": "Modifica",
|
||||
"Edition": "Edizione",
|
||||
"Enable": "Abilita",
|
||||
"EnableAutomaticAdd": "Attiva l'aggiunta automatica",
|
||||
"EnableAutomaticSearch": "Attiva la ricerca automatica",
|
||||
"EnableColorImpairedMode": "Abilità la modalità a colori alternati",
|
||||
"EnableColorImpairedModeHelpText": "Stile alterato per permettere agli utenti daltonici di distinguere meglio le informazioni con colori codificati",
|
||||
"EnableAutomaticAdd": "Attiva l'Aggiunta Automatica",
|
||||
"EnableAutomaticSearch": "Attiva la Ricerca Automatica",
|
||||
"EnableColorImpairedMode": "Abilita la Modalità Daltonismo",
|
||||
"EnableColorImpairedModeHelpText": "Stile alterato per permettere agli utenti daltonici di distinguere meglio le informazioni codificate a colori",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importa automaticamente i download completati dai client di download",
|
||||
"EnableHelpText": "Abilita la creazione del file di metadati per questo tipo di metadati",
|
||||
"EnableInteractiveSearch": "Abilita la ricerca interattiva",
|
||||
"EnableInteractiveSearch": "Abilita la Ricerca Interattiva",
|
||||
"EnableRSS": "Abilita RSS",
|
||||
"EnableSSL": "Abilita SSL",
|
||||
"EnableSslHelpText": " Richiede il riavvio come amministratore per avere effetto",
|
||||
@@ -167,13 +167,13 @@
|
||||
"HasPendingChangesSaveChanges": "Salva Modifiche",
|
||||
"History": "Storia",
|
||||
"Host": "Host",
|
||||
"Hostname": "Hostname",
|
||||
"Hostname": "Nome Host",
|
||||
"ICalFeed": "Feed iCal",
|
||||
"ICalHttpUrlHelpText": "Copia questo URL sul tuo client o clicca per sottoscrivere se il tuo browser supporta Webcal",
|
||||
"ICalLink": "Link iCal",
|
||||
"IconForCutoffUnmet": "L'icona per il taglio non è soddisfatta",
|
||||
"IconTooltip": "In Programma",
|
||||
"IgnoredAddresses": "Indirizzi ignorati",
|
||||
"IgnoredAddresses": "Indirizzi Ignorati",
|
||||
"IgnoredHelpText": "Questa release sarà respinta se contiene uno o più di questi termini (Sensibile al maiuscolo)",
|
||||
"IgnoredPlaceHolder": "Aggiungi una nuova restrizione",
|
||||
"IllRestartLater": "Riavvierò più tardi",
|
||||
@@ -186,9 +186,9 @@
|
||||
"IncludeUnknownAuthorItemsHelpText": "Mostra le voci senza un film nella coda. Ciò potrebbe include film spostati o altro nelle categorie di Radarr",
|
||||
"IncludeUnmonitored": "Includi non Monitorati",
|
||||
"Indexer": "Indicizzatore",
|
||||
"IndexerPriority": "Priorità dell'indexer",
|
||||
"IndexerPriority": "Priorità dell'Indicizzatore",
|
||||
"IndexerSettings": "Impostazioni dell'Indexer",
|
||||
"Indexers": "Indexer",
|
||||
"Indexers": "Indicizzatori",
|
||||
"Interval": "Intervallo",
|
||||
"IsCutoffCutoff": "Taglio",
|
||||
"IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Aggiorna finchè questa qualità non è raggiunta o superata",
|
||||
@@ -231,13 +231,13 @@
|
||||
"New": "Nuovo",
|
||||
"NoBackupsAreAvailable": "Nessun Backup disponibile",
|
||||
"NoHistory": "Nessuna Storia",
|
||||
"NoLeaveIt": "No, lascialo",
|
||||
"NoLeaveIt": "No, Lascialo",
|
||||
"NoLimitForAnyRuntime": "Nessun limite di durata",
|
||||
"NoLogFiles": "Nessun file di log",
|
||||
"NoMinimumForAnyRuntime": "Nessuna durata minima",
|
||||
"NoUpdatesAreAvailable": "Nessun aggiornamento disponibile",
|
||||
"None": "Nessuna",
|
||||
"NotificationTriggers": "Selettori di notifica",
|
||||
"NotificationTriggers": "Attivatori di Notifica",
|
||||
"OnGrabHelpText": "Quando viene prelevato",
|
||||
"OnHealthIssueHelpText": "Quando c'è un problema",
|
||||
"OnRenameHelpText": "Durante la rinomina",
|
||||
@@ -246,7 +246,7 @@
|
||||
"Options": "Opzioni",
|
||||
"Original": "Originale",
|
||||
"Overview": "Panoramica",
|
||||
"PackageVersion": "Versione del pacchetto",
|
||||
"PackageVersion": "Versione del Pacchetto",
|
||||
"PageSize": "Dimensione Pagina",
|
||||
"PageSizeHelpText": "Numero di voci da mostrare in ogni pagina",
|
||||
"Password": "Password",
|
||||
@@ -265,7 +265,7 @@
|
||||
"ProtocolHelpText": "Scegli che protocollo(i) usare e quale è preferito quando si deve scegliere tra release altrimenti uguali",
|
||||
"Proxy": "Proxy",
|
||||
"ProxyBypassFilterHelpText": "Usa ',' come separatore, e '*.' come jolly per i sottodomini",
|
||||
"ProxyType": "Tipo di proxy",
|
||||
"ProxyType": "Tipo di Proxy",
|
||||
"ProxyUsernameHelpText": "Devi inserire nome utente e password solo se richiesto. Altrimenti lascia vuoto.",
|
||||
"PublishedDate": "Data di pubblicazione",
|
||||
"Quality": "Qualità",
|
||||
@@ -276,7 +276,7 @@
|
||||
"Queue": "Coda",
|
||||
"RSSSync": "Sync RSS",
|
||||
"RSSSyncInterval": "Intervallo di Sync RSS",
|
||||
"ReadTheWikiForMoreInformation": "Leggi le Wiki per maggiori informazioni",
|
||||
"ReadTheWikiForMoreInformation": "Leggi la Wiki per maggiori informazioni",
|
||||
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Radarr supporta qualunque indexer che usi gli standard Newznab, cosi come gli altri Indexer sotto.",
|
||||
"ReadarrTags": "Tag di Radarr",
|
||||
"Real": "Reale",
|
||||
@@ -305,7 +305,7 @@
|
||||
"RemoveSelectedMessageText": "Sei sicuro di voler rimuovere gli elementi selezionati della blacklist?",
|
||||
"RemoveTagExistingTag": "Tag esistente",
|
||||
"RemoveTagRemovingTag": "Sto eliminando il tag",
|
||||
"RemovedFromTaskQueue": "Rimuovi dalla coda di lavoro",
|
||||
"RemovedFromTaskQueue": "Rimosso dalla coda lavori",
|
||||
"RenameBooksHelpText": "Radarr userà i nomi dei file se rinomina è disabilitato",
|
||||
"Reorder": "Riordina",
|
||||
"ReplaceIllegalCharacters": "Sostituisci i caratteri non consentiti",
|
||||
@@ -322,16 +322,16 @@
|
||||
"Restore": "Ripristina",
|
||||
"RestoreBackup": "Ripristina Backup",
|
||||
"Result": "Risultato",
|
||||
"Retention": "Memorizzazione",
|
||||
"Retention": "Ritenzione",
|
||||
"RetentionHelpText": "Solo Usenet: Imposta a zero per una conservazione illimitata",
|
||||
"RetryingDownloadInterp": "Riprovando il download {0} a {1}",
|
||||
"RootFolder": "Cartella Radice",
|
||||
"RootFolders": "Cartelle Radice",
|
||||
"RssSyncIntervalHelpText": "Intervallo in minuti. Imposta zero per disabilitarlo (ciò fermerà il recupero automatico di tutte le release)",
|
||||
"SSLCertPassword": "Password Cert SSL",
|
||||
"SSLCertPath": "Percorso Cert SSL",
|
||||
"SSLCertPassword": "Password Certificato SSL",
|
||||
"SSLCertPath": "Percorso Certificato SSL",
|
||||
"SSLPort": "Porta SSL",
|
||||
"Scheduled": "In Programma",
|
||||
"Scheduled": "Programmato",
|
||||
"Score": "Punto",
|
||||
"ScriptPath": "Percorso dello script",
|
||||
"Search": "Cerca",
|
||||
@@ -339,7 +339,7 @@
|
||||
"SearchForMissing": "Cerca i film mancanti",
|
||||
"SearchSelected": "Cerca il film selezionato",
|
||||
"Security": "Sicurezza",
|
||||
"SendAnonymousUsageData": "Invia dati sull'uso anonimamente",
|
||||
"SendAnonymousUsageData": "Invia dati anonimi sull'uso",
|
||||
"SetPermissions": "Imposta permessi",
|
||||
"SetPermissionsLinuxHelpText": "Eseguire chmod quando i file sono importati/rinominati?",
|
||||
"SetPermissionsLinuxHelpTextWarning": "Se non sei sicuro di cosa facciano queste impostazioni, non cambiarle.",
|
||||
@@ -354,7 +354,7 @@
|
||||
"ShowQualityProfileHelpText": "Mostra profilo qualità sotto il poster",
|
||||
"ShowRelativeDates": "Mostra date relative",
|
||||
"ShowRelativeDatesHelpText": "Mostra date relative (Oggi/Ieri/ecc) o assolute",
|
||||
"ShowSearch": "Mostra ricerca",
|
||||
"ShowSearch": "Mostra Ricerca",
|
||||
"ShowSearchActionHelpText": "Mostra pulsante ricerca al passaggio",
|
||||
"ShowSizeOnDisk": "Mostra spazio su disco",
|
||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Mostra sopra ogni colonna quando la settimana è la vista attiva",
|
||||
@@ -378,82 +378,82 @@
|
||||
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS non è supportato con questo indexer",
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "La ricerca non è supportata dal questo indexer",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Sarà usata quando la ricerca automatica è eseguita dalla UI o da Radarr",
|
||||
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Sarà usata quando la ricerca interattiva è utilizzata",
|
||||
"TagIsNotUsedAndCanBeDeleted": "Il tag non è usato e può essere eliminato",
|
||||
"Tasks": "Funzioni",
|
||||
"TestAll": "Prova Tutti",
|
||||
"TestAllClients": "Testa tutti i client",
|
||||
"TestAllIndexers": "Testa tutti gli indexer",
|
||||
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Verrà usato durante la ricerca interattiva",
|
||||
"TagIsNotUsedAndCanBeDeleted": "L'etichetta non è in uso e può essere eliminata",
|
||||
"Tasks": "Attività",
|
||||
"TestAll": "Testa Tutti",
|
||||
"TestAllClients": "Testa Tutti i Client",
|
||||
"TestAllIndexers": "Testa tutti gli Indicizzatori",
|
||||
"TestAllLists": "Testa tutte le liste",
|
||||
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Questo verrà applicato a tutti gli indexer, segui le regole impostate da loro",
|
||||
"TimeFormat": "Formato orario",
|
||||
"Title": "Titolo",
|
||||
"TorrentDelay": "Ritardo del torrent",
|
||||
"TorrentDelayHelpText": "Ritardo in minuti da aspettare prima di prendere un torrent",
|
||||
"Torrents": "Torrent",
|
||||
"Torrents": "Torrents",
|
||||
"TotalFileSize": "Dimensione totale dei file",
|
||||
"UILanguage": "Lingua della UI",
|
||||
"UILanguage": "Lingua dell'Interfaccia",
|
||||
"UILanguageHelpText": "Lingua che Radarr userà per la UI",
|
||||
"UILanguageHelpTextWarning": "Richiede il reload del Browser",
|
||||
"UISettings": "Impostazioni UI",
|
||||
"URLBase": "URL di Base",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Non riesco ad aggiungere un nuovo client di download, riprova.",
|
||||
"UILanguageHelpTextWarning": "Ricaricamento del browser richiesto",
|
||||
"UISettings": "Impostazioni Interfaccia",
|
||||
"URLBase": "Base Url",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Impossibile aggiungere un nuovo client di download, riprova.",
|
||||
"UnableToAddANewImportListExclusionPleaseTryAgain": "Non riesco ad aggiungere una nuova lista di esclusione, riprova.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Non riesco ad aggiungere un nuovo indexer, riprova.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Impossibile aggiungere un nuovo Indicizzatore, riprova.",
|
||||
"UnableToAddANewListPleaseTryAgain": "Non riesco ad aggiungere una nuova lista, riprova.",
|
||||
"UnableToAddANewMetadataProfilePleaseTryAgain": "Non riesco ad aggiungere un nuovo profilo di qualità, riprova.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Non riesco ad aggiungere una nuova notifica, riprova.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Impossibile aggiungere una nuova notifica, riprova.",
|
||||
"UnableToAddANewQualityProfilePleaseTryAgain": "Non riesco ad aggiungere un nuovo profilo di qualità, riprova.",
|
||||
"UnableToAddANewRemotePathMappingPleaseTryAgain": "Non riesco ad aggiungere la mappatura di un nuovo percorso remoto, riprova.",
|
||||
"UnableToAddANewRootFolderPleaseTryAgain": "Non riesco ad aggiungere un nuovo formato personalizzato, riprova.",
|
||||
"UnableToLoadBackups": "Non riesco a caricare i backup",
|
||||
"UnableToLoadBackups": "Impossibile caricare i backup",
|
||||
"UnableToLoadDelayProfiles": "Non riesco a caricare i profili di ritardo",
|
||||
"UnableToLoadDownloadClientOptions": "Non riesco a caricare le opzioni del client di download",
|
||||
"UnableToLoadDownloadClients": "Non riesco a caricare i client di download",
|
||||
"UnableToLoadGeneralSettings": "Non riesco a caricare le impostazioni generali",
|
||||
"UnableToLoadDownloadClients": "Impossibile caricare i client di download",
|
||||
"UnableToLoadGeneralSettings": "Impossibile caricare le impostazioni Generali",
|
||||
"UnableToLoadHistory": "Non riesco a caricare la storia",
|
||||
"UnableToLoadImportListExclusions": "Non riesco a caricare le liste di esclusione",
|
||||
"UnableToLoadIndexerOptions": "Non riesco a caricare le opzioni dell'indexer",
|
||||
"UnableToLoadIndexers": "Non riesco a caricare l'indexer",
|
||||
"UnableToLoadIndexers": "Impossibile caricare gli Indicizzatori",
|
||||
"UnableToLoadLists": "Non riesco a caricare le liste",
|
||||
"UnableToLoadMediaManagementSettings": "Non riesco a caricare le impostazioni di Gestione dei Media",
|
||||
"UnableToLoadMetadata": "Non riesco a caricare i metadati",
|
||||
"UnableToLoadNamingSettings": "Non riesco a caricare le impostazioni di denominazione",
|
||||
"UnableToLoadNotifications": "Non riesco a caricare le notifiche",
|
||||
"UnableToLoadNotifications": "Impossibile caricare le Notifiche",
|
||||
"UnableToLoadQualities": "Non riesco a caricare le qualità",
|
||||
"UnableToLoadQualityDefinitions": "Non riesco a caricare le definizioni della qualità",
|
||||
"UnableToLoadQualityProfiles": "Non riesco a caricare i profili della qualità",
|
||||
"UnableToLoadReleaseProfiles": "Non riesco a caricare i profili di ritardo",
|
||||
"UnableToLoadRemotePathMappings": "Non riesco a caricare le mappature del percorso remoto",
|
||||
"UnableToLoadRootFolders": "Non riesco a caricare la cartella root",
|
||||
"UnableToLoadTags": "Non riesco a caricare i tag",
|
||||
"UnableToLoadTags": "Impossibile caricare le Etichette",
|
||||
"UnableToLoadTheCalendar": "Non riesco a caricare il calendario",
|
||||
"UnableToLoadUISettings": "Non riesco a caricare le impostazioni della UI",
|
||||
"UnableToLoadUISettings": "Impossibile caricare le impostazioni interfaccia",
|
||||
"Ungroup": "Separa",
|
||||
"Unmonitored": "Non Seguito",
|
||||
"UnmonitoredHelpText": "Includi i film non monitorati nei feed di iCal",
|
||||
"UpdateAll": "Aggiorna Tutto",
|
||||
"UpdateAutomaticallyHelpText": "Download e installazione automatica degli aggiornamenti. Sarai comunque in grado in installarli dal menu Sistema: Aggiornamenti",
|
||||
"UpdateMechanismHelpText": "Usa il programma di aggiornamento incorporato in Radarr o uno script",
|
||||
"UpdateScriptPathHelpText": "Percorso verso uno script che prende un pacchetto di aggiornamento estratto e gestisce il resto del processo di aggiornamento",
|
||||
"UpdateAutomaticallyHelpText": "Scarica e installa automaticamente gli aggiornamenti. Sarai comunque in grado in installarli da Sistema: Aggiornamenti",
|
||||
"UpdateMechanismHelpText": "Usa l'aggiornamento integrato in Readarr o uno script",
|
||||
"UpdateScriptPathHelpText": "Percorso verso uno script personalizzato che prende un pacchetto di aggiornamento estratto e gestisce il resto del processo di aggiornamento",
|
||||
"Updates": "Aggiornamenti",
|
||||
"UrlBaseHelpTextWarning": "Richiede il riavvio per avere effetti",
|
||||
"AnalyticsEnabledHelpTextWarning": "Richiede il riavvio per avere effetti",
|
||||
"ApiKeyHelpTextWarning": "Richiede il riavvio per avere effetti",
|
||||
"AnalyticsEnabledHelpTextWarning": "Richiede il riavvio per avere effetto",
|
||||
"ApiKeyHelpTextWarning": "Richiede il riavvio per avere effetto",
|
||||
"DeleteRootFolderMessageText": "Sei sicuro di voler eliminare l'indexer '{0}'?",
|
||||
"LoadingBooksFailed": "Caricamento dei file del Film fallito",
|
||||
"ProxyPasswordHelpText": "Devi inserire nome utente e password solo se richiesto. Altrimenti lascia vuoto.",
|
||||
"SslCertPathHelpTextWarning": "Richiede il riavvio per avere effetti",
|
||||
"SslCertPasswordHelpTextWarning": "Richiede il riavvio per avere effetti",
|
||||
"SslCertPasswordHelpTextWarning": "Richiede il riavvio per avere effetto",
|
||||
"UnableToLoadMetadataProfiles": "Non riesco a caricare i profili di ritardo",
|
||||
"DownloadClientCheckDownloadingToRoot": "Scarica client {0} colloca i download nella cartella principale {1}. Non dovresti scaricare in una cartella principale.",
|
||||
"MaintenanceRelease": "Release di Manutenzione: correzione di bug e altre miglioramenti. Vedi la storia dei Commit su Github per maggiori dettagli",
|
||||
"DownloadClientCheckDownloadingToRoot": "Il client di download {0} colloca i download nella cartella radice {1}. Non dovresti scaricare in una cartella radice.",
|
||||
"MaintenanceRelease": "Release di Manutenzione: correzione di bug e altri miglioramenti. Vedi la storia dei Commit su Github per maggiori dettagli",
|
||||
"OutputPath": "Percorso di Destinazione",
|
||||
"ReplaceIllegalCharactersHelpText": "Sostituisci i caratteri non consentiti. Se non selezionato, Radarr invece li rimuoverà",
|
||||
"Progress": "Avanzamento",
|
||||
"Actions": "Azioni",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "I film cancellati dal disco sono automaticamente non monitorati in Radarr",
|
||||
"BookAvailableButMissing": "Film disponibile, ma Mancante",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "I libri cancellati dal disco sono automaticamente non monitorati in Readarr",
|
||||
"BookAvailableButMissing": "Libro Disponibile, ma Mancante",
|
||||
"DetailedProgressBarHelpText": "Mostra testo sulla barra di avanzamento",
|
||||
"NotAvailable": "Non disponibile",
|
||||
"NotMonitored": "Non monitorato",
|
||||
@@ -465,20 +465,20 @@
|
||||
"Today": "Oggi",
|
||||
"Tomorrow": "Domani",
|
||||
"UI": "Interfaccia",
|
||||
"CloneIndexer": "Clona Indexer",
|
||||
"CloneIndexer": "Clona Indicizzatore",
|
||||
"RemoveFromBlocklist": "Rimuovi della blacklist",
|
||||
"Time": "Orario",
|
||||
"Time": "Ora",
|
||||
"Label": "Etichetta",
|
||||
"UnableToLoadBlocklist": "Non riesco a caricare la BlackList",
|
||||
"Component": "Componente",
|
||||
"Level": "Livello",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "Il Branch {0} non è un branch valido per le release di Radarr, non riceverai aggiornamenti",
|
||||
"AddMissing": "Aggiungi ai mancanti",
|
||||
"AddMissing": "Aggiungi mancanti",
|
||||
"AddNewItem": "Aggiungi Nuovo Elemento",
|
||||
"Blocklist": "Lista Nera",
|
||||
"BlocklistHelpText": "Impedisci a Radarr di acquisire automaticamente questo versione",
|
||||
"BlocklistRelease": "Release in blacklist",
|
||||
"AllowFingerprinting": "Consenti impronte",
|
||||
"Blocklist": "Lista dei Blocchi",
|
||||
"BlocklistHelpText": "Impedisci a Readarr di re-acquisire automaticamente questi file",
|
||||
"BlocklistRelease": "Release in Lista dei Blocchi",
|
||||
"AllowFingerprinting": "Consenti il \"Fingerprinting\"",
|
||||
"AllExpandedCollapseAll": "Collassa tutto",
|
||||
"AllExpandedExpandAll": "Espandi tutto",
|
||||
"ShowUnknownAuthorItems": "Mostra film sconosciuti",
|
||||
@@ -491,21 +491,21 @@
|
||||
"CreateEmptyAuthorFolders": "Crea le cartelle dei film se non esistono",
|
||||
"All": "Tutti",
|
||||
"RescanAfterRefreshHelpText": "Riscansiona la cartella dopo aver ricaricato il film",
|
||||
"AllowFingerprintingHelpText": "Consenti impronte per migliorare il riconoscimento delle tracce",
|
||||
"AllowFingerprintingHelpTextWarning": "Questo richiede che Lidarr legga le parti dei file e potrebbe causare un’alta attività del disco e della rete.",
|
||||
"AllowAuthorChangeClickToChangeAuthor": "Clicca per cambiare l’artista",
|
||||
"AllowFingerprintingHelpText": "Usa il \"Fingerprinting\" per migliorare la corrispondenza dei libri",
|
||||
"AllowFingerprintingHelpTextWarning": "Questo richiede che Readarr legga parti del file che rallenterà le scansioni e potrebbe causare un’alta attività del disco o della rete.",
|
||||
"AllowAuthorChangeClickToChangeAuthor": "Clicca per cambiare l’autore",
|
||||
"IndexerRssHealthCheckNoIndexers": "Non è disponibile nessun indexer con la sincronizzazione RSS attiva, Radarr non recupererà nuove release automaticamente",
|
||||
"SearchFiltered": "Cerca con Filtri",
|
||||
"DownloadClientCheckNoneAvailableMessage": "Non è disponibile nessun client per il download",
|
||||
"DownloadClientCheckNoneAvailableMessage": "Non è disponibile nessun client di download",
|
||||
"OnBookFileDelete": "Su Elimina file filmato",
|
||||
"OnBookFileDeleteForUpgrade": "Su file filmato Elimina per aggiornamento",
|
||||
"OnHealthIssue": "Quando c'è un problema",
|
||||
"OnRename": "Durante la rinomina",
|
||||
"OnUpgrade": "In aggiornamento",
|
||||
"AppDataLocationHealthCheckMessage": "L'aggiornamento non sarà possibile per evitare la cancellazione di AppData durante l'aggiornamento",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Tutti i client per il download non sono disponibili a causa di errori",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Client per il download non disponibile per errori: {0}",
|
||||
"Filters": "Filtro",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Nessun client di download è disponibile a causa di errori",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Client per il download non disponibili per errori: {0}",
|
||||
"Filters": "Filtri",
|
||||
"IndexerSearchCheckNoAutomaticMessage": "Non è disponibile nessun indexer con abilitata la Ricerca Automatica, Radarr non fornirà nessun risultato tramite la ricerca automatica",
|
||||
"RemotePathMappingCheckFolderPermissions": "Radarr può vedere ma non accedere alla directory {0}. Probabilmente per un errore nei permessi.",
|
||||
"RemotePathMappingCheckImportFailed": "Radarr ha fallito nell'importare un film. Controlla i logs per dettagli.",
|
||||
@@ -515,33 +515,33 @@
|
||||
"SettingsRemotePathMappingRemotePathHelpText": "Percorso root alla cartella a cui accede il client di download",
|
||||
"UISettingsSummary": "Opzioni calendario, data e visione dei colori",
|
||||
"UpdateCheckStartupNotWritableMessage": "Impossibile installare l'aggiornamento perché l'utente '{1}' non ha i permessi di scrittura per la cartella di avvio '{0}'.",
|
||||
"UpdateCheckUINotWritableMessage": "Impossibile installare l'aggiornamento perché l'utente '{1}' non ha i permessi di scrittura per la cartella di interfaccia '{0}'.",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent esposto dalla app che ha chiamato la API",
|
||||
"UpdateCheckUINotWritableMessage": "Impossibile installare l'aggiornamento perché l'utente '{1}' non ha i permessi di scrittura per la cartella dell'interfaccia '{0}'.",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fornito dalla app che ha chiamato la API",
|
||||
"UpdateAvailable": "É disponibile un nuovo aggiornamento",
|
||||
"DownloadClientsSettingsSummary": "Client download, gestione dei download e collegamento a percorsi remoti",
|
||||
"DownloadClientsSettingsSummary": "Client di download, gestione dei download e mappatura dei percorsi remoti",
|
||||
"OnBookFileDeleteForUpgradeHelpText": "Su file filmato Elimina per aggiornamento",
|
||||
"CouldntFindAnyResultsForTerm": "Non ho trovato risultati per '{0}'",
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Tutti gli indexer abilitati alla ricerca sono momentaneamente non disponibili a causa di errori",
|
||||
"RemotePathMappingCheckDownloadPermissions": "Radarr può vedere ma non accedere al film scaricato {0}. Probabilmente per un errore nei permessi.",
|
||||
"SettingsRemotePathMappingLocalPathHelpText": "Percorso che Radarr dovrebbe usare per accedere localmente al percorso remoto",
|
||||
"UpdateCheckStartupTranslocationMessage": "Impossibile installare l'aggiornamento perché la cartella '{0}' si trova in una cartella App Translocation.",
|
||||
"SystemTimeCheckMessage": "L'orario di sistema è spento da più di 1 giorno. I task schedulati potrebbero non essere correttamente eseguiti fino al suo ripristino",
|
||||
"UpdateCheckStartupTranslocationMessage": "Impossibile installare l'aggiornamento perché la cartella '{0}' si trova in una cartella di \"App Translocation\".",
|
||||
"SystemTimeCheckMessage": "L'orario di sistema è sbagliato di più di un giorno. Le attività pianificate potrebbero non essere eseguite correttamente fino alla correzione",
|
||||
"General": "Generale",
|
||||
"GeneralSettingsSummary": "Porta, SSL, Nome utente/password, proxy, statistiche e aggiornamenti",
|
||||
"HealthNoIssues": "La tua configurazione non presenta problemi",
|
||||
"ImportListStatusCheckAllClientMessage": "Tutte le liste non sono disponibili a causa di errori",
|
||||
"ImportListStatusCheckSingleClientMessage": "Liste non disponibili a causa di errori: {0}",
|
||||
"ImportMechanismHealthCheckMessage": "Abilita la Gestione dei Download Completati",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Nessun indexer è disponibile da più di 6 ore a causa di errori",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Alcuni indexer non disponibili da più di 6 ore a causa di errori: {0}",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Nessun Indicizzatore è disponibile da più di 6 ore a causa di errori",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Alcuni Indicizzatori non sono disponibili da più di 6 ore a causa di errori: {0}",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "Non è disponibile nessun indexer con abilitata la Ricerca Interattiva, Radarr non fornirà nessun risultato tramite la ricerca interattiva",
|
||||
"IndexerStatusCheckAllClientMessage": "Tutti gli indexer non sono disponibili a causa di errori",
|
||||
"IndexerStatusCheckSingleClientMessage": "Indexer non disponibili a causa di errori: {0}",
|
||||
"IndexerStatusCheckAllClientMessage": "Nessun Indicizzatore disponibile a causa di errori",
|
||||
"IndexerStatusCheckSingleClientMessage": "Indicizzatori non disponibili a causa di errori: {0}",
|
||||
"Metadata": "Metadata",
|
||||
"Monitor": "Segui",
|
||||
"MountCheckMessage": "La destinazione contenente il percorso di un film è montata in sola lettura: ",
|
||||
"OnGrab": "Quando viene prelevato",
|
||||
"ProxyCheckBadRequestMessage": "Il test del proxy è fallito. Stato: {0}",
|
||||
"OnGrab": "Al Prelievo",
|
||||
"ProxyCheckBadRequestMessage": "Il test del proxy è fallito. Codice Stato: {0}",
|
||||
"ProxyCheckFailedToTestMessage": "Test del proxy fallito: {0}",
|
||||
"QualitySettingsSummary": "Dimensioni delle qualità e denominazione",
|
||||
"Queued": "Messo in coda",
|
||||
@@ -549,12 +549,12 @@
|
||||
"RemotePathMappingCheckBadDockerPath": "Stai utilizzando docker; Il client di download {0} mette i download in {1} ma questo non è un percorso valido {2}. Controlla la mappa dei percorsi remoti e le impostazioni del client di download.",
|
||||
"RemotePathMappingCheckDockerFolderMissing": "Stai utilizzando docker; il download client {0} riporta files in {1} ma questa directory non sembra esistere nel contenitore. Controlla la mappa dei percorsi remoti e le impostazioni dei volumi del container.",
|
||||
"RemotePathMappingCheckGenericPermissions": "Il download client {0} mette i files in {1} ma Radarr non può vedere questa directory. Potrebbe essere necessario aggiustare i permessi della cartella.",
|
||||
"ProxyCheckResolveIpMessage": "Impossibile risolvere l'indirizzo IP per il Proxy {0}",
|
||||
"ProxyCheckResolveIpMessage": "Impossibile risolvere l'indirizzo IP per l'Host Configurato del Proxy {0}",
|
||||
"QueueIsEmpty": "La coda è vuota",
|
||||
"RemotePathMappingCheckWrongOSPath": "Stai utilizzando docker; Il client di download {0} mette i download in {1} ma questo non è un percorso valido {2}. Controlla la mappa dei percorsi remoti e le impostazioni del client di download.",
|
||||
"RootFolderCheckSingleMessage": "Cartella radice mancante: {0}",
|
||||
"TimeLeft": "Tempo Rimanente",
|
||||
"BackupIntervalHelpText": "Intervallo per eseguire il backup del DB Lidarr e delle impostazioni",
|
||||
"BackupIntervalHelpText": "Intervallo per eseguire il backup del DB e delle impostazioni di Readarr",
|
||||
"ConnectSettingsSummary": "Notifiche, collegamenti a media server/player e script personalizzati",
|
||||
"FailedToLoadQueue": "Impossibile caricare la coda",
|
||||
"FileWasDeletedByUpgrade": "Il file è stato eliminato per importare un aggiornamento",
|
||||
@@ -575,5 +575,31 @@
|
||||
"RemotePathMappingCheckFilesGenericPermissions": "Il download client {0} riporta files in {1} ma Radarr non può vedere questa directory. Potrebbe essere necessario aggiustare i permessi della cartella.",
|
||||
"RemotePathMappingCheckFilesWrongOSPath": "Stai utilizzando docker; Il client di download {0} riporta files in {1} ma questo non è un percorso valido {2}. Controlla la mappa dei percorsi remoti e le impostazioni del client di download.",
|
||||
"Save": "Salva",
|
||||
"SettingsRemotePathMappingLocalPath": "Percorso locale"
|
||||
"SettingsRemotePathMappingLocalPath": "Percorso locale",
|
||||
"AuthorIndex": "Indice Autore",
|
||||
"Authors": "Autori",
|
||||
"AutomaticallySwitchEdition": "Cambia Automaticamente Edizione",
|
||||
"BookEditor": "Editore del libro",
|
||||
"BookIndex": "Indice del Libro",
|
||||
"BookList": "Lista Libri",
|
||||
"AddedAuthorSettings": "Impostazioni dell'autore aggiunte",
|
||||
"AddImportListExclusionHelpText": "Evita che vengano aggiunti libri a Readarr dalle Liste di Importazione o dall'Aggiornamento degli Autori",
|
||||
"AnyEditionOkHelpText": "Readarr cambierà automaticamente all'edizione che meglio si abbina al file scaricato",
|
||||
"Author": "Autore",
|
||||
"AuthorEditor": "Editor Autore",
|
||||
"AuthorFolderFormat": "Formato Cartella Autore",
|
||||
"AuthorNameHelpText": "Il nome dell'autore/libro da escludere (può essere qualsiasi cosa significativa)",
|
||||
"Book": "Libro",
|
||||
"AllAuthorBooks": "Tutti i Libri dell'Autore",
|
||||
"AllBooks": "Tutti i Libri",
|
||||
"AllowedLanguages": "Lingue Permesse",
|
||||
"ASIN": "ASIN",
|
||||
"BookMonitoring": "Monitoraggio del libro",
|
||||
"BookNaming": "Nomenclatura del Libro",
|
||||
"Books": "Libri",
|
||||
"BookFileCountBookCountTotalTotalBookCountInterp": "{0} / {1} (Totale: {2})",
|
||||
"BookFileCounttotalBookCountBooksDownloadedInterp": "{0}/{1} libri scaricati",
|
||||
"BookFilesCountMessage": "Nessun file di libri",
|
||||
"AudioFileMetadata": "Scrivi i Metadati sui File Audio",
|
||||
"Duration": "Durata"
|
||||
}
|
||||
|
||||
@@ -30,12 +30,12 @@
|
||||
"BackupNow": "Sikkerhetskopier nå",
|
||||
"BackupRetentionHelpText": "Automatiske sikkerhetskopier som er eldre enn oppbevaringsperioden, blir ryddet opp automatisk",
|
||||
"BindAddress": "Bind adresse",
|
||||
"BindAddressHelpText": "Gyldig IP4 -adresse eller \"*\" for alle grensesnitt",
|
||||
"BindAddressHelpText": "Gyldig IPv4 -adresse eller \"*\" for alle grensesnitt",
|
||||
"BypassProxyForLocalAddresses": "Omgå proxy for lokale adresser",
|
||||
"Cancel": "Avbryt",
|
||||
"CancelMessageText": "Er du sikker på at du vil avbryte denne ventende oppgaven?",
|
||||
"CertificateValidation": "Sertifikatvalidering",
|
||||
"CertificateValidationHelpText": "Endre hvor streng HTTPS -sertifisering validering er",
|
||||
"CertificateValidationHelpText": "Endre hvor streng HTTPS -sertifisering validering er. Ikke endre med mindre du forstår risikoene.",
|
||||
"ChangeHasNotBeenSavedYet": "Endringen er ikke lagret ennå",
|
||||
"ChmodFolder": "chmod mappe",
|
||||
"ChmodFolderHelpText": "Octal, brukt under import/gi nytt navn til mediemapper og filer (uten utføringsbiter)",
|
||||
@@ -63,5 +63,17 @@
|
||||
"Blocklist": "Svarteliste",
|
||||
"BlocklistHelpText": "Hindrer Radarr i å automatisk gripe denne utgivelsen igjen",
|
||||
"BlocklistRelease": "Blacklist -utgivelse",
|
||||
"AppDataLocationHealthCheckMessage": "Oppdatering vil ikke være mulig for å forhindre sletting av AppData på oppdateringen"
|
||||
"AppDataLocationHealthCheckMessage": "Oppdatering vil ikke være mulig for å forhindre sletting av AppData på oppdateringen",
|
||||
"CopyUsingHardlinksHelpText": "Bruk harde lenker ved forsøk på å kopiere filer fra torrents som fortsatt blir delt",
|
||||
"Component": "Komponent",
|
||||
"Connect": "Koble til",
|
||||
"Connections": "Tilkoblinger",
|
||||
"ConnectSettings": "Tilkoblingsinnstillinger",
|
||||
"ClientPriority": "Klientprioritet",
|
||||
"CloneIndexer": "Klon indekser",
|
||||
"CloneProfile": "Klon profil",
|
||||
"Columns": "Kolonner",
|
||||
"CompletedDownloadHandling": "Fullført nedlastingshåndtering",
|
||||
"ClickToChangeQuality": "Klikk for å endre kvalitet",
|
||||
"Close": "Lukk"
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
"BackupRetentionHelpText": "Automatyczne kopie zapasowe starsze niż okres przechowywania zostaną automatycznie wyczyszczone",
|
||||
"Backups": "Kopie zapasowe",
|
||||
"BindAddress": "Adres powiązania",
|
||||
"BindAddressHelpText": "Prawidłowy adres IP4 lub „*” dla wszystkich interfejsów",
|
||||
"BindAddressHelpText": "Prawidłowy adres IPv4 lub „*” dla wszystkich interfejsów",
|
||||
"BindAddressHelpTextWarning": "Wymaga ponownego uruchomienia, aby odniosło skutek",
|
||||
"BookIsDownloading": "Film jest pobierany",
|
||||
"BookIsDownloadingInterp": "Film jest pobierany - {0}% {1}",
|
||||
@@ -90,7 +90,7 @@
|
||||
"Cancel": "Anuluj",
|
||||
"CancelMessageText": "Czy na pewno chcesz anulować to oczekujące zadanie?",
|
||||
"CertificateValidation": "Walidacja certyfikatu",
|
||||
"CertificateValidationHelpText": "Zmień ścisłą walidację certyfikatu HTTPS",
|
||||
"CertificateValidationHelpText": "Zmień ścisłość walidacji certyfikatu HTTPS. Nie zmieniaj, jeśli nie rozumiesz związanych z tym zagrożeń.",
|
||||
"ChangeFileDate": "Zmień datę pliku",
|
||||
"ChangeHasNotBeenSavedYet": "Zmiana nie została jeszcze zapisana",
|
||||
"ChmodFolder": "chmod Folder",
|
||||
@@ -471,7 +471,7 @@
|
||||
"RemoveFromBlocklist": "Usuń z czarnej listy",
|
||||
"SelectAll": "Zaznacz wszystko",
|
||||
"SelectedCountBooksSelectedInterp": "Wybrane filmy: {0}",
|
||||
"ThisCannotBeCancelled": "Nie można tego anulować po uruchomieniu bez ponownego uruchamiania Radarr.",
|
||||
"ThisCannotBeCancelled": "Nie można tego anulować po uruchomieniu bez wyłączenia wszystkich indekserów.",
|
||||
"UnselectAll": "Odznacz wszystko",
|
||||
"UpdateSelected": "Aktualizuj wybrane",
|
||||
"Component": "Składnik",
|
||||
@@ -552,5 +552,22 @@
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Folder filmów „{0}” i cała jego zawartość zostaną usunięte.",
|
||||
"TimeLeft": "Pozostały czas",
|
||||
"Yesterday": "Wczoraj",
|
||||
"OnGrab": "Na Grab"
|
||||
"OnGrab": "Na Grab",
|
||||
"SizeLimit": "Ograniczenie rozmiaru",
|
||||
"UpdateAvailable": "Dostępna jest aktualizacja",
|
||||
"IndexerJackettAll": "Indeksery korzystają z nieobsługiwanego punktu końcowego \"wszystkie\" w Jackett: {0}",
|
||||
"RemotePathMappingCheckBadDockerPath": "Korzystasz z Dockera. Klient pobierania {0} umieszcza pobrane pliki w {1}, lecz nie jest to poprawna ścieżka {2}. Zmień ustawienia zdalnego mapowania ścieżek i klienta pobierania.",
|
||||
"RemotePathMappingCheckDockerFolderMissing": "Korzystasz z Dockera. Klient pobierania {0} umieszcza pobrane pliki w {1}, lecz tej folder nie istnieje wewnątrz kontenera. Zmień ustawienia zdalnego mapowania ścieżek i woluminów kontenera.",
|
||||
"RemotePathMappingCheckLocalFolderMissing": "Zdalny klient pobierania {0} umieszcza pobrane pliki w {1}, lecz ten folder nie istnieje. Prawdopodobnie wynika to z brakującego lub nieprawidłowego zdalnego mapowania ścieżki.",
|
||||
"RemotePathMappingCheckWrongOSPath": "Zdalny klient pobierania {0} umieszcza pobrane pliki w {1}, lecz nie jest to poprawna ścieżka {2}. Zmień ustawienia zdalnego mapowania ścieżek i klienta pobierania.",
|
||||
"Started": "Rozpoczęto",
|
||||
"InstanceName": "Nazwa instancji",
|
||||
"InstanceNameHelpText": "Nazwa instancji w zakładce i dla nazwy aplikacji Syslog",
|
||||
"Duration": "Czas trwania",
|
||||
"RemotePathMappingCheckFileRemoved": "Plik {0} został usunięty w trakcie przetwarzania.",
|
||||
"RemotePathMappingCheckFilesLocalWrongOSPath": "Lokalny klient pobierania {0} zgłosił pliki w {1}, lecz nie jest to poprawna ścieżka {2}. Zmień ustawienia klienta pobierania.",
|
||||
"RemotePathMappingCheckLocalWrongOSPath": "Lokalny klient pobierania {0} umieszcza pobrane pliki w {1}, lecz nie jest to poprawna ścieżka {2}. Zmień ustawienia klienta pobierania.",
|
||||
"RemotePathMappingCheckFilesBadDockerPath": "Korzystasz z Dockera. Klient pobierania {0} zgłosił pliki w {1}, lecz nie jest to poprawna ścieżka {2}. Zmień ustawienia zdalnego mapowania ścieżek i klienta pobierania.",
|
||||
"RemotePathMappingCheckFilesWrongOSPath": "Zdalny klient pobierania {0} zgłosił pliki w {1}, lecz nie jest to poprawna ścieżka {2}. Zmień ustawienia zdalnego mapowania ścieżek i klienta pobierania.",
|
||||
"RemotePathMappingCheckRemoteDownloadClient": "Zdalny klient pobierania {0} zgłosił pliki w {1}, lecz ten folder nie istnieje. Prawdopodobnie to wynik brakującego zdalnego mapowania ścieżki."
|
||||
}
|
||||
|
||||
@@ -362,7 +362,7 @@
|
||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Mostrado acima de cada coluna quando a semana é a exibição ativa",
|
||||
"Size": " Tamanho",
|
||||
"SkipFreeSpaceCheck": "Ignorar verificação de espaço livre",
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Usar quando o Readarr não conseguir detectar espaço livre na pasta raiz do autor",
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Usar quando o Readarr não puder detectar o espaço livre da pasta raiz do seu autor",
|
||||
"SorryThatAuthorCannotBeFound": "Desculpe, esse autor não pode ser encontrado.",
|
||||
"SorryThatBookCannotBeFound": "Desculpe, esse livro não pode ser encontrado.",
|
||||
"Source": "Fonte",
|
||||
@@ -761,7 +761,7 @@
|
||||
"OnRename": "Ao Renomear",
|
||||
"OnUpgrade": "Ao Atualizar",
|
||||
"AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "Nenhum indexador disponível com a pesquisa interativa habilitada, o Readarr não fornecerá nenhum resultado de pesquisa interativo",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "Sem indexadores disponíveis com pesquisa interativa habilitada, o Readarr não fornecerá nenhum resultado de pesquisa interativo",
|
||||
"ConnectSettingsSummary": "Notificações, conexões com servidores/tocadores de mídia e scripts personalizados",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Todos os clientes download não estão disponíveis devido a falhas",
|
||||
"DownloadClientsSettingsSummary": "Clientes de download, gerenciamento do download e mapeamento remoto de caminhos",
|
||||
@@ -821,7 +821,7 @@
|
||||
"ReadarrSupportsAnyDownloadClient": "Readarr suporta muitos clientes populares de download de torrent e usenet.",
|
||||
"RemotePathMappingCheckDockerFolderMissing": "Você está usando o docker; cliente de download {0} coloca downloads em {1}, mas esse diretório parece não existir dentro do contêiner. Revise seus mapeamentos de caminho remoto e configurações de volume de contêiner.",
|
||||
"RemotePathMappingCheckFilesLocalWrongOSPath": "O cliente de download local {0} relatou arquivos em {1}, mas este não é um caminho {2} válido. Revise as configurações do seu cliente de download.",
|
||||
"RemotePathMappingCheckGenericPermissions": "O cliente de download {0} coloca os downloads em {1}, mas o Readarr não pode ver este diretório. Pode ser necessário ajustar as permissões da pasta.",
|
||||
"RemotePathMappingCheckGenericPermissions": "Cliente para download {0} coloca downloads em {1}, mas Readarr não pode ver este diretório. Você pode precisar ajustar as permissões da pasta.",
|
||||
"RemotePathMappingCheckRemoteDownloadClient": "O cliente de download remoto {0} relatou arquivos em {1}, mas este diretório parece não existir. Provavelmente faltando mapeamento de caminho remoto.",
|
||||
"SettingsRemotePathMappingLocalPathHelpText": "Caminho que Readarr deve usar para acessar o caminho remoto localmente",
|
||||
"RootFolderCheckSingleMessage": "Pasta raiz ausente: {0}",
|
||||
@@ -849,5 +849,30 @@
|
||||
"UISettingsSummary": "Opções de calendário, data e cores prejudicadas",
|
||||
"UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.",
|
||||
"UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta App Translocation.",
|
||||
"TagsSettingsSummary": "Gerenciar etiquetas de autor, perfil, restrição e notificação"
|
||||
"TagsSettingsSummary": "Gerenciar etiquetas de autor, perfil, restrição e notificação",
|
||||
"InstanceNameHelpText": "Nome da instância na guia e para o nome do aplicativo Syslog",
|
||||
"AddList": "Adicionar à Lista",
|
||||
"DataExistingBooks": "Monitorar livros que você tem arquivos ou que não foram lançados ainda",
|
||||
"DataListMonitorAll": "Monitorar autores e todos os livros para cada autor incluído na lista de importação",
|
||||
"DataListMonitorNone": "Não monitorar autores ou livros",
|
||||
"DataListMonitorSpecificBook": "Monitorar autores, mas só monitorar livros explicitamente incluídos na lista",
|
||||
"EditList": "Editar Lista",
|
||||
"MonitorExistingBooks": "Monitorar Livros Existentes",
|
||||
"RenameFiles": "Renomear Arquivos",
|
||||
"Test": "Testar",
|
||||
"WriteMetadataTags": "Salvar Etiquetas de Metadados",
|
||||
"RestartRequiredHelpTextWarning": "Requer reinicio para fazer efeito",
|
||||
"InstanceName": "Nome da instância",
|
||||
"ConvertToFormat": "Converter para o Formato",
|
||||
"DataAllBooks": "Monitorar todos os livros",
|
||||
"DataFirstBook": "Monitorar o primeiro livro. Todos os outros livros serão ignorados",
|
||||
"DataFuturebooks": "Monitorar livros que não foram lançados ainda",
|
||||
"DataLatestBook": "Monitorar o último livro e livros futuros",
|
||||
"DataMissingBooks": "Monitorar livros que não tenha arquivos ou não foram lançados ainda",
|
||||
"DataNewAllBooks": "Monitorar todos os novos livros",
|
||||
"DataNewBooks": "Monitorar novos livros lançados depois do mais novo livro existente",
|
||||
"DataNewNone": "Não monitorar nenhum novo livro",
|
||||
"DataNone": "Nenhum livro irá ser monitorado",
|
||||
"MonitorNewBooks": "Monitorar Novos Livros",
|
||||
"SetReadarrTags": "Configurar Etiquetas do Readarr"
|
||||
}
|
||||
|
||||
@@ -601,5 +601,8 @@
|
||||
"BackupIntervalHelpText": "备份 Lidarr 数据库和设置的时间间隔",
|
||||
"Term": "项",
|
||||
"MetadataProfile": "元数据配置",
|
||||
"MetadataProfiles": "元数据配置"
|
||||
"MetadataProfiles": "元数据配置",
|
||||
"InstanceName": "中文",
|
||||
"InstanceNameHelpText": "选项卡及日志应用名称",
|
||||
"AddList": "添加列表"
|
||||
}
|
||||
|
||||
@@ -439,7 +439,7 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
|
||||
var edition = book.Editions.Value.SingleOrDefault(e => e.ForeignEditionId == id.ToString());
|
||||
|
||||
trimmed.Editions = new List<Edition> { edition };
|
||||
return trimmed;
|
||||
book = trimmed;
|
||||
}
|
||||
|
||||
var authorDict = authors.ToDictionary(x => x.ForeignAuthorId);
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
<PackageReference Include="MailKit" />
|
||||
<PackageReference Include="Newtonsoft.Json" />
|
||||
<PackageReference Include="NLog" />
|
||||
<PackageReference Include="NLog.Targets.Syslog" />
|
||||
<PackageReference Include="RestSharp" />
|
||||
<PackageReference Include="System.IO.Abstractions" />
|
||||
<PackageReference Include="TagLibSharp-Lidarr" />
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace NzbDrone.Core.Validation.Paths
|
||||
private readonly IAppFolderInfo _appFolderInfo;
|
||||
|
||||
public StartupFolderValidator(IAppFolderInfo appFolderInfo)
|
||||
: base("Path cannot be an ancestor of the start up folder")
|
||||
: base("Path cannot be {relationship} the start up folder")
|
||||
{
|
||||
_appFolderInfo = appFolderInfo;
|
||||
}
|
||||
@@ -21,7 +21,24 @@ namespace NzbDrone.Core.Validation.Paths
|
||||
return true;
|
||||
}
|
||||
|
||||
return !_appFolderInfo.StartUpFolder.IsParentPath(context.PropertyValue.ToString());
|
||||
var startupFolder = _appFolderInfo.StartUpFolder;
|
||||
var folder = context.PropertyValue.ToString();
|
||||
|
||||
if (startupFolder.PathEquals(folder))
|
||||
{
|
||||
context.MessageFormatter.AppendArgument("relationship", "set to");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (startupFolder.IsParentPath(folder))
|
||||
{
|
||||
context.MessageFormatter.AppendArgument("relationship", "child of");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,5 +61,11 @@ namespace NzbDrone.Core.Validation
|
||||
{
|
||||
return ruleBuilder.WithState(v => NzbDroneValidationState.Warning);
|
||||
}
|
||||
|
||||
public static IRuleBuilderOptions<T, string> ContainsReadarr<T>(this IRuleBuilder<T, string> ruleBuilder)
|
||||
{
|
||||
ruleBuilder.SetValidator(new NotEmptyValidator(null));
|
||||
return ruleBuilder.SetValidator(new RegularExpressionValidator("readarr", RegexOptions.IgnoreCase)).WithMessage("Must contain readarr");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,12 +52,23 @@ namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
EnsureAuthor("14586394", "43765115", "Andrew Hunter Murray", true);
|
||||
|
||||
var result = WantedMissing.GetPaged(0, 15, "releaseDate", "desc");
|
||||
var result = WantedMissing.GetPagedIncludeAuthor(0, 15, "releaseDate", "desc", includeAuthor: true);
|
||||
|
||||
result.Records.First().Author.Should().NotBeNull();
|
||||
result.Records.First().Author.AuthorName.Should().Be("Andrew Hunter Murray");
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Order(1)]
|
||||
public void missing_should_not_have_author()
|
||||
{
|
||||
EnsureAuthor("14586394", "43765115", "Andrew Hunter Murray", true);
|
||||
|
||||
var result = WantedMissing.GetPagedIncludeAuthor(0, 15, "releaseDate", "desc", includeAuthor: false);
|
||||
|
||||
result.Records.First().Author.Should().BeNull();
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Order(2)]
|
||||
public void cutoff_should_have_monitored_items()
|
||||
@@ -103,12 +114,25 @@ namespace NzbDrone.Integration.Test.ApiTests
|
||||
var author = EnsureAuthor("14586394", "43765115", "Andrew Hunter Murray", true);
|
||||
EnsureBookFile(author, 1, "43765115", Quality.MOBI);
|
||||
|
||||
var result = WantedCutoffUnmet.GetPaged(0, 15, "releaseDate", "desc");
|
||||
var result = WantedCutoffUnmet.GetPagedIncludeAuthor(0, 15, "releaseDate", "desc", includeAuthor: true);
|
||||
|
||||
result.Records.First().Author.Should().NotBeNull();
|
||||
result.Records.First().Author.AuthorName.Should().Be("Andrew Hunter Murray");
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Order(2)]
|
||||
public void cutoff_should_not_have_author()
|
||||
{
|
||||
EnsureProfileCutoff(1, Quality.AZW3);
|
||||
var author = EnsureAuthor("14586394", "43765115", "Andrew Hunter Murray", true);
|
||||
EnsureBookFile(author, 1, "43765115", Quality.MOBI);
|
||||
|
||||
var result = WantedCutoffUnmet.GetPagedIncludeAuthor(0, 15, "releaseDate", "desc", includeAuthor: false);
|
||||
|
||||
result.Records.First().Author.Should().BeNull();
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Order(1)]
|
||||
public void missing_should_have_unmonitored_items()
|
||||
|
||||
40
src/NzbDrone.Integration.Test/Client/WantedClient.cs
Normal file
40
src/NzbDrone.Integration.Test/Client/WantedClient.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using System.Collections.Generic;
|
||||
using Readarr.Api.V1.Books;
|
||||
using Readarr.Http;
|
||||
using RestSharp;
|
||||
|
||||
namespace NzbDrone.Integration.Test.Client
|
||||
{
|
||||
public class WantedClient : ClientBase<BookResource>
|
||||
{
|
||||
public WantedClient(IRestClient restClient, string apiKey, string resource)
|
||||
: base(restClient, apiKey, resource)
|
||||
{
|
||||
}
|
||||
|
||||
public PagingResource<BookResource> GetPagedIncludeAuthor(int pageNumber, int pageSize, string sortKey, string sortDir, string filterKey = null, string filterValue = null, bool includeAuthor = true)
|
||||
{
|
||||
var request = BuildRequest();
|
||||
request.AddParameter("page", pageNumber);
|
||||
request.AddParameter("pageSize", pageSize);
|
||||
request.AddParameter("sortKey", sortKey);
|
||||
request.AddParameter("sortDir", sortDir);
|
||||
|
||||
if (filterKey != null && filterValue != null)
|
||||
{
|
||||
request.AddParameter("filterKey", filterKey);
|
||||
request.AddParameter("filterValue", filterValue);
|
||||
}
|
||||
|
||||
request.AddParameter("includeAuthor", includeAuthor);
|
||||
|
||||
return Get<PagingResource<BookResource>>(request);
|
||||
}
|
||||
|
||||
public List<BookResource> GetBooksInAuthor(int authorId)
|
||||
{
|
||||
var request = BuildRequest("?authorId=" + authorId.ToString());
|
||||
return Get<List<BookResource>>(request);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -53,8 +53,8 @@ namespace NzbDrone.Integration.Test
|
||||
public ClientBase<RootFolderResource> RootFolders;
|
||||
public AuthorClient Author;
|
||||
public ClientBase<TagResource> Tags;
|
||||
public ClientBase<BookResource> WantedMissing;
|
||||
public ClientBase<BookResource> WantedCutoffUnmet;
|
||||
public WantedClient WantedMissing;
|
||||
public WantedClient WantedCutoffUnmet;
|
||||
|
||||
private List<SignalRMessage> _signalRReceived;
|
||||
|
||||
@@ -118,8 +118,8 @@ namespace NzbDrone.Integration.Test
|
||||
RootFolders = new ClientBase<RootFolderResource>(RestClient, ApiKey);
|
||||
Author = new AuthorClient(RestClient, ApiKey);
|
||||
Tags = new ClientBase<TagResource>(RestClient, ApiKey);
|
||||
WantedMissing = new ClientBase<BookResource>(RestClient, ApiKey, "wanted/missing");
|
||||
WantedCutoffUnmet = new ClientBase<BookResource>(RestClient, ApiKey, "wanted/cutoff");
|
||||
WantedMissing = new WantedClient(RestClient, ApiKey, "wanted/missing");
|
||||
WantedCutoffUnmet = new WantedClient(RestClient, ApiKey, "wanted/cutoff");
|
||||
}
|
||||
|
||||
[OneTimeTearDown]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using FluentValidation;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Common.Extensions;
|
||||
@@ -70,10 +70,13 @@ namespace Readarr.Api.V1.Books
|
||||
{
|
||||
if (!authorId.HasValue && !bookIds.Any() && titleSlug.IsNullOrWhiteSpace())
|
||||
{
|
||||
var editionTask = Task.Run(() => _editionService.GetAllMonitoredEditions());
|
||||
var metadataTask = Task.Run(() => _authorService.GetAllAuthors());
|
||||
var books = _bookService.GetAllBooks();
|
||||
|
||||
var authors = _authorService.GetAllAuthors().ToDictionary(x => x.AuthorMetadataId);
|
||||
var editions = _editionService.GetAllMonitoredEditions().GroupBy(x => x.BookId).ToDictionary(x => x.Key, y => y.ToList());
|
||||
var editions = editionTask.GetAwaiter().GetResult().GroupBy(x => x.BookId).ToDictionary(x => x.Key, y => y.ToList());
|
||||
|
||||
var authors = metadataTask.GetAwaiter().GetResult().ToDictionary(x => x.AuthorMetadataId);
|
||||
|
||||
foreach (var book in books)
|
||||
{
|
||||
@@ -138,6 +141,17 @@ namespace Readarr.Api.V1.Books
|
||||
return MapToResource(_bookService.GetBooks(bookIds), false);
|
||||
}
|
||||
|
||||
[HttpGet("{id:int}/overview")]
|
||||
public object Overview(int id)
|
||||
{
|
||||
var overview = _editionService.GetEditionsByBook(id).Single(x => x.Monitored).Overview;
|
||||
return new
|
||||
{
|
||||
id,
|
||||
overview
|
||||
};
|
||||
}
|
||||
|
||||
[RestPostById]
|
||||
public ActionResult<BookResource> AddBook(BookResource bookResource)
|
||||
{
|
||||
|
||||
@@ -112,10 +112,14 @@ namespace Readarr.Api.V1.Books
|
||||
|
||||
private void LinkAuthorStatistics(List<BookResource> resources, List<AuthorStatistics> authorStatistics)
|
||||
{
|
||||
var bookStatsDict = authorStatistics.SelectMany(x => x.BookStatistics).ToDictionary(x => x.BookId);
|
||||
|
||||
foreach (var book in resources)
|
||||
{
|
||||
var stats = authorStatistics.SingleOrDefault(ss => ss.AuthorId == book.AuthorId);
|
||||
LinkAuthorStatistics(book, stats);
|
||||
if (bookStatsDict.TryGetValue(book.Id, out var stats))
|
||||
{
|
||||
book.Statistics = stats.ToResource();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -72,13 +72,10 @@ namespace Readarr.Api.V1.Books
|
||||
AuthorTitle = authorTitle,
|
||||
SeriesTitle = seriesTitle,
|
||||
Disambiguation = selectedEdition?.Disambiguation,
|
||||
Overview = selectedEdition?.Overview,
|
||||
Images = selectedEdition?.Images ?? new List<MediaCover>(),
|
||||
Links = model.Links.Concat(selectedEdition?.Links ?? new List<Links>()).ToList(),
|
||||
Ratings = selectedEdition?.Ratings ?? new Ratings(),
|
||||
Added = model.Added,
|
||||
Author = model.Author?.Value.ToResource(),
|
||||
Editions = model.Editions?.Value.ToResource() ?? new List<EditionResource>()
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ namespace Readarr.Api.V1.Config
|
||||
SharedValidator.RuleFor(c => c.Port).ValidPort();
|
||||
|
||||
SharedValidator.RuleFor(c => c.UrlBase).ValidUrlBase();
|
||||
SharedValidator.RuleFor(c => c.InstanceName).ContainsReadarr().When(c => c.InstanceName.IsNotNullOrWhiteSpace());
|
||||
|
||||
SharedValidator.RuleFor(c => c.Username).NotEmpty().When(c => c.AuthenticationMethod != AuthenticationType.None);
|
||||
SharedValidator.RuleFor(c => c.Password).NotEmpty().When(c => c.AuthenticationMethod != AuthenticationType.None);
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace Readarr.Api.V1.Config
|
||||
public string SslCertPath { get; set; }
|
||||
public string SslCertPassword { get; set; }
|
||||
public string UrlBase { get; set; }
|
||||
public string InstanceName { get; set; }
|
||||
public bool UpdateAutomatically { get; set; }
|
||||
public UpdateMechanism UpdateMechanism { get; set; }
|
||||
public string UpdateScriptPath { get; set; }
|
||||
@@ -66,6 +67,7 @@ namespace Readarr.Api.V1.Config
|
||||
SslCertPath = model.SslCertPath,
|
||||
SslCertPassword = model.SslCertPassword,
|
||||
UrlBase = model.UrlBase,
|
||||
InstanceName = model.InstanceName,
|
||||
UpdateAutomatically = model.UpdateAutomatically,
|
||||
UpdateMechanism = model.UpdateMechanism,
|
||||
UpdateScriptPath = model.UpdateScriptPath,
|
||||
|
||||
@@ -99,8 +99,8 @@ namespace Readarr.Api.V1.History
|
||||
return _historyService.GetByAuthor(authorId, eventType).Select(h => MapToResource(h, includeAuthor, includeBook)).ToList();
|
||||
}
|
||||
|
||||
[HttpPost("failed")]
|
||||
public object MarkAsFailed([FromBody] int id)
|
||||
[HttpPost("failed/{id}")]
|
||||
public object MarkAsFailed([FromRoute] int id)
|
||||
{
|
||||
_failedDownloadService.MarkAsFailed(id);
|
||||
return new { };
|
||||
|
||||
@@ -51,6 +51,9 @@ namespace Readarr.Api.V1.Search
|
||||
{
|
||||
var book = (NzbDrone.Core.Books.Book)result;
|
||||
resource.Book = book.ToResource();
|
||||
resource.Book.Overview = book.Editions.Value.Single(x => x.Monitored).Overview;
|
||||
resource.Book.Author = book.Author.Value.ToResource();
|
||||
resource.Book.Editions = book.Editions.Value.ToResource();
|
||||
resource.ForeignId = book.ForeignBookId;
|
||||
|
||||
var cover = book.Editions.Value.Single(x => x.Monitored).Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Cover);
|
||||
|
||||
@@ -59,6 +59,7 @@ namespace Readarr.Api.V1.System
|
||||
return new
|
||||
{
|
||||
AppName = BuildInfo.AppName,
|
||||
InstanceName = _configFileProvider.InstanceName,
|
||||
Version = BuildInfo.Version.ToString(),
|
||||
BuildTime = BuildInfo.BuildDateTime,
|
||||
IsDebug = BuildInfo.IsDebug,
|
||||
|
||||
@@ -49,6 +49,7 @@ namespace Readarr.Http.Frontend
|
||||
builder.AppendLine($" apiKey: '{_apiKey}',");
|
||||
builder.AppendLine($" release: '{BuildInfo.Release}',");
|
||||
builder.AppendLine($" version: '{BuildInfo.Version.ToString()}',");
|
||||
builder.AppendLine($" instanceName: '{_configFileProvider.InstanceName.ToString()}',");
|
||||
builder.AppendLine($" branch: '{_configFileProvider.Branch.ToLower()}',");
|
||||
builder.AppendLine($" analytics: {_analyticsService.IsEnabled.ToString().ToLowerInvariant()},");
|
||||
builder.AppendLine($" userHash: '{HashUtil.AnonymousToken()}',");
|
||||
|
||||
18
yarn.lock
18
yarn.lock
@@ -1368,15 +1368,15 @@
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
|
||||
integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
|
||||
|
||||
"@microsoft/signalr@6.0.3":
|
||||
version "6.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.3.tgz#9904efd48cd488e3c1c80930ff9fbb3c9f55895d"
|
||||
integrity sha512-wWGVC2xi8OxNjyir8iQWuyxWHy3Dkakk2Q3VreCE7pDzFAgZ4pId6abJlRPMVIQxkUvUGc8knMW5l3sv2bJ/yw==
|
||||
"@microsoft/signalr@6.0.5":
|
||||
version "6.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.5.tgz#219f7fa10e94a75a841d3d7140d939fd2c2657e9"
|
||||
integrity sha512-Y6Mny+z71wv2/FiuoqLcraojQRIbyeF/Ao4y+tcZK28JzGGieoulXBJIVQhoxzeM15Xe8xGOX0/5pVlOpwrI8Q==
|
||||
dependencies:
|
||||
abort-controller "^3.0.0"
|
||||
eventsource "^1.0.7"
|
||||
fetch-cookie "^0.11.0"
|
||||
node-fetch "^2.6.1"
|
||||
node-fetch "^2.6.7"
|
||||
ws "^7.4.5"
|
||||
|
||||
"@mrmlnc/readdir-enhanced@^2.2.1":
|
||||
@@ -5188,10 +5188,10 @@ no-case@^3.0.4:
|
||||
lower-case "^2.0.2"
|
||||
tslib "^2.0.3"
|
||||
|
||||
node-fetch@^2.6.1:
|
||||
version "2.6.6"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89"
|
||||
integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==
|
||||
node-fetch@^2.6.7:
|
||||
version "2.6.7"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
|
||||
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
|
||||
dependencies:
|
||||
whatwg-url "^5.0.0"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user