Compare commits

..

3 Commits

Author SHA1 Message Date
bakerboy448
e0b7a78568 CHANGELOG-v0.1.1.1320 2022-05-10 19:31:21 -05:00
bakerboy448
bc31f10770 changelog script workaround bad tags 2022-05-10 19:30:20 -05:00
bakerboy448
98ca518178 create changelog script 2022-05-10 19:29:58 -05:00
65 changed files with 588 additions and 805 deletions

View File

@@ -15,7 +15,7 @@ variables:
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '6.0.300'
dotnetVersion: '6.0.201'
innoVersion: '6.2.0'
windowsImage: 'windows-2022'
linuxImage: 'ubuntu-20.04'
@@ -66,13 +66,16 @@ stages:
inputs:
version: $(dotnetVersion)
- bash: |
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
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
fi
displayName: Extra Platform Support
displayName: Enable FreeBSD Support
- task: Cache@2
inputs:
key: 'nuget | "$(Agent.OS)" | $(Build.SourcesDirectory)/src/Directory.Packages.props'
@@ -84,27 +87,29 @@ 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
- publish: $(outputFolder)
artifact: '$(osName)Backend'
- task: PublishPipelineArtifact@1
inputs:
path: $(outputFolder)
artifact: '$(osName)Backend'
artifactType: 'pipeline'
parallel: true
parallelCount: 100
displayName: Publish Backend
- publish: '$(testsFolder)/net6.0/win-x64/publish'
artifact: win-x64-tests
displayName: Publish win-x64 Test Package
artifact: WindowsCoreTests
displayName: Publish Windows Test Package
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
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
artifact: LinuxCoreTests
displayName: Publish Linux Test Package
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
artifact: linux-musl-x64-tests
displayName: Publish linux-musl-x64 Test Package
artifact: LinuxMuslCoreTests
displayName: Publish Linux Musl Test Package
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
artifact: freebsd-x64-tests
displayName: Publish freebsd-x64 Test Package
artifact: FreebsdCoreTests
displayName: Publish FreeBSD Test Package
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
artifact: osx-x64-tests
displayName: Publish osx-x64 Test Package
artifact: MacCoreTests
displayName: Publish MacOS Test Package
- stage: Build_Backend_Other
displayName: Build Backend (Other OS)
@@ -136,29 +141,25 @@ stages:
inputs:
version: $(dotnetVersion)
- bash: |
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
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
fi
displayName: Extra Platform Support
displayName: Enable FreeBSD 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-extra-platforms
- bash: ./build.sh --backend --enable-bsd
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
@@ -261,35 +262,35 @@ stages:
artifactName: WindowsFrontend
targetPath: _output
displayName: Fetch Frontend
- bash: ./build.sh --packages --enable-extra-platforms
- bash: ./build.sh --packages --enable-bsd
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 win-x64 zip
displayName: Create Windows Core 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 win-x86 zip
displayName: Create Windows x86 Core 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 osx-x64 app
displayName: Create MacOS x64 Core 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 osx-x64 tar
displayName: Create MacOS x64 Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).osx-core-x64.tar.gz'
archiveType: 'tar'
@@ -297,14 +298,14 @@ stages:
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
- task: ArchiveFiles@2
displayName: Create osx-arm64 app
displayName: Create MacOS arm64 Core 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 osx-arm64 tar
displayName: Create MacOS arm64 Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).osx-core-arm64.tar.gz'
archiveType: 'tar'
@@ -312,7 +313,7 @@ stages:
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
- task: ArchiveFiles@2
displayName: Create linux-x64 tar
displayName: Create Linux Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-x64.tar.gz'
archiveType: 'tar'
@@ -320,7 +321,7 @@ stages:
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
- task: ArchiveFiles@2
displayName: Create linux-musl-x64 tar
displayName: Create Linux Musl Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-musl-core-x64.tar.gz'
archiveType: 'tar'
@@ -328,15 +329,7 @@ stages:
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
- task: ArchiveFiles@2
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
displayName: Create ARM32 Linux Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-arm.tar.gz'
archiveType: 'tar'
@@ -344,7 +337,7 @@ stages:
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
- task: ArchiveFiles@2
displayName: Create linux-musl-arm tar
displayName: Create ARM32 Linux Musl Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-musl-core-arm.tar.gz'
archiveType: 'tar'
@@ -352,7 +345,7 @@ stages:
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
- task: ArchiveFiles@2
displayName: Create linux-arm64 tar
displayName: Create Linux arm64 Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-arm64.tar.gz'
archiveType: 'tar'
@@ -360,7 +353,7 @@ stages:
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
- task: ArchiveFiles@2
displayName: Create linux-musl-arm64 tar
displayName: Create ARM64 Linux Musl Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-musl-core-arm64.tar.gz'
archiveType: 'tar'
@@ -368,7 +361,7 @@ stages:
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0
- task: ArchiveFiles@2
displayName: Create freebsd-x64 tar
displayName: Create FreeBSD Core Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).freebsd-core-x64.tar.gz'
archiveType: 'tar'
@@ -420,22 +413,22 @@ stages:
matrix:
MacCore:
osName: 'Mac'
testName: 'osx-x64'
testName: 'MacCore'
poolName: 'Azure Pipelines'
imageName: ${{ variables.macImage }}
WindowsCore:
osName: 'Windows'
testName: 'win-x64'
testName: 'WindowsCore'
poolName: 'Azure Pipelines'
imageName: ${{ variables.windowsImage }}
LinuxCore:
osName: 'Linux'
testName: 'linux-x64'
testName: 'LinuxCore'
poolName: 'Azure Pipelines'
imageName: ${{ variables.linuxImage }}
FreebsdCore:
osName: 'Linux'
testName: 'freebsd-x64'
testName: 'FreebsdCore'
poolName: 'FreeBSD'
imageName:
@@ -454,7 +447,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
@@ -482,12 +475,8 @@ stages:
matrix:
alpine:
testName: 'Musl Net Core'
artifactName: linux-musl-x64-tests
artifactName: LinuxMuslCoreTests
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 }}
@@ -498,15 +487,9 @@ stages:
steps:
- task: UseDotNet@2
displayName: 'Install .NET'
displayName: 'Install .net core'
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
@@ -540,17 +523,17 @@ stages:
matrix:
MacCore:
osName: 'Mac'
testName: 'osx-x64'
testName: 'MacCore'
imageName: ${{ variables.macImage }}
pattern: 'Readarr.*.osx-core-x64.tar.gz'
WindowsCore:
osName: 'Windows'
testName: 'win-x64'
testName: 'WindowsCore'
imageName: ${{ variables.windowsImage }}
pattern: 'Readarr.*.windows-core-x64.zip'
LinuxCore:
osName: 'Linux'
testName: 'linux-x64'
testName: 'LinuxCore'
imageName: ${{ variables.linuxImage }}
pattern: 'Readarr.*.linux-core-x64.tar.gz'
@@ -567,7 +550,7 @@ stages:
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: '$(testName)-tests'
artifactName: '$(testName)Tests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
@@ -612,7 +595,7 @@ stages:
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: 'freebsd-x64-tests'
artifactName: 'FreebsdCoreTests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
@@ -646,15 +629,11 @@ stages:
strategy:
matrix:
alpine:
testName: 'linux-musl-x64'
artifactName: linux-musl-x64-tests
testName: 'Musl Net Core'
artifactName: LinuxMuslCoreTests
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 }}
@@ -664,15 +643,9 @@ stages:
steps:
- task: UseDotNet@2
displayName: 'Install .NET'
displayName: 'Install .net core'
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
@@ -718,17 +691,14 @@ 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'
@@ -745,7 +715,7 @@ stages:
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: '$(artifactName)-tests'
artifactName: '$(osName)CoreTests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact

View File

@@ -27,22 +27,15 @@ UpdateVersionNumber()
fi
}
EnableExtraPlatformsInSDK()
EnableBsdSupport()
{
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
}
#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"
EnableExtraPlatforms()
{
if grep -qv freebsd-x64 src/Directory.Build.props; then
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64;linux-x86</RuntimeIdentifiers>^g" src/Directory.Build.props
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64</RuntimeIdentifiers>^g" src/Directory.Build.props
sed -i'' -e "s^<ExcludedRuntimeFrameworkPairs>\(.*\)</ExcludedRuntimeFrameworkPairs>^<ExcludedRuntimeFrameworkPairs>\1;freebsd-x64:net472</ExcludedRuntimeFrameworkPairs>^g" src/Directory.Build.props
fi
}
@@ -299,8 +292,7 @@ if [ $# -eq 0 ]; then
PACKAGES=YES
INSTALLER=NO
LINT=YES
ENABLE_EXTRA_PLATFORMS=NO
ENABLE_EXTRA_PLATFORMS_IN_SDK=NO
ENABLE_BSD=NO
fi
while [[ $# -gt 0 ]]
@@ -312,12 +304,8 @@ case $key in
BACKEND=YES
shift # past argument
;;
--enable-bsd|--enable-extra-platforms)
ENABLE_EXTRA_PLATFORMS=YES
shift # past argument
;;
--enable-extra-platforms-in-sdk)
ENABLE_EXTRA_PLATFORMS_IN_SDK=YES
--enable-bsd)
ENABLE_BSD=YES
shift # past argument
;;
-r|--runtime)
@@ -361,17 +349,12 @@ esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters
if [ "$ENABLE_EXTRA_PLATFORMS_IN_SDK" = "YES" ];
then
EnableExtraPlatformsInSDK
fi
if [ "$BACKEND" = "YES" ];
then
UpdateVersionNumber
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
if [ "$ENABLE_BSD" = "YES" ];
then
EnableExtraPlatforms
EnableBsdSupport
fi
Build
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
@@ -381,10 +364,9 @@ then
PackageTests "net6.0" "linux-x64"
PackageTests "net6.0" "linux-musl-x64"
PackageTests "net6.0" "osx-x64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
if [ "$ENABLE_BSD" = "YES" ];
then
PackageTests "net6.0" "freebsd-x64"
PackageTests "net6.0" "linux-x86"
fi
else
PackageTests "$FRAMEWORK" "$RID"
@@ -423,10 +405,9 @@ then
Package "net6.0" "linux-musl-arm"
Package "net6.0" "osx-x64"
Package "net6.0" "osx-arm64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
if [ "$ENABLE_BSD" = "YES" ];
then
Package "net6.0" "freebsd-x64"
Package "net6.0" "linux-x86"
fi
else
Package "$FRAMEWORK" "$RID"

View File

@@ -0,0 +1,94 @@
# New Beta Release
Readarr v0.1.1.1320 has been released on `develop`
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
A reminder about the `develop` and `nightly` branches
- **develop** - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta.
- **nightly** - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.
# Announcements
- Automated API Documentation Updates recently implemented
- [Wiki Contributions](https://wiki.servarr.com/readarr) and updates welcome and encouraged on the Wiki itself or via GitHub
# Additional Commentary
- [Lidarr v1 released](https://www.reddit.com/r/Lidarr/comments/ul0b2w/new_release_develop_v1012578/)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- Radarr Postgres Database Support in `nightly` and `develop`
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
# Releases
## Native
- [GitHub Releases](https://github.com/Readarr/Readarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/readarr/installation)
## Docker
- [hotio/Readarr:testing](https://hotio.dev/containers/readarr)
- [lscr.io/linuxserver/Readarr:develop](https://docs.linuxserver.io/images/docker-readarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v0.1.1.1320 (changes since v0.1.0.1248)
- Fixed: Correct User-Agent api logging
- Fixed: UI hiding search results with duplicate GUIDs
- New: Add date picker for custom filter dates
- Fixed: Interactive Search Filter not filtering multiple qualities in the same filter row
- Fixed: Clarify Qbit Content Path Error
- Fixed: Properly handle 119 error code from Synology Download Station
- Fixed: API error when sending payload without optional parameters
- Fixed: Cleanup Temp files after backup creation
- Fixed: Loading old commands from database
- New: Update Cert Validation Help Text
- Fixed: Clarify Indexer Priority Helptext
- Fixed: Improve help text for download client Category
- Fixed: IPv4 instead of IP4
- New: Add Validations for Recycle Bin Folder
- New: .NET 6.0.3
- Fixed: Healthcheck warning message used incorrect variable
- Fixed: Assume SABnzbd develop version is 3.0.0 if not specified
- Fixed: Updater version number logging
- Fixed: Update from version in logs
- New: Add more information about Windows service to installer
- Fixed: Recycle bin log message
- Fixed: Make authentication cookie name unique to Readarr
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,2 @@
- Automated API Documentation Updates recently implemented
- [Wiki Contributions](https://wiki.servarr.com/readarr) and updates welcome and encouraged on the Wiki itself or via GitHub

View File

@@ -0,0 +1,6 @@
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
A reminder about the `develop` and `nightly` branches
- **develop** - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta.
- **nightly** - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.

View File

@@ -0,0 +1,6 @@
- **Users who do not wish to be on the alpha `nightly` or beta `develop` testing branches should take advantage of this parity and switch to `master`
A reminder about the `develop` and `nightly` branches
- **develop** - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta.**
- **nightly** - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**

View File

@@ -0,0 +1,4 @@
- [Lidarr v1 released](https://www.reddit.com/r/Lidarr/comments/ul0b2w/new_release_develop_v1012578/)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- Radarr Postgres Database Support in `nightly` and `develop`
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)

View File

@@ -8,17 +8,17 @@ function AuthorMonitorNewItemsOptionsPopoverContent() {
<DescriptionList>
<DescriptionListItem
title={translate('AllBooks')}
data={translate('DataNewAllBooks')}
data="Monitor all new books"
/>
<DescriptionListItem
title={translate('NewBooks')}
data={translate('DataNewBooks')}
data="Monitor new books released after the newest existing book"
/>
<DescriptionListItem
title={translate('None')}
data={translate('DataNewNone')}
data="Don't monitor any new books"
/>
</DescriptionList>
);

View File

@@ -8,42 +8,42 @@ function AuthorMonitoringOptionsPopoverContent() {
return (
<>
<Alert>
{translate('MonitoringOptionsHelpText')}
This is a one time adjustment to set which books are monitored
</Alert>
<DescriptionList>
<DescriptionListItem
title={translate('AllBooks')}
data={translate('DataAllBooks')}
data="Monitor all books"
/>
<DescriptionListItem
title={translate('FutureBooks')}
data={translate('DataFutureBooks')}
data="Monitor books that have not released yet"
/>
<DescriptionListItem
title={translate('MissingBooks')}
data={translate('DataMissingBooks')}
data="Monitor books that do not have files or have not released yet"
/>
<DescriptionListItem
title={translate('ExistingBooks')}
data={translate('DataExistingBooks')}
data="Monitor books that have files or have not released yet"
/>
<DescriptionListItem
title={translate('FirstBook')}
data={translate('DataFirstBook')}
data="Monitor the first book. All other books will be ignored"
/>
<DescriptionListItem
title={translate('LatestBook')}
data={translate('DataLatestBook')}
data="Monitor the latest book and future books"
/>
<DescriptionListItem
title={translate('None')}
data={translate('DataNone')}
data="No books will be monitored"
/>
</DescriptionList>
</>

View File

@@ -8,7 +8,7 @@ import AppRoutes from './AppRoutes';
function App({ store, history }) {
return (
<DocumentTitle title={window.Readarr.instanceName}>
<DocumentTitle title="Readarr">
<Provider store={store}>
<ConnectedRouter history={history}>
<PageConnector>

View File

@@ -267,7 +267,7 @@ class AuthorEditorFooter extends Component {
isDisabled={!selectedCount || isOrganizingAuthor || isRetaggingAuthor}
onPress={onOrganizeAuthorPress}
>
{translate('RenameFiles')}
Rename Files
</SpinnerButton>
<SpinnerButton
@@ -277,7 +277,7 @@ class AuthorEditorFooter extends Component {
isDisabled={!selectedCount || isOrganizingAuthor || isRetaggingAuthor}
onPress={onRetagAuthorPress}
>
{translate('WriteMetadataTags')}
Write Metadata Tags
</SpinnerButton>
<SpinnerButton
@@ -286,7 +286,7 @@ class AuthorEditorFooter extends Component {
isDisabled={!selectedCount || isOrganizingAuthor || isRetaggingAuthor}
onPress={this.onTagsPress}
>
{translate('SetReadarrTags')}
Set Readarr Tags
</SpinnerButton>
<SpinnerButton
@@ -296,7 +296,7 @@ class AuthorEditorFooter extends Component {
isDisabled={!selectedCount || isDeleting}
onPress={this.onDeleteSelectedPress}
>
{translate('Delete')}
Delete
</SpinnerButton>
</div>

View File

@@ -8,7 +8,6 @@ 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';
@@ -44,12 +43,11 @@ function createMapStateToProps() {
(state, { titleSlug }) => titleSlug,
selectBookFiles,
(state) => state.books,
(state) => state.editions,
createAllAuthorSelector(),
createCommandsSelector(),
createUISettingsSelector(),
createDimensionsSelector(),
(titleSlug, bookFiles, books, editions, authors, commands, uiSettings, dimensions) => {
(titleSlug, bookFiles, books, 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);
@@ -81,8 +79,8 @@ function createMapStateToProps() {
isRefreshingCommand.body.bookId === book.id
);
const isFetching = isBookFilesFetching || editions.isFetching;
const isPopulated = isBookFilesPopulated && editions.isPopulated;
const isFetching = isBookFilesFetching;
const isPopulated = isBookFilesPopulated;
return {
...book,
@@ -106,8 +104,6 @@ const mapDispatchToProps = {
executeCommand,
fetchBookFiles,
clearBookFiles,
fetchEditions,
clearEditions,
clearReleases,
cancelFetchReleases,
toggleBooksMonitored
@@ -125,8 +121,7 @@ class BookDetailsConnector extends Component {
}
componentDidUpdate(prevProps) {
if (prevProps.id !== this.props.id ||
!_.isEqual(getMonitoredEditions(prevProps), getMonitoredEditions(this.props)) ||
if (!_.isEqual(getMonitoredEditions(prevProps), getMonitoredEditions(this.props)) ||
(prevProps.anyReleaseOk === false && this.props.anyReleaseOk === true)) {
this.unpopulate();
this.populate();
@@ -145,14 +140,12 @@ 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();
}
//
@@ -202,8 +195,6 @@ 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,25 +8,15 @@ 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, overview, uiSettings, dimensions) => {
(book, 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 : false;
const hasFile = statistics ? statistics.bookFileCount : 0;
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 { saveEditions } from 'Store/Actions/editionActions';
import { clearEditions, fetchEditions } from 'Store/Actions/editionActions';
import createAuthorSelector from 'Store/Selectors/createAuthorSelector';
import createBookSelector from 'Store/Selectors/createBookSelector';
import selectSettings from 'Store/Selectors/selectSettings';
@@ -26,14 +26,17 @@ function createMapStateToProps() {
const {
isFetching,
isPopulated,
error
error,
items
} = editionState;
book.editions = items;
const bookSettings = _.pick(book, [
'monitored',
'anyEditionOk'
'anyEditionOk',
'editions'
]);
bookSettings.editions = editionState.items;
const settings = selectSettings(bookSettings, pendingChanges, saveError);
@@ -55,9 +58,10 @@ function createMapStateToProps() {
}
const mapDispatchToProps = {
dispatchFetchEditions: fetchEditions,
dispatchClearEditions: clearEditions,
dispatchSetBookValue: setBookValue,
dispatchSaveBook: saveBook,
dispatchSaveEditions: saveEditions
dispatchSaveBook: saveBook
};
class EditBookModalContentConnector extends Component {
@@ -65,12 +69,20 @@ 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
@@ -82,9 +94,6 @@ class EditBookModalContentConnector extends Component {
this.props.dispatchSaveBook({
id: this.props.bookId
});
this.props.dispatchSaveEditions({
id: this.props.bookId
});
}
//
@@ -105,9 +114,10 @@ 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,7 +5,6 @@ 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';
@@ -33,13 +32,11 @@ function selectShowSearchAction() {
function createMapStateToProps() {
return createSelector(
createBookSelector(),
createBookAuthorSelector(),
createBookQualityProfileSelector(),
selectShowSearchAction(),
createExecutingCommandsSelector(),
(
book,
author,
qualityProfile,
showSearchAction,
executingCommands
@@ -57,7 +54,7 @@ function createMapStateToProps() {
const isRefreshingBook = executingCommands.some((command) => {
return (
(command.name === commandNames.REFRESH_AUTHOR &&
command.body.authorId === book.authorId) ||
command.body.authorId === book.author.id) ||
(command.name === commandNames.REFRESH_BOOK &&
command.body.bookId === book.id)
);
@@ -66,7 +63,7 @@ function createMapStateToProps() {
const isSearchingBook = executingCommands.some((command) => {
return (
(command.name === commandNames.AUTHOR_SEARCH &&
command.body.authorId === book.authorId) ||
command.body.authorId === book.author.id) ||
(command.name === commandNames.BOOK_SEARCH &&
command.body.bookIds.includes(book.id))
);
@@ -74,7 +71,6 @@ function createMapStateToProps() {
return {
...book,
author,
qualityProfile,
showSearchAction,
isRefreshingBook,

View File

@@ -12,7 +12,6 @@ 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';
@@ -43,26 +42,10 @@ class BookIndexOverview extends Component {
this.state = {
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: false,
overview: ''
isDeleteAuthorModalOpen: false
};
}
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
@@ -101,6 +84,7 @@ class BookIndexOverview extends Component {
const {
id,
title,
overview,
monitored,
titleSlug,
nextAiring,
@@ -134,7 +118,6 @@ class BookIndexOverview extends Component {
} = statistics;
const {
overview,
isEditAuthorModalOpen,
isDeleteAuthorModalOpen
} = this.state;
@@ -284,6 +267,7 @@ 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,7 +6,6 @@ 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';
@@ -115,7 +114,7 @@ class BookshelfFooter extends Component {
<div className={styles.inputContainer}>
<div className={styles.label}>
{translate('MonitorExistingBooks')}
Monitor Existing Books
</div>
<MonitorBooksSelectInput
@@ -129,7 +128,7 @@ class BookshelfFooter extends Component {
<div className={styles.inputContainer}>
<div className={styles.label}>
{translate('MonitorNewBooks')}
Monitor New Books
</div>
<MonitorNewItemsSelectInput
@@ -153,7 +152,7 @@ class BookshelfFooter extends Component {
isDisabled={!selectedCount || noChanges}
onPress={this.onUpdateSelectedPress}
>
{translate('UpdateSelected')}
Update Selected
</SpinnerButton>
</div>
</PageContentFooter>

View File

@@ -2,7 +2,6 @@ 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';
@@ -217,7 +216,7 @@ function FormInputGroup(props) {
<Link
to={helpLink}
>
{translate('MoreInfo')}
More Info
</Link>
}

View File

@@ -14,7 +14,7 @@ function PageContent(props) {
return (
<ErrorBoundary errorComponent={PageContentError}>
<DocumentTitle title={title ? `${title} - ${window.Readarr.instanceName}` : window.Readarr.instanceName}>
<DocumentTitle title={title ? `${title} - Readarr` : 'Readarr'}>
<div className={className}>
{children}
</div>

View File

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

View File

@@ -20,7 +20,6 @@ function HostSettings(props) {
bindAddress,
port,
urlBase,
instanceName,
enableSsl,
sslPort,
sslCertPath,
@@ -79,22 +78,6 @@ 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={translate('DataListMonitorNone')}
data="Do not monitor authors or books"
/>
<DescriptionListItem
title={translate('SpecificBook')}
data={translate('DataListMonitorSpecificBook')}
data="Monitor authors but only monitor books explicitly included in the list"
/>
<DescriptionListItem
title={translate('AllAuthorBooks')}
data={translate('DataListMonitorAll')}
data="Monitor authors and all books for each author included on the import list"
/>
</DescriptionList>
);
@@ -89,7 +89,7 @@ function EditImportListModalContent(props) {
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{id ? translate('EditList') : translate('AddList')}
{id ? 'Edit List' : 'Add List'}
</ModalHeader>
<ModalBody>
@@ -148,7 +148,7 @@ function EditImportListModalContent(props) {
<FormGroup>
<FormLabel>
{translate('Monitor')}
Monitor
<Popover
anchor={
@@ -318,7 +318,7 @@ function EditImportListModalContent(props) {
kind={kinds.DANGER}
onPress={onDeleteImportListPress}
>
{translate('Delete')}
Delete
</Button>
}
@@ -327,13 +327,13 @@ function EditImportListModalContent(props) {
error={saveError}
onPress={onTestPress}
>
{translate('Test')}
Test
</SpinnerErrorButton>
<Button
onPress={onModalClose}
>
{translate('Cancel')}
Cancel
</Button>
<SpinnerErrorButton
@@ -341,7 +341,7 @@ function EditImportListModalContent(props) {
error={saveError}
onPress={onSavePress}
>
{translate('Save')}
Save
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>

View File

@@ -346,7 +346,7 @@ function EditRootFolderModalContent(props) {
<FormGroup>
<FormLabel>
{translate('ConvertToFormat')}
Convert to format
<Popover
anchor={
<Icon
@@ -371,7 +371,7 @@ function EditRootFolderModalContent(props) {
<FormGroup>
<FormLabel>
{translate('CalibreOutputProfile')}
Calibre Output Profile
<Popover
anchor={
<Icon
@@ -423,14 +423,14 @@ function EditRootFolderModalContent(props) {
kind={kinds.DANGER}
onPress={onDeleteRootFolderPress}
>
{translate('Delete')}
Delete
</Button>
}
<Button
onPress={onModalClose}
>
{translate('Cancel')}
Cancel
</Button>
<SpinnerErrorButton
@@ -438,7 +438,7 @@ function EditRootFolderModalContent(props) {
error={saveError}
onPress={onSavePress}
>
{translate('Save')}
Save
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>

View File

@@ -78,8 +78,12 @@ export const actionHandlers = handleThunks({
} = payload;
const promise = createAjaxRequest({
url: `/history/failed/${historyId}`,
method: 'POST'
url: '/history/failed',
method: 'POST',
data: {
id: historyId
},
dataType: 'json'
}).request;
promise.done(() => {

View File

@@ -86,8 +86,12 @@ export const actionHandlers = handleThunks({
} = payload;
const promise = createAjaxRequest({
url: `/history/failed/${historyId}`,
method: 'POST'
url: '/history/failed',
method: 'POST',
data: {
id: historyId
},
dataType: 'json'
}).request;
promise.done(() => {

View File

@@ -1,8 +1,5 @@
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';
@@ -28,39 +25,18 @@ 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'),
[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
});
})
]));
}
[FETCH_EDITIONS]: createFetchHandler(section, '/edition')
});
//

View File

@@ -246,8 +246,11 @@ export const actionHandlers = handleThunks({
}));
const promise = createAjaxRequest({
url: `/history/failed/${id}`,
url: '/history/failed',
method: 'POST',
data: {
id
},
dataType: 'json'
}).request;

View File

@@ -1,15 +0,0 @@
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,16 +1,18 @@
import { createSelector } from 'reselect';
import createBookAuthorSelector from './createBookAuthorSelector';
import createBookSelector from './createBookSelector';
function createBookQualityProfileSelector() {
return createSelector(
(state) => state.settings.qualityProfiles.items,
createBookAuthorSelector(),
(qualityProfiles, author) => {
if (!author) {
createBookSelector(),
(qualityProfiles, book) => {
if (!book) {
return {};
}
return qualityProfiles.find((profile) => profile.id === author.qualityProfileId);
return qualityProfiles.find((profile) => {
return profile.id === book.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.5",
"@microsoft/signalr": "6.0.3",
"@sentry/browser": "6.18.2",
"@sentry/integrations": "6.18.2",
"ansi-colors": "4.1.1",

View File

@@ -0,0 +1,110 @@
#!/bin/bash
# Generate a Markdown change log of pull requests from commits between two tags
scriptDir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
ghRepo="Readarr"
#branch="develop"
#read -r -p "What Repo?: " ghRepo
#read -r -p "What Org?: [Default:$ghRepo]" ghOrg
read -r -p "What Branch? [master|develop|nightly]:" branch
ghOrg=${ghOrg:-$ghRepo}
ghRepoUrl=https://github.com/$ghOrg/$ghRepo
case "${branch}" in
master)
hotioBranch='release'
lsioBranch='latest'
branchType='Stable'
;;
develop)
hotioBranch='testing'
lsioBranch='develop'
branchType='Beta'
;;
nightly)
hotioBranch='nightly'
lsioBranch='nightly'
branchType='Alpha'
;;
esac
baseDir=$(dirname "$scriptDir")
changelogDir="$baseDir/changelogs/"
templateDir="$changelogDir/templates/"
# Get a list of all tags in reverse order
# Assumes the tags are in version format like v1.2.3
## gitTags=$(git ls-remote -t --exit-code --refs --sort='-v:refname' "$ghRepoUrl" | sed -E 's/^[[:xdigit:]]+[[:space:]]+refs\/tags\/(.+)/\1/g')
# Make the tags an array
# shellcheck disable=SC2206
## tags=($gitTags)
# Prompt for Tags due to bad Tags on GH (Sonarr v2)
# Commented out automation
##latestTag=${tags[0]}
##previousTag=${tags[1]}
read -r -p "Enter Latest Tag:" latestTag
read -r -p "Enter Previous Tag:" previousTag
# Get a log of commits that occurred between two tags
# See Pretty format placeholders at https://git-scm.com/docs/pretty-formats
# -i -E --grep="(Fixed:|New:)"'
commits=$(git log --pretty=format:" - %s%n" -i -E --grep="(Fixed:|New:)" "$previousTag".."$latestTag")
# Store our changelog in a variable to be saved to a file at the end
markdown="# New ${branchType^} Release"
markdown+='\n\n'
markdown+="$ghRepo $latestTag has been released on \`$branch\`"
markdown+='\n\n'
branchmsg=$(cat "$templateDir"/branch-$branch.md)
if [ -n "$branchmsg" ]; then
{
markdown+=$branchmsg
markdown+='\n\n'
}
fi
markdown+="# Announcements"
markdown+='\n\n'
markdown+=$(cat "$templateDir"/announcements.md)
markdown+='\n\n'
markdown+="# Additional Commentary"
markdown+='\n\n'
markdown+=$(cat "$templateDir"/commentary.md)
markdown+='\n\n'
markdown+="# Releases"
markdown+='\n\n'
markdown+="## Native"
markdown+="\n\n"
markdown+="- [GitHub Releases]($ghRepoUrl/releases)"
markdown+="\n\n"
markdown+="- [Wiki Installation Instructions](https://wiki.servarr.com/${ghRepo,,}/installation)"
markdown+="\n\n"
markdown+="## Docker"
markdown+="\n\n"
markdown+="- [hotio/$ghRepo:$hotioBranch](https://hotio.dev/containers/${ghRepo,,})"
markdown+="\n\n"
markdown+="- [lscr.io/linuxserver/$ghRepo:$lsioBranch](https://docs.linuxserver.io/images/docker-${ghRepo,,})"
markdown+="\n\n"
markdown+="## NAS Packages"
markdown+="\n\n"
markdown+="- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally"
markdown+="\n\n"
markdown+="- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally"
markdown+="\n\n"
markdown+="------------"
markdown+="\n\n"
markdown+="# Release Notes"
markdown+="\n\n"
markdown+="## $latestTag (changes since $previousTag)"
markdown+="\n\n"
markdown+="$commits"
markdown+="\n\n"
markdown+=" - Other bug fixes and improvements, see GitHub history"
# Loop over each commit and look for merged pull requests
#for COMMIT in $COMMITS; do
#done
# Save our markdown to a file
mkdir -p "$changelogDir"
echo -e "$markdown" >"$changelogDir/CHANGELOG-$latestTag.md"
exit 0

View File

@@ -15,26 +15,25 @@
<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.5" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.3" />
<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.2.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
<PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr22" />
<PackageVersion Include="MonoTorrent" Version="2.0.5" />
<PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr18" />
<PackageVersion Include="MonoTorrent" Version="2.0.4" />
<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.18" />
<PackageVersion Include="PdfSharpCore" Version="1.3.13" />
<PackageVersion Include="RestSharp.Serializers.SystemTextJson" Version="106.15.0" />
<PackageVersion Include="RestSharp" Version="106.15.0" />
<PackageVersion Include="Selenium.Support" Version="3.141.0" />
@@ -56,9 +55,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.4" />
<PackageVersion Include="System.Text.Json" Version="6.0.2" />
<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,26 +9,4 @@
<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,7 +80,6 @@ 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(@"(?<=\?|&|: )((?:api|auth|pass)?key|(?:access[-_]?)?token|auth|user|uid|api|[a-z_]*apikey|account|passwd)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"(?<=\?|&|: )(apikey|(?:access[-_]?)?token|passkey|auth|authkey|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,6 +27,7 @@ namespace NzbDrone.Core.Test.UpdateTests
[Test]
public void finds_update_when_version_lower()
{
NotBsd();
UseRealHttp();
Subject.GetLatestUpdate("nightly", new Version(0, 1)).Should().NotBeNull();
}
@@ -42,6 +43,8 @@ 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,13 +41,9 @@ 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
@@ -206,7 +202,6 @@ 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);
@@ -214,12 +209,6 @@ 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

@@ -1,14 +0,0 @@
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,8 +2,6 @@ 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;
@@ -42,12 +40,6 @@ 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
@@ -109,24 +101,6 @@ 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,7 +7,6 @@
"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",
@@ -131,7 +130,6 @@
"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}'",
@@ -141,19 +139,6 @@
"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",
@@ -225,7 +210,6 @@
"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",
@@ -352,8 +336,6 @@
"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",
@@ -441,11 +423,9 @@
"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",
@@ -619,7 +599,6 @@
"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",
@@ -635,7 +614,6 @@
"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",
@@ -678,7 +656,6 @@
"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",
@@ -757,7 +734,6 @@
"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",
@@ -829,7 +805,6 @@
"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}'.",
@@ -867,12 +842,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"
"Yesterday": "Yesterday",
"UpdateAvailable": "New update is available"
}

View File

@@ -2,7 +2,7 @@
"AnalyticsEnabledHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
"Delete": "Poista",
"None": "Ei mitään",
"RootFolder": "Juurikansio",
"RootFolder": "Pääkansio",
"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": "Miten tunnisteita sovelletaan valittuun kirjailijaan",
"ApplyTagsHelpTexts1": "Tunnisteisiin kohdistettavat toimenpiteet:",
"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": "Muuta tiedoston päiväys tuonnin ja uudelleentarkistuksen yhteydessä.",
"FileDateHelpText": "Tiedoston päiväyksen muutos tuonnin ja uudellentarkistuksen yhteydessä.",
"FileManagement": "Tiedostojen hallinta",
"FileNames": "Tiedostonimet",
"Filename": "Tiedostonimi",
@@ -141,7 +141,7 @@
"Fixed": "Korjattu",
"Folder": "Kansio",
"Folders": "Kansioiden käsittely",
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Lue lisää yksittäisistä lataustyökaluista painamalla 'Lisätietoja'.",
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Lue lisää lataustyökalusta 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, joille ei ole kirjailijaa. Tämä voi sisältää poistettuja kirjailijoita tai mitä tahansa muuta Readarrille luokiteltua.",
"IncludeUnknownAuthorItemsHelpText": "Näytä jonossa kohteet, joissa 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": "Tiedostomuutoksia ei tunnisteta automaattisesti, jollei asetuksena ole 'Aina'.",
"RescanAuthorFolderAfterRefresh": "Tutki kirjailijakansio päivityksen jälkeen uudelleen",
"RescanAfterRefreshHelpTextWarning": "Readarr ei tunnista tiedostomuutoksia automaattisesti, jollei asetuksena ole 'Aina'.",
"RescanAuthorFolderAfterRefresh": "Tarkista 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": "Juurikansiot",
"RootFolders": "Pääkansiot",
"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": "Juurikansioiden lataus epäonnistui.",
"UnableToLoadRootFolders": "Pääkansioiden 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 juurikansioon '{1}' ja näin ei pitäisi tehdä, vaan lataukset tulee tallentaa erilliseen sijaintiin.",
"DownloadClientCheckDownloadingToRoot": "Lataustyökalu '{0}' sijoittaa lataukset pääkansioon '{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": "Tutki kirjailijakansio uudelleen kirjailijan päivityksen jälkeen.",
"RescanAfterRefreshHelpText": "Tarkista kirjailijakansion sisältö uudelleen elokuvan 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ä valitut",
"UpdateSelected": "Päivitä valittu",
"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 tuloksia.",
"CouldntFindAnyResultsForTerm": "Haku '{0}' ei tuottanut yhtään 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,6 +689,5 @@
"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",
"WatchLibraryForChangesHelpText": "Suorita automaattinen uudelleentutkinta, kun juurikansiossa havaitaan tiedostomuutoksia."
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa"
}

View File

@@ -849,29 +849,5 @@
"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ő",
"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"
"UpdateAvailable": "Új frissítés elérhető"
}

View File

@@ -6,14 +6,14 @@
"APIKey": "Chiave API",
"About": "Informazioni",
"AddListExclusion": "Aggiungi Lista Esclusioni",
"AddingTag": "Aggiungi etichetta",
"AdvancedSettingsHiddenClickToShow": "Nascosto, clicca per mostrare",
"AddingTag": "Aggiungi tag",
"AdvancedSettingsHiddenClickToShow": "Nascosto, premi per mostrare",
"AdvancedSettingsShownClickToHide": "Visibile, clicca per nascondere",
"Fixed": "Fissato",
"Local": "Locale",
"Remove": "Rimuovi",
"Source": "Fonte",
"Tags": "Etichette",
"Tags": "Tag",
"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": "Ramo utilizzato dal sistema di aggiornamento esterno",
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branch utilizzato dal sistema di aggiornamento esterno",
"Version": "Versione",
"WeekColumnHeader": "Intestazione colonna settimana",
"Year": "Anno",
"YesCancel": "Si, Cancella",
"AgeWhenGrabbed": "Età (quando recuperato)",
"YesCancel": "Si, annulla",
"AgeWhenGrabbed": "Età (quando trovato)",
"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 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.",
"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.",
"AppDataDirectory": "Cartella AppData",
"ApplyTags": "Applica Etichette",
"ApplyTagsHelpTexts1": "Come applicare etichette agli autori selezionati",
"ApplyTagsHelpTexts2": "Aggiungi: Aggiunge le etichette alla lista esistente di etichette",
"ApplyTagsHelpTexts3": "Rimuovi: Rimuove le etichette inserite",
"ApplyTagsHelpTexts1": "Come applicare i tag ai film selezionati",
"ApplyTagsHelpTexts2": "Aggiungi: Aggiungere le etichette alla lista esistente di etichette",
"ApplyTagsHelpTexts3": "Rimuovere: rimuovi 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 Readarr",
"AuthorClickToChangeBook": "Clicca per cambiare libro",
"AutoRedownloadFailedHelpText": "Cerca e prova a scaricare automaticamente un'altra versione",
"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",
"Automatic": "Automatico",
"BackupFolderHelpText": "I percorsi relativi saranno nella cartella AppData di Readarr",
"BackupFolderHelpText": "I percorsi relativi saranno sotto la directory AppData di Radarr",
"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 effetto",
"BookIsDownloading": "Libro in download",
"BookIsDownloadingInterp": "Libro in download - {0}% {1}",
"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}",
"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": "Annulla",
"Cancel": "Cancella",
"CancelMessageText": "Sei sicuro di voler cancellare questa operazione in sospeso?",
"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",
"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",
"ChmodFolder": "Permessi Cartella",
"ChmodFolderHelpText": "Octal, applicato durante l'importazione/rinomina verso cartelle e file (senza bits di esecuzione)",
"ChmodFolderHelpText": "Octal, applicato durante importazione/rinomina di cartelle e file (senza execute bits)",
"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 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.",
"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.",
"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": "Profilo di Ritardo",
"DelayProfile": "Profili 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": "Cancella Profilo di Ritardo",
"DeleteDelayProfile": "Cancellare il 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": "Cancella le cartelle vuote",
"DeleteEmptyFolders": "Cancellare le cartelle vuote",
"DeleteEmptyFoldersHelpText": "Cancellare le cartelle vuote dei film durante la scansione del disco e quando i file di film vengono cancellati",
"DeleteImportListExclusion": "Rimuovi Esclusione dalla Lista Importazioni",
"DeleteImportListExclusion": "Cancellare la lista delle esclusioni",
"DeleteImportListExclusionMessageText": "Sei sicuro di voler cancellare questa lista di esclusioni delle importazioni?",
"DeleteImportListMessageText": "Sei sicuro di voler eliminare la lista '{0}'?",
"DeleteIndexer": "Cancella Indicizzatore",
"DeleteIndexerMessageText": "Sicuro di voler eliminare l'indicizzatore '{0}'?",
"DeleteIndexer": "Cancella Indexer",
"DeleteIndexerMessageText": "Sei sicuro di voler eliminare l'indexer '{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": "Cancella il Profilo di Qualità",
"DeleteQualityProfile": "Cancellare 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": "Elimina Etichetta",
"DeleteTagMessageText": "Sei sicuro di voler eliminare l'etichetta '{0}'?",
"DestinationPath": "Percorso di Destinazione",
"DetailedProgressBar": "Barra di Avanzamento Dettagliata",
"DeleteTag": "Cancella Tag",
"DeleteTagMessageText": "Sei sicuro di voler eliminare il tag '{0}'?",
"DestinationPath": "Percorso di destinazione",
"DetailedProgressBar": "Barra di avanzamento dettagliata",
"DiskSpace": "Spazio su Disco",
"Docker": "Docker",
"DownloadClient": "Client di Download",
"DownloadClientSettings": "Impostazioni del Client di Download",
"DownloadClients": "Clients di Download",
"DownloadClient": "Client Download",
"DownloadClientSettings": "Impostazioni del client di download",
"DownloadClients": "Client 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": "Avviso di download: controllare il client di download per maggiori dettagli",
"DownloadWarningCheckDownloadClientForMoreDetails": "Problema 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": "Abilita la Modalità Daltonismo",
"EnableColorImpairedModeHelpText": "Stile alterato per permettere agli utenti daltonici di distinguere meglio le informazioni codificate a colori",
"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",
"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": "Nome Host",
"Hostname": "Hostname",
"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'Indicizzatore",
"IndexerPriority": "Priorità dell'indexer",
"IndexerSettings": "Impostazioni dell'Indexer",
"Indexers": "Indicizzatori",
"Indexers": "Indexer",
"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": "Attivatori di Notifica",
"NotificationTriggers": "Selettori 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 la Wiki per maggiori informazioni",
"ReadTheWikiForMoreInformation": "Leggi le 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": "Rimosso dalla coda lavori",
"RemovedFromTaskQueue": "Rimuovi dalla coda di lavoro",
"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": "Ritenzione",
"Retention": "Memorizzazione",
"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 Certificato SSL",
"SSLCertPath": "Percorso Certificato SSL",
"SSLCertPassword": "Password Cert SSL",
"SSLCertPath": "Percorso Cert SSL",
"SSLPort": "Porta SSL",
"Scheduled": "Programmato",
"Scheduled": "In Programma",
"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 anonimi sull'uso",
"SendAnonymousUsageData": "Invia dati sull'uso anonimamente",
"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": "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",
"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",
"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": "Torrents",
"Torrents": "Torrent",
"TotalFileSize": "Dimensione totale dei file",
"UILanguage": "Lingua dell'Interfaccia",
"UILanguage": "Lingua della UI",
"UILanguageHelpText": "Lingua che Radarr userà per la UI",
"UILanguageHelpTextWarning": "Ricaricamento del browser richiesto",
"UISettings": "Impostazioni Interfaccia",
"URLBase": "Base Url",
"UnableToAddANewDownloadClientPleaseTryAgain": "Impossibile aggiungere un nuovo client di download, riprova.",
"UILanguageHelpTextWarning": "Richiede il reload del Browser",
"UISettings": "Impostazioni UI",
"URLBase": "URL di Base",
"UnableToAddANewDownloadClientPleaseTryAgain": "Non riesco ad aggiungere un nuovo client di download, riprova.",
"UnableToAddANewImportListExclusionPleaseTryAgain": "Non riesco ad aggiungere una nuova lista di esclusione, riprova.",
"UnableToAddANewIndexerPleaseTryAgain": "Impossibile aggiungere un nuovo Indicizzatore, riprova.",
"UnableToAddANewIndexerPleaseTryAgain": "Non riesco ad aggiungere un nuovo indexer, riprova.",
"UnableToAddANewListPleaseTryAgain": "Non riesco ad aggiungere una nuova lista, riprova.",
"UnableToAddANewMetadataProfilePleaseTryAgain": "Non riesco ad aggiungere un nuovo profilo di qualità, riprova.",
"UnableToAddANewNotificationPleaseTryAgain": "Impossibile aggiungere una nuova notifica, riprova.",
"UnableToAddANewNotificationPleaseTryAgain": "Non riesco ad 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": "Impossibile caricare i backup",
"UnableToLoadBackups": "Non riesco a caricare i backup",
"UnableToLoadDelayProfiles": "Non riesco a caricare i profili di ritardo",
"UnableToLoadDownloadClientOptions": "Non riesco a caricare le opzioni del client di download",
"UnableToLoadDownloadClients": "Impossibile caricare i client di download",
"UnableToLoadGeneralSettings": "Impossibile caricare le impostazioni Generali",
"UnableToLoadDownloadClients": "Non riesco a caricare i client di download",
"UnableToLoadGeneralSettings": "Non riesco a 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": "Impossibile caricare gli Indicizzatori",
"UnableToLoadIndexers": "Non riesco a caricare l'indexer",
"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": "Impossibile caricare le Notifiche",
"UnableToLoadNotifications": "Non riesco a 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": "Impossibile caricare le Etichette",
"UnableToLoadTags": "Non riesco a caricare i tag",
"UnableToLoadTheCalendar": "Non riesco a caricare il calendario",
"UnableToLoadUISettings": "Impossibile caricare le impostazioni interfaccia",
"UnableToLoadUISettings": "Non riesco a caricare le impostazioni della UI",
"Ungroup": "Separa",
"Unmonitored": "Non Seguito",
"UnmonitoredHelpText": "Includi i film non monitorati nei feed di iCal",
"UpdateAll": "Aggiorna Tutto",
"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",
"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",
"Updates": "Aggiornamenti",
"UrlBaseHelpTextWarning": "Richiede il riavvio per avere effetti",
"AnalyticsEnabledHelpTextWarning": "Richiede il riavvio per avere effetto",
"ApiKeyHelpTextWarning": "Richiede il riavvio per avere effetto",
"AnalyticsEnabledHelpTextWarning": "Richiede il riavvio per avere effetti",
"ApiKeyHelpTextWarning": "Richiede il riavvio per avere effetti",
"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 effetto",
"SslCertPasswordHelpTextWarning": "Richiede il riavvio per avere effetti",
"UnableToLoadMetadataProfiles": "Non riesco a caricare i profili di ritardo",
"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",
"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",
"OutputPath": "Percorso di Destinazione",
"ReplaceIllegalCharactersHelpText": "Sostituisci i caratteri non consentiti. Se non selezionato, Radarr invece li rimuoverà",
"Progress": "Avanzamento",
"Actions": "Azioni",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "I libri cancellati dal disco sono automaticamente non monitorati in Readarr",
"BookAvailableButMissing": "Libro Disponibile, ma Mancante",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "I film cancellati dal disco sono automaticamente non monitorati in Radarr",
"BookAvailableButMissing": "Film 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 Indicizzatore",
"CloneIndexer": "Clona Indexer",
"RemoveFromBlocklist": "Rimuovi della blacklist",
"Time": "Ora",
"Time": "Orario",
"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 mancanti",
"AddMissing": "Aggiungi ai mancanti",
"AddNewItem": "Aggiungi Nuovo Elemento",
"Blocklist": "Lista dei Blocchi",
"BlocklistHelpText": "Impedisci a Readarr di re-acquisire automaticamente questi file",
"BlocklistRelease": "Release in Lista dei Blocchi",
"AllowFingerprinting": "Consenti il \"Fingerprinting\"",
"Blocklist": "Lista Nera",
"BlocklistHelpText": "Impedisci a Radarr di acquisire automaticamente questo versione",
"BlocklistRelease": "Release in blacklist",
"AllowFingerprinting": "Consenti impronte",
"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": "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",
"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",
"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 di download",
"DownloadClientCheckNoneAvailableMessage": "Non è disponibile nessun client per il 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": "Nessun client di download è disponibile a causa di errori",
"DownloadClientStatusCheckSingleClientMessage": "Client per il download non disponibili per errori: {0}",
"Filters": "Filtri",
"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",
"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 dell'interfaccia '{0}'.",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fornito 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 di interfaccia '{0}'.",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent esposto dalla app che ha chiamato la API",
"UpdateAvailable": "É disponibile un nuovo aggiornamento",
"DownloadClientsSettingsSummary": "Client di download, gestione dei download e mappatura dei percorsi remoti",
"DownloadClientsSettingsSummary": "Client download, gestione dei download e collegamento a 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 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",
"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",
"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 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}",
"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}",
"IndexerSearchCheckNoInteractiveMessage": "Non è disponibile nessun indexer con abilitata la Ricerca Interattiva, Radarr non fornirà nessun risultato tramite la ricerca interattiva",
"IndexerStatusCheckAllClientMessage": "Nessun Indicizzatore disponibile a causa di errori",
"IndexerStatusCheckSingleClientMessage": "Indicizzatori non disponibili a causa di errori: {0}",
"IndexerStatusCheckAllClientMessage": "Tutti gli indexer non sono disponibili a causa di errori",
"IndexerStatusCheckSingleClientMessage": "Indexer 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": "Al Prelievo",
"ProxyCheckBadRequestMessage": "Il test del proxy è fallito. Codice Stato: {0}",
"OnGrab": "Quando viene prelevato",
"ProxyCheckBadRequestMessage": "Il test del proxy è fallito. 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 l'Host Configurato del Proxy {0}",
"ProxyCheckResolveIpMessage": "Impossibile risolvere l'indirizzo IP per il 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 e delle impostazioni di Readarr",
"BackupIntervalHelpText": "Intervallo per eseguire il backup del DB Lidarr e delle impostazioni",
"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,31 +575,5 @@
"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",
"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"
"SettingsRemotePathMappingLocalPath": "Percorso locale"
}

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 IPv4 -adresse eller \"*\" for alle grensesnitt",
"BindAddressHelpText": "Gyldig IP4 -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. Ikke endre med mindre du forstår risikoene.",
"CertificateValidationHelpText": "Endre hvor streng HTTPS -sertifisering validering er",
"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,17 +63,5 @@
"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",
"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"
"AppDataLocationHealthCheckMessage": "Oppdatering vil ikke være mulig for å forhindre sletting av AppData på oppdateringen"
}

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 IPv4 lub „*” dla wszystkich interfejsów",
"BindAddressHelpText": "Prawidłowy adres IP4 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łość walidacji certyfikatu HTTPS. Nie zmieniaj, jeśli nie rozumiesz związanych z tym zagrożeń.",
"CertificateValidationHelpText": "Zmień ścisłą walidację certyfikatu HTTPS",
"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 wyłączenia wszystkich indekserów.",
"ThisCannotBeCancelled": "Nie można tego anulować po uruchomieniu bez ponownego uruchamiania Radarr.",
"UnselectAll": "Odznacz wszystko",
"UpdateSelected": "Aktualizuj wybrane",
"Component": "Składnik",
@@ -552,22 +552,5 @@
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Folder filmów „{0}” i cała jego zawartość zostaną usunięte.",
"TimeLeft": "Pozostały czas",
"Yesterday": "Wczoraj",
"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."
"OnGrab": "Na Grab"
}

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 puder detectar o espaço livre da pasta raiz do seu autor",
"SkipFreeSpaceCheckWhenImportingHelpText": "Usar quando o Readarr não conseguir detectar espaço livre na pasta raiz do 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": "Sem indexadores disponíveis com pesquisa interativa habilitada, o Readarr não fornecerá nenhum resultado de pesquisa interativo",
"IndexerSearchCheckNoInteractiveMessage": "Nenhum indexador disponível com a 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": "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.",
"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.",
"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,30 +849,5 @@
"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",
"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"
"TagsSettingsSummary": "Gerenciar etiquetas de autor, perfil, restrição e notificação"
}

View File

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

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 };
book = trimmed;
return trimmed;
}
var authorDict = authors.ToDictionary(x => x.ForeignAuthorId);

View File

@@ -18,7 +18,6 @@
<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 {relationship} the start up folder")
: base("Path cannot be an ancestor of the start up folder")
{
_appFolderInfo = appFolderInfo;
}
@@ -21,24 +21,7 @@ namespace NzbDrone.Core.Validation.Paths
return true;
}
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;
return !_appFolderInfo.StartUpFolder.IsParentPath(context.PropertyValue.ToString());
}
}
}

View File

@@ -61,11 +61,5 @@ 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,23 +52,12 @@ namespace NzbDrone.Integration.Test.ApiTests
{
EnsureAuthor("14586394", "43765115", "Andrew Hunter Murray", true);
var result = WantedMissing.GetPagedIncludeAuthor(0, 15, "releaseDate", "desc", includeAuthor: true);
var result = WantedMissing.GetPaged(0, 15, "releaseDate", "desc");
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()
@@ -114,25 +103,12 @@ namespace NzbDrone.Integration.Test.ApiTests
var author = EnsureAuthor("14586394", "43765115", "Andrew Hunter Murray", true);
EnsureBookFile(author, 1, "43765115", Quality.MOBI);
var result = WantedCutoffUnmet.GetPagedIncludeAuthor(0, 15, "releaseDate", "desc", includeAuthor: true);
var result = WantedCutoffUnmet.GetPaged(0, 15, "releaseDate", "desc");
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

@@ -1,40 +0,0 @@
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 WantedClient WantedMissing;
public WantedClient WantedCutoffUnmet;
public ClientBase<BookResource> WantedMissing;
public ClientBase<BookResource> 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 WantedClient(RestClient, ApiKey, "wanted/missing");
WantedCutoffUnmet = new WantedClient(RestClient, ApiKey, "wanted/cutoff");
WantedMissing = new ClientBase<BookResource>(RestClient, ApiKey, "wanted/missing");
WantedCutoffUnmet = new ClientBase<BookResource>(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,13 +70,10 @@ 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 editions = editionTask.GetAwaiter().GetResult().GroupBy(x => x.BookId).ToDictionary(x => x.Key, y => y.ToList());
var authors = metadataTask.GetAwaiter().GetResult().ToDictionary(x => x.AuthorMetadataId);
var authors = _authorService.GetAllAuthors().ToDictionary(x => x.AuthorMetadataId);
var editions = _editionService.GetAllMonitoredEditions().GroupBy(x => x.BookId).ToDictionary(x => x.Key, y => y.ToList());
foreach (var book in books)
{
@@ -141,17 +138,6 @@ 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,14 +112,10 @@ 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)
{
if (bookStatsDict.TryGetValue(book.Id, out var stats))
{
book.Statistics = stats.ToResource();
}
var stats = authorStatistics.SingleOrDefault(ss => ss.AuthorId == book.AuthorId);
LinkAuthorStatistics(book, stats);
}
}

View File

@@ -72,10 +72,13 @@ 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,7 +40,6 @@ 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,7 +25,6 @@ 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; }
@@ -67,7 +66,6 @@ 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/{id}")]
public object MarkAsFailed([FromRoute] int id)
[HttpPost("failed")]
public object MarkAsFailed([FromBody] int id)
{
_failedDownloadService.MarkAsFailed(id);
return new { };

View File

@@ -51,9 +51,6 @@ 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,7 +59,6 @@ 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,7 +49,6 @@ 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.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==
"@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==
dependencies:
abort-controller "^3.0.0"
eventsource "^1.0.7"
fetch-cookie "^0.11.0"
node-fetch "^2.6.7"
node-fetch "^2.6.1"
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.7:
version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
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==
dependencies:
whatwg-url "^5.0.0"