Compare commits

...

17 Commits

Author SHA1 Message Date
Qstick
1c0943449b Fixed: Validate if equals or child for startup folder
(cherry picked from commit 0991cfe27efd6ddb533227b25754661e18d7e9ad)
2022-06-12 16:42:12 +00:00
Weblate
b4fd1340c2 Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
Currently translated at 68.1% (597 of 876 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 78.9% (692 of 876 strings)

Translated using Weblate (Polish) [skip ci]

Currently translated at 64.2% (563 of 876 strings)

Translated using Weblate (Hungarian) [skip ci]

Currently translated at 99.8% (875 of 876 strings)

Translated using Weblate (Hungarian) [skip ci]

Currently translated at 97.6% (855 of 876 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 68.0% (596 of 876 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 68.0% (596 of 876 strings)

Translated using Weblate (Norwegian Bokmål) [skip ci]

Currently translated at 8.5% (75 of 876 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 67.9% (595 of 876 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (876 of 876 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (851 of 851 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 69.8% (594 of 851 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 81.3% (692 of 851 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 69.8% (594 of 851 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 69.6% (593 of 851 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 69.6% (593 of 851 strings)

Co-authored-by: Csaba <csab0825@gmail.com>
Co-authored-by: Francesco <francy.ammirati@hotmail.com>
Co-authored-by: Giorgio <sannagiorgio1997@gmail.com>
Co-authored-by: Gjermund Wiggen <gjermundwiggen@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Matrixlee <matrix.alax@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Pan Jarek <jsawiuk@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: carreyli <laddie1987@qq.com>
Co-authored-by: un110 <13735581@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2022-06-11 15:13:19 -05:00
bakerboy448
1da27b0978 Fixed: Cleanse GoodReads oauth from logs 2022-05-30 09:26:47 +01:00
ta264
b0a3ddef9c Fixed: Speed up book api 2022-05-30 09:05:25 +01:00
ta264
a59706ceb4 Fixed: Removed unnecessary author data from book endpoint 2022-05-30 09:05:25 +01:00
nitsua
ce58e6ecdb Fixed: Mark as Failed errors
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>

(cherry picked from commit a9792973eef960e8310a611cf1da2d2cada57532)
2022-05-25 17:02:44 +01:00
bakerboy448
d01ce8b908 Fixed: Added new and missing translations 2022-05-25 14:08:08 +01:00
ta264
575f995916 Reinstate tests 2022-05-24 21:16:00 +01:00
ta264
c17c8815ef New: Add linux-x86 builds
(cherry picked from commit 8907b06899483d7cb3ecb9546d82af00d129f8e1)
2022-05-25 13:06:39 +01:00
ta264
8445941510 New: .NET 6.0.5 2022-05-25 13:06:39 +01:00
ta264
32ae18ae6f Fix bad translation 2022-05-25 13:06:39 +01:00
PearsonFlyer
b91ec241a6 Fixed: Add translation for RestartRequiredHelpTextWarning 2022-05-15 20:18:29 +01:00
Qstick
17ce8187fd New: Instance name in System/Status API endpoint 2022-05-15 13:05:44 -05:00
Qstick
41615fe026 New: Instance name for Page Title 2022-05-15 13:05:44 -05:00
Robin Dadswell
9cff8f31e9 New: Instance Name used for Syslog 2022-05-15 13:05:44 -05:00
Robin Dadswell
21538b972d New: Set Instance Name 2022-05-15 13:05:44 -05:00
Robin Dadswell
5a7b4d41d8 New: Added UDP syslog support
(cherry picked from commit 8d856b2edb8bf46a2b516d5f7644ae3fa1151323)
2022-05-15 13:05:44 -05:00
59 changed files with 805 additions and 366 deletions

View File

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

View File

@@ -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"

View File

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

View File

@@ -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>
</>

View File

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

View File

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

View File

@@ -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,

View File

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

View File

@@ -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 (

View File

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

View File

@@ -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,

View File

@@ -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,

View File

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

View File

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

View File

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

View File

@@ -126,7 +126,7 @@ class AddAuthorOptionsForm extends Component {
<FormGroup className={showMetadataProfile ? undefined : styles.hideMetadataProfile}>
<FormLabel>
Metadata Profile
{translate('MetadataProfile')}
{
includeNoneMetadataProfile &&

View File

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

View File

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

View File

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

View File

@@ -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(() => {

View File

@@ -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(() => {

View File

@@ -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
});
})
]));
}
});
//

View File

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

View 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;

View File

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

View File

@@ -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",

View File

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

View File

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

View File

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

View File

@@ -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),

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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."
}

View File

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

View File

@@ -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 unalta attività del disco e della rete.",
"AllowAuthorChangeClickToChangeAuthor": "Clicca per cambiare lartista",
"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 unalta attività del disco o della rete.",
"AllowAuthorChangeClickToChangeAuthor": "Clicca per cambiare lautore",
"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"
}

View File

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

View File

@@ -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."
}

View File

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

View File

@@ -601,5 +601,8 @@
"BackupIntervalHelpText": "备份 Lidarr 数据库和设置的时间间隔",
"Term": "项",
"MetadataProfile": "元数据配置",
"MetadataProfiles": "元数据配置"
"MetadataProfiles": "元数据配置",
"InstanceName": "中文",
"InstanceNameHelpText": "选项卡及日志应用名称",
"AddList": "添加列表"
}

View File

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

View File

@@ -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" />

View File

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

View File

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

View File

@@ -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()

View 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);
}
}
}

View File

@@ -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]

View File

@@ -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)
{

View File

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

View File

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

View File

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

View File

@@ -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,

View File

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

View File

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

View File

@@ -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,

View File

@@ -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()}',");

View File

@@ -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"