mirror of
https://github.com/Radarr/Radarr.git
synced 2026-04-18 21:35:51 -04:00
Compare commits
63 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1b4a6b1309 | |||
| fcebfe6759 | |||
| f890aadffa | |||
| a8695959f1 | |||
| 696bb845a5 | |||
| 301a6904c0 | |||
| 8b4621db61 | |||
| 822b597f26 | |||
| 737a0176d4 | |||
| 5dc541c69e | |||
| a9627771e6 | |||
| 5facab0744 | |||
| 63dde3eb89 | |||
| 144f564076 | |||
| a6205c1ad4 | |||
| 64f27bca4f | |||
| 8a84975954 | |||
| e923b2fc6c | |||
| a4136150d0 | |||
| 1f1f3cdaa2 | |||
| bd85936a62 | |||
| 93b2395228 | |||
| 14cccd3a23 | |||
| 006c9289de | |||
| 79cd2b2346 | |||
| f80272a659 | |||
| a158e008e9 | |||
| c798987379 | |||
| 097b46c49f | |||
| ddeb3a7840 | |||
| 50018d0325 | |||
| a37fc0dc1f | |||
| 39ad315e73 | |||
| 0559996566 | |||
| e7d4429fe4 | |||
| 6c494e9a92 | |||
| 62faa1aad8 | |||
| 907950e309 | |||
| 1caced614e | |||
| 5824ba963b | |||
| 7f2d5d8d10 | |||
| 81bffe243a | |||
| 2d6fde282a | |||
| 3125b038d5 | |||
| 89e25a6241 | |||
| 4db6688fe0 | |||
| 4ac1aeaf06 | |||
| e2ae743ee1 | |||
| 9ad316a6f5 | |||
| b643d2e23d | |||
| 6a03eddda9 | |||
| 1576bf1f17 | |||
| 6325b70e27 | |||
| 24206ad0a3 | |||
| 2fc7cbff89 | |||
| 55ef505d74 | |||
| cabdad6306 | |||
| 8d4b2dd21b | |||
| ad04031c99 | |||
| e9a5f87e45 | |||
| bc6ac0cd4b | |||
| c2328e4b79 | |||
| 36119facf0 |
+85
-50
@@ -9,13 +9,13 @@ variables:
|
|||||||
testsFolder: './_tests'
|
testsFolder: './_tests'
|
||||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||||
majorVersion: '4.1.0'
|
majorVersion: '4.2.0'
|
||||||
minorVersion: $[counter('minorVersion', 2000)]
|
minorVersion: $[counter('minorVersion', 2000)]
|
||||||
radarrVersion: '$(majorVersion).$(minorVersion)'
|
radarrVersion: '$(majorVersion).$(minorVersion)'
|
||||||
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
||||||
sentryOrg: 'servarr'
|
sentryOrg: 'servarr'
|
||||||
sentryUrl: 'https://sentry.servarr.com'
|
sentryUrl: 'https://sentry.servarr.com'
|
||||||
dotnetVersion: '6.0.201'
|
dotnetVersion: '6.0.300'
|
||||||
nodeVersion: '16.X'
|
nodeVersion: '16.X'
|
||||||
innoVersion: '6.2.0'
|
innoVersion: '6.2.0'
|
||||||
windowsImage: 'windows-2022'
|
windowsImage: 'windows-2022'
|
||||||
@@ -97,15 +97,14 @@ stages:
|
|||||||
- bash: |
|
- bash: |
|
||||||
BUNDLEDVERSIONS=${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}/Microsoft.NETCoreSdk.BundledVersions.props
|
BUNDLEDVERSIONS=${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}/Microsoft.NETCoreSdk.BundledVersions.props
|
||||||
echo $BUNDLEDVERSIONS
|
echo $BUNDLEDVERSIONS
|
||||||
grep osx-x64 $BUNDLEDVERSIONS
|
|
||||||
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||||
echo "BSD already enabled"
|
echo "Extra platforms already enabled"
|
||||||
else
|
else
|
||||||
echo "Enabling BSD support"
|
echo "Enabling extra platform support"
|
||||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' $BUNDLEDVERSIONS
|
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||||
fi
|
fi
|
||||||
displayName: Enable FreeBSD Support
|
displayName: Enable Extra Platform Support
|
||||||
- bash: ./build.sh --backend --enable-bsd
|
- bash: ./build.sh --backend --enable-extra-platforms
|
||||||
displayName: Build Radarr Backend
|
displayName: Build Radarr Backend
|
||||||
- bash: |
|
- bash: |
|
||||||
find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
|
find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
|
||||||
@@ -119,24 +118,28 @@ stages:
|
|||||||
displayName: Publish Backend
|
displayName: Publish Backend
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/win-x64/publish'
|
- publish: '$(testsFolder)/net6.0/win-x64/publish'
|
||||||
artifact: WindowsCoreTests
|
artifact: win-x64-tests
|
||||||
displayName: Publish Windows Test Package
|
displayName: Publish win-x64 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
|
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
|
||||||
artifact: LinuxCoreTests
|
artifact: linux-x64-tests
|
||||||
displayName: Publish Linux Test Package
|
displayName: Publish linux-x64 Test Package
|
||||||
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
|
- publish: '$(testsFolder)/net6.0/linux-x86/publish'
|
||||||
|
artifact: linux-x86-tests
|
||||||
|
displayName: Publish linux-x86 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
|
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
|
||||||
artifact: LinuxMuslCoreTests
|
artifact: linux-musl-x64-tests
|
||||||
displayName: Publish Linux Musl Test Package
|
displayName: Publish linux-musl-x64 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
|
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
|
||||||
artifact: FreebsdCoreTests
|
artifact: freebsd-x64-tests
|
||||||
displayName: Publish FreeBSD Test Package
|
displayName: Publish freebsd-x64 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
|
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
|
||||||
artifact: MacCoreTests
|
artifact: osx-x64-tests
|
||||||
displayName: Publish MacOS Test Package
|
displayName: Publish osx-x64 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
|
|
||||||
- stage: Build_Frontend
|
- stage: Build_Frontend
|
||||||
@@ -240,7 +243,7 @@ stages:
|
|||||||
artifactName: WindowsFrontend
|
artifactName: WindowsFrontend
|
||||||
targetPath: _output
|
targetPath: _output
|
||||||
displayName: Fetch Frontend
|
displayName: Fetch Frontend
|
||||||
- bash: ./build.sh --packages --enable-bsd
|
- bash: ./build.sh --packages --enable-extra-platforms
|
||||||
displayName: Create Packages
|
displayName: Create Packages
|
||||||
- bash: |
|
- bash: |
|
||||||
find . -name "ffprobe" -exec chmod a+x {} \;
|
find . -name "ffprobe" -exec chmod a+x {} \;
|
||||||
@@ -248,28 +251,28 @@ stages:
|
|||||||
find . -name "Radarr.Update" -exec chmod a+x {} \;
|
find . -name "Radarr.Update" -exec chmod a+x {} \;
|
||||||
displayName: Set executable bits
|
displayName: Set executable bits
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Windows Core zip
|
displayName: Create win-x64 zip
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Windows x86 Core zip
|
displayName: Create win-x86 zip
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x86.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x86.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
|
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS x64 Core app
|
displayName: Create osx-x64 app
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-x64.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-x64.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
|
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS x64 Core tar
|
displayName: Create osx-x64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-core-x64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-core-x64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -277,14 +280,14 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS arm64 Core app
|
displayName: Create osx-arm64 app
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-arm64.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-arm64.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
|
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS arm64 Core tar
|
displayName: Create osx-arm64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-core-arm64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-core-arm64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -292,7 +295,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Linux Core tar
|
displayName: Create linux-x64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-x64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-x64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -300,7 +303,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Linux Musl Core tar
|
displayName: Create linux-musl-x64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-musl-core-x64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-musl-core-x64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -308,7 +311,15 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM32 Linux Core tar
|
displayName: Create linux-x86 tar
|
||||||
|
inputs:
|
||||||
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-x86.tar.gz'
|
||||||
|
archiveType: 'tar'
|
||||||
|
tarCompression: 'gz'
|
||||||
|
includeRootFolder: false
|
||||||
|
rootFolderOrFile: $(artifactsFolder)/linux-x86/net6.0
|
||||||
|
- task: ArchiveFiles@2
|
||||||
|
displayName: Create linux-arm tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -316,7 +327,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM32 Linux Musl Core tar
|
displayName: Create linux-musl-arm tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-musl-core-arm.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-musl-core-arm.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -324,7 +335,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM64 Linux Core tar
|
displayName: Create linux-arm64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -332,7 +343,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM64 Linux Musl Core tar
|
displayName: Create linux-musl-arm64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-musl-core-arm64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-musl-core-arm64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -340,7 +351,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create FreeBSD Core Core tar
|
displayName: Create freebsd-x64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).freebsd-core-x64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).freebsd-core-x64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -407,22 +418,22 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
MacCore:
|
MacCore:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
testName: 'MacCore'
|
testName: 'osx-x64'
|
||||||
poolName: 'Azure Pipelines'
|
poolName: 'Azure Pipelines'
|
||||||
imageName: ${{ variables.macImage }}
|
imageName: ${{ variables.macImage }}
|
||||||
WindowsCore:
|
WindowsCore:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
testName: 'WindowsCore'
|
testName: 'win-x64'
|
||||||
poolName: 'Azure Pipelines'
|
poolName: 'Azure Pipelines'
|
||||||
imageName: ${{ variables.windowsImage }}
|
imageName: ${{ variables.windowsImage }}
|
||||||
LinuxCore:
|
LinuxCore:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
testName: 'LinuxCore'
|
testName: 'linux-x64'
|
||||||
poolName: 'Azure Pipelines'
|
poolName: 'Azure Pipelines'
|
||||||
imageName: ${{ variables.linuxImage }}
|
imageName: ${{ variables.linuxImage }}
|
||||||
FreebsdCore:
|
FreebsdCore:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
testName: 'FreebsdCore'
|
testName: 'freebsd-x64'
|
||||||
poolName: 'FreeBSD'
|
poolName: 'FreeBSD'
|
||||||
imageName:
|
imageName:
|
||||||
|
|
||||||
@@ -441,7 +452,7 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: '$(testName)Tests'
|
artifactName: '$(testName)-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- powershell: Set-Service SCardSvr -StartupType Manual
|
- powershell: Set-Service SCardSvr -StartupType Manual
|
||||||
displayName: Enable Windows Test Service
|
displayName: Enable Windows Test Service
|
||||||
@@ -475,8 +486,12 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
alpine:
|
alpine:
|
||||||
testName: 'Musl Net Core'
|
testName: 'Musl Net Core'
|
||||||
artifactName: LinuxMuslCoreTests
|
artifactName: linux-musl-x64-tests
|
||||||
containerImage: ghcr.io/servarr/testimages:alpine
|
containerImage: ghcr.io/servarr/testimages:alpine
|
||||||
|
linux-x86:
|
||||||
|
testName: 'linux-x86'
|
||||||
|
artifactName: linux-x86-tests
|
||||||
|
containerImage: ghcr.io/servarr/testimages:linux-x86
|
||||||
|
|
||||||
pool:
|
pool:
|
||||||
vmImage: ${{ variables.linuxImage }}
|
vmImage: ${{ variables.linuxImage }}
|
||||||
@@ -487,9 +502,15 @@ stages:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- task: UseDotNet@2
|
- task: UseDotNet@2
|
||||||
displayName: 'Install .net core'
|
displayName: 'Install .NET'
|
||||||
inputs:
|
inputs:
|
||||||
version: $(dotnetVersion)
|
version: $(dotnetVersion)
|
||||||
|
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
|
||||||
|
- bash: |
|
||||||
|
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
|
||||||
|
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
|
||||||
|
displayName: 'Install .NET'
|
||||||
|
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
|
||||||
- checkout: none
|
- checkout: none
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
@@ -522,7 +543,7 @@ stages:
|
|||||||
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
|
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
|
||||||
variables:
|
variables:
|
||||||
pattern: 'Radarr.*.linux-core-x64.tar.gz'
|
pattern: 'Radarr.*.linux-core-x64.tar.gz'
|
||||||
artifactName: LinuxCoreTests
|
artifactName: linux-x64-tests
|
||||||
Radarr__Postgres__Host: 'localhost'
|
Radarr__Postgres__Host: 'localhost'
|
||||||
Radarr__Postgres__Port: '5432'
|
Radarr__Postgres__Port: '5432'
|
||||||
Radarr__Postgres__User: 'radarr'
|
Radarr__Postgres__User: 'radarr'
|
||||||
@@ -597,17 +618,17 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
MacCore:
|
MacCore:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
testName: 'MacCore'
|
testName: 'osx-x64'
|
||||||
imageName: ${{ variables.macImage }}
|
imageName: ${{ variables.macImage }}
|
||||||
pattern: 'Radarr.*.osx-core-x64.tar.gz'
|
pattern: 'Radarr.*.osx-core-x64.tar.gz'
|
||||||
WindowsCore:
|
WindowsCore:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
testName: 'WindowsCore'
|
testName: 'win-x64'
|
||||||
imageName: ${{ variables.windowsImage }}
|
imageName: ${{ variables.windowsImage }}
|
||||||
pattern: 'Radarr.*.windows-core-x64.zip'
|
pattern: 'Radarr.*.windows-core-x64.zip'
|
||||||
LinuxCore:
|
LinuxCore:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
testName: 'LinuxCore'
|
testName: 'linux-x64'
|
||||||
imageName: ${{ variables.linuxImage }}
|
imageName: ${{ variables.linuxImage }}
|
||||||
pattern: 'Radarr.*.linux-core-x64.tar.gz'
|
pattern: 'Radarr.*.linux-core-x64.tar.gz'
|
||||||
|
|
||||||
@@ -624,7 +645,7 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: '$(testName)Tests'
|
artifactName: '$(testName)-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Build Artifact
|
displayName: Download Build Artifact
|
||||||
@@ -678,7 +699,7 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: 'LinuxCoreTests'
|
artifactName: 'linux-x64-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Build Artifact
|
displayName: Download Build Artifact
|
||||||
@@ -732,7 +753,7 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: 'FreebsdCoreTests'
|
artifactName: 'freebsd-x64-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Build Artifact
|
displayName: Download Build Artifact
|
||||||
@@ -768,10 +789,15 @@ stages:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
alpine:
|
alpine:
|
||||||
testName: 'Musl Net Core'
|
testName: 'linux-musl-x64'
|
||||||
artifactName: LinuxMuslCoreTests
|
artifactName: linux-musl-x64-tests
|
||||||
containerImage: ghcr.io/servarr/testimages:alpine
|
containerImage: ghcr.io/servarr/testimages:alpine
|
||||||
pattern: 'Radarr.*.linux-musl-core-x64.tar.gz'
|
pattern: 'Radarr.*.linux-musl-core-x64.tar.gz'
|
||||||
|
linux-x86:
|
||||||
|
testName: 'linux-x86'
|
||||||
|
artifactName: linux-x86-tests
|
||||||
|
containerImage: ghcr.io/servarr/testimages:linux-x86
|
||||||
|
pattern: 'Radarr.*.linux-core-x86.tar.gz'
|
||||||
pool:
|
pool:
|
||||||
vmImage: ${{ variables.linuxImage }}
|
vmImage: ${{ variables.linuxImage }}
|
||||||
|
|
||||||
@@ -781,9 +807,15 @@ stages:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- task: UseDotNet@2
|
- task: UseDotNet@2
|
||||||
displayName: 'Install .net core'
|
displayName: 'Install .NET'
|
||||||
inputs:
|
inputs:
|
||||||
version: $(dotnetVersion)
|
version: $(dotnetVersion)
|
||||||
|
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
|
||||||
|
- bash: |
|
||||||
|
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
|
||||||
|
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
|
||||||
|
displayName: 'Install .NET'
|
||||||
|
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
|
||||||
- checkout: none
|
- checkout: none
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
@@ -829,16 +861,19 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
Linux:
|
Linux:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
|
artifactName: 'linux-x64'
|
||||||
imageName: ${{ variables.linuxImage }}
|
imageName: ${{ variables.linuxImage }}
|
||||||
pattern: 'Radarr.*.linux-core-x64.tar.gz'
|
pattern: 'Radarr.*.linux-core-x64.tar.gz'
|
||||||
failBuild: true
|
failBuild: true
|
||||||
Mac:
|
Mac:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
|
artifactName: 'osx-x64'
|
||||||
imageName: ${{ variables.macImage }}
|
imageName: ${{ variables.macImage }}
|
||||||
pattern: 'Radarr.*.osx-core-x64.tar.gz'
|
pattern: 'Radarr.*.osx-core-x64.tar.gz'
|
||||||
failBuild: true
|
failBuild: true
|
||||||
Windows:
|
Windows:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
|
artifactName: 'win-x64'
|
||||||
imageName: ${{ variables.windowsImage }}
|
imageName: ${{ variables.windowsImage }}
|
||||||
pattern: 'Radarr.*.windows-core-x64.zip'
|
pattern: 'Radarr.*.windows-core-x64.zip'
|
||||||
failBuild: true
|
failBuild: true
|
||||||
@@ -856,7 +891,7 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: '$(osName)CoreTests'
|
artifactName: '$(artifactName)-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Build Artifact
|
displayName: Download Build Artifact
|
||||||
|
|||||||
@@ -25,14 +25,22 @@ UpdateVersionNumber()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
EnableBsdSupport()
|
EnableExtraPlatformsInSDK()
|
||||||
{
|
{
|
||||||
#todo enable sdk with
|
SDK_PATH=$(dotnet --list-sdks | grep -P '6\.\d\.\d+' | head -1 | sed 's/\(6\.[0-9]*\.[0-9]*\).*\[\(.*\)\]/\2\/\1/g')
|
||||||
#SDK_PATH=$(dotnet --list-sdks | grep -P '5\.\d\.\d+' | head -1 | sed 's/\(5\.[0-9]*\.[0-9]*\).*\[\(.*\)\]/\2\/\1/g')
|
BUNDLEDVERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
|
||||||
# BUNDLED_VERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
|
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||||
|
echo "Extra platforms already enabled"
|
||||||
|
else
|
||||||
|
echo "Enabling extra platform support"
|
||||||
|
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
EnableExtraPlatforms()
|
||||||
|
{
|
||||||
if grep -qv freebsd-x64 src/Directory.Build.props; then
|
if grep -qv freebsd-x64 src/Directory.Build.props; then
|
||||||
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64</RuntimeIdentifiers>^g" src/Directory.Build.props
|
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64;linux-x86</RuntimeIdentifiers>^g" src/Directory.Build.props
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,7 +300,8 @@ if [ $# -eq 0 ]; then
|
|||||||
PACKAGES=YES
|
PACKAGES=YES
|
||||||
INSTALLER=NO
|
INSTALLER=NO
|
||||||
LINT=YES
|
LINT=YES
|
||||||
ENABLE_BSD=NO
|
ENABLE_EXTRA_PLATFORMS=NO
|
||||||
|
ENABLE_EXTRA_PLATFORMS_IN_SDK=NO
|
||||||
fi
|
fi
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]
|
while [[ $# -gt 0 ]]
|
||||||
@@ -304,8 +313,12 @@ case $key in
|
|||||||
BACKEND=YES
|
BACKEND=YES
|
||||||
shift # past argument
|
shift # past argument
|
||||||
;;
|
;;
|
||||||
--enable-bsd)
|
--enable-bsd|--enable-extra-platforms)
|
||||||
ENABLE_BSD=YES
|
ENABLE_EXTRA_PLATFORMS=YES
|
||||||
|
shift # past argument
|
||||||
|
;;
|
||||||
|
--enable-extra-platforms-in-sdk)
|
||||||
|
ENABLE_EXTRA_PLATFORMS_IN_SDK=YES
|
||||||
shift # past argument
|
shift # past argument
|
||||||
;;
|
;;
|
||||||
-r|--runtime)
|
-r|--runtime)
|
||||||
@@ -349,12 +362,17 @@ esac
|
|||||||
done
|
done
|
||||||
set -- "${POSITIONAL[@]}" # restore positional parameters
|
set -- "${POSITIONAL[@]}" # restore positional parameters
|
||||||
|
|
||||||
|
if [ "$ENABLE_EXTRA_PLATFORMS_IN_SDK" = "YES" ];
|
||||||
|
then
|
||||||
|
EnableExtraPlatformsInSDK
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$BACKEND" = "YES" ];
|
if [ "$BACKEND" = "YES" ];
|
||||||
then
|
then
|
||||||
UpdateVersionNumber
|
UpdateVersionNumber
|
||||||
if [ "$ENABLE_BSD" = "YES" ];
|
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||||
then
|
then
|
||||||
EnableBsdSupport
|
EnableExtraPlatforms
|
||||||
fi
|
fi
|
||||||
Build
|
Build
|
||||||
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
||||||
@@ -364,9 +382,10 @@ then
|
|||||||
PackageTests "net6.0" "linux-x64"
|
PackageTests "net6.0" "linux-x64"
|
||||||
PackageTests "net6.0" "linux-musl-x64"
|
PackageTests "net6.0" "linux-musl-x64"
|
||||||
PackageTests "net6.0" "osx-x64"
|
PackageTests "net6.0" "osx-x64"
|
||||||
if [ "$ENABLE_BSD" = "YES" ];
|
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||||
then
|
then
|
||||||
PackageTests "net6.0" "freebsd-x64"
|
PackageTests "net6.0" "freebsd-x64"
|
||||||
|
PackageTests "net6.0" "linux-x86"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
PackageTests "$FRAMEWORK" "$RID"
|
PackageTests "$FRAMEWORK" "$RID"
|
||||||
@@ -405,9 +424,10 @@ then
|
|||||||
Package "net6.0" "linux-musl-arm"
|
Package "net6.0" "linux-musl-arm"
|
||||||
Package "net6.0" "osx-x64"
|
Package "net6.0" "osx-x64"
|
||||||
Package "net6.0" "osx-arm64"
|
Package "net6.0" "osx-arm64"
|
||||||
if [ "$ENABLE_BSD" = "YES" ];
|
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||||
then
|
then
|
||||||
Package "net6.0" "freebsd-x64"
|
Package "net6.0" "freebsd-x64"
|
||||||
|
Package "net6.0" "linux-x86"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
Package "$FRAMEWORK" "$RID"
|
Package "$FRAMEWORK" "$RID"
|
||||||
|
|||||||
@@ -179,6 +179,16 @@ class HistoryRow extends Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (name === 'sourceTitle') {
|
||||||
|
return (
|
||||||
|
<TableRowCell
|
||||||
|
key={name}
|
||||||
|
>
|
||||||
|
{sourceTitle}
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (name === 'details') {
|
if (name === 'details') {
|
||||||
return (
|
return (
|
||||||
<TableRowCell
|
<TableRowCell
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import AppRoutes from './AppRoutes';
|
|||||||
|
|
||||||
function App({ store, history }) {
|
function App({ store, history }) {
|
||||||
return (
|
return (
|
||||||
<DocumentTitle title="Radarr">
|
<DocumentTitle title={window.Radarr.instanceName}>
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<ConnectedRouter history={history}>
|
<ConnectedRouter history={history}>
|
||||||
<PageConnector>
|
<PageConnector>
|
||||||
|
|||||||
@@ -89,12 +89,12 @@ function AppUpdatedModalContent(props) {
|
|||||||
|
|
||||||
<UpdateChanges
|
<UpdateChanges
|
||||||
title={translate('New')}
|
title={translate('New')}
|
||||||
changes={update.changes.new}
|
changes={Array.from(new Set(update.changes.new))}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<UpdateChanges
|
<UpdateChanges
|
||||||
title={translate('Fixed')}
|
title={translate('Fixed')}
|
||||||
changes={update.changes.fixed}
|
changes={Array.from(new Set(update.changes.fixed))}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ class CollectionFooter extends Component {
|
|||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
const monitoredOptions = [
|
const monitoredOptions = [
|
||||||
{ key: NO_CHANGE, value: translate('No Change'), disabled: true },
|
{ key: NO_CHANGE, value: translate('NoChange'), disabled: true },
|
||||||
{ key: 'monitored', value: translate('Monitored') },
|
{ key: 'monitored', value: translate('Monitored') },
|
||||||
{ key: 'unmonitored', value: translate('Unmonitored') }
|
{ key: 'unmonitored', value: translate('Unmonitored') }
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
.movie {
|
||||||
|
display: flex;
|
||||||
|
align-items: stretch;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 2px 4px;
|
||||||
|
border: 1px solid $borderColor;
|
||||||
|
border-radius: 4px;
|
||||||
|
background-color: #eee;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.movieTitle {
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.movieStatus {
|
||||||
|
padding: 0 4px;
|
||||||
|
border-left: 4px;
|
||||||
|
border-left-style: solid;
|
||||||
|
background-color: $white;
|
||||||
|
color: $defaultColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
.primary {
|
||||||
|
border-color: $primaryColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
.danger {
|
||||||
|
border-color: $dangerColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
.success {
|
||||||
|
border-color: $successColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
.purple {
|
||||||
|
border-color: $purple;
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning {
|
||||||
|
border-color: $warningColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info {
|
||||||
|
border-color: $infoColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
.queue {
|
||||||
|
border-color: $queueColor;
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
import classNames from 'classnames';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import MonitorToggleButton from 'Components/MonitorToggleButton';
|
||||||
|
import getStatusStyle from 'Utilities/Movie/getStatusStyle';
|
||||||
|
import translate from 'Utilities/String/translate';
|
||||||
|
import styles from './CollectionMovieLabel.css';
|
||||||
|
|
||||||
|
class CollectionMovieLabel extends Component {
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
id,
|
||||||
|
title,
|
||||||
|
status,
|
||||||
|
monitored,
|
||||||
|
isAvailable,
|
||||||
|
hasFile,
|
||||||
|
onMonitorTogglePress,
|
||||||
|
isSaving
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.movie}>
|
||||||
|
<div className={styles.movieTitle}>
|
||||||
|
{
|
||||||
|
id &&
|
||||||
|
<MonitorToggleButton
|
||||||
|
monitored={monitored}
|
||||||
|
isSaving={isSaving}
|
||||||
|
onPress={onMonitorTogglePress}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
<span>
|
||||||
|
{
|
||||||
|
title
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{
|
||||||
|
id &&
|
||||||
|
<div
|
||||||
|
className={classNames(
|
||||||
|
styles.movieStatus,
|
||||||
|
styles[getStatusStyle(status, monitored, hasFile, isAvailable, 'kinds')]
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{
|
||||||
|
hasFile ? translate('Downloaded') : translate('Missing')
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CollectionMovieLabel.propTypes = {
|
||||||
|
id: PropTypes.number,
|
||||||
|
title: PropTypes.string.isRequired,
|
||||||
|
status: PropTypes.string,
|
||||||
|
isAvailable: PropTypes.bool,
|
||||||
|
monitored: PropTypes.bool,
|
||||||
|
hasFile: PropTypes.bool,
|
||||||
|
isSaving: PropTypes.bool.isRequired,
|
||||||
|
movieFile: PropTypes.object,
|
||||||
|
movieFileId: PropTypes.number,
|
||||||
|
onMonitorTogglePress: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
CollectionMovieLabel.defaultProps = {
|
||||||
|
isSaving: false,
|
||||||
|
statistics: {
|
||||||
|
episodeFileCount: 0,
|
||||||
|
totalEpisodeCount: 0,
|
||||||
|
percentOfEpisodes: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default CollectionMovieLabel;
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import { toggleMovieMonitored } from 'Store/Actions/movieActions';
|
||||||
|
import createCollectionExistingMovieSelector from 'Store/Selectors/createCollectionExistingMovieSelector';
|
||||||
|
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
||||||
|
import CollectionMovieLabel from './CollectionMovieLabel';
|
||||||
|
|
||||||
|
function createMapStateToProps() {
|
||||||
|
return createSelector(
|
||||||
|
createDimensionsSelector(),
|
||||||
|
createCollectionExistingMovieSelector(),
|
||||||
|
(dimensions, existingMovie) => {
|
||||||
|
return {
|
||||||
|
isSmallScreen: dimensions.isSmallScreen,
|
||||||
|
isExistingMovie: !!existingMovie,
|
||||||
|
...existingMovie
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const mapDispatchToProps = {
|
||||||
|
toggleMovieMonitored
|
||||||
|
};
|
||||||
|
|
||||||
|
class CollectionMovieLabelConnector extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Listeners
|
||||||
|
|
||||||
|
onMonitorTogglePress = (monitored) => {
|
||||||
|
this.props.toggleMovieMonitored({
|
||||||
|
movieId: this.props.id,
|
||||||
|
monitored
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<CollectionMovieLabel
|
||||||
|
{...this.props}
|
||||||
|
onMonitorTogglePress={this.onMonitorTogglePress}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CollectionMovieLabelConnector.propTypes = {
|
||||||
|
id: PropTypes.number,
|
||||||
|
monitored: PropTypes.bool,
|
||||||
|
toggleMovieMonitored: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default connect(createMapStateToProps, mapDispatchToProps)(CollectionMovieLabelConnector);
|
||||||
@@ -32,6 +32,11 @@ $hoverScale: 1.05;
|
|||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.labelsContainer {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
.moviesContainer {
|
.moviesContainer {
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
|
import Slider from 'react-slick';
|
||||||
import TextTruncate from 'react-text-truncate';
|
import TextTruncate from 'react-text-truncate';
|
||||||
import EditCollectionModalConnector from 'Collection/Edit/EditCollectionModalConnector';
|
import EditCollectionModalConnector from 'Collection/Edit/EditCollectionModalConnector';
|
||||||
import Carousel from 'Components/Carousel';
|
|
||||||
import CheckInput from 'Components/Form/CheckInput';
|
import CheckInput from 'Components/Form/CheckInput';
|
||||||
import Icon from 'Components/Icon';
|
import Icon from 'Components/Icon';
|
||||||
import Label from 'Components/Label';
|
import Label from 'Components/Label';
|
||||||
@@ -14,8 +14,12 @@ import dimensions from 'Styles/Variables/dimensions';
|
|||||||
import fonts from 'Styles/Variables/fonts';
|
import fonts from 'Styles/Variables/fonts';
|
||||||
import translate from 'Utilities/String/translate';
|
import translate from 'Utilities/String/translate';
|
||||||
import CollectionMovieConnector from './CollectionMovieConnector';
|
import CollectionMovieConnector from './CollectionMovieConnector';
|
||||||
|
import CollectionMovieLabelConnector from './CollectionMovieLabelConnector';
|
||||||
import styles from './CollectionOverview.css';
|
import styles from './CollectionOverview.css';
|
||||||
|
|
||||||
|
import 'slick-carousel/slick/slick.css';
|
||||||
|
import 'slick-carousel/slick/slick-theme.css';
|
||||||
|
|
||||||
const columnPadding = parseInt(dimensions.movieIndexColumnPadding);
|
const columnPadding = parseInt(dimensions.movieIndexColumnPadding);
|
||||||
const columnPaddingSmallScreen = parseInt(dimensions.movieIndexColumnPaddingSmallScreen);
|
const columnPaddingSmallScreen = parseInt(dimensions.movieIndexColumnPaddingSmallScreen);
|
||||||
const defaultFontSize = parseInt(fonts.defaultFontSize);
|
const defaultFontSize = parseInt(fonts.defaultFontSize);
|
||||||
@@ -105,6 +109,7 @@ class CollectionOverview extends Component {
|
|||||||
const {
|
const {
|
||||||
showDetails,
|
showDetails,
|
||||||
showOverview,
|
showOverview,
|
||||||
|
showPosters,
|
||||||
detailedProgressBar
|
detailedProgressBar
|
||||||
} = this.props.overviewOptions;
|
} = this.props.overviewOptions;
|
||||||
|
|
||||||
@@ -115,6 +120,15 @@ class CollectionOverview extends Component {
|
|||||||
const contentHeight = getContentHeight(rowHeight, isSmallScreen);
|
const contentHeight = getContentHeight(rowHeight, isSmallScreen);
|
||||||
const overviewHeight = contentHeight - titleRowHeight - posterHeight;
|
const overviewHeight = contentHeight - titleRowHeight - posterHeight;
|
||||||
|
|
||||||
|
const sliderSettings = {
|
||||||
|
arrows: false,
|
||||||
|
dots: false,
|
||||||
|
infinite: false,
|
||||||
|
slidesToShow: 1,
|
||||||
|
slidesToScroll: 1,
|
||||||
|
variableWidth: true
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<div className={styles.content}>
|
<div className={styles.content}>
|
||||||
@@ -149,21 +163,25 @@ class CollectionOverview extends Component {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={styles.navigationButtons}>
|
{
|
||||||
<IconButton
|
showPosters &&
|
||||||
name={icons.ARROW_LEFT}
|
<div className={styles.navigationButtons}>
|
||||||
title={translate('ScrollMovies')}
|
<IconButton
|
||||||
onPress={this.state.slider?.slickPrev}
|
name={icons.ARROW_LEFT}
|
||||||
size={20}
|
title={translate('ScrollMovies')}
|
||||||
/>
|
onPress={this.state.slider?.slickPrev}
|
||||||
|
size={20}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<IconButton
|
||||||
|
name={icons.ARROW_RIGHT}
|
||||||
|
title={translate('ScrollMovies')}
|
||||||
|
onPress={this.state.slider?.slickNext}
|
||||||
|
size={20}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<IconButton
|
|
||||||
name={icons.ARROW_RIGHT}
|
|
||||||
title={translate('ScrollMovies')}
|
|
||||||
onPress={this.state.slider?.slickNext}
|
|
||||||
size={20}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -249,22 +267,35 @@ class CollectionOverview extends Component {
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<div className={styles.sliderContainer}>
|
{
|
||||||
<Carousel setRef={this.setSliderRef}>
|
showPosters ?
|
||||||
{movies.map((movie) => (
|
<div className={styles.sliderContainer}>
|
||||||
<div className={styles.movie} key={movie.tmdbId}>
|
<Slider ref={this.setSliderRef} {...sliderSettings}>
|
||||||
<CollectionMovieConnector
|
{movies.map((movie) => (
|
||||||
|
<div className={styles.movie} key={movie.tmdbId}>
|
||||||
|
<CollectionMovieConnector
|
||||||
|
key={movie.tmdbId}
|
||||||
|
posterWidth={posterWidth}
|
||||||
|
posterHeight={posterHeight}
|
||||||
|
detailedProgressBar={detailedProgressBar}
|
||||||
|
collectionId={id}
|
||||||
|
{...movie}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</Slider>
|
||||||
|
</div> :
|
||||||
|
<div className={styles.labelsContainer}>
|
||||||
|
{movies.map((movie) => (
|
||||||
|
<CollectionMovieLabelConnector
|
||||||
key={movie.tmdbId}
|
key={movie.tmdbId}
|
||||||
posterWidth={posterWidth}
|
|
||||||
posterHeight={posterHeight}
|
|
||||||
detailedProgressBar={detailedProgressBar}
|
|
||||||
collectionId={id}
|
collectionId={id}
|
||||||
{...movie}
|
{...movie}
|
||||||
/>
|
/>
|
||||||
</div>
|
))}
|
||||||
))}
|
</div>
|
||||||
</Carousel>
|
}
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ function calculatePosterWidth(posterSize, isSmallScreen) {
|
|||||||
function calculateRowHeight(posterHeight, sortKey, isSmallScreen, overviewOptions) {
|
function calculateRowHeight(posterHeight, sortKey, isSmallScreen, overviewOptions) {
|
||||||
|
|
||||||
const heights = [
|
const heights = [
|
||||||
posterHeight,
|
overviewOptions.showPosters ? posterHeight : 75,
|
||||||
isSmallScreen ? columnPaddingSmallScreen : columnPadding
|
isSmallScreen ? columnPaddingSmallScreen : columnPadding
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ class CollectionOverviewOptionsModalContent extends Component {
|
|||||||
detailedProgressBar: props.detailedProgressBar,
|
detailedProgressBar: props.detailedProgressBar,
|
||||||
size: props.size,
|
size: props.size,
|
||||||
showDetails: props.showDetails,
|
showDetails: props.showDetails,
|
||||||
showOverview: props.showOverview
|
showOverview: props.showOverview,
|
||||||
|
showPosters: props.showPosters
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +41,8 @@ class CollectionOverviewOptionsModalContent extends Component {
|
|||||||
detailedProgressBar,
|
detailedProgressBar,
|
||||||
size,
|
size,
|
||||||
showDetails,
|
showDetails,
|
||||||
showOverview
|
showOverview,
|
||||||
|
showPosters
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const state = {};
|
const state = {};
|
||||||
@@ -61,6 +63,10 @@ class CollectionOverviewOptionsModalContent extends Component {
|
|||||||
state.showOverview = showOverview;
|
state.showOverview = showOverview;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (showPosters !== prevProps.showPosters) {
|
||||||
|
state.showPosters = showPosters;
|
||||||
|
}
|
||||||
|
|
||||||
if (!_.isEmpty(state)) {
|
if (!_.isEmpty(state)) {
|
||||||
this.setState(state);
|
this.setState(state);
|
||||||
}
|
}
|
||||||
@@ -99,13 +105,14 @@ class CollectionOverviewOptionsModalContent extends Component {
|
|||||||
size,
|
size,
|
||||||
detailedProgressBar,
|
detailedProgressBar,
|
||||||
showDetails,
|
showDetails,
|
||||||
|
showPosters,
|
||||||
showOverview
|
showOverview
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ModalContent onModalClose={onModalClose}>
|
<ModalContent onModalClose={onModalClose}>
|
||||||
<ModalHeader>
|
<ModalHeader>
|
||||||
Overview Options
|
{translate('CollectionOptions')}
|
||||||
</ModalHeader>
|
</ModalHeader>
|
||||||
|
|
||||||
<ModalBody>
|
<ModalBody>
|
||||||
@@ -141,6 +148,7 @@ class CollectionOverviewOptionsModalContent extends Component {
|
|||||||
type={inputTypes.CHECK}
|
type={inputTypes.CHECK}
|
||||||
name="showDetails"
|
name="showDetails"
|
||||||
value={showDetails}
|
value={showDetails}
|
||||||
|
helpText={translate('CollectionShowDetailsHelpText')}
|
||||||
onChange={this.onChangeOverviewOption}
|
onChange={this.onChangeOverviewOption}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
@@ -152,6 +160,19 @@ class CollectionOverviewOptionsModalContent extends Component {
|
|||||||
type={inputTypes.CHECK}
|
type={inputTypes.CHECK}
|
||||||
name="showOverview"
|
name="showOverview"
|
||||||
value={showOverview}
|
value={showOverview}
|
||||||
|
helpText={translate('CollectionShowOverviewsHelpText')}
|
||||||
|
onChange={this.onChangeOverviewOption}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('ShowPosters')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.CHECK}
|
||||||
|
name="showPosters"
|
||||||
|
value={showPosters}
|
||||||
|
helpText={translate('CollectionShowPostersHelpText')}
|
||||||
onChange={this.onChangeOverviewOption}
|
onChange={this.onChangeOverviewOption}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
@@ -175,6 +196,7 @@ CollectionOverviewOptionsModalContent.propTypes = {
|
|||||||
size: PropTypes.string.isRequired,
|
size: PropTypes.string.isRequired,
|
||||||
showDetails: PropTypes.bool.isRequired,
|
showDetails: PropTypes.bool.isRequired,
|
||||||
showOverview: PropTypes.bool.isRequired,
|
showOverview: PropTypes.bool.isRequired,
|
||||||
|
showPosters: PropTypes.bool.isRequired,
|
||||||
onChangeOverviewOption: PropTypes.func.isRequired,
|
onChangeOverviewOption: PropTypes.func.isRequired,
|
||||||
onChangeOption: PropTypes.func.isRequired,
|
onChangeOption: PropTypes.func.isRequired,
|
||||||
onModalClose: PropTypes.func.isRequired
|
onModalClose: PropTypes.func.isRequired
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
import PropTypes from 'prop-types';
|
|
||||||
import React from 'react';
|
|
||||||
import Slider from 'react-slick';
|
|
||||||
import styles from './Alert.css';
|
|
||||||
|
|
||||||
import 'slick-carousel/slick/slick.css';
|
|
||||||
import 'slick-carousel/slick/slick-theme.css';
|
|
||||||
|
|
||||||
function Carousel({ className, setRef, children, ...otherProps }) {
|
|
||||||
|
|
||||||
const sliderSettings = {
|
|
||||||
arrows: false,
|
|
||||||
dots: false,
|
|
||||||
infinite: false,
|
|
||||||
slidesToShow: 1,
|
|
||||||
slidesToScroll: 1,
|
|
||||||
variableWidth: true
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Slider ref={setRef} {...sliderSettings}>
|
|
||||||
{children}
|
|
||||||
</Slider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Carousel.propTypes = {
|
|
||||||
className: PropTypes.string.isRequired,
|
|
||||||
setRef: PropTypes.func.isRequired,
|
|
||||||
children: PropTypes.node.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
Carousel.defaultProps = {
|
|
||||||
className: styles.alert
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Carousel;
|
|
||||||
@@ -14,7 +14,7 @@ function PageContent(props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ErrorBoundary errorComponent={PageContentError}>
|
<ErrorBoundary errorComponent={PageContentError}>
|
||||||
<DocumentTitle title={title ? `${title} - Radarr` : 'Radarr'}>
|
<DocumentTitle title={title ? `${title} - ${window.Radarr.instanceName}` : window.Radarr.instanceName}>
|
||||||
<div className={className}>
|
<div className={className}>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import SelectInput from 'Components/Form/SelectInput';
|
|||||||
import SpinnerButton from 'Components/Link/SpinnerButton';
|
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||||
import PageContentFooter from 'Components/Page/PageContentFooter';
|
import PageContentFooter from 'Components/Page/PageContentFooter';
|
||||||
import { kinds } from 'Helpers/Props';
|
import { kinds } from 'Helpers/Props';
|
||||||
|
import monitorOptions from 'Utilities/Movie/monitorOptions';
|
||||||
import translate from 'Utilities/String/translate';
|
import translate from 'Utilities/String/translate';
|
||||||
import DiscoverMovieFooterLabel from './DiscoverMovieFooterLabel';
|
import DiscoverMovieFooterLabel from './DiscoverMovieFooterLabel';
|
||||||
import ExcludeMovieModal from './Exclusion/ExcludeMovieModal';
|
import ExcludeMovieModal from './Exclusion/ExcludeMovieModal';
|
||||||
@@ -137,11 +138,6 @@ class DiscoverMovieFooter extends Component {
|
|||||||
isExcludeMovieModalOpen
|
isExcludeMovieModalOpen
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
const monitoredOptions = [
|
|
||||||
{ key: true, value: translate('Monitored') },
|
|
||||||
{ key: false, value: translate('Unmonitored') }
|
|
||||||
];
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageContentFooter>
|
<PageContentFooter>
|
||||||
<div className={styles.inputContainer}>
|
<div className={styles.inputContainer}>
|
||||||
@@ -153,7 +149,7 @@ class DiscoverMovieFooter extends Component {
|
|||||||
<SelectInput
|
<SelectInput
|
||||||
name="monitor"
|
name="monitor"
|
||||||
value={monitor}
|
value={monitor}
|
||||||
values={monitoredOptions}
|
values={monitorOptions}
|
||||||
isDisabled={!selectedCount}
|
isDisabled={!selectedCount}
|
||||||
onChange={onInputChange}
|
onChange={onInputChange}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ const filterExistingFilesOptions = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const importModeOptions = [
|
const importModeOptions = [
|
||||||
|
{ key: 'chooseImportMode', value: translate('ChooseImportMode'), disabled: true },
|
||||||
{ key: 'move', value: translate('MoveFiles') },
|
{ key: 'move', value: translate('MoveFiles') },
|
||||||
{ key: 'copy', value: translate('HardlinkCopyFiles') }
|
{ key: 'copy', value: translate('HardlinkCopyFiles') }
|
||||||
];
|
];
|
||||||
|
|||||||
+10
-2
@@ -1,4 +1,3 @@
|
|||||||
import _ from 'lodash';
|
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
@@ -101,9 +100,18 @@ class InteractiveImportModalContentConnector extends Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onImportSelectedPress = (selected, importMode) => {
|
onImportSelectedPress = (selected, importMode) => {
|
||||||
|
const {
|
||||||
|
items
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
const files = [];
|
const files = [];
|
||||||
|
|
||||||
_.forEach(this.props.items, (item) => {
|
if (importMode === 'chooseImportMode') {
|
||||||
|
this.setState({ interactiveImportErrorMessage: 'An import mode must be selected' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
items.forEach((item) => {
|
||||||
const isSelected = selected.indexOf(item.id) > -1;
|
const isSelected = selected.indexOf(item.id) > -1;
|
||||||
|
|
||||||
if (isSelected) {
|
if (isSelected) {
|
||||||
|
|||||||
+6
@@ -7,3 +7,9 @@
|
|||||||
.filteredMessage {
|
.filteredMessage {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.blankpad {
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
+35
-63
@@ -2,15 +2,12 @@ import PropTypes from 'prop-types';
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Icon from 'Components/Icon';
|
import Icon from 'Components/Icon';
|
||||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
import FilterMenu from 'Components/Menu/FilterMenu';
|
|
||||||
import PageMenuButton from 'Components/Menu/PageMenuButton';
|
|
||||||
import Table from 'Components/Table/Table';
|
import Table from 'Components/Table/Table';
|
||||||
import TableBody from 'Components/Table/TableBody';
|
import TableBody from 'Components/Table/TableBody';
|
||||||
import { align, icons, sortDirections } from 'Helpers/Props';
|
import { icons, sortDirections } from 'Helpers/Props';
|
||||||
import translate from 'Utilities/String/translate';
|
import translate from 'Utilities/String/translate';
|
||||||
import InteractiveSearchFilterModalConnector from './InteractiveSearchFilterModalConnector';
|
|
||||||
import InteractiveSearchRowConnector from './InteractiveSearchRowConnector';
|
import InteractiveSearchRowConnector from './InteractiveSearchRowConnector';
|
||||||
import styles from './InteractiveSearch.css';
|
import styles from './InteractiveSearchContent.css';
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
@@ -25,6 +22,20 @@ const columns = [
|
|||||||
isSortable: true,
|
isSortable: true,
|
||||||
isVisible: true
|
isVisible: true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'releaseWeight',
|
||||||
|
label: React.createElement(Icon, { name: icons.DOWNLOAD }),
|
||||||
|
isSortable: true,
|
||||||
|
fixedSortDirection: sortDirections.ASCENDING,
|
||||||
|
isVisible: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'rejections',
|
||||||
|
label: React.createElement(Icon, { name: icons.DANGER }),
|
||||||
|
isSortable: true,
|
||||||
|
fixedSortDirection: sortDirections.ASCENDING,
|
||||||
|
isVisible: true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'title',
|
name: 'title',
|
||||||
label: translate('Title'),
|
label: translate('Title'),
|
||||||
@@ -88,24 +99,10 @@ const columns = [
|
|||||||
label: React.createElement(Icon, { name: icons.FLAG }),
|
label: React.createElement(Icon, { name: icons.FLAG }),
|
||||||
isSortable: true,
|
isSortable: true,
|
||||||
isVisible: true
|
isVisible: true
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'rejections',
|
|
||||||
label: React.createElement(Icon, { name: icons.DANGER }),
|
|
||||||
isSortable: true,
|
|
||||||
fixedSortDirection: sortDirections.ASCENDING,
|
|
||||||
isVisible: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'releaseWeight',
|
|
||||||
label: React.createElement(Icon, { name: icons.DOWNLOAD }),
|
|
||||||
isSortable: true,
|
|
||||||
fixedSortDirection: sortDirections.ASCENDING,
|
|
||||||
isVisible: true
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
function InteractiveSearch(props) {
|
function InteractiveSearchContent(props) {
|
||||||
const {
|
const {
|
||||||
searchPayload,
|
searchPayload,
|
||||||
isFetching,
|
isFetching,
|
||||||
@@ -113,63 +110,44 @@ function InteractiveSearch(props) {
|
|||||||
error,
|
error,
|
||||||
totalReleasesCount,
|
totalReleasesCount,
|
||||||
items,
|
items,
|
||||||
selectedFilterKey,
|
|
||||||
filters,
|
|
||||||
customFilters,
|
|
||||||
sortKey,
|
sortKey,
|
||||||
sortDirection,
|
sortDirection,
|
||||||
longDateFormat,
|
longDateFormat,
|
||||||
timeFormat,
|
timeFormat,
|
||||||
onSortPress,
|
onSortPress,
|
||||||
onFilterSelect,
|
|
||||||
onGrabPress
|
onGrabPress
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className={styles.filterMenuContainer}>
|
|
||||||
<FilterMenu
|
|
||||||
alignMenu={align.RIGHT}
|
|
||||||
selectedFilterKey={selectedFilterKey}
|
|
||||||
filters={filters}
|
|
||||||
customFilters={customFilters}
|
|
||||||
buttonComponent={PageMenuButton}
|
|
||||||
filterModalConnectorComponent={InteractiveSearchFilterModalConnector}
|
|
||||||
filterModalConnectorComponentProps={'movies'}
|
|
||||||
onFilterSelect={onFilterSelect}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{
|
{
|
||||||
isFetching ? <LoadingIndicator /> : null
|
isFetching &&
|
||||||
|
<LoadingIndicator />
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
!isFetching && error ?
|
!isFetching && !!error &&
|
||||||
<div>
|
<div className={styles.blankpad}>
|
||||||
{translate('UnableToLoadResultsIntSearch')}
|
{translate('UnableToLoadResultsIntSearch')}
|
||||||
</div> :
|
</div>
|
||||||
null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
!isFetching && isPopulated && !totalReleasesCount ?
|
!isFetching && isPopulated && !totalReleasesCount &&
|
||||||
<div>
|
<div className={styles.blankpad}>
|
||||||
{translate('NoResultsFound')}
|
{translate('NoResultsFound')}
|
||||||
</div> :
|
</div>
|
||||||
null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
!!totalReleasesCount && isPopulated && !items.length ?
|
!!totalReleasesCount && isPopulated && !items.length &&
|
||||||
<div>
|
<div className={styles.blankpad}>
|
||||||
{translate('AllResultsHiddenFilter')}
|
{translate('AllResultsHiddenFilter')}
|
||||||
</div> :
|
</div>
|
||||||
null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
isPopulated && !!items.length ?
|
isPopulated && !!items.length &&
|
||||||
<Table
|
<Table
|
||||||
columns={columns}
|
columns={columns}
|
||||||
sortKey={sortKey}
|
sortKey={sortKey}
|
||||||
@@ -181,7 +159,7 @@ function InteractiveSearch(props) {
|
|||||||
items.map((item) => {
|
items.map((item) => {
|
||||||
return (
|
return (
|
||||||
<InteractiveSearchRowConnector
|
<InteractiveSearchRowConnector
|
||||||
key={item.guid}
|
key={`${item.indexerId}-${item.guid}`}
|
||||||
{...item}
|
{...item}
|
||||||
searchPayload={searchPayload}
|
searchPayload={searchPayload}
|
||||||
longDateFormat={longDateFormat}
|
longDateFormat={longDateFormat}
|
||||||
@@ -192,38 +170,32 @@ function InteractiveSearch(props) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
</TableBody>
|
</TableBody>
|
||||||
</Table> :
|
</Table>
|
||||||
null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
totalReleasesCount !== items.length && !!items.length ?
|
totalReleasesCount !== items.length && !!items.length &&
|
||||||
<div className={styles.filteredMessage}>
|
<div className={styles.filteredMessage}>
|
||||||
{translate('SomeResultsHiddenFilter')}
|
{translate('SomeResultsHiddenFilter')}
|
||||||
</div> :
|
</div>
|
||||||
null
|
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
InteractiveSearch.propTypes = {
|
InteractiveSearchContent.propTypes = {
|
||||||
searchPayload: PropTypes.object.isRequired,
|
searchPayload: PropTypes.object.isRequired,
|
||||||
isFetching: PropTypes.bool.isRequired,
|
isFetching: PropTypes.bool.isRequired,
|
||||||
isPopulated: PropTypes.bool.isRequired,
|
isPopulated: PropTypes.bool.isRequired,
|
||||||
error: PropTypes.object,
|
error: PropTypes.object,
|
||||||
totalReleasesCount: PropTypes.number.isRequired,
|
totalReleasesCount: PropTypes.number.isRequired,
|
||||||
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
selectedFilterKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
|
|
||||||
filters: PropTypes.arrayOf(PropTypes.object).isRequired,
|
|
||||||
customFilters: PropTypes.arrayOf(PropTypes.object).isRequired,
|
|
||||||
sortKey: PropTypes.string,
|
sortKey: PropTypes.string,
|
||||||
sortDirection: PropTypes.string,
|
sortDirection: PropTypes.string,
|
||||||
longDateFormat: PropTypes.string.isRequired,
|
longDateFormat: PropTypes.string.isRequired,
|
||||||
timeFormat: PropTypes.string.isRequired,
|
timeFormat: PropTypes.string.isRequired,
|
||||||
onSortPress: PropTypes.func.isRequired,
|
onSortPress: PropTypes.func.isRequired,
|
||||||
onFilterSelect: PropTypes.func.isRequired,
|
|
||||||
onGrabPress: PropTypes.func.isRequired
|
onGrabPress: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
export default InteractiveSearch;
|
export default InteractiveSearchContent;
|
||||||
+5
-5
@@ -5,7 +5,7 @@ import { createSelector } from 'reselect';
|
|||||||
import * as releaseActions from 'Store/Actions/releaseActions';
|
import * as releaseActions from 'Store/Actions/releaseActions';
|
||||||
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
|
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
|
||||||
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||||
import InteractiveSearch from './InteractiveSearch';
|
import InteractiveSearchContent from './InteractiveSearchContent';
|
||||||
|
|
||||||
function createMapStateToProps(appState) {
|
function createMapStateToProps(appState) {
|
||||||
return createSelector(
|
return createSelector(
|
||||||
@@ -48,7 +48,7 @@ function createMapDispatchToProps(dispatch, props) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
class InteractiveSearchConnector extends Component {
|
class InteractiveSearchContentConnector extends Component {
|
||||||
|
|
||||||
//
|
//
|
||||||
// Lifecycle
|
// Lifecycle
|
||||||
@@ -79,18 +79,18 @@ class InteractiveSearchConnector extends Component {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
||||||
<InteractiveSearch
|
<InteractiveSearchContent
|
||||||
{...otherProps}
|
{...otherProps}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InteractiveSearchConnector.propTypes = {
|
InteractiveSearchContentConnector.propTypes = {
|
||||||
searchPayload: PropTypes.object.isRequired,
|
searchPayload: PropTypes.object.isRequired,
|
||||||
isPopulated: PropTypes.bool.isRequired,
|
isPopulated: PropTypes.bool.isRequired,
|
||||||
dispatchFetchReleases: PropTypes.func.isRequired,
|
dispatchFetchReleases: PropTypes.func.isRequired,
|
||||||
dispatchClearReleases: PropTypes.func.isRequired
|
dispatchClearReleases: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
export default connect(createMapStateToProps, createMapDispatchToProps)(InteractiveSearchConnector);
|
export default connect(createMapStateToProps, createMapDispatchToProps)(InteractiveSearchContentConnector);
|
||||||
@@ -1,20 +1,15 @@
|
|||||||
.protocol {
|
.cell {
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
}
|
||||||
|
|
||||||
|
.protocol {
|
||||||
|
composes: cell;
|
||||||
|
|
||||||
width: 80px;
|
width: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
.indexer {
|
.indexer {
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
composes: cell;
|
||||||
|
|
||||||
width: 85px;
|
width: 85px;
|
||||||
}
|
}
|
||||||
@@ -22,9 +17,7 @@
|
|||||||
.quality,
|
.quality,
|
||||||
.customFormat,
|
.customFormat,
|
||||||
.language {
|
.language {
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
composes: cell;
|
||||||
|
|
||||||
text-align: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.language {
|
.language {
|
||||||
@@ -32,7 +25,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.customFormatScore {
|
.customFormatScore {
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
composes: cell;
|
||||||
|
|
||||||
width: 55px;
|
width: 55px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -42,26 +35,34 @@
|
|||||||
.rejected,
|
.rejected,
|
||||||
.indexerFlags,
|
.indexerFlags,
|
||||||
.download {
|
.download {
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
composes: cell;
|
||||||
|
|
||||||
width: 50px;
|
width: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.age,
|
.age,
|
||||||
.size {
|
.size {
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
composes: cell;
|
||||||
|
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.peers {
|
.peers {
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
composes: cell;
|
||||||
|
|
||||||
width: 75px;
|
width: 75px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
composes: cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title div {
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
.history {
|
.history {
|
||||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
composes: cell;
|
||||||
|
|
||||||
width: 75px;
|
width: 75px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,6 +145,46 @@ class InteractiveSearchRow extends Component {
|
|||||||
{formatAge(age, ageHours, ageMinutes)}
|
{formatAge(age, ageHours, ageMinutes)}
|
||||||
</TableRowCell>
|
</TableRowCell>
|
||||||
|
|
||||||
|
<TableRowCell className={styles.download}>
|
||||||
|
<SpinnerIconButton
|
||||||
|
name={getDownloadIcon(isGrabbing, isGrabbed, grabError)}
|
||||||
|
kind={grabError ? kinds.DANGER : kinds.DEFAULT}
|
||||||
|
title={getDownloadTooltip(isGrabbing, isGrabbed, grabError)}
|
||||||
|
isDisabled={isGrabbed}
|
||||||
|
isSpinning={isGrabbing}
|
||||||
|
onPress={downloadAllowed ? this.onGrabPress : this.onConfirmGrabPress}
|
||||||
|
/>
|
||||||
|
</TableRowCell>
|
||||||
|
|
||||||
|
<TableRowCell className={styles.rejected}>
|
||||||
|
{
|
||||||
|
!!rejections.length &&
|
||||||
|
<Popover
|
||||||
|
anchor={
|
||||||
|
<Icon
|
||||||
|
name={icons.DANGER}
|
||||||
|
kind={kinds.DANGER}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
title={translate('ReleaseRejected')}
|
||||||
|
body={
|
||||||
|
<ul>
|
||||||
|
{
|
||||||
|
rejections.map((rejection, index) => {
|
||||||
|
return (
|
||||||
|
<li key={index}>
|
||||||
|
{rejection}
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
}
|
||||||
|
position={tooltipPositions.BOTTOM}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
</TableRowCell>
|
||||||
|
|
||||||
<TableRowCell className={styles.title}>
|
<TableRowCell className={styles.title}>
|
||||||
<Link
|
<Link
|
||||||
to={infoUrl}
|
to={infoUrl}
|
||||||
@@ -257,46 +297,6 @@ class InteractiveSearchRow extends Component {
|
|||||||
}
|
}
|
||||||
</TableRowCell>
|
</TableRowCell>
|
||||||
|
|
||||||
<TableRowCell className={styles.rejected}>
|
|
||||||
{
|
|
||||||
!!rejections.length &&
|
|
||||||
<Popover
|
|
||||||
anchor={
|
|
||||||
<Icon
|
|
||||||
name={icons.DANGER}
|
|
||||||
kind={kinds.DANGER}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
title={translate('ReleaseRejected')}
|
|
||||||
body={
|
|
||||||
<ul>
|
|
||||||
{
|
|
||||||
rejections.map((rejection, index) => {
|
|
||||||
return (
|
|
||||||
<li key={index}>
|
|
||||||
{rejection}
|
|
||||||
</li>
|
|
||||||
);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</ul>
|
|
||||||
}
|
|
||||||
position={tooltipPositions.LEFT}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
</TableRowCell>
|
|
||||||
|
|
||||||
<TableRowCell className={styles.download}>
|
|
||||||
<SpinnerIconButton
|
|
||||||
name={getDownloadIcon(isGrabbing, isGrabbed, grabError)}
|
|
||||||
kind={grabError ? kinds.DANGER : kinds.DEFAULT}
|
|
||||||
title={getDownloadTooltip(isGrabbing, isGrabbed, grabError)}
|
|
||||||
isDisabled={isGrabbed}
|
|
||||||
isSpinning={isGrabbing}
|
|
||||||
onPress={downloadAllowed ? this.onGrabPress : this.onConfirmGrabPress}
|
|
||||||
/>
|
|
||||||
</TableRowCell>
|
|
||||||
|
|
||||||
<ConfirmModal
|
<ConfirmModal
|
||||||
isOpen={this.state.isConfirmGrabModalOpen}
|
isOpen={this.state.isConfirmGrabModalOpen}
|
||||||
kind={kinds.WARNING}
|
kind={kinds.WARNING}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import InteractiveSearchContentConnector from './InteractiveSearchContentConnector';
|
||||||
|
|
||||||
|
function InteractiveSearchTable(props) {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<InteractiveSearchContentConnector
|
||||||
|
searchPayload={props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
InteractiveSearchTable.propTypes = {
|
||||||
|
};
|
||||||
|
|
||||||
|
export default InteractiveSearchTable;
|
||||||
@@ -69,8 +69,7 @@ class MovieCastPoster extends Component {
|
|||||||
|
|
||||||
const elementStyle = {
|
const elementStyle = {
|
||||||
width: `${posterWidth}px`,
|
width: `${posterWidth}px`,
|
||||||
height: `${posterHeight}px`,
|
height: `${posterHeight}px`
|
||||||
borderRadius: '5px'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const contentStyle = {
|
const contentStyle = {
|
||||||
|
|||||||
@@ -69,8 +69,7 @@ class MovieCrewPoster extends Component {
|
|||||||
|
|
||||||
const elementStyle = {
|
const elementStyle = {
|
||||||
width: `${posterWidth}px`,
|
width: `${posterWidth}px`,
|
||||||
height: `${posterHeight}px`,
|
height: `${posterHeight}px`
|
||||||
borderRadius: '5px'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const contentStyle = {
|
const contentStyle = {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
$hoverScale: 1.05;
|
$hoverScale: 1.05;
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
border-radius: 5px;
|
|
||||||
transition: all 200ms ease-in;
|
transition: all 200ms ease-in;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
|||||||
@@ -2,10 +2,6 @@
|
|||||||
flex: 1 0 auto;
|
flex: 1 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.movie {
|
|
||||||
padding: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import Carousel from 'Components/Carousel';
|
import { Grid, WindowScroller } from 'react-virtualized';
|
||||||
|
import Measure from 'Components/Measure';
|
||||||
import dimensions from 'Styles/Variables/dimensions';
|
import dimensions from 'Styles/Variables/dimensions';
|
||||||
import hasDifferentItemsOrOrder from 'Utilities/Object/hasDifferentItemsOrOrder';
|
import hasDifferentItemsOrOrder from 'Utilities/Object/hasDifferentItemsOrOrder';
|
||||||
import MovieCreditPosterConnector from './MovieCreditPosterConnector';
|
import MovieCreditPosterConnector from './MovieCreditPosterConnector';
|
||||||
@@ -168,36 +169,56 @@ class MovieCreditPosters extends Component {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
items,
|
items
|
||||||
itemComponent
|
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
posterWidth,
|
width,
|
||||||
posterHeight
|
columnWidth,
|
||||||
|
columnCount,
|
||||||
|
rowHeight
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
return (
|
const rowCount = Math.ceil(items.length / columnCount);
|
||||||
|
|
||||||
<div className={styles.sliderContainer}>
|
return (
|
||||||
<Carousel setRef={this.setSliderRef}>
|
<Measure
|
||||||
{items.map((movie) => (
|
whitelist={['width']}
|
||||||
<div className={styles.movie} key={movie.tmdbId}>
|
onMeasure={this.onMeasure}
|
||||||
<MovieCreditPosterConnector
|
>
|
||||||
key={movie.order}
|
<WindowScroller
|
||||||
component={itemComponent}
|
scrollElement={undefined}
|
||||||
posterWidth={posterWidth}
|
>
|
||||||
posterHeight={posterHeight}
|
{({ height, registerChild, onChildScroll, scrollTop }) => {
|
||||||
tmdbId={movie.personTmdbId}
|
if (!height) {
|
||||||
personName={movie.personName}
|
return <div />;
|
||||||
job={movie.job}
|
}
|
||||||
character={movie.character}
|
|
||||||
images={movie.images}
|
return (
|
||||||
/>
|
<div ref={registerChild}>
|
||||||
</div>
|
<Grid
|
||||||
))}
|
ref={this.setGridRef}
|
||||||
</Carousel>
|
className={styles.grid}
|
||||||
</div>
|
autoHeight={true}
|
||||||
|
height={height}
|
||||||
|
columnCount={columnCount}
|
||||||
|
columnWidth={columnWidth}
|
||||||
|
rowCount={rowCount}
|
||||||
|
rowHeight={rowHeight}
|
||||||
|
width={width}
|
||||||
|
onScroll={onChildScroll}
|
||||||
|
scrollTop={scrollTop}
|
||||||
|
overscanRowCount={2}
|
||||||
|
cellRenderer={this.cellRenderer}
|
||||||
|
scrollToAlignment={'start'}
|
||||||
|
isScrollingOptOut={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</WindowScroller>
|
||||||
|
</Measure>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
.alternateTitle {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React from 'react';
|
||||||
|
import styles from './MovieAlternateTitles.css';
|
||||||
|
|
||||||
|
function MovieAlternateTitles({ alternateTitles }) {
|
||||||
|
return (
|
||||||
|
<ul>
|
||||||
|
{
|
||||||
|
alternateTitles.filter((x, i, a) => a.indexOf(x) === i).map((alternateTitle) => {
|
||||||
|
return (
|
||||||
|
<li
|
||||||
|
key={alternateTitle}
|
||||||
|
className={styles.alternateTitle}
|
||||||
|
>
|
||||||
|
{alternateTitle}
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
MovieAlternateTitles.propTypes = {
|
||||||
|
alternateTitles: PropTypes.arrayOf(PropTypes.string).isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default MovieAlternateTitles;
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
.header {
|
.header {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 425px;
|
height: 375px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.errorMessage {
|
.errorMessage {
|
||||||
@@ -39,11 +39,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.poster {
|
.poster {
|
||||||
z-index: 2;
|
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
margin-right: 35px;
|
margin-right: 35px;
|
||||||
width: 250px;
|
width: 217px;
|
||||||
height: 368px;
|
height: 319px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
|
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs';
|
||||||
import TextTruncate from 'react-text-truncate';
|
import TextTruncate from 'react-text-truncate';
|
||||||
import FieldSet from 'Components/FieldSet';
|
|
||||||
import Icon from 'Components/Icon';
|
import Icon from 'Components/Icon';
|
||||||
import ImdbRating from 'Components/ImdbRating';
|
import ImdbRating from 'Components/ImdbRating';
|
||||||
import InfoLabel from 'Components/InfoLabel';
|
import InfoLabel from 'Components/InfoLabel';
|
||||||
@@ -22,11 +22,12 @@ import Popover from 'Components/Tooltip/Popover';
|
|||||||
import Tooltip from 'Components/Tooltip/Tooltip';
|
import Tooltip from 'Components/Tooltip/Tooltip';
|
||||||
import { icons, kinds, sizes, tooltipPositions } from 'Helpers/Props';
|
import { icons, kinds, sizes, tooltipPositions } from 'Helpers/Props';
|
||||||
import InteractiveImportModal from 'InteractiveImport/InteractiveImportModal';
|
import InteractiveImportModal from 'InteractiveImport/InteractiveImportModal';
|
||||||
|
import InteractiveSearchFilterMenuConnector from 'InteractiveSearch/InteractiveSearchFilterMenuConnector';
|
||||||
|
import InteractiveSearchTable from 'InteractiveSearch/InteractiveSearchTable';
|
||||||
import DeleteMovieModal from 'Movie/Delete/DeleteMovieModal';
|
import DeleteMovieModal from 'Movie/Delete/DeleteMovieModal';
|
||||||
import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector';
|
import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector';
|
||||||
import MovieHistoryTable from 'Movie/History/MovieHistoryTable';
|
import MovieHistoryTable from 'Movie/History/MovieHistoryTable';
|
||||||
import MoviePoster from 'Movie/MoviePoster';
|
import MoviePoster from 'Movie/MoviePoster';
|
||||||
import MovieInteractiveSearchModalConnector from 'Movie/Search/MovieInteractiveSearchModalConnector';
|
|
||||||
import MovieFileEditorTable from 'MovieFile/Editor/MovieFileEditorTable';
|
import MovieFileEditorTable from 'MovieFile/Editor/MovieFileEditorTable';
|
||||||
import ExtraFileTable from 'MovieFile/Extras/ExtraFileTable';
|
import ExtraFileTable from 'MovieFile/Extras/ExtraFileTable';
|
||||||
import OrganizePreviewModalConnector from 'Organize/OrganizePreviewModalConnector';
|
import OrganizePreviewModalConnector from 'Organize/OrganizePreviewModalConnector';
|
||||||
@@ -80,10 +81,10 @@ class MovieDetails extends Component {
|
|||||||
isEditMovieModalOpen: false,
|
isEditMovieModalOpen: false,
|
||||||
isDeleteMovieModalOpen: false,
|
isDeleteMovieModalOpen: false,
|
||||||
isInteractiveImportModalOpen: false,
|
isInteractiveImportModalOpen: false,
|
||||||
isInteractiveSearchModalOpen: false,
|
|
||||||
allExpanded: false,
|
allExpanded: false,
|
||||||
allCollapsed: false,
|
allCollapsed: false,
|
||||||
expandedState: {},
|
expandedState: {},
|
||||||
|
selectedTabIndex: 0,
|
||||||
overviewHeight: 0,
|
overviewHeight: 0,
|
||||||
titleWidth: 0
|
titleWidth: 0
|
||||||
};
|
};
|
||||||
@@ -136,14 +137,6 @@ class MovieDetails extends Component {
|
|||||||
this.setState({ isEditMovieModalOpen: false });
|
this.setState({ isEditMovieModalOpen: false });
|
||||||
};
|
};
|
||||||
|
|
||||||
onInteractiveSearchPress = () => {
|
|
||||||
this.setState({ isInteractiveSearchModalOpen: true });
|
|
||||||
};
|
|
||||||
|
|
||||||
onInteractiveSearchModalClose = () => {
|
|
||||||
this.setState({ isInteractiveSearchModalOpen: false });
|
|
||||||
};
|
|
||||||
|
|
||||||
onDeleteMoviePress = () => {
|
onDeleteMoviePress = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
isEditMovieModalOpen: false,
|
isEditMovieModalOpen: false,
|
||||||
@@ -305,9 +298,9 @@ class MovieDetails extends Component {
|
|||||||
isEditMovieModalOpen,
|
isEditMovieModalOpen,
|
||||||
isDeleteMovieModalOpen,
|
isDeleteMovieModalOpen,
|
||||||
isInteractiveImportModalOpen,
|
isInteractiveImportModalOpen,
|
||||||
isInteractiveSearchModalOpen,
|
|
||||||
overviewHeight,
|
overviewHeight,
|
||||||
titleWidth
|
titleWidth,
|
||||||
|
selectedTabIndex
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
const marqueeWidth = isSmallScreen ? titleWidth : (titleWidth - 150);
|
const marqueeWidth = isSmallScreen ? titleWidth : (titleWidth - 150);
|
||||||
@@ -333,14 +326,6 @@ class MovieDetails extends Component {
|
|||||||
onPress={onSearchPress}
|
onPress={onSearchPress}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<PageToolbarButton
|
|
||||||
label={translate('InteractiveSearch')}
|
|
||||||
iconName={icons.INTERACTIVE}
|
|
||||||
isSpinning={isSearching}
|
|
||||||
title={undefined}
|
|
||||||
onPress={this.onInteractiveSearchPress}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<PageToolbarSeparator />
|
<PageToolbarSeparator />
|
||||||
|
|
||||||
<PageToolbarButton
|
<PageToolbarButton
|
||||||
@@ -666,39 +651,101 @@ class MovieDetails extends Component {
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<FieldSet legend={translate('History')}>
|
<Tabs selectedIndex={this.state.tabIndex} onSelect={this.onTabSelect}>
|
||||||
<MovieHistoryTable
|
<TabList
|
||||||
movieId={id}
|
className={styles.tabList}
|
||||||
/>
|
>
|
||||||
</FieldSet>
|
<Tab
|
||||||
|
className={styles.tab}
|
||||||
|
selectedClassName={styles.selectedTab}
|
||||||
|
>
|
||||||
|
{translate('History')}
|
||||||
|
</Tab>
|
||||||
|
|
||||||
<FieldSet legend={translate('Files')}>
|
<Tab
|
||||||
<MovieFileEditorTable
|
className={styles.tab}
|
||||||
movieId={id}
|
selectedClassName={styles.selectedTab}
|
||||||
/>
|
>
|
||||||
|
{translate('Search')}
|
||||||
|
</Tab>
|
||||||
|
|
||||||
<ExtraFileTable
|
<Tab
|
||||||
movieId={id}
|
className={styles.tab}
|
||||||
/>
|
selectedClassName={styles.selectedTab}
|
||||||
</FieldSet>
|
>
|
||||||
|
{translate('Files')}
|
||||||
|
</Tab>
|
||||||
|
|
||||||
<FieldSet legend={translate('Cast')}>
|
<Tab
|
||||||
<MovieCastPostersConnector
|
className={styles.tab}
|
||||||
isSmallScreen={isSmallScreen}
|
selectedClassName={styles.selectedTab}
|
||||||
/>
|
>
|
||||||
</FieldSet>
|
{translate('Titles')}
|
||||||
|
</Tab>
|
||||||
|
|
||||||
<FieldSet legend={translate('Crew')}>
|
<Tab
|
||||||
<MovieCrewPostersConnector
|
className={styles.tab}
|
||||||
isSmallScreen={isSmallScreen}
|
selectedClassName={styles.selectedTab}
|
||||||
/>
|
>
|
||||||
</FieldSet>
|
{translate('Cast')}
|
||||||
|
</Tab>
|
||||||
|
|
||||||
|
<Tab
|
||||||
|
className={styles.tab}
|
||||||
|
selectedClassName={styles.selectedTab}
|
||||||
|
>
|
||||||
|
{translate('Crew')}
|
||||||
|
</Tab>
|
||||||
|
|
||||||
|
{
|
||||||
|
selectedTabIndex === 1 &&
|
||||||
|
<div className={styles.filterIcon}>
|
||||||
|
<InteractiveSearchFilterMenuConnector />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
</TabList>
|
||||||
|
|
||||||
|
<TabPanel>
|
||||||
|
<MovieHistoryTable
|
||||||
|
movieId={id}
|
||||||
|
/>
|
||||||
|
</TabPanel>
|
||||||
|
|
||||||
|
<TabPanel>
|
||||||
|
<InteractiveSearchTable
|
||||||
|
movieId={id}
|
||||||
|
/>
|
||||||
|
</TabPanel>
|
||||||
|
|
||||||
|
<TabPanel>
|
||||||
|
<MovieFileEditorTable
|
||||||
|
movieId={id}
|
||||||
|
/>
|
||||||
|
<ExtraFileTable
|
||||||
|
movieId={id}
|
||||||
|
/>
|
||||||
|
</TabPanel>
|
||||||
|
|
||||||
|
<TabPanel>
|
||||||
|
<MovieTitlesTable
|
||||||
|
movieId={id}
|
||||||
|
/>
|
||||||
|
</TabPanel>
|
||||||
|
|
||||||
|
<TabPanel>
|
||||||
|
<MovieCastPostersConnector
|
||||||
|
isSmallScreen={isSmallScreen}
|
||||||
|
/>
|
||||||
|
</TabPanel>
|
||||||
|
|
||||||
|
<TabPanel>
|
||||||
|
<MovieCrewPostersConnector
|
||||||
|
isSmallScreen={isSmallScreen}
|
||||||
|
/>
|
||||||
|
</TabPanel>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
<FieldSet legend={translate('Titles')}>
|
|
||||||
<MovieTitlesTable
|
|
||||||
movieId={id}
|
|
||||||
/>
|
|
||||||
</FieldSet>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<OrganizePreviewModalConnector
|
<OrganizePreviewModalConnector
|
||||||
@@ -730,12 +777,6 @@ class MovieDetails extends Component {
|
|||||||
showImportMode={false}
|
showImportMode={false}
|
||||||
onModalClose={this.onInteractiveImportModalClose}
|
onModalClose={this.onInteractiveImportModalClose}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<MovieInteractiveSearchModalConnector
|
|
||||||
isOpen={isInteractiveSearchModalOpen}
|
|
||||||
movieId={id}
|
|
||||||
onModalClose={this.onInteractiveSearchModalClose}
|
|
||||||
/>
|
|
||||||
</PageContentBody>
|
</PageContentBody>
|
||||||
</PageContent>
|
</PageContent>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
.container {
|
|
||||||
border: 1px solid $borderColor;
|
|
||||||
border-radius: 4px;
|
|
||||||
background-color: $white;
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import MovieTitlesTableContentConnector from './MovieTitlesTableContentConnector';
|
import MovieTitlesTableContentConnector from './MovieTitlesTableContentConnector';
|
||||||
import styles from './MovieTitlesTable.css';
|
|
||||||
|
|
||||||
function MovieTitlesTable(props) {
|
function MovieTitlesTable(props) {
|
||||||
const {
|
const {
|
||||||
@@ -8,11 +7,9 @@ function MovieTitlesTable(props) {
|
|||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<MovieTitlesTableContentConnector
|
||||||
<MovieTitlesTableContentConnector
|
{...otherProps}
|
||||||
{...otherProps}
|
/>
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
.container {
|
|
||||||
border: 1px solid $borderColor;
|
|
||||||
border-radius: 4px;
|
|
||||||
background-color: $white;
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import MovieHistoryTableContentConnector from './MovieHistoryTableContentConnector';
|
import MovieHistoryTableContentConnector from './MovieHistoryTableContentConnector';
|
||||||
import styles from './MovieHistoryTable.css';
|
|
||||||
|
|
||||||
function MovieHistoryTable(props) {
|
function MovieHistoryTable(props) {
|
||||||
const {
|
const {
|
||||||
@@ -8,11 +7,9 @@ function MovieHistoryTable(props) {
|
|||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<MovieHistoryTableContentConnector
|
||||||
<MovieHistoryTableContentConnector
|
{...otherProps}
|
||||||
{...otherProps}
|
/>
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
import PropTypes from 'prop-types';
|
|
||||||
import React from 'react';
|
|
||||||
import Modal from 'Components/Modal/Modal';
|
|
||||||
import { sizes } from 'Helpers/Props';
|
|
||||||
import MovieInteractiveSearchModalContent from './MovieInteractiveSearchModalContent';
|
|
||||||
|
|
||||||
function MovieInteractiveSearchModal(props) {
|
|
||||||
const {
|
|
||||||
isOpen,
|
|
||||||
movieId,
|
|
||||||
onModalClose
|
|
||||||
} = props;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Modal
|
|
||||||
isOpen={isOpen}
|
|
||||||
closeOnBackgroundClick={false}
|
|
||||||
onModalClose={onModalClose}
|
|
||||||
size={sizes.EXTRA_LARGE}
|
|
||||||
>
|
|
||||||
<MovieInteractiveSearchModalContent
|
|
||||||
movieId={movieId}
|
|
||||||
onModalClose={onModalClose}
|
|
||||||
/>
|
|
||||||
</Modal>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
MovieInteractiveSearchModal.propTypes = {
|
|
||||||
isOpen: PropTypes.bool.isRequired,
|
|
||||||
movieId: PropTypes.number.isRequired,
|
|
||||||
onModalClose: PropTypes.func.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
export default MovieInteractiveSearchModal;
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import { connect } from 'react-redux';
|
|
||||||
import { cancelFetchReleases, clearReleases } from 'Store/Actions/releaseActions';
|
|
||||||
import MovieInteractiveSearchModal from './MovieInteractiveSearchModal';
|
|
||||||
|
|
||||||
function createMapDispatchToProps(dispatch, props) {
|
|
||||||
return {
|
|
||||||
onModalClose() {
|
|
||||||
dispatch(cancelFetchReleases());
|
|
||||||
dispatch(clearReleases());
|
|
||||||
props.onModalClose();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export default connect(null, createMapDispatchToProps)(MovieInteractiveSearchModal);
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
import PropTypes from 'prop-types';
|
|
||||||
import React from 'react';
|
|
||||||
import Button from 'Components/Link/Button';
|
|
||||||
import ModalBody from 'Components/Modal/ModalBody';
|
|
||||||
import ModalContent from 'Components/Modal/ModalContent';
|
|
||||||
import ModalFooter from 'Components/Modal/ModalFooter';
|
|
||||||
import ModalHeader from 'Components/Modal/ModalHeader';
|
|
||||||
import { scrollDirections } from 'Helpers/Props';
|
|
||||||
import InteractiveSearchConnector from 'InteractiveSearch/InteractiveSearchConnector';
|
|
||||||
|
|
||||||
function MovieInteractiveSearchModalContent(props) {
|
|
||||||
const {
|
|
||||||
movieId,
|
|
||||||
onModalClose
|
|
||||||
} = props;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ModalContent onModalClose={onModalClose}>
|
|
||||||
<ModalHeader>
|
|
||||||
Interactive Search
|
|
||||||
</ModalHeader>
|
|
||||||
|
|
||||||
<ModalBody scrollDirection={scrollDirections.BOTH}>
|
|
||||||
<InteractiveSearchConnector
|
|
||||||
searchPayload={{
|
|
||||||
movieId
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</ModalBody>
|
|
||||||
|
|
||||||
<ModalFooter>
|
|
||||||
<Button onPress={onModalClose}>
|
|
||||||
Close
|
|
||||||
</Button>
|
|
||||||
</ModalFooter>
|
|
||||||
</ModalContent>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
MovieInteractiveSearchModalContent.propTypes = {
|
|
||||||
movieId: PropTypes.number.isRequired,
|
|
||||||
onModalClose: PropTypes.func.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
export default MovieInteractiveSearchModalContent;
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
.container {
|
.container {
|
||||||
|
margin-top: 20px;
|
||||||
border: 1px solid $borderColor;
|
border: 1px solid $borderColor;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: $white;
|
background-color: $white;
|
||||||
|
|||||||
@@ -65,10 +65,10 @@ function DownloadClientOptions(props) {
|
|||||||
<FormInputGroup
|
<FormInputGroup
|
||||||
type={inputTypes.NUMBER}
|
type={inputTypes.NUMBER}
|
||||||
name="checkForFinishedDownloadInterval"
|
name="checkForFinishedDownloadInterval"
|
||||||
min={0}
|
min={1}
|
||||||
max={120}
|
max={120}
|
||||||
unit="minutes"
|
unit="minutes"
|
||||||
helpText={translate('HelpText')}
|
helpText={translate('RefreshMonitoredIntervalHelpText')}
|
||||||
onChange={onInputChange}
|
onChange={onInputChange}
|
||||||
{...settings.checkForFinishedDownloadInterval}
|
{...settings.checkForFinishedDownloadInterval}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ function HostSettings(props) {
|
|||||||
bindAddress,
|
bindAddress,
|
||||||
port,
|
port,
|
||||||
urlBase,
|
urlBase,
|
||||||
|
instanceName,
|
||||||
enableSsl,
|
enableSsl,
|
||||||
sslPort,
|
sslPort,
|
||||||
sslCertPath,
|
sslCertPath,
|
||||||
@@ -73,6 +74,22 @@ function HostSettings(props) {
|
|||||||
/>
|
/>
|
||||||
</FormGroup>
|
</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
|
<FormGroup
|
||||||
advancedSettings={advancedSettings}
|
advancedSettings={advancedSettings}
|
||||||
isAdvanced={true}
|
isAdvanced={true}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ function IndexerOptions(props) {
|
|||||||
min={0}
|
min={0}
|
||||||
max={120}
|
max={120}
|
||||||
unit="minutes"
|
unit="minutes"
|
||||||
helpText={translate('HelpText')}
|
helpText={translate('RssSyncHelpText')}
|
||||||
helpTextWarning={translate('RSSSyncIntervalHelpTextWarning')}
|
helpTextWarning={translate('RSSSyncIntervalHelpTextWarning')}
|
||||||
helpLink="https://wiki.servarr.com/radarr/faq#how-does-radarr-work"
|
helpLink="https://wiki.servarr.com/radarr/faq#how-does-radarr-work"
|
||||||
onChange={onInputChange}
|
onChange={onInputChange}
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ class Notification extends Component {
|
|||||||
onDownload,
|
onDownload,
|
||||||
onUpgrade,
|
onUpgrade,
|
||||||
onRename,
|
onRename,
|
||||||
|
onMovieAdded,
|
||||||
onMovieDelete,
|
onMovieDelete,
|
||||||
onMovieFileDelete,
|
onMovieFileDelete,
|
||||||
onMovieFileDeleteForUpgrade,
|
onMovieFileDeleteForUpgrade,
|
||||||
@@ -68,6 +69,7 @@ class Notification extends Component {
|
|||||||
supportsOnDownload,
|
supportsOnDownload,
|
||||||
supportsOnUpgrade,
|
supportsOnUpgrade,
|
||||||
supportsOnRename,
|
supportsOnRename,
|
||||||
|
supportsOnMovieAdded,
|
||||||
supportsOnMovieDelete,
|
supportsOnMovieDelete,
|
||||||
supportsOnMovieFileDelete,
|
supportsOnMovieFileDelete,
|
||||||
supportsOnMovieFileDeleteForUpgrade,
|
supportsOnMovieFileDeleteForUpgrade,
|
||||||
@@ -117,6 +119,14 @@ class Notification extends Component {
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
supportsOnMovieAdded && onMovieAdded ?
|
||||||
|
<Label kind={kinds.SUCCESS}>
|
||||||
|
{translate('OnMovieAdded')}
|
||||||
|
</Label> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
supportsOnHealthIssue && onHealthIssue ?
|
supportsOnHealthIssue && onHealthIssue ?
|
||||||
<Label kind={kinds.SUCCESS}>
|
<Label kind={kinds.SUCCESS}>
|
||||||
@@ -196,6 +206,7 @@ Notification.propTypes = {
|
|||||||
onDownload: PropTypes.bool.isRequired,
|
onDownload: PropTypes.bool.isRequired,
|
||||||
onUpgrade: PropTypes.bool.isRequired,
|
onUpgrade: PropTypes.bool.isRequired,
|
||||||
onRename: PropTypes.bool.isRequired,
|
onRename: PropTypes.bool.isRequired,
|
||||||
|
onMovieAdded: PropTypes.bool.isRequired,
|
||||||
onMovieDelete: PropTypes.bool.isRequired,
|
onMovieDelete: PropTypes.bool.isRequired,
|
||||||
onMovieFileDelete: PropTypes.bool.isRequired,
|
onMovieFileDelete: PropTypes.bool.isRequired,
|
||||||
onMovieFileDeleteForUpgrade: PropTypes.bool.isRequired,
|
onMovieFileDeleteForUpgrade: PropTypes.bool.isRequired,
|
||||||
@@ -208,6 +219,7 @@ Notification.propTypes = {
|
|||||||
supportsOnMovieFileDeleteForUpgrade: PropTypes.bool.isRequired,
|
supportsOnMovieFileDeleteForUpgrade: PropTypes.bool.isRequired,
|
||||||
supportsOnUpgrade: PropTypes.bool.isRequired,
|
supportsOnUpgrade: PropTypes.bool.isRequired,
|
||||||
supportsOnRename: PropTypes.bool.isRequired,
|
supportsOnRename: PropTypes.bool.isRequired,
|
||||||
|
supportsOnMovieAdded: PropTypes.bool.isRequired,
|
||||||
supportsOnHealthIssue: PropTypes.bool.isRequired,
|
supportsOnHealthIssue: PropTypes.bool.isRequired,
|
||||||
supportsOnApplicationUpdate: PropTypes.bool.isRequired,
|
supportsOnApplicationUpdate: PropTypes.bool.isRequired,
|
||||||
onConfirmDeleteNotification: PropTypes.func.isRequired
|
onConfirmDeleteNotification: PropTypes.func.isRequired
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ function NotificationEventItems(props) {
|
|||||||
onDownload,
|
onDownload,
|
||||||
onUpgrade,
|
onUpgrade,
|
||||||
onRename,
|
onRename,
|
||||||
|
onMovieAdded,
|
||||||
onMovieDelete,
|
onMovieDelete,
|
||||||
onMovieFileDelete,
|
onMovieFileDelete,
|
||||||
onMovieFileDeleteForUpgrade,
|
onMovieFileDeleteForUpgrade,
|
||||||
@@ -28,6 +29,7 @@ function NotificationEventItems(props) {
|
|||||||
supportsOnDownload,
|
supportsOnDownload,
|
||||||
supportsOnUpgrade,
|
supportsOnUpgrade,
|
||||||
supportsOnRename,
|
supportsOnRename,
|
||||||
|
supportsOnMovieAdded,
|
||||||
supportsOnMovieDelete,
|
supportsOnMovieDelete,
|
||||||
supportsOnMovieFileDelete,
|
supportsOnMovieFileDelete,
|
||||||
supportsOnMovieFileDeleteForUpgrade,
|
supportsOnMovieFileDeleteForUpgrade,
|
||||||
@@ -92,6 +94,17 @@ function NotificationEventItems(props) {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.CHECK}
|
||||||
|
name="onMovieAdded"
|
||||||
|
helpText={translate('OnMovieAddedHelpText')}
|
||||||
|
isDisabled={!supportsOnMovieAdded.value}
|
||||||
|
{...onMovieAdded}
|
||||||
|
onChange={onInputChange}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<FormInputGroup
|
<FormInputGroup
|
||||||
type={inputTypes.CHECK}
|
type={inputTypes.CHECK}
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ export default {
|
|||||||
selectedSchema.onDownload = selectedSchema.supportsOnDownload;
|
selectedSchema.onDownload = selectedSchema.supportsOnDownload;
|
||||||
selectedSchema.onUpgrade = selectedSchema.supportsOnUpgrade;
|
selectedSchema.onUpgrade = selectedSchema.supportsOnUpgrade;
|
||||||
selectedSchema.onRename = selectedSchema.supportsOnRename;
|
selectedSchema.onRename = selectedSchema.supportsOnRename;
|
||||||
|
selectedSchema.onMovieAdded = selectedSchema.supportsOnMovieAdded;
|
||||||
selectedSchema.onMovieDelete = selectedSchema.supportsOnMovieDelete;
|
selectedSchema.onMovieDelete = selectedSchema.supportsOnMovieDelete;
|
||||||
selectedSchema.onMovieFileDelete = selectedSchema.supportsOnMovieFileDelete;
|
selectedSchema.onMovieFileDelete = selectedSchema.supportsOnMovieFileDelete;
|
||||||
selectedSchema.onMovieFileDeleteForUpgrade = selectedSchema.supportsOnMovieFileDeleteForUpgrade;
|
selectedSchema.onMovieFileDeleteForUpgrade = selectedSchema.supportsOnMovieFileDeleteForUpgrade;
|
||||||
|
|||||||
@@ -79,6 +79,11 @@ export const defaultState = {
|
|||||||
label: translate('ReleaseGroup'),
|
label: translate('ReleaseGroup'),
|
||||||
isVisible: false
|
isVisible: false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'sourceTitle',
|
||||||
|
label: translate('SourceTitle'),
|
||||||
|
isVisible: false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'details',
|
name: 'details',
|
||||||
columnLabel: translate('Details'),
|
columnLabel: translate('Details'),
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export const defaultState = {
|
|||||||
sortKey: 'quality',
|
sortKey: 'quality',
|
||||||
sortDirection: sortDirections.DESCENDING,
|
sortDirection: sortDirections.DESCENDING,
|
||||||
recentFolders: [],
|
recentFolders: [],
|
||||||
importMode: 'move',
|
importMode: 'chooseImportMode',
|
||||||
sortPredicates: {
|
sortPredicates: {
|
||||||
relativePath: function(item, direction) {
|
relativePath: function(item, direction) {
|
||||||
const relativePath = item.relativePath;
|
const relativePath = item.relativePath;
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ export const defaultState = {
|
|||||||
detailedProgressBar: false,
|
detailedProgressBar: false,
|
||||||
size: 'medium',
|
size: 'medium',
|
||||||
showDetails: true,
|
showDetails: true,
|
||||||
showOverview: true
|
showOverview: true,
|
||||||
|
showPosters: true
|
||||||
},
|
},
|
||||||
|
|
||||||
defaults: {
|
defaults: {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import migrateBlacklistToBlocklist from './migrateBlacklistToBlocklist';
|
import migrateBlacklistToBlocklist from './migrateBlacklistToBlocklist';
|
||||||
|
import migrateMonitorToEnum from './migrateMonitorToEnum';
|
||||||
import migratePreDbToReleased from './migratePreDbToReleased';
|
import migratePreDbToReleased from './migratePreDbToReleased';
|
||||||
|
|
||||||
export default function migrate(persistedState) {
|
export default function migrate(persistedState) {
|
||||||
migrateBlacklistToBlocklist(persistedState);
|
migrateBlacklistToBlocklist(persistedState);
|
||||||
migratePreDbToReleased(persistedState);
|
migratePreDbToReleased(persistedState);
|
||||||
|
migrateMonitorToEnum(persistedState);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,26 @@
|
|||||||
import get from 'lodash';
|
import _ from 'lodash';
|
||||||
|
|
||||||
export default function migrateMonitorToEnum(persistedState) {
|
export default function migrateMonitorToEnum(persistedState) {
|
||||||
const addMovie = get(persistedState, 'addMovie.defaults.monitor');
|
const addMovie = _.get(persistedState, 'addMovie.defaults.monitor');
|
||||||
const discoverMovie = get(persistedState, 'discoverMovie.defaults.monitor');
|
const discoverMovie = _.get(persistedState, 'discoverMovie.defaults.monitor');
|
||||||
|
|
||||||
if (!addMovie && !discoverMovie) {
|
if (addMovie) {
|
||||||
return;
|
if (addMovie === 'true') {
|
||||||
|
persistedState.addMovie.defaults.monitor = 'movieOnly';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addMovie === 'false') {
|
||||||
|
persistedState.addMovie.defaults.monitor = 'none';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addMovie === true) {
|
if (discoverMovie) {
|
||||||
persistedState.addMovie.defaults.monitor = 'movieOnly';
|
if (discoverMovie === 'true') {
|
||||||
}
|
persistedState.discoverMovie.defaults.monitor = 'movieOnly';
|
||||||
|
}
|
||||||
|
|
||||||
if (discoverMovie === true) {
|
if (discoverMovie === 'false') {
|
||||||
persistedState.discoverMovie.defaults.monitor = 'movieOnly';
|
persistedState.discoverMovie.defaults.monitor = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addMovie === false) {
|
|
||||||
persistedState.addMovie.defaults.minimumAvailability = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (discoverMovie === false) {
|
|
||||||
persistedState.discoverMovie.defaults.minimumAvailability = 'none';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import get from 'lodash';
|
import _ from 'lodash';
|
||||||
|
|
||||||
export default function migratePreDbToReleased(persistedState) {
|
export default function migratePreDbToReleased(persistedState) {
|
||||||
const addMovie = get(persistedState, 'addMovie.defaults.minimumAvailability');
|
const addMovie = _.get(persistedState, 'addMovie.defaults.minimumAvailability');
|
||||||
const discoverMovie = get(persistedState, 'discoverMovie.defaults.minimumAvailability');
|
const discoverMovie = _.get(persistedState, 'discoverMovie.defaults.minimumAvailability');
|
||||||
|
|
||||||
if (!addMovie && !discoverMovie) {
|
if (!addMovie && !discoverMovie) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -44,7 +44,14 @@ function filter(items, state) {
|
|||||||
const predicate = filterPredicates[key];
|
const predicate = filterPredicates[key];
|
||||||
|
|
||||||
if (Array.isArray(value)) {
|
if (Array.isArray(value)) {
|
||||||
accepted = value.some((v) => predicate(item, v, type));
|
if (
|
||||||
|
type === filterTypes.NOT_CONTAINS ||
|
||||||
|
type === filterTypes.NOT_EQUAL
|
||||||
|
) {
|
||||||
|
accepted = value.every((v) => predicate(item, v, type));
|
||||||
|
} else {
|
||||||
|
accepted = value.some((v) => predicate(item, v, type));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
accepted = predicate(item, value, type);
|
accepted = predicate(item, value, type);
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-11
@@ -30,7 +30,7 @@
|
|||||||
"@fortawesome/free-regular-svg-icons": "6.1.0",
|
"@fortawesome/free-regular-svg-icons": "6.1.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "6.1.0",
|
"@fortawesome/free-solid-svg-icons": "6.1.0",
|
||||||
"@fortawesome/react-fontawesome": "0.1.18",
|
"@fortawesome/react-fontawesome": "0.1.18",
|
||||||
"@microsoft/signalr": "6.0.3",
|
"@microsoft/signalr": "6.0.5",
|
||||||
"@sentry/browser": "6.18.2",
|
"@sentry/browser": "6.18.2",
|
||||||
"@sentry/integrations": "6.18.2",
|
"@sentry/integrations": "6.18.2",
|
||||||
"classnames": "2.3.1",
|
"classnames": "2.3.1",
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
"jquery": "3.6.0",
|
"jquery": "3.6.0",
|
||||||
"lodash": "4.17.21",
|
"lodash": "4.17.21",
|
||||||
"mobile-detect": "1.4.5",
|
"mobile-detect": "1.4.5",
|
||||||
"moment": "2.29.1",
|
"moment": "2.29.2",
|
||||||
"mousetrap": "1.6.5",
|
"mousetrap": "1.6.5",
|
||||||
"normalize.css": "8.0.1",
|
"normalize.css": "8.0.1",
|
||||||
"prop-types": "15.7.2",
|
"prop-types": "15.7.2",
|
||||||
@@ -101,8 +101,8 @@
|
|||||||
"babel-loader": "8.2.3",
|
"babel-loader": "8.2.3",
|
||||||
"babel-plugin-inline-classnames": "2.0.1",
|
"babel-plugin-inline-classnames": "2.0.1",
|
||||||
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
|
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
|
||||||
"core-js": "3.11.0",
|
"core-js": "3.12.1",
|
||||||
"css-loader": "5.2.4",
|
"css-loader": "6.5.1",
|
||||||
"eslint": "8.11.0",
|
"eslint": "8.11.0",
|
||||||
"eslint-plugin-filenames": "1.3.2",
|
"eslint-plugin-filenames": "1.3.2",
|
||||||
"eslint-plugin-import": "2.25.4",
|
"eslint-plugin-import": "2.25.4",
|
||||||
@@ -117,22 +117,22 @@
|
|||||||
"mini-css-extract-plugin": "1.5.0",
|
"mini-css-extract-plugin": "1.5.0",
|
||||||
"postcss": "8.2.12",
|
"postcss": "8.2.12",
|
||||||
"postcss-color-function": "4.1.0",
|
"postcss-color-function": "4.1.0",
|
||||||
"postcss-loader": "5.2.0",
|
"postcss-loader": "6.2.0",
|
||||||
"postcss-mixins": "7.0.3",
|
"postcss-mixins": "8.1.0",
|
||||||
"postcss-nested": "5.0.5",
|
"postcss-nested": "5.0.6",
|
||||||
"postcss-simple-vars": "6.0.3",
|
"postcss-simple-vars": "6.0.3",
|
||||||
"postcss-url": "10.1.3",
|
"postcss-url": "10.1.3",
|
||||||
"require-nocache": "1.0.0",
|
"require-nocache": "1.0.0",
|
||||||
"rimraf": "3.0.2",
|
"rimraf": "3.0.2",
|
||||||
"run-sequence": "2.2.1",
|
"run-sequence": "2.2.1",
|
||||||
"streamqueue": "1.1.2",
|
"streamqueue": "1.1.2",
|
||||||
"style-loader": "2.0.0",
|
"style-loader": "3.3.1",
|
||||||
"stylelint": "14.6.0",
|
"stylelint": "14.6.0",
|
||||||
"stylelint-order": "5.0.0",
|
"stylelint-order": "5.0.0",
|
||||||
"url-loader": "4.1.1",
|
"url-loader": "4.1.1",
|
||||||
"webpack": "5.35.1",
|
"webpack": "5.64.2",
|
||||||
"webpack-cli": "4.6.0",
|
"webpack-cli": "4.9.1",
|
||||||
"webpack-livereload-plugin": "3.0.1",
|
"webpack-livereload-plugin": "3.0.2",
|
||||||
"worker-loader": "3.0.8"
|
"worker-loader": "3.0.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@
|
|||||||
|
|
||||||
<!-- Standard testing packages -->
|
<!-- Standard testing packages -->
|
||||||
<ItemGroup Condition="'$(TestProject)'=='true'">
|
<ItemGroup Condition="'$(TestProject)'=='true'">
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
||||||
<PackageReference Include="NUnit" Version="3.13.2" />
|
<PackageReference Include="NUnit" Version="3.13.2" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="4.1.0" />
|
<PackageReference Include="NUnit3TestAdapter" Version="4.1.0" />
|
||||||
<PackageReference Include="NunitXml.TestLogger" Version="3.0.117" />
|
<PackageReference Include="NunitXml.TestLogger" Version="3.0.117" />
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using Microsoft.Win32;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.EnvironmentInfo
|
namespace NzbDrone.Common.EnvironmentInfo
|
||||||
{
|
{
|
||||||
@@ -51,78 +50,5 @@ namespace NzbDrone.Common.EnvironmentInfo
|
|||||||
{
|
{
|
||||||
return _version;
|
return _version;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Version GetDotNetVersion()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
|
|
||||||
using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
|
|
||||||
{
|
|
||||||
if (ndpKey == null)
|
|
||||||
{
|
|
||||||
return new Version(4, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
var releaseKey = (int)ndpKey.GetValue("Release");
|
|
||||||
|
|
||||||
if (releaseKey >= 528040)
|
|
||||||
{
|
|
||||||
return new Version(4, 8, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 461808)
|
|
||||||
{
|
|
||||||
return new Version(4, 7, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 461308)
|
|
||||||
{
|
|
||||||
return new Version(4, 7, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 460798)
|
|
||||||
{
|
|
||||||
return new Version(4, 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 394802)
|
|
||||||
{
|
|
||||||
return new Version(4, 6, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 394254)
|
|
||||||
{
|
|
||||||
return new Version(4, 6, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 393295)
|
|
||||||
{
|
|
||||||
return new Version(4, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 379893)
|
|
||||||
{
|
|
||||||
return new Version(4, 5, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 378675)
|
|
||||||
{
|
|
||||||
return new Version(4, 5, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releaseKey >= 378389)
|
|
||||||
{
|
|
||||||
return new Version(4, 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Couldnt get .NET framework version: " + ex.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Version(4, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,13 @@
|
|||||||
<PackageReference Include="Sentry" Version="3.15.0" />
|
<PackageReference Include="Sentry" Version="3.15.0" />
|
||||||
<PackageReference Include="NLog.Targets.Syslog" Version="6.0.3" />
|
<PackageReference Include="NLog.Targets.Syslog" Version="6.0.3" />
|
||||||
<PackageReference Include="SharpZipLib" Version="1.3.3" />
|
<PackageReference Include="SharpZipLib" Version="1.3.3" />
|
||||||
<PackageReference Include="System.Text.Json" Version="6.0.2" />
|
<PackageReference Include="System.Text.Json" Version="6.0.4" />
|
||||||
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
||||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||||
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.0" />
|
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.0" />
|
||||||
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
|
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
|
||||||
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
|
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
|
||||||
<PackageReference Include="System.ServiceProcess.ServiceController" Version="6.0.0" />
|
<PackageReference Include="System.ServiceProcess.ServiceController" Version="6.0.0" />
|
||||||
<PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Update="EnsureThat\Resources\ExceptionMessages.Designer.cs">
|
<Compile Update="EnsureThat\Resources\ExceptionMessages.Designer.cs">
|
||||||
|
|||||||
@@ -0,0 +1,347 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.Serializer;
|
||||||
|
using NzbDrone.Core.Datastore.Migration;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.Datastore.Migration
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class movie_metadataFixture : MigrationTest<movie_metadata>
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void should_add_metadata_from_movie_and_link_back_to_movie()
|
||||||
|
{
|
||||||
|
var db = WithMigrationTestDb(c =>
|
||||||
|
{
|
||||||
|
c.Insert.IntoTable("Movies").Row(new
|
||||||
|
{
|
||||||
|
Monitored = true,
|
||||||
|
Title = "Title",
|
||||||
|
CleanTitle = "CleanTitle",
|
||||||
|
Status = 3,
|
||||||
|
MinimumAvailability = 4,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Recommendations = new[] { 1 }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
OriginalLanguage = 1,
|
||||||
|
ProfileId = 1,
|
||||||
|
MovieFileId = 0,
|
||||||
|
Path = string.Format("/Movies/{0}", "Title"),
|
||||||
|
TitleSlug = 123456,
|
||||||
|
TmdbId = 132456,
|
||||||
|
Added = DateTime.UtcNow,
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
LastInfoSync = DateTime.UtcNow,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var metadata = db.Query<MovieMetadata207>("SELECT \"Id\", \"Title\", \"TmdbId\" FROM \"MovieMetadata\"");
|
||||||
|
|
||||||
|
metadata.Should().HaveCount(1);
|
||||||
|
metadata.First().TmdbId.Should().Be(132456);
|
||||||
|
metadata.First().Title.Should().Be("Title");
|
||||||
|
|
||||||
|
var movies = db.Query<Movie207>("SELECT \"Id\", \"MovieMetadataId\" FROM \"Movies\"");
|
||||||
|
|
||||||
|
movies.Should().HaveCount(1);
|
||||||
|
movies.First().MovieMetadataId.Should().Be(metadata.First().Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_link_metadata_to_credits()
|
||||||
|
{
|
||||||
|
var db = WithMigrationTestDb(c =>
|
||||||
|
{
|
||||||
|
c.Insert.IntoTable("Movies").Row(new
|
||||||
|
{
|
||||||
|
Id = 5,
|
||||||
|
Monitored = true,
|
||||||
|
Title = "Title",
|
||||||
|
CleanTitle = "CleanTitle",
|
||||||
|
Status = 3,
|
||||||
|
MinimumAvailability = 4,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Recommendations = new[] { 1 }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
OriginalLanguage = 1,
|
||||||
|
ProfileId = 1,
|
||||||
|
MovieFileId = 0,
|
||||||
|
Path = string.Format("/Movies/{0}", "Title"),
|
||||||
|
TitleSlug = 123456,
|
||||||
|
TmdbId = 132456,
|
||||||
|
Added = DateTime.UtcNow,
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
LastInfoSync = DateTime.UtcNow,
|
||||||
|
});
|
||||||
|
|
||||||
|
c.Insert.IntoTable("Credits").Row(new
|
||||||
|
{
|
||||||
|
MovieId = 5,
|
||||||
|
CreditTmdbId = 123,
|
||||||
|
PersonTmdbId = 456,
|
||||||
|
Order = 1,
|
||||||
|
Type = 1,
|
||||||
|
Name = "Some Person",
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var metadata = db.Query<MovieMetadata207>("SELECT \"Id\", \"Title\", \"TmdbId\" FROM \"MovieMetadata\"");
|
||||||
|
|
||||||
|
metadata.Should().HaveCount(1);
|
||||||
|
metadata.First().TmdbId.Should().Be(132456);
|
||||||
|
metadata.First().Title.Should().Be("Title");
|
||||||
|
|
||||||
|
var movies = db.Query<Movie207>("SELECT \"Id\", \"MovieMetadataId\" FROM \"Credits\"");
|
||||||
|
|
||||||
|
movies.Should().HaveCount(1);
|
||||||
|
movies.First().MovieMetadataId.Should().Be(metadata.First().Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_link_metadata_to_alt_title()
|
||||||
|
{
|
||||||
|
var db = WithMigrationTestDb(c =>
|
||||||
|
{
|
||||||
|
c.Insert.IntoTable("Movies").Row(new
|
||||||
|
{
|
||||||
|
Id = 5,
|
||||||
|
Monitored = true,
|
||||||
|
Title = "Title",
|
||||||
|
CleanTitle = "CleanTitle",
|
||||||
|
Status = 3,
|
||||||
|
MinimumAvailability = 4,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Recommendations = new[] { 1 }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
OriginalLanguage = 1,
|
||||||
|
ProfileId = 1,
|
||||||
|
MovieFileId = 0,
|
||||||
|
Path = string.Format("/Movies/{0}", "Title"),
|
||||||
|
TitleSlug = 123456,
|
||||||
|
TmdbId = 132456,
|
||||||
|
Added = DateTime.UtcNow,
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
LastInfoSync = DateTime.UtcNow,
|
||||||
|
});
|
||||||
|
|
||||||
|
c.Insert.IntoTable("AlternativeTitles").Row(new
|
||||||
|
{
|
||||||
|
MovieId = 5,
|
||||||
|
Title = "Some Alt",
|
||||||
|
CleanTitle = "somealt",
|
||||||
|
SourceType = 1,
|
||||||
|
SourceId = 1,
|
||||||
|
Votes = 0,
|
||||||
|
VoteCount = 0,
|
||||||
|
Language = 1
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var metadata = db.Query<MovieMetadata207>("SELECT \"Id\", \"Title\", \"TmdbId\" FROM \"MovieMetadata\"");
|
||||||
|
|
||||||
|
metadata.Should().HaveCount(1);
|
||||||
|
metadata.First().TmdbId.Should().Be(132456);
|
||||||
|
metadata.First().Title.Should().Be("Title");
|
||||||
|
|
||||||
|
var movies = db.Query<Movie207>("SELECT \"Id\", \"MovieMetadataId\" FROM \"AlternativeTitles\"");
|
||||||
|
|
||||||
|
movies.Should().HaveCount(1);
|
||||||
|
movies.First().MovieMetadataId.Should().Be(metadata.First().Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_link_metadata_to_translation()
|
||||||
|
{
|
||||||
|
var db = WithMigrationTestDb(c =>
|
||||||
|
{
|
||||||
|
c.Insert.IntoTable("Movies").Row(new
|
||||||
|
{
|
||||||
|
Id = 5,
|
||||||
|
Monitored = true,
|
||||||
|
Title = "Title",
|
||||||
|
CleanTitle = "CleanTitle",
|
||||||
|
Status = 3,
|
||||||
|
MinimumAvailability = 4,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Recommendations = new[] { 1 }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
OriginalLanguage = 1,
|
||||||
|
ProfileId = 1,
|
||||||
|
MovieFileId = 0,
|
||||||
|
Path = string.Format("/Movies/{0}", "Title"),
|
||||||
|
TitleSlug = 123456,
|
||||||
|
TmdbId = 132456,
|
||||||
|
Added = DateTime.UtcNow,
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
LastInfoSync = DateTime.UtcNow,
|
||||||
|
});
|
||||||
|
|
||||||
|
c.Insert.IntoTable("MovieTranslations").Row(new
|
||||||
|
{
|
||||||
|
MovieId = 5,
|
||||||
|
Title = "Some Trans",
|
||||||
|
Language = 1
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var metadata = db.Query<MovieMetadata207>("SELECT \"Id\", \"Title\", \"TmdbId\" FROM \"MovieMetadata\"");
|
||||||
|
|
||||||
|
metadata.Should().HaveCount(1);
|
||||||
|
metadata.First().TmdbId.Should().Be(132456);
|
||||||
|
metadata.First().Title.Should().Be("Title");
|
||||||
|
|
||||||
|
var movies = db.Query<Movie207>("SELECT \"Id\", \"MovieMetadataId\" FROM \"MovieTranslations\"");
|
||||||
|
|
||||||
|
movies.Should().HaveCount(1);
|
||||||
|
movies.First().MovieMetadataId.Should().Be(metadata.First().Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_add_metadata_from_list_and_link_back()
|
||||||
|
{
|
||||||
|
var db = WithMigrationTestDb(c =>
|
||||||
|
{
|
||||||
|
c.Insert.IntoTable("ImportListMovies").Row(new
|
||||||
|
{
|
||||||
|
Title = "Title",
|
||||||
|
Status = 3,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
TmdbId = 123456,
|
||||||
|
ListId = 4,
|
||||||
|
Translations = new[] { new { } }.ToJson(),
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var metadata = db.Query<MovieMetadata207>("SELECT \"Id\", \"Title\", \"TmdbId\" FROM \"MovieMetadata\"");
|
||||||
|
|
||||||
|
metadata.Should().HaveCount(1);
|
||||||
|
metadata.First().TmdbId.Should().Be(123456);
|
||||||
|
metadata.First().Title.Should().Be("Title");
|
||||||
|
|
||||||
|
var movies = db.Query<Movie207>("SELECT \"Id\", \"MovieMetadataId\" FROM \"ImportListMovies\"");
|
||||||
|
|
||||||
|
movies.Should().HaveCount(1);
|
||||||
|
movies.First().MovieMetadataId.Should().Be(metadata.First().Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_duplicate_metadata()
|
||||||
|
{
|
||||||
|
var db = WithMigrationTestDb(c =>
|
||||||
|
{
|
||||||
|
c.Insert.IntoTable("Movies").Row(new
|
||||||
|
{
|
||||||
|
Monitored = true,
|
||||||
|
Title = "Title",
|
||||||
|
CleanTitle = "CleanTitle",
|
||||||
|
Status = 3,
|
||||||
|
MinimumAvailability = 4,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Recommendations = new[] { 1 }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
OriginalLanguage = 1,
|
||||||
|
ProfileId = 1,
|
||||||
|
MovieFileId = 0,
|
||||||
|
Path = string.Format("/Movies/{0}", "Title"),
|
||||||
|
TitleSlug = 123456,
|
||||||
|
TmdbId = 123456,
|
||||||
|
Added = DateTime.UtcNow,
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
LastInfoSync = DateTime.UtcNow,
|
||||||
|
});
|
||||||
|
|
||||||
|
c.Insert.IntoTable("ImportListMovies").Row(new
|
||||||
|
{
|
||||||
|
Title = "Title",
|
||||||
|
Status = 3,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
TmdbId = 123456,
|
||||||
|
ListId = 4,
|
||||||
|
Translations = new[] { new { } }.ToJson(),
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var metadata = db.Query<MovieMetadata207>("SELECT \"Id\", \"Title\", \"TmdbId\" FROM \"MovieMetadata\"");
|
||||||
|
|
||||||
|
metadata.Should().HaveCount(1);
|
||||||
|
metadata.First().TmdbId.Should().Be(123456);
|
||||||
|
metadata.First().Title.Should().Be("Title");
|
||||||
|
|
||||||
|
var movies = db.Query<Movie207>("SELECT \"Id\", \"MovieMetadataId\" FROM \"Movies\"");
|
||||||
|
|
||||||
|
movies.Should().HaveCount(1);
|
||||||
|
movies.First().MovieMetadataId.Should().Be(metadata.First().Id);
|
||||||
|
|
||||||
|
var listMovies = db.Query<Movie207>("SELECT \"Id\", \"MovieMetadataId\" FROM \"ImportListMovies\"");
|
||||||
|
|
||||||
|
listMovies.Should().HaveCount(1);
|
||||||
|
listMovies.First().MovieMetadataId.Should().Be(metadata.First().Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_duplicate_metadata_from_lists()
|
||||||
|
{
|
||||||
|
var db = WithMigrationTestDb(c =>
|
||||||
|
{
|
||||||
|
c.Insert.IntoTable("ImportListMovies").Row(new
|
||||||
|
{
|
||||||
|
Title = "Title",
|
||||||
|
Overview = "Overview 1",
|
||||||
|
Status = 3,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
TmdbId = 123456,
|
||||||
|
ListId = 4,
|
||||||
|
Translations = new[] { new { } }.ToJson(),
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
});
|
||||||
|
|
||||||
|
c.Insert.IntoTable("ImportListMovies").Row(new
|
||||||
|
{
|
||||||
|
Title = "Title",
|
||||||
|
Overview = "Overview 2",
|
||||||
|
Status = 3,
|
||||||
|
Images = new[] { new { CoverType = "Poster" } }.ToJson(),
|
||||||
|
Runtime = 90,
|
||||||
|
TmdbId = 123456,
|
||||||
|
ListId = 5,
|
||||||
|
Translations = new[] { new { } }.ToJson(),
|
||||||
|
Collection = new { Name = "Some Collection", TmdbId = 11 }.ToJson(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var metadata = db.Query<MovieMetadata207>("SELECT \"Id\", \"Title\", \"TmdbId\" FROM \"MovieMetadata\"");
|
||||||
|
|
||||||
|
metadata.Should().HaveCount(1);
|
||||||
|
metadata.First().TmdbId.Should().Be(123456);
|
||||||
|
metadata.First().Title.Should().Be("Title");
|
||||||
|
|
||||||
|
var listMovies = db.Query<Movie207>("SELECT \"Id\", \"MovieMetadataId\" FROM \"ImportListMovies\"");
|
||||||
|
|
||||||
|
listMovies.Should().HaveCount(2);
|
||||||
|
listMovies.First().MovieMetadataId.Should().Be(metadata.First().Id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MovieMetadata207
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public int TmdbId { get; set; }
|
||||||
|
public string Title { get; set; }
|
||||||
|
public bool Monitored { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Movie207
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public int MovieMetadataId { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
<rss xmlns:atom="http://www.w3.org/2005/Atom"
|
||||||
|
xmlns:nyaa="https://nyaa.si/xmlns/nyaa" version="2.0">
|
||||||
|
<channel>
|
||||||
|
<title>Nyaa - Home - Torrent File RSS</title>
|
||||||
|
<description>RSS Feed for Home</description>
|
||||||
|
<link>https://nyaa.si/</link>
|
||||||
|
<atom:link href="https://nyaa.si/?page=rss" rel="self" type="application/rss+xml"/>
|
||||||
|
<item>
|
||||||
|
<title>[Foxy-Subs] Mahouka Koukou no Yuutousei - 08 [720p] [3194D881].mkv</title>
|
||||||
|
<link>https://nyaa.si/download/1424896.torrent</link>
|
||||||
|
<guid isPermaLink="true">https://nyaa.si/view/1424896</guid>
|
||||||
|
<pubDate>Tue, 24 Aug 2021 22:18:46 -0000</pubDate>
|
||||||
|
<nyaa:seeders>4</nyaa:seeders>
|
||||||
|
<nyaa:leechers>3</nyaa:leechers>
|
||||||
|
<nyaa:downloads>2</nyaa:downloads>
|
||||||
|
<nyaa:infoHash>e8ca5e20eca876339f41c3d9e95ea66c1d7caaee</nyaa:infoHash>
|
||||||
|
<nyaa:categoryId>1_3</nyaa:categoryId>
|
||||||
|
<nyaa:category>Anime - Non-English-translated</nyaa:category>
|
||||||
|
<nyaa:size>609.6 MiB</nyaa:size>
|
||||||
|
<nyaa:comments>0</nyaa:comments>
|
||||||
|
<nyaa:trusted>No</nyaa:trusted>
|
||||||
|
<nyaa:remake>No</nyaa:remake>
|
||||||
|
<description>
|
||||||
|
<![CDATA[ <a href="https://nyaa.si/view/1424896">#1424896 | [Foxy-Subs] Mahouka Koukou no Yuutousei - 08 [720p] [3194D881].mkv</a> | 609.6 MiB | Anime - Non-English-translated | E8CA5E20ECA876339F41C3D9E95EA66C1D7CAAEE ]]>
|
||||||
|
</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Macross Zero (BDRip 1920x1080p x265 HEVC TrueHD, FLAC 5.1+2.0)[sxales]</title>
|
||||||
|
<link>https://nyaa.si/download/1424895.torrent</link>
|
||||||
|
<guid isPermaLink="true">https://nyaa.si/view/1424895</guid>
|
||||||
|
<pubDate>Tue, 24 Aug 2021 22:03:11 -0000</pubDate>
|
||||||
|
<nyaa:seeders>23</nyaa:seeders>
|
||||||
|
<nyaa:leechers>32</nyaa:leechers>
|
||||||
|
<nyaa:downloads>17</nyaa:downloads>
|
||||||
|
<nyaa:infoHash>26f37f26d5b3475b41a98dc575fabfa6f8d32a76</nyaa:infoHash>
|
||||||
|
<nyaa:categoryId>1_2</nyaa:categoryId>
|
||||||
|
<nyaa:category>Anime - English-translated</nyaa:category>
|
||||||
|
<nyaa:size>5.7 GiB</nyaa:size>
|
||||||
|
<nyaa:comments>2</nyaa:comments>
|
||||||
|
<nyaa:trusted>No</nyaa:trusted>
|
||||||
|
<nyaa:remake>No</nyaa:remake>
|
||||||
|
<description>
|
||||||
|
<![CDATA[ <a href="https://nyaa.si/view/1424895">#1424895 | Macross Zero (BDRip 1920x1080p x265 HEVC TrueHD, FLAC 5.1+2.0)[sxales]</a> | 5.7 GiB | Anime - English-translated | 26F37F26D5B3475B41A98DC575FABFA6F8D32A76 ]]>
|
||||||
|
</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Fumetsu no Anata e - 19 [WEBDL 1080p] Ukr DVO</title>
|
||||||
|
<link>https://nyaa.si/download/1424887.torrent</link>
|
||||||
|
<guid isPermaLink="true">https://nyaa.si/view/1424887</guid>
|
||||||
|
<pubDate>Tue, 24 Aug 2021 21:23:06 -0000</pubDate>
|
||||||
|
<nyaa:seeders>5</nyaa:seeders>
|
||||||
|
<nyaa:leechers>4</nyaa:leechers>
|
||||||
|
<nyaa:downloads>4</nyaa:downloads>
|
||||||
|
<nyaa:infoHash>3e4300e24b39983802162877755aab4380bd137a</nyaa:infoHash>
|
||||||
|
<nyaa:categoryId>1_3</nyaa:categoryId>
|
||||||
|
<nyaa:category>Anime - Non-English-translated</nyaa:category>
|
||||||
|
<nyaa:size>1.4 GiB</nyaa:size>
|
||||||
|
<nyaa:comments>0</nyaa:comments>
|
||||||
|
<nyaa:trusted>No</nyaa:trusted>
|
||||||
|
<nyaa:remake>No</nyaa:remake>
|
||||||
|
<description>
|
||||||
|
<![CDATA[ <a href="https://nyaa.si/view/1424887">#1424887 | Fumetsu no Anata e - 19 [WEBDL 1080p] Ukr DVO</a> | 1.4 GiB | Anime - Non-English-translated | 3E4300E24B39983802162877755AAB4380BD137A ]]>
|
||||||
|
</description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
@@ -35,6 +35,11 @@
|
|||||||
"title": "Avengers: Endgame",
|
"title": "Avengers: Endgame",
|
||||||
"year": 2019,
|
"year": 2019,
|
||||||
"Guid": []
|
"Guid": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "movie",
|
||||||
|
"title": "Avengers",
|
||||||
|
"year": 2005
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_not_delete_unorphaned_credit_items()
|
public void should_not_delete_unorphaned_collection_items()
|
||||||
{
|
{
|
||||||
var collection = Builder<MovieCollection>.CreateNew()
|
var collection = Builder<MovieCollection>.CreateNew()
|
||||||
.With(h => h.Id = 3)
|
.With(h => h.Id = 3)
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests
|
|||||||
.Returns(_movie);
|
.Returns(_movie);
|
||||||
|
|
||||||
Mocker.GetMock<IMovieTranslationService>()
|
Mocker.GetMock<IMovieTranslationService>()
|
||||||
.Setup(s => s.GetAllTranslationsForMovie(It.IsAny<int>()))
|
.Setup(s => s.GetAllTranslationsForMovieMetadata(It.IsAny<int>()))
|
||||||
.Returns(new List<MovieTranslation>());
|
.Returns(new List<MovieTranslation>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,9 @@ namespace NzbDrone.Core.Test.IndexerTests.NyaaTests
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
/* [Test]
|
||||||
|
// Legacy Nyaa feed test
|
||||||
|
|
||||||
public void should_parse_recent_feed_from_Nyaa()
|
public void should_parse_recent_feed_from_Nyaa()
|
||||||
{
|
{
|
||||||
var recentFeed = ReadAllText(@"Files/Indexers/Nyaa/Nyaa.xml");
|
var recentFeed = ReadAllText(@"Files/Indexers/Nyaa/Nyaa.xml");
|
||||||
@@ -53,6 +55,35 @@ namespace NzbDrone.Core.Test.IndexerTests.NyaaTests
|
|||||||
torrentInfo.MagnetUrl.Should().Be(null);
|
torrentInfo.MagnetUrl.Should().Be(null);
|
||||||
torrentInfo.Peers.Should().Be(2 + 1);
|
torrentInfo.Peers.Should().Be(2 + 1);
|
||||||
torrentInfo.Seeders.Should().Be(1);
|
torrentInfo.Seeders.Should().Be(1);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_parse_2021_recent_feed_from_Nyaa()
|
||||||
|
{
|
||||||
|
var recentFeed = ReadAllText(@"Files/Indexers/Nyaa/Nyaa2021.xml");
|
||||||
|
|
||||||
|
Mocker.GetMock<IHttpClient>()
|
||||||
|
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get)))
|
||||||
|
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||||
|
|
||||||
|
var releases = Subject.FetchRecent();
|
||||||
|
|
||||||
|
releases.Should().HaveCount(3);
|
||||||
|
releases.First().Should().BeOfType<TorrentInfo>();
|
||||||
|
|
||||||
|
var torrentInfo = releases.First() as TorrentInfo;
|
||||||
|
|
||||||
|
torrentInfo.Title.Should().Be("[Foxy-Subs] Mahouka Koukou no Yuutousei - 08 [720p] [3194D881].mkv");
|
||||||
|
torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
|
||||||
|
torrentInfo.DownloadUrl.Should().Be("https://nyaa.si/download/1424896.torrent");
|
||||||
|
torrentInfo.InfoUrl.Should().Be("https://nyaa.si/view/1424896");
|
||||||
|
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
|
||||||
|
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
|
||||||
|
torrentInfo.PublishDate.Should().Be(DateTime.Parse("Tue, 24 Aug 2021 22:18:46"));
|
||||||
|
torrentInfo.Size.Should().Be(639211930); //609.6 MiB
|
||||||
|
torrentInfo.MagnetUrl.Should().Be(null);
|
||||||
|
torrentInfo.Seeders.Should().Be(4);
|
||||||
|
torrentInfo.Peers.Should().Be(3 + 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using NzbDrone.Common.Extensions;
|
|||||||
using NzbDrone.Core.Exceptions;
|
using NzbDrone.Core.Exceptions;
|
||||||
using NzbDrone.Core.MetadataSource;
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Movies;
|
using NzbDrone.Core.Movies;
|
||||||
|
using NzbDrone.Core.Movies.Collections;
|
||||||
using NzbDrone.Core.Movies.Commands;
|
using NzbDrone.Core.Movies.Commands;
|
||||||
using NzbDrone.Core.Movies.Credits;
|
using NzbDrone.Core.Movies.Credits;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
@@ -19,6 +20,7 @@ namespace NzbDrone.Core.Test.MovieTests
|
|||||||
public class RefreshMovieServiceFixture : CoreTest<RefreshMovieService>
|
public class RefreshMovieServiceFixture : CoreTest<RefreshMovieService>
|
||||||
{
|
{
|
||||||
private MovieMetadata _movie;
|
private MovieMetadata _movie;
|
||||||
|
private MovieCollection _movieCollection;
|
||||||
private Movie _existingMovie;
|
private Movie _existingMovie;
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
@@ -28,6 +30,9 @@ namespace NzbDrone.Core.Test.MovieTests
|
|||||||
.With(s => s.Status = MovieStatusType.Released)
|
.With(s => s.Status = MovieStatusType.Released)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
_movieCollection = Builder<MovieCollection>.CreateNew()
|
||||||
|
.Build();
|
||||||
|
|
||||||
_existingMovie = Builder<Movie>.CreateNew()
|
_existingMovie = Builder<Movie>.CreateNew()
|
||||||
.With(s => s.MovieMetadata.Value.Status = MovieStatusType.Released)
|
.With(s => s.MovieMetadata.Value.Status = MovieStatusType.Released)
|
||||||
.Build();
|
.Build();
|
||||||
@@ -40,6 +45,10 @@ namespace NzbDrone.Core.Test.MovieTests
|
|||||||
.Setup(s => s.Get(_movie.Id))
|
.Setup(s => s.Get(_movie.Id))
|
||||||
.Returns(_movie);
|
.Returns(_movie);
|
||||||
|
|
||||||
|
Mocker.GetMock<IAddMovieCollectionService>()
|
||||||
|
.Setup(v => v.AddMovieCollection(It.IsAny<MovieCollection>()))
|
||||||
|
.Returns(_movieCollection);
|
||||||
|
|
||||||
Mocker.GetMock<IProvideMovieInfo>()
|
Mocker.GetMock<IProvideMovieInfo>()
|
||||||
.Setup(s => s.GetMovieInfo(It.IsAny<int>()))
|
.Setup(s => s.GetMovieInfo(It.IsAny<int>()))
|
||||||
.Callback<int>((i) => { throw new MovieNotFoundException(i); });
|
.Callback<int>((i) => { throw new MovieNotFoundException(i); });
|
||||||
|
|||||||
@@ -64,6 +64,11 @@ namespace NzbDrone.Core.Test.NotificationTests
|
|||||||
TestLogger.Info("OnRename was called");
|
TestLogger.Info("OnRename was called");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnMovieAdded(Movie movie)
|
||||||
|
{
|
||||||
|
TestLogger.Info("OnMovieAdded was called");
|
||||||
|
}
|
||||||
|
|
||||||
public override void OnMovieFileDelete(MovieFileDeleteMessage message)
|
public override void OnMovieFileDelete(MovieFileDeleteMessage message)
|
||||||
{
|
{
|
||||||
TestLogger.Info("OnMovieFileDelete was called");
|
TestLogger.Info("OnMovieFileDelete was called");
|
||||||
@@ -117,6 +122,7 @@ namespace NzbDrone.Core.Test.NotificationTests
|
|||||||
notification.SupportsOnDownload.Should().BeTrue();
|
notification.SupportsOnDownload.Should().BeTrue();
|
||||||
notification.SupportsOnUpgrade.Should().BeTrue();
|
notification.SupportsOnUpgrade.Should().BeTrue();
|
||||||
notification.SupportsOnRename.Should().BeTrue();
|
notification.SupportsOnRename.Should().BeTrue();
|
||||||
|
notification.SupportsOnMovieAdded.Should().BeTrue();
|
||||||
notification.SupportsOnMovieDelete.Should().BeTrue();
|
notification.SupportsOnMovieDelete.Should().BeTrue();
|
||||||
notification.SupportsOnMovieFileDelete.Should().BeTrue();
|
notification.SupportsOnMovieFileDelete.Should().BeTrue();
|
||||||
notification.SupportsOnMovieFileDeleteForUpgrade.Should().BeTrue();
|
notification.SupportsOnMovieFileDeleteForUpgrade.Should().BeTrue();
|
||||||
@@ -133,6 +139,7 @@ namespace NzbDrone.Core.Test.NotificationTests
|
|||||||
notification.SupportsOnDownload.Should().BeFalse();
|
notification.SupportsOnDownload.Should().BeFalse();
|
||||||
notification.SupportsOnUpgrade.Should().BeFalse();
|
notification.SupportsOnUpgrade.Should().BeFalse();
|
||||||
notification.SupportsOnRename.Should().BeFalse();
|
notification.SupportsOnRename.Should().BeFalse();
|
||||||
|
notification.SupportsOnMovieAdded.Should().BeFalse();
|
||||||
notification.SupportsOnMovieDelete.Should().BeFalse();
|
notification.SupportsOnMovieDelete.Should().BeFalse();
|
||||||
notification.SupportsOnMovieFileDelete.Should().BeFalse();
|
notification.SupportsOnMovieFileDelete.Should().BeFalse();
|
||||||
notification.SupportsOnMovieFileDeleteForUpgrade.Should().BeFalse();
|
notification.SupportsOnMovieFileDeleteForUpgrade.Should().BeFalse();
|
||||||
|
|||||||
+1
-1
@@ -71,7 +71,7 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests
|
|||||||
.Returns(new List<CustomFormat>());
|
.Returns(new List<CustomFormat>());
|
||||||
|
|
||||||
Mocker.GetMock<IMovieTranslationService>()
|
Mocker.GetMock<IMovieTranslationService>()
|
||||||
.Setup(v => v.GetAllTranslationsForMovie(It.IsAny<int>()))
|
.Setup(v => v.GetAllTranslationsForMovieMetadata(It.IsAny<int>()))
|
||||||
.Returns(_movieTranslations);
|
.Returns(_movieTranslations);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
|||||||
|
|
||||||
[TestCase("Movie.Title.1994.Dublado.1080p.XviD-LOL")]
|
[TestCase("Movie.Title.1994.Dublado.1080p.XviD-LOL")]
|
||||||
[TestCase("Movie.Title.2.2019.1080p.Bluray.Dublado.WWW.TPF.GRATIS")]
|
[TestCase("Movie.Title.2.2019.1080p.Bluray.Dublado.WWW.TPF.GRATIS")]
|
||||||
|
[TestCase("Movie.Title.2014.1080p.Bluray.Brazilian.WWW.TPF.GRATIS")]
|
||||||
public void should_parse_language_brazilian_portuguese(string postTitle)
|
public void should_parse_language_brazilian_portuguese(string postTitle)
|
||||||
{
|
{
|
||||||
var result = Parser.Parser.ParseMovieTitle(postTitle, true);
|
var result = Parser.Parser.ParseMovieTitle(postTitle, true);
|
||||||
|
|||||||
@@ -261,6 +261,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
|||||||
[TestCase("Movie.Name.2016.German.DTS.DL.1080p.UHDBD.x265-TDO.mkv", false)]
|
[TestCase("Movie.Name.2016.German.DTS.DL.1080p.UHDBD.x265-TDO.mkv", false)]
|
||||||
[TestCase("Movie.Name.2021.1080p.BDLight.x265-AVCDVD", false)]
|
[TestCase("Movie.Name.2021.1080p.BDLight.x265-AVCDVD", false)]
|
||||||
[TestCase("Random.Title.2010.1080p.HD.DVD.AVC.DDP.5.1-GRouP", false)]
|
[TestCase("Random.Title.2010.1080p.HD.DVD.AVC.DDP.5.1-GRouP", false)]
|
||||||
|
[TestCase("Movie.Title.2012.German.DL.1080p.UHD2BD.x264-QfG", false)]
|
||||||
public void should_parse_bluray1080p_quality(string title, bool proper)
|
public void should_parse_bluray1080p_quality(string title, bool proper)
|
||||||
{
|
{
|
||||||
ParseAndVerifyQuality(title, Source.BLURAY, proper, Resolution.R1080p);
|
ParseAndVerifyQuality(title, Source.BLURAY, proper, Resolution.R1080p);
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
|||||||
[TestCase("Crappy Anime Movie Name 2017 [RH] [Blu-ray][MKV][h264 10-bit][1080p][FLAC 5.1][Dual Audio][Softsubs (RH)]", "RH")]
|
[TestCase("Crappy Anime Movie Name 2017 [RH] [Blu-ray][MKV][h264 10-bit][1080p][FLAC 5.1][Dual Audio][Softsubs (RH)]", "RH")]
|
||||||
[TestCase("Yet Another Anime Movie 2012 [Kametsu] [Blu-ray][MKV][h264 10-bit][1080p][FLAC 5.1][Dual Audio][Softsubs (Kametsu)]", "Kametsu")]
|
[TestCase("Yet Another Anime Movie 2012 [Kametsu] [Blu-ray][MKV][h264 10-bit][1080p][FLAC 5.1][Dual Audio][Softsubs (Kametsu)]", "Kametsu")]
|
||||||
[TestCase("Another.Anime.Film.Name.2016.JPN.Blu-Ray.Remux.AVC.DTS-MA.BluDragon", "BluDragon")]
|
[TestCase("Another.Anime.Film.Name.2016.JPN.Blu-Ray.Remux.AVC.DTS-MA.BluDragon", "BluDragon")]
|
||||||
|
[TestCase("A Movie in the Name (1964) (1080p BluRay x265 r00t)", "r00t")]
|
||||||
public void should_parse_exception_release_group(string title, string expected)
|
public void should_parse_exception_release_group(string title, string expected)
|
||||||
{
|
{
|
||||||
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
Parser.Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ namespace NzbDrone.Core.Test.UpdateTests
|
|||||||
Subject.GetLatestUpdate("develop", new Version(10, 0)).Should().BeNull();
|
Subject.GetLatestUpdate("develop", new Version(10, 0)).Should().BeNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Ignore("Pending linux-x86 release")]
|
||||||
[Test]
|
[Test]
|
||||||
public void finds_update_when_version_lower()
|
public void finds_update_when_version_lower()
|
||||||
{
|
{
|
||||||
@@ -39,6 +40,7 @@ namespace NzbDrone.Core.Test.UpdateTests
|
|||||||
Subject.GetLatestUpdate("invalid_branch", new Version(0, 2)).Should().NotBeNull();
|
Subject.GetLatestUpdate("invalid_branch", new Version(0, 2)).Should().NotBeNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Ignore("Pending linux-x86 release")]
|
||||||
[Test]
|
[Test]
|
||||||
public void should_get_recent_updates()
|
public void should_get_recent_updates()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,11 +45,13 @@ namespace NzbDrone.Core.Configuration
|
|||||||
string SslCertPassword { get; }
|
string SslCertPassword { get; }
|
||||||
string UrlBase { get; }
|
string UrlBase { get; }
|
||||||
string UiFolder { get; }
|
string UiFolder { get; }
|
||||||
|
string InstanceName { get; }
|
||||||
bool UpdateAutomatically { get; }
|
bool UpdateAutomatically { get; }
|
||||||
UpdateMechanism UpdateMechanism { get; }
|
UpdateMechanism UpdateMechanism { get; }
|
||||||
string UpdateScriptPath { get; }
|
string UpdateScriptPath { get; }
|
||||||
string SyslogServer { get; }
|
string SyslogServer { get; }
|
||||||
int SyslogPort { get; }
|
int SyslogPort { get; }
|
||||||
|
string SyslogLevel { get; }
|
||||||
string PostgresHost { get; }
|
string PostgresHost { get; }
|
||||||
int PostgresPort { get; }
|
int PostgresPort { get; }
|
||||||
string PostgresUser { get; }
|
string PostgresUser { get; }
|
||||||
@@ -223,6 +225,7 @@ namespace NzbDrone.Core.Configuration
|
|||||||
}
|
}
|
||||||
|
|
||||||
public string UiFolder => BuildInfo.IsDebug ? Path.Combine("..", "UI") : "UI";
|
public string UiFolder => BuildInfo.IsDebug ? Path.Combine("..", "UI") : "UI";
|
||||||
|
public string InstanceName => GetValue("InstanceName", BuildInfo.AppName);
|
||||||
|
|
||||||
public bool UpdateAutomatically => GetValueBoolean("UpdateAutomatically", false, false);
|
public bool UpdateAutomatically => GetValueBoolean("UpdateAutomatically", false, false);
|
||||||
|
|
||||||
@@ -231,8 +234,11 @@ namespace NzbDrone.Core.Configuration
|
|||||||
public string UpdateScriptPath => GetValue("UpdateScriptPath", "", false);
|
public string UpdateScriptPath => GetValue("UpdateScriptPath", "", false);
|
||||||
|
|
||||||
public string SyslogServer => GetValue("SyslogServer", "", persist: false);
|
public string SyslogServer => GetValue("SyslogServer", "", persist: false);
|
||||||
|
|
||||||
public int SyslogPort => GetValueInt("SyslogPort", 514, 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)
|
public int GetValueInt(string key, int defaultValue, bool persist = true)
|
||||||
{
|
{
|
||||||
return Convert.ToInt32(GetValue(key, defaultValue, persist));
|
return Convert.ToInt32(GetValue(key, defaultValue, persist));
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.CustomFormats
|
||||||
|
{
|
||||||
|
public class ReleaseGroupSpecification : RegexSpecificationBase
|
||||||
|
{
|
||||||
|
public override int Order => 9;
|
||||||
|
public override string ImplementationName => "Release Group";
|
||||||
|
public override string InfoLink => "https://wiki.servarr.com/radarr/settings#custom-formats-2";
|
||||||
|
|
||||||
|
protected override bool IsSatisfiedByWithoutNegate(ParsedMovieInfo movieInfo)
|
||||||
|
{
|
||||||
|
return MatchString(movieInfo?.ReleaseGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,9 +15,9 @@ namespace NzbDrone.Core.Datastore.Migration
|
|||||||
.WithColumn("Genres").AsString().Nullable()
|
.WithColumn("Genres").AsString().Nullable()
|
||||||
.WithColumn("Title").AsString()
|
.WithColumn("Title").AsString()
|
||||||
.WithColumn("SortTitle").AsString().Nullable()
|
.WithColumn("SortTitle").AsString().Nullable()
|
||||||
.WithColumn("CleanTitle").AsString().Indexed()
|
.WithColumn("CleanTitle").AsString().Nullable().Indexed()
|
||||||
.WithColumn("OriginalTitle").AsString()
|
.WithColumn("OriginalTitle").AsString().Nullable()
|
||||||
.WithColumn("CleanOriginalTitle").AsString().Indexed()
|
.WithColumn("CleanOriginalTitle").AsString().Nullable().Indexed()
|
||||||
.WithColumn("OriginalLanguage").AsInt32()
|
.WithColumn("OriginalLanguage").AsInt32()
|
||||||
.WithColumn("Status").AsInt32()
|
.WithColumn("Status").AsInt32()
|
||||||
.WithColumn("LastInfoSync").AsDateTime().Nullable()
|
.WithColumn("LastInfoSync").AsDateTime().Nullable()
|
||||||
@@ -28,7 +28,7 @@ namespace NzbDrone.Core.Datastore.Migration
|
|||||||
.WithColumn("Year").AsInt32().Nullable()
|
.WithColumn("Year").AsInt32().Nullable()
|
||||||
.WithColumn("SecondaryYear").AsInt32().Nullable()
|
.WithColumn("SecondaryYear").AsInt32().Nullable()
|
||||||
.WithColumn("Ratings").AsString().Nullable()
|
.WithColumn("Ratings").AsString().Nullable()
|
||||||
.WithColumn("Recommendations").AsString().Nullable()
|
.WithColumn("Recommendations").AsString()
|
||||||
.WithColumn("Certification").AsString().Nullable()
|
.WithColumn("Certification").AsString().Nullable()
|
||||||
.WithColumn("YouTubeTrailerId").AsString().Nullable()
|
.WithColumn("YouTubeTrailerId").AsString().Nullable()
|
||||||
.WithColumn("Collection").AsString().Nullable()
|
.WithColumn("Collection").AsString().Nullable()
|
||||||
@@ -43,10 +43,11 @@ namespace NzbDrone.Core.Datastore.Migration
|
|||||||
FROM ""Movies""");
|
FROM ""Movies""");
|
||||||
|
|
||||||
// Transfer metadata from ImportListMovies to MovieMetadata if not already in
|
// Transfer metadata from ImportListMovies to MovieMetadata if not already in
|
||||||
Execute.Sql(@"INSERT INTO ""MovieMetadata"" (""TmdbId"", ""ImdbId"", ""Title"", ""SortTitle"", ""CleanTitle"", ""OriginalTitle"", ""CleanOriginalTitle"", ""OriginalLanguage"", ""Overview"", ""Status"", ""LastInfoSync"", ""Images"", ""Genres"", ""Ratings"", ""Runtime"", ""InCinemas"", ""PhysicalRelease"", ""DigitalRelease"", ""Year"", ""Certification"", ""YouTubeTrailerId"", ""Studio"", ""Collection"", ""Website"")
|
Execute.Sql(@"INSERT INTO ""MovieMetadata"" (""TmdbId"", ""ImdbId"", ""Title"", ""SortTitle"", ""CleanTitle"", ""OriginalTitle"", ""CleanOriginalTitle"", ""OriginalLanguage"", ""Overview"", ""Status"", ""LastInfoSync"", ""Images"", ""Genres"", ""Ratings"", ""Runtime"", ""InCinemas"", ""PhysicalRelease"", ""DigitalRelease"", ""Year"", ""Recommendations"", ""Certification"", ""YouTubeTrailerId"", ""Studio"", ""Collection"", ""Website"")
|
||||||
SELECT ""TmdbId"", ""ImdbId"", ""Title"", ""SortTitle"", ""Title"", ""OriginalTitle"", ""OriginalTitle"", 1, ""Overview"", ""Status"", ""LastInfoSync"", ""Images"", ""Genres"", ""Ratings"", ""Runtime"", ""InCinemas"", ""PhysicalRelease"", ""DigitalRelease"", ""Year"", ""Certification"", ""YouTubeTrailerId"", ""Studio"", ""Collection"", ""Website""
|
SELECT ""TmdbId"", ""ImdbId"", ""Title"", ""SortTitle"", ""Title"", ""OriginalTitle"", ""OriginalTitle"", 1, ""Overview"", ""Status"", ""LastInfoSync"", ""Images"", ""Genres"", ""Ratings"", ""Runtime"", ""InCinemas"", ""PhysicalRelease"", ""DigitalRelease"", ""Year"", '[]', ""Certification"", ""YouTubeTrailerId"", ""Studio"", ""Collection"", ""Website""
|
||||||
FROM ""ImportListMovies""
|
FROM ""ImportListMovies""
|
||||||
WHERE ""ImportListMovies"".""TmdbId"" NOT IN ( SELECT ""MovieMetadata"".""TmdbId"" FROM ""MovieMetadata"" )");
|
WHERE ""ImportListMovies"".""TmdbId"" NOT IN ( SELECT ""MovieMetadata"".""TmdbId"" FROM ""MovieMetadata"" )
|
||||||
|
AND ""ImportListMovies"".""Id"" IN ( SELECT MIN(""Id"") FROM ""ImportListMovies"" GROUP BY ""TmdbId"" )");
|
||||||
|
|
||||||
// Add an MovieMetadataId column to Movies
|
// Add an MovieMetadataId column to Movies
|
||||||
Alter.Table("Movies").AddColumn("MovieMetadataId").AsInt32().WithDefaultValue(0);
|
Alter.Table("Movies").AddColumn("MovieMetadataId").AsInt32().WithDefaultValue(0);
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using FluentMigrator;
|
||||||
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Datastore.Migration
|
||||||
|
{
|
||||||
|
[Migration(209)]
|
||||||
|
public class movie_meta_collection_index : NzbDroneMigrationBase
|
||||||
|
{
|
||||||
|
protected override void MainDbUpgrade()
|
||||||
|
{
|
||||||
|
Create.Index("IX_MovieMetadata_CollectionTmdbId").OnTable("MovieMetadata").OnColumn("CollectionTmdbId");
|
||||||
|
Create.Index("IX_MovieTranslations_MovieMetadataId").OnTable("MovieTranslations").OnColumn("MovieMetadataId");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
using FluentMigrator;
|
||||||
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Datastore.Migration
|
||||||
|
{
|
||||||
|
[Migration(210)]
|
||||||
|
public class movie_added_notifications : NzbDroneMigrationBase
|
||||||
|
{
|
||||||
|
protected override void MainDbUpgrade()
|
||||||
|
{
|
||||||
|
Alter.Table("Notifications").AddColumn("OnMovieAdded").AsBoolean().WithDefaultValue(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -88,6 +88,7 @@ namespace NzbDrone.Core.Datastore
|
|||||||
.Ignore(i => i.SupportsOnDownload)
|
.Ignore(i => i.SupportsOnDownload)
|
||||||
.Ignore(i => i.SupportsOnUpgrade)
|
.Ignore(i => i.SupportsOnUpgrade)
|
||||||
.Ignore(i => i.SupportsOnRename)
|
.Ignore(i => i.SupportsOnRename)
|
||||||
|
.Ignore(i => i.SupportsOnMovieAdded)
|
||||||
.Ignore(i => i.SupportsOnMovieDelete)
|
.Ignore(i => i.SupportsOnMovieDelete)
|
||||||
.Ignore(i => i.SupportsOnMovieFileDelete)
|
.Ignore(i => i.SupportsOnMovieFileDelete)
|
||||||
.Ignore(i => i.SupportsOnMovieFileDeleteForUpgrade)
|
.Ignore(i => i.SupportsOnMovieFileDeleteForUpgrade)
|
||||||
|
|||||||
@@ -288,7 +288,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "forcedDL": //torrent is being downloaded, and was forced started
|
case "forcedDL": // torrent is being downloaded, and was forced started
|
||||||
|
case "forcedMetaDL": // torrent metadata is being forcibly downloaded
|
||||||
case "moving": // torrent is being moved from a folder
|
case "moving": // torrent is being moved from a folder
|
||||||
case "downloading": // torrent is being downloaded and data is being transferred
|
case "downloading": // torrent is being downloaded and data is being transferred
|
||||||
item.Status = DownloadItemStatus.Downloading;
|
item.Status = DownloadItemStatus.Downloading;
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ namespace NzbDrone.Core.Download
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var importResults = _downloadedMovieImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteMovie.Movie, trackedDownload.DownloadItem);
|
var importResults = _downloadedMovieImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteMovie.Movie, trackedDownload.ImportItem);
|
||||||
|
|
||||||
if (VerifyImport(trackedDownload, importResults))
|
if (VerifyImport(trackedDownload, importResults))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -126,11 +126,11 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
|
|||||||
(int)movie.MovieMetadata.Value.OriginalLanguage :
|
(int)movie.MovieMetadata.Value.OriginalLanguage :
|
||||||
Settings.MovieMetadataLanguage;
|
Settings.MovieMetadataLanguage;
|
||||||
|
|
||||||
var movieTranslations = _movieTranslationsService.GetAllTranslationsForMovie(movie.Id);
|
var movieTranslations = _movieTranslationsService.GetAllTranslationsForMovieMetadata(movie.MovieMetadataId);
|
||||||
var selectedSettingsLanguage = Language.FindById(movieMetadataLanguage);
|
var selectedSettingsLanguage = Language.FindById(movieMetadataLanguage);
|
||||||
var movieTranslation = movieTranslations.FirstOrDefault(mt => mt.Language == selectedSettingsLanguage);
|
var movieTranslation = movieTranslations.FirstOrDefault(mt => mt.Language == selectedSettingsLanguage);
|
||||||
|
|
||||||
var credits = _creditService.GetAllCreditsForMovie(movie.MovieMetadataId);
|
var credits = _creditService.GetAllCreditsForMovieMetadata(movie.MovieMetadataId);
|
||||||
|
|
||||||
var watched = GetExistingWatchedStatus(movie, movieFile.RelativePath);
|
var watched = GetExistingWatchedStatus(movie, movieFile.RelativePath);
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,9 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
|
|||||||
WHERE ""Id"" IN (
|
WHERE ""Id"" IN (
|
||||||
SELECT ""MovieMetadata"".""Id"" FROM ""MovieMetadata""
|
SELECT ""MovieMetadata"".""Id"" FROM ""MovieMetadata""
|
||||||
LEFT OUTER JOIN ""Movies"" ON ""Movies"".""MovieMetadataId"" = ""MovieMetadata"".""Id""
|
LEFT OUTER JOIN ""Movies"" ON ""Movies"".""MovieMetadataId"" = ""MovieMetadata"".""Id""
|
||||||
|
LEFT OUTER JOIN ""Collections"" ON ""Collections"".""TmdbId"" = ""MovieMetadata"".""CollectionTmdbId""
|
||||||
LEFT OUTER JOIN ""ImportListMovies"" ON ""ImportListMovies"".""MovieMetadataId"" = ""MovieMetadata"".""Id""
|
LEFT OUTER JOIN ""ImportListMovies"" ON ""ImportListMovies"".""MovieMetadataId"" = ""MovieMetadata"".""Id""
|
||||||
WHERE ""Movies"".""Id"" IS NULL AND ""ImportListMovies"".""Id"" IS NULL)");
|
WHERE ""Movies"".""Id"" IS NULL AND ""ImportListMovies"".""Id"" IS NULL AND ""Collections"".""Id"" IS NULL)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -177,12 +177,12 @@ namespace NzbDrone.Core.ImportLists
|
|||||||
{
|
{
|
||||||
var mappedMovie = _movieSearch.MapMovieToTmdbMovie(new MovieMetadata { Title = report.Title, TmdbId = report.TmdbId, ImdbId = report.ImdbId, Year = report.Year });
|
var mappedMovie = _movieSearch.MapMovieToTmdbMovie(new MovieMetadata { Title = report.Title, TmdbId = report.TmdbId, ImdbId = report.ImdbId, Year = report.Year });
|
||||||
|
|
||||||
_movieMetadataService.Upsert(mappedMovie);
|
|
||||||
|
|
||||||
var mappedListMovie = new ImportListMovie { ListId = report.ListId };
|
var mappedListMovie = new ImportListMovie { ListId = report.ListId };
|
||||||
|
|
||||||
if (mappedMovie != null)
|
if (mappedMovie != null)
|
||||||
{
|
{
|
||||||
|
_movieMetadataService.Upsert(mappedMovie);
|
||||||
|
|
||||||
mappedListMovie.MovieMetadata = mappedMovie;
|
mappedListMovie.MovieMetadata = mappedMovie;
|
||||||
mappedListMovie.MovieMetadataId = mappedMovie.Id;
|
mappedListMovie.MovieMetadataId = mappedMovie.Id;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,8 @@ namespace NzbDrone.Core.ImportLists
|
|||||||
AddOptions = new AddMovieOptions
|
AddOptions = new AddMovieOptions
|
||||||
{
|
{
|
||||||
SearchForMovie = monitorType != MonitorTypes.None && importList.SearchOnAdd,
|
SearchForMovie = monitorType != MonitorTypes.None && importList.SearchOnAdd,
|
||||||
Monitor = monitorType
|
Monitor = monitorType,
|
||||||
|
AddMethod = AddMovieMethod.List
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ namespace NzbDrone.Core.ImportLists.Plex
|
|||||||
{
|
{
|
||||||
var scheme = $"{prefix}://";
|
var scheme = $"{prefix}://";
|
||||||
|
|
||||||
return guids.FirstOrDefault((guid) => guid.Id.StartsWith(scheme))?.Id.Replace(scheme, "");
|
return guids?.FirstOrDefault((guid) => guid.Id.StartsWith(scheme))?.Id.Replace(scheme, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ namespace NzbDrone.Core.IndexerSearch
|
|||||||
public List<DownloadDecision> MovieSearch(int movieId, bool userInvokedSearch, bool interactiveSearch)
|
public List<DownloadDecision> MovieSearch(int movieId, bool userInvokedSearch, bool interactiveSearch)
|
||||||
{
|
{
|
||||||
var movie = _movieService.GetMovie(movieId);
|
var movie = _movieService.GetMovie(movieId);
|
||||||
movie.MovieMetadata.Value.Translations = _movieTranslationService.GetAllTranslationsForMovie(movie.Id);
|
movie.MovieMetadata.Value.Translations = _movieTranslationService.GetAllTranslationsForMovieMetadata(movie.MovieMetadataId);
|
||||||
|
|
||||||
return MovieSearch(movie, userInvokedSearch, interactiveSearch);
|
return MovieSearch(movie, userInvokedSearch, interactiveSearch);
|
||||||
}
|
}
|
||||||
@@ -77,7 +77,7 @@ namespace NzbDrone.Core.IndexerSearch
|
|||||||
};
|
};
|
||||||
|
|
||||||
var wantedLanguages = _profileService.GetAcceptableLanguages(movie.ProfileId);
|
var wantedLanguages = _profileService.GetAcceptableLanguages(movie.ProfileId);
|
||||||
var translations = _movieTranslationService.GetAllTranslationsForMovie(movie.Id);
|
var translations = _movieTranslationService.GetAllTranslationsForMovieMetadata(movie.MovieMetadataId);
|
||||||
|
|
||||||
var queryTranlations = new List<string>
|
var queryTranlations = new List<string>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ namespace NzbDrone.Core.Indexers
|
|||||||
UseGuidInfoUrl = true;
|
UseGuidInfoUrl = true;
|
||||||
UseEnclosureLength = false;
|
UseEnclosureLength = false;
|
||||||
UseEnclosureUrl = true;
|
UseEnclosureUrl = true;
|
||||||
|
SeedsElementName = "seeds";
|
||||||
|
InfoHashElementName = "infoHash";
|
||||||
|
SizeElementName = "contentLength";
|
||||||
|
MagnetElementName = "magnetURI";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool PreProcess(IndexerResponse indexerResponse)
|
protected override bool PreProcess(IndexerResponse indexerResponse)
|
||||||
@@ -26,51 +30,5 @@ namespace NzbDrone.Core.Indexers
|
|||||||
|
|
||||||
return base.PreProcess(indexerResponse);
|
return base.PreProcess(indexerResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override long GetSize(XElement item)
|
|
||||||
{
|
|
||||||
var contentLength = item.FindDecendants("contentLength").SingleOrDefault();
|
|
||||||
|
|
||||||
if (contentLength != null)
|
|
||||||
{
|
|
||||||
return (long)contentLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.GetSize(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override string GetInfoHash(XElement item)
|
|
||||||
{
|
|
||||||
var infoHash = item.FindDecendants("infoHash").SingleOrDefault();
|
|
||||||
return (string)infoHash;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override string GetMagnetUrl(XElement item)
|
|
||||||
{
|
|
||||||
var magnetURI = item.FindDecendants("magnetURI").SingleOrDefault();
|
|
||||||
return (string)magnetURI;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override int? GetSeeders(XElement item)
|
|
||||||
{
|
|
||||||
var seeds = item.FindDecendants("seeds").SingleOrDefault();
|
|
||||||
if (seeds != null)
|
|
||||||
{
|
|
||||||
return (int)seeds;
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.GetSeeders(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override int? GetPeers(XElement item)
|
|
||||||
{
|
|
||||||
var peers = item.FindDecendants("peers").SingleOrDefault();
|
|
||||||
if (peers != null)
|
|
||||||
{
|
|
||||||
return (int)peers;
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.GetPeers(item);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ namespace NzbDrone.Core.Indexers.Nyaa
|
|||||||
|
|
||||||
public override IParseIndexerResponse GetParser()
|
public override IParseIndexerResponse GetParser()
|
||||||
{
|
{
|
||||||
return new TorrentRssParser() { UseGuidInfoUrl = true, ParseSizeInDescription = true, ParseSeedersInDescription = true };
|
return new TorrentRssParser() { UseGuidInfoUrl = true, SizeElementName = "size", InfoHashElementName = "infoHash", PeersElementName = "leechers", CalculatePeersAsSum = true, SeedsElementName = "seeders" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
using MonoTorrent;
|
using MonoTorrent;
|
||||||
@@ -9,12 +10,27 @@ namespace NzbDrone.Core.Indexers
|
|||||||
{
|
{
|
||||||
public class TorrentRssParser : RssParser
|
public class TorrentRssParser : RssParser
|
||||||
{
|
{
|
||||||
|
// Use to sum/calculate Peers as Leechers+Seeders
|
||||||
|
public bool CalculatePeersAsSum { get; set; } = false;
|
||||||
|
|
||||||
|
// Use the specified element name to determine the Infohash
|
||||||
|
public string InfoHashElementName { get; set; }
|
||||||
|
|
||||||
// Parse various seeder/leecher/peers formats in the description element to determine number of seeders.
|
// Parse various seeder/leecher/peers formats in the description element to determine number of seeders.
|
||||||
public bool ParseSeedersInDescription { get; set; }
|
public bool ParseSeedersInDescription { get; set; }
|
||||||
|
|
||||||
// Use the specified element name to determine the size
|
// Use the specified element name to determine the Peers
|
||||||
|
public string PeersElementName { get; set; }
|
||||||
|
|
||||||
|
// Use the specified element name to determine the Seeds
|
||||||
|
public string SeedsElementName { get; set; }
|
||||||
|
|
||||||
|
// Use the specified element name to determine the Size
|
||||||
public string SizeElementName { get; set; }
|
public string SizeElementName { get; set; }
|
||||||
|
|
||||||
|
// Use the specified element name to determine the Magnet link
|
||||||
|
public string MagnetElementName { get; set; }
|
||||||
|
|
||||||
public TorrentRssParser()
|
public TorrentRssParser()
|
||||||
{
|
{
|
||||||
PreferredEnclosureMimeTypes = TorrentEnclosureMimeTypes;
|
PreferredEnclosureMimeTypes = TorrentEnclosureMimeTypes;
|
||||||
@@ -40,14 +56,28 @@ namespace NzbDrone.Core.Indexers
|
|||||||
result.InfoHash = GetInfoHash(item);
|
result.InfoHash = GetInfoHash(item);
|
||||||
result.MagnetUrl = GetMagnetUrl(item);
|
result.MagnetUrl = GetMagnetUrl(item);
|
||||||
result.Seeders = GetSeeders(item);
|
result.Seeders = GetSeeders(item);
|
||||||
result.Peers = GetPeers(item);
|
|
||||||
|
if (CalculatePeersAsSum)
|
||||||
|
{
|
||||||
|
result.Peers = GetPeers(item) + result.Seeders;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.Peers = GetPeers(item);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual string GetInfoHash(XElement item)
|
protected virtual string GetInfoHash(XElement item)
|
||||||
{
|
{
|
||||||
|
if (InfoHashElementName.IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
return item.FindDecendants(InfoHashElementName).FirstOrDefault().Value;
|
||||||
|
}
|
||||||
|
|
||||||
var magnetUrl = GetMagnetUrl(item);
|
var magnetUrl = GetMagnetUrl(item);
|
||||||
|
|
||||||
if (magnetUrl.IsNotNullOrWhiteSpace())
|
if (magnetUrl.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -64,10 +94,21 @@ namespace NzbDrone.Core.Indexers
|
|||||||
|
|
||||||
protected virtual string GetMagnetUrl(XElement item)
|
protected virtual string GetMagnetUrl(XElement item)
|
||||||
{
|
{
|
||||||
var downloadUrl = GetDownloadUrl(item);
|
if (MagnetElementName.IsNotNullOrWhiteSpace())
|
||||||
if (downloadUrl.IsNotNullOrWhiteSpace() && downloadUrl.StartsWith("magnet:"))
|
|
||||||
{
|
{
|
||||||
return downloadUrl;
|
var magnetURL = item.FindDecendants(MagnetElementName).FirstOrDefault().Value;
|
||||||
|
if (magnetURL.IsNotNullOrWhiteSpace() && magnetURL.StartsWith("magnet:"))
|
||||||
|
{
|
||||||
|
return magnetURL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var downloadUrl = GetDownloadUrl(item);
|
||||||
|
if (downloadUrl.IsNotNullOrWhiteSpace() && downloadUrl.StartsWith("magnet:"))
|
||||||
|
{
|
||||||
|
return downloadUrl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@@ -75,6 +116,8 @@ namespace NzbDrone.Core.Indexers
|
|||||||
|
|
||||||
protected virtual int? GetSeeders(XElement item)
|
protected virtual int? GetSeeders(XElement item)
|
||||||
{
|
{
|
||||||
|
// safe to always use the element if it's present (and valid)
|
||||||
|
// fall back to description if ParseSeedersInDescription is enabled
|
||||||
if (ParseSeedersInDescription && item.Element("description") != null)
|
if (ParseSeedersInDescription && item.Element("description") != null)
|
||||||
{
|
{
|
||||||
var matchSeeders = ParseSeedersRegex.Match(item.Element("description").Value);
|
var matchSeeders = ParseSeedersRegex.Match(item.Element("description").Value);
|
||||||
@@ -93,6 +136,12 @@ namespace NzbDrone.Core.Indexers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var seeds = item.FindDecendants(SeedsElementName).SingleOrDefault();
|
||||||
|
if (seeds != null)
|
||||||
|
{
|
||||||
|
return (int)seeds;
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,6 +165,12 @@ namespace NzbDrone.Core.Indexers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PeersElementName.IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
var itempeers = item.FindDecendants(PeersElementName).SingleOrDefault();
|
||||||
|
return int.Parse(itempeers.Value);
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,9 +179,10 @@ namespace NzbDrone.Core.Indexers
|
|||||||
var size = base.GetSize(item);
|
var size = base.GetSize(item);
|
||||||
if (size == 0 && SizeElementName.IsNotNullOrWhiteSpace())
|
if (size == 0 && SizeElementName.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
if (item.Element(SizeElementName) != null)
|
var itemsize = item.FindDecendants(SizeElementName).SingleOrDefault();
|
||||||
|
if (itemsize != null)
|
||||||
{
|
{
|
||||||
size = ParseSize(item.Element(SizeElementName).Value, true);
|
size = ParseSize(itemsize.Value, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,8 @@ namespace NzbDrone.Core.Instrumentation
|
|||||||
|
|
||||||
if (_configFileProvider.SyslogServer.IsNotNullOrWhiteSpace())
|
if (_configFileProvider.SyslogServer.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
SetSyslogParameters(_configFileProvider.SyslogServer, _configFileProvider.SyslogPort, minimumLogLevel);
|
var syslogLevel = LogLevel.FromString(_configFileProvider.SyslogLevel);
|
||||||
|
SetSyslogParameters(_configFileProvider.SyslogServer, _configFileProvider.SyslogPort, syslogLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
var rules = LogManager.Configuration.LoggingRules;
|
var rules = LogManager.Configuration.LoggingRules;
|
||||||
@@ -118,7 +119,7 @@ namespace NzbDrone.Core.Instrumentation
|
|||||||
syslogTarget.MessageSend.Udp.Server = syslogServer;
|
syslogTarget.MessageSend.Udp.Server = syslogServer;
|
||||||
syslogTarget.MessageSend.Udp.ReconnectInterval = 500;
|
syslogTarget.MessageSend.Udp.ReconnectInterval = 500;
|
||||||
syslogTarget.MessageCreation.Rfc = RfcNumber.Rfc5424;
|
syslogTarget.MessageCreation.Rfc = RfcNumber.Rfc5424;
|
||||||
syslogTarget.MessageCreation.Rfc5424.AppName = BuildInfo.AppName;
|
syslogTarget.MessageCreation.Rfc5424.AppName = _configFileProvider.InstanceName;
|
||||||
|
|
||||||
var loggingRule = new LoggingRule("*", minimumLogLevel, syslogTarget);
|
var loggingRule = new LoggingRule("*", minimumLogLevel, syslogTarget);
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ namespace NzbDrone.Core.Jobs
|
|||||||
|
|
||||||
new ScheduledTask
|
new ScheduledTask
|
||||||
{
|
{
|
||||||
Interval = Math.Max(_configService.CheckForFinishedDownloadInterval, 1),
|
Interval = GetRefreshMonitoredInterval(),
|
||||||
TypeName = typeof(RefreshMonitoredDownloadsCommand).FullName,
|
TypeName = typeof(RefreshMonitoredDownloadsCommand).FullName,
|
||||||
Priority = CommandPriority.High
|
Priority = CommandPriority.High
|
||||||
}
|
}
|
||||||
@@ -198,6 +198,18 @@ namespace NzbDrone.Core.Jobs
|
|||||||
return interval;
|
return interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int GetRefreshMonitoredInterval()
|
||||||
|
{
|
||||||
|
var interval = _configService.CheckForFinishedDownloadInterval;
|
||||||
|
|
||||||
|
if (interval < 1)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return interval;
|
||||||
|
}
|
||||||
|
|
||||||
private int GetImportListSyncInterval()
|
private int GetImportListSyncInterval()
|
||||||
{
|
{
|
||||||
//Enforce 6 hour min on list sync
|
//Enforce 6 hour min on list sync
|
||||||
@@ -218,6 +230,7 @@ namespace NzbDrone.Core.Jobs
|
|||||||
|
|
||||||
_scheduledTaskRepository.SetLastExecutionTime(scheduledTask.Id, lastExecution, message.Command.StartedAt.Value);
|
_scheduledTaskRepository.SetLastExecutionTime(scheduledTask.Id, lastExecution, message.Command.StartedAt.Value);
|
||||||
_cache.Find(scheduledTask.TypeName).LastExecution = lastExecution;
|
_cache.Find(scheduledTask.TypeName).LastExecution = lastExecution;
|
||||||
|
_cache.Find(scheduledTask.TypeName).LastStartTime = message.Command.StartedAt.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,13 +246,14 @@ namespace NzbDrone.Core.Jobs
|
|||||||
backup.Interval = GetBackupInterval();
|
backup.Interval = GetBackupInterval();
|
||||||
|
|
||||||
var refreshMonitoredDownloads = _scheduledTaskRepository.GetDefinition(typeof(RefreshMonitoredDownloadsCommand));
|
var refreshMonitoredDownloads = _scheduledTaskRepository.GetDefinition(typeof(RefreshMonitoredDownloadsCommand));
|
||||||
refreshMonitoredDownloads.Interval = _configService.CheckForFinishedDownloadInterval;
|
refreshMonitoredDownloads.Interval = GetRefreshMonitoredInterval();
|
||||||
|
|
||||||
_scheduledTaskRepository.UpdateMany(new List<ScheduledTask> { rss, importList, refreshMonitoredDownloads, backup });
|
_scheduledTaskRepository.UpdateMany(new List<ScheduledTask> { rss, importList, refreshMonitoredDownloads, backup });
|
||||||
|
|
||||||
_cache.Find(rss.TypeName).Interval = rss.Interval;
|
_cache.Find(rss.TypeName).Interval = rss.Interval;
|
||||||
_cache.Find(importList.TypeName).Interval = importList.Interval;
|
_cache.Find(importList.TypeName).Interval = importList.Interval;
|
||||||
_cache.Find(backup.TypeName).Interval = backup.Interval;
|
_cache.Find(backup.TypeName).Interval = backup.Interval;
|
||||||
|
_cache.Find(refreshMonitoredDownloads.TypeName).Interval = refreshMonitoredDownloads.Interval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
"Yesterday": "في الامس",
|
"Yesterday": "في الامس",
|
||||||
"YesMoveFiles": "نعم ، انقل الملفات",
|
"YesMoveFiles": "نعم ، انقل الملفات",
|
||||||
"YesCancel": "نعم إلغاء",
|
"YesCancel": "نعم إلغاء",
|
||||||
"Yes": "نعم",
|
|
||||||
"Year": "عام",
|
"Year": "عام",
|
||||||
"WouldYouLikeToRestoreBackup": "هل ترغب في استعادة النسخة الاحتياطية {0}؟",
|
"WouldYouLikeToRestoreBackup": "هل ترغب في استعادة النسخة الاحتياطية {0}؟",
|
||||||
"Wiki": "ويكي",
|
"Wiki": "ويكي",
|
||||||
@@ -294,7 +293,6 @@
|
|||||||
"NoChange": "لا تغيير",
|
"NoChange": "لا تغيير",
|
||||||
"NoBackupsAreAvailable": "لا توجد نسخ احتياطية متاحة",
|
"NoBackupsAreAvailable": "لا توجد نسخ احتياطية متاحة",
|
||||||
"NoAltTitle": "لا توجد عناوين بديلة.",
|
"NoAltTitle": "لا توجد عناوين بديلة.",
|
||||||
"No": "لا",
|
|
||||||
"NextExecution": "التنفيذ القادم",
|
"NextExecution": "التنفيذ القادم",
|
||||||
"New": "جديد",
|
"New": "جديد",
|
||||||
"NetCore": ".شبكة",
|
"NetCore": ".شبكة",
|
||||||
@@ -437,7 +435,6 @@
|
|||||||
"History": "التاريخ",
|
"History": "التاريخ",
|
||||||
"HideAdvanced": "إخفاء الإعدادات المتقدمة",
|
"HideAdvanced": "إخفاء الإعدادات المتقدمة",
|
||||||
"HiddenClickToShow": "مخفي ، انقر للعرض",
|
"HiddenClickToShow": "مخفي ، انقر للعرض",
|
||||||
"HelpText": "الفاصل بالدقائق. اضبط على صفر للتعطيل (سيؤدي هذا إلى إيقاف كل عمليات الاستيلاء على التحرير التلقائي)",
|
|
||||||
"HealthNoIssues": "لا مشاكل مع التكوين الخاص بك",
|
"HealthNoIssues": "لا مشاكل مع التكوين الخاص بك",
|
||||||
"Health": "الصحة",
|
"Health": "الصحة",
|
||||||
"HaveNotAddedMovies": "لم تقم بإضافة أي أفلام بعد ، هل تريد استيراد بعض أو كل أفلامك أولاً؟",
|
"HaveNotAddedMovies": "لم تقم بإضافة أي أفلام بعد ، هل تريد استيراد بعض أو كل أفلامك أولاً؟",
|
||||||
@@ -1016,7 +1013,6 @@
|
|||||||
"DownloadClientCheckNoneAvailableMessage": "لا يوجد عميل تنزيل متاح",
|
"DownloadClientCheckNoneAvailableMessage": "لا يوجد عميل تنزيل متاح",
|
||||||
"AddNewMessage": "من السهل إضافة فيلم جديد ، فقط ابدأ بكتابة اسم الفيلم الذي تريد إضافته",
|
"AddNewMessage": "من السهل إضافة فيلم جديد ، فقط ابدأ بكتابة اسم الفيلم الذي تريد إضافته",
|
||||||
"AddNew": "اضف جديد",
|
"AddNew": "اضف جديد",
|
||||||
"AddMoviesMonitored": "إضافة أفلام مراقبتها",
|
|
||||||
"AddMovies": "اضافة افلام",
|
"AddMovies": "اضافة افلام",
|
||||||
"AddMovie": "اضافة فيلم",
|
"AddMovie": "اضافة فيلم",
|
||||||
"AddListExclusion": "إضافة استبعاد قائمة",
|
"AddListExclusion": "إضافة استبعاد قائمة",
|
||||||
@@ -1062,5 +1058,10 @@
|
|||||||
"Rating": "التقييمات",
|
"Rating": "التقييمات",
|
||||||
"RemotePath": "مسار بعيد",
|
"RemotePath": "مسار بعيد",
|
||||||
"Filters": "منقي",
|
"Filters": "منقي",
|
||||||
"LocalPath": "مسار محلي"
|
"LocalPath": "مسار محلي",
|
||||||
|
"MonitorMovies": "مراقبة الفيلم",
|
||||||
|
"NoCollections": "لم يتم العثور على أفلام ، للبدء ، ستحتاج إلى إضافة فيلم جديد أو استيراد بعض الأفلام الموجودة.",
|
||||||
|
"RssSyncHelpText": "الفاصل بالدقائق. اضبط على صفر للتعطيل (سيؤدي هذا إلى إيقاف كل عمليات الاستيلاء على التحرير التلقائي)",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "جميع الأفلام مخفية بسبب الفلتر المطبق.",
|
||||||
|
"Collections": "مجموعة"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,6 @@
|
|||||||
"HardlinkCopyFiles": "Твърда връзка / копиране на файлове",
|
"HardlinkCopyFiles": "Твърда връзка / копиране на файлове",
|
||||||
"Health": "Здраве",
|
"Health": "Здраве",
|
||||||
"HealthNoIssues": "Няма проблеми с вашата конфигурация",
|
"HealthNoIssues": "Няма проблеми с вашата конфигурация",
|
||||||
"HelpText": "Интервал за минути. Задайте на нула, за да деактивирате (това ще спре всички автоматично хващане на освобождаване)",
|
|
||||||
"HiddenClickToShow": "Скрито, кликнете за показване",
|
"HiddenClickToShow": "Скрито, кликнете за показване",
|
||||||
"ImportExtraFiles": "Импортиране на допълнителни файлове",
|
"ImportExtraFiles": "Импортиране на допълнителни файлове",
|
||||||
"ImportFailed": "Неуспешно импортиране: {0}",
|
"ImportFailed": "Неуспешно импортиране: {0}",
|
||||||
@@ -712,7 +711,6 @@
|
|||||||
"Wiki": "Wiki",
|
"Wiki": "Wiki",
|
||||||
"WouldYouLikeToRestoreBackup": "Искате ли да възстановите архива {0}?",
|
"WouldYouLikeToRestoreBackup": "Искате ли да възстановите архива {0}?",
|
||||||
"Year": "Година",
|
"Year": "Година",
|
||||||
"Yes": "Да",
|
|
||||||
"YesCancel": "Да, Отказ",
|
"YesCancel": "Да, Отказ",
|
||||||
"YesMoveFiles": "Да, премести файловете",
|
"YesMoveFiles": "Да, премести файловете",
|
||||||
"Yesterday": "Вчера",
|
"Yesterday": "Вчера",
|
||||||
@@ -769,7 +767,6 @@
|
|||||||
"MovieIsMonitored": "Филмът се следи",
|
"MovieIsMonitored": "Филмът се следи",
|
||||||
"RadarrUpdated": "Радар актуализиран",
|
"RadarrUpdated": "Радар актуализиран",
|
||||||
"AddListExclusion": "Добавяне на изключване от списъка",
|
"AddListExclusion": "Добавяне на изключване от списъка",
|
||||||
"AddMoviesMonitored": "Добавяне на контролирани филми",
|
|
||||||
"AddNewMovie": "Добавяне на нов филм",
|
"AddNewMovie": "Добавяне на нов филм",
|
||||||
"AddNewTmdbIdMessage": "Можете също да търсите с помощта на TMDb Id на филм. напр. 'tmdb: 71663'",
|
"AddNewTmdbIdMessage": "Можете също да търсите с помощта на TMDb Id на филм. напр. 'tmdb: 71663'",
|
||||||
"AddRemotePathMapping": "Добавете отдалечено картографиране на пътя",
|
"AddRemotePathMapping": "Добавете отдалечено картографиране на пътя",
|
||||||
@@ -964,7 +961,6 @@
|
|||||||
"MustNotContain": "Не трябва да съдържа",
|
"MustNotContain": "Не трябва да съдържа",
|
||||||
"NamingSettings": "Настройки за именуване",
|
"NamingSettings": "Настройки за именуване",
|
||||||
"NetCore": ".NET Core",
|
"NetCore": ".NET Core",
|
||||||
"No": "Не",
|
|
||||||
"NoBackupsAreAvailable": "Няма налични резервни копия",
|
"NoBackupsAreAvailable": "Няма налични резервни копия",
|
||||||
"NoChange": "Няма промяна",
|
"NoChange": "Няма промяна",
|
||||||
"NoHistory": "Няма история",
|
"NoHistory": "Няма история",
|
||||||
@@ -1061,5 +1057,10 @@
|
|||||||
"RemotePath": "Отдалечен път",
|
"RemotePath": "Отдалечен път",
|
||||||
"List": "Списъци",
|
"List": "Списъци",
|
||||||
"LocalPath": "Местен път",
|
"LocalPath": "Местен път",
|
||||||
"SelectLanguages": "Избери език"
|
"SelectLanguages": "Избери език",
|
||||||
|
"MonitorMovies": "Монитор на филм",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "Всички филми са скрити поради приложен филтър.",
|
||||||
|
"Collections": "колекция",
|
||||||
|
"NoCollections": "Не са намерени филми, за да започнете, ще искате да добавите нов филм или да импортирате някои съществуващи.",
|
||||||
|
"RssSyncHelpText": "Интервал за минути. Задайте на нула, за да деактивирате (това ще спре всички автоматично хващане на освобождаване)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -292,7 +292,6 @@
|
|||||||
"ImportNotForDownloads": "Nepoužívejte k importu souborů ke stažení z vašeho klienta pro stahování, toto je pouze pro existující organizované knihovny, nikoli pro netříděné soubory.",
|
"ImportNotForDownloads": "Nepoužívejte k importu souborů ke stažení z vašeho klienta pro stahování, toto je pouze pro existující organizované knihovny, nikoli pro netříděné soubory.",
|
||||||
"GrabReleaseMessageText": "Radarr nebyl schopen určit, pro který film je toto vydání určeno. Radarr nemusí být schopen toto vydání automaticky importovat. Chcete chytit „{0}“?",
|
"GrabReleaseMessageText": "Radarr nebyl schopen určit, pro který film je toto vydání určeno. Radarr nemusí být schopen toto vydání automaticky importovat. Chcete chytit „{0}“?",
|
||||||
"GrabSelected": "Chyťte vybrané",
|
"GrabSelected": "Chyťte vybrané",
|
||||||
"HelpText": "Interval v minutách. Nastavením na nulu deaktivujete (tím se zastaví veškeré automatické uvolnění uvolnění)",
|
|
||||||
"HiddenClickToShow": "Skryté, kliknutím zobrazíte",
|
"HiddenClickToShow": "Skryté, kliknutím zobrazíte",
|
||||||
"ImportMechanismHealthCheckMessage": "Povolit zpracování dokončeného stahování",
|
"ImportMechanismHealthCheckMessage": "Povolit zpracování dokončeného stahování",
|
||||||
"NoResultsFound": "Nebyly nalezeny žádné výsledky",
|
"NoResultsFound": "Nebyly nalezeny žádné výsledky",
|
||||||
@@ -421,7 +420,6 @@
|
|||||||
"MustNotContain": "Nesmí obsahovat",
|
"MustNotContain": "Nesmí obsahovat",
|
||||||
"NamingSettings": "Nastavení pojmenování",
|
"NamingSettings": "Nastavení pojmenování",
|
||||||
"NetCore": ".NET Core",
|
"NetCore": ".NET Core",
|
||||||
"No": "Ne",
|
|
||||||
"NoBackupsAreAvailable": "Nejsou k dispozici žádné zálohy",
|
"NoBackupsAreAvailable": "Nejsou k dispozici žádné zálohy",
|
||||||
"NoChange": "Žádná změna",
|
"NoChange": "Žádná změna",
|
||||||
"NoHistory": "Žádná historie",
|
"NoHistory": "Žádná historie",
|
||||||
@@ -438,7 +436,6 @@
|
|||||||
"Overview": "Přehled",
|
"Overview": "Přehled",
|
||||||
"Failed": "Selhalo",
|
"Failed": "Selhalo",
|
||||||
"AddMovies": "Přidat filmy",
|
"AddMovies": "Přidat filmy",
|
||||||
"AddMoviesMonitored": "Přidat sledované filmy",
|
|
||||||
"AddingTag": "Přidávání značky",
|
"AddingTag": "Přidávání značky",
|
||||||
"AlternativeTitle": "Alternativní název",
|
"AlternativeTitle": "Alternativní název",
|
||||||
"AnalyseVideoFiles": "Analyzujte video soubory",
|
"AnalyseVideoFiles": "Analyzujte video soubory",
|
||||||
@@ -1016,7 +1013,6 @@
|
|||||||
"Wiki": "Wiki",
|
"Wiki": "Wiki",
|
||||||
"WouldYouLikeToRestoreBackup": "Chcete obnovit zálohu {0}?",
|
"WouldYouLikeToRestoreBackup": "Chcete obnovit zálohu {0}?",
|
||||||
"Year": "Rok",
|
"Year": "Rok",
|
||||||
"Yes": "Ano",
|
|
||||||
"YesCancel": "Ano, zrušit",
|
"YesCancel": "Ano, zrušit",
|
||||||
"YesMoveFiles": "Ano, přesuňte soubory",
|
"YesMoveFiles": "Ano, přesuňte soubory",
|
||||||
"Yesterday": "Včera",
|
"Yesterday": "Včera",
|
||||||
@@ -1061,5 +1057,10 @@
|
|||||||
"RemotePath": "Vzdálená cesta",
|
"RemotePath": "Vzdálená cesta",
|
||||||
"Rating": "Hodnocení",
|
"Rating": "Hodnocení",
|
||||||
"List": "Seznamy",
|
"List": "Seznamy",
|
||||||
"SelectLanguages": "Zvolte jazyk"
|
"SelectLanguages": "Zvolte jazyk",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "Všechny filmy jsou skryty kvůli použitému filtru.",
|
||||||
|
"Collections": "Sbírka",
|
||||||
|
"MonitorMovies": "Monitorujte film",
|
||||||
|
"NoCollections": "Nebyly nalezeny žádné filmy. Chcete-li začít, budete chtít přidat nový film nebo importovat některé stávající.",
|
||||||
|
"RssSyncHelpText": "Interval v minutách. Nastavením na nulu deaktivujete (tím se zastaví veškeré automatické uvolnění uvolnění)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -408,7 +408,6 @@
|
|||||||
"MovieIsUnmonitored": "Filmen overvåges ikke",
|
"MovieIsUnmonitored": "Filmen overvåges ikke",
|
||||||
"Movies": "Film",
|
"Movies": "Film",
|
||||||
"NetCore": ".NET Core",
|
"NetCore": ".NET Core",
|
||||||
"No": "Ingen",
|
|
||||||
"OnHealthIssueHelpText": "Om sundhedsspørgsmål",
|
"OnHealthIssueHelpText": "Om sundhedsspørgsmål",
|
||||||
"OnRenameHelpText": "Om omdøb",
|
"OnRenameHelpText": "Om omdøb",
|
||||||
"OnUpgradeHelpText": "Ved opgradering",
|
"OnUpgradeHelpText": "Ved opgradering",
|
||||||
@@ -457,7 +456,6 @@
|
|||||||
"AlreadyInYourLibrary": "Allerede i dit bibliotek",
|
"AlreadyInYourLibrary": "Allerede i dit bibliotek",
|
||||||
"RecycleBinCleanupDaysHelpTextWarning": "Filer i papirkurven, der er ældre end det valgte antal dage, renses automatisk",
|
"RecycleBinCleanupDaysHelpTextWarning": "Filer i papirkurven, der er ældre end det valgte antal dage, renses automatisk",
|
||||||
"AddListExclusion": "Tilføj ekskludering af liste",
|
"AddListExclusion": "Tilføj ekskludering af liste",
|
||||||
"AddMoviesMonitored": "Tilføj overvågede film",
|
|
||||||
"AddingTag": "Tilføjer tag",
|
"AddingTag": "Tilføjer tag",
|
||||||
"AgeWhenGrabbed": "Alder (når grebet)",
|
"AgeWhenGrabbed": "Alder (når grebet)",
|
||||||
"RefreshAndScan": "Opdater & Scan",
|
"RefreshAndScan": "Opdater & Scan",
|
||||||
@@ -641,7 +639,6 @@
|
|||||||
"GrabRelease": "Grab Release",
|
"GrabRelease": "Grab Release",
|
||||||
"GrabReleaseMessageText": "Radarr var ikke i stand til at bestemme, hvilken film denne udgivelse var til. Radarr kan muligvis ikke automatisk importere denne udgivelse. Vil du hente '{0}'?",
|
"GrabReleaseMessageText": "Radarr var ikke i stand til at bestemme, hvilken film denne udgivelse var til. Radarr kan muligvis ikke automatisk importere denne udgivelse. Vil du hente '{0}'?",
|
||||||
"Group": "Gruppe",
|
"Group": "Gruppe",
|
||||||
"HelpText": "Interval på få minutter. Sæt til nul for at deaktivere (dette stopper al automatisk frigivelse)",
|
|
||||||
"HiddenClickToShow": "Skjult, klik for at vise",
|
"HiddenClickToShow": "Skjult, klik for at vise",
|
||||||
"Host": "Vært",
|
"Host": "Vært",
|
||||||
"iCalLink": "iCal Link",
|
"iCalLink": "iCal Link",
|
||||||
@@ -1016,7 +1013,6 @@
|
|||||||
"Wiki": "Wiki",
|
"Wiki": "Wiki",
|
||||||
"WouldYouLikeToRestoreBackup": "Vil du gendanne sikkerhedskopien {0}?",
|
"WouldYouLikeToRestoreBackup": "Vil du gendanne sikkerhedskopien {0}?",
|
||||||
"Year": "År",
|
"Year": "År",
|
||||||
"Yes": "Ja",
|
|
||||||
"YesCancel": "Ja, Annuller",
|
"YesCancel": "Ja, Annuller",
|
||||||
"YesMoveFiles": "Ja, flyt filerne",
|
"YesMoveFiles": "Ja, flyt filerne",
|
||||||
"Yesterday": "I går",
|
"Yesterday": "I går",
|
||||||
@@ -1061,5 +1057,10 @@
|
|||||||
"RemotePath": "Fjern sti",
|
"RemotePath": "Fjern sti",
|
||||||
"SelectLanguages": "Vælg sprog",
|
"SelectLanguages": "Vælg sprog",
|
||||||
"List": "Lister",
|
"List": "Lister",
|
||||||
"Rating": "Bedømmelser"
|
"Rating": "Bedømmelser",
|
||||||
|
"RssSyncHelpText": "Interval på få minutter. Sæt til nul for at deaktivere (dette stopper al automatisk frigivelse)",
|
||||||
|
"MonitorMovies": "Overvåg film",
|
||||||
|
"NoCollections": "Ingen film fundet. For at komme i gang vil du tilføje en ny film eller importere nogle eksisterende.",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "Alle film er gemt på grund af aktivt filter.",
|
||||||
|
"Collections": "Samling"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -572,8 +572,6 @@
|
|||||||
"EnableMediaInfoHelpText": "Videoinformationen wie Auflösung, Laufzeit und Codec aus Datien erkennen. Dazu ist es erforderlich, dass Radarr Teile der Datei liest, was zu hoher Festplatten- oder Netzwerkaktivität während der Scans führen kann.",
|
"EnableMediaInfoHelpText": "Videoinformationen wie Auflösung, Laufzeit und Codec aus Datien erkennen. Dazu ist es erforderlich, dass Radarr Teile der Datei liest, was zu hoher Festplatten- oder Netzwerkaktivität während der Scans führen kann.",
|
||||||
"ImportListSyncIntervalHelpText": "Wie oft die Listen synchronisiert werden sollen. Minimum 6 Stunden",
|
"ImportListSyncIntervalHelpText": "Wie oft die Listen synchronisiert werden sollen. Minimum 6 Stunden",
|
||||||
"AddListExclusion": "Listenausschluss hinzufügen",
|
"AddListExclusion": "Listenausschluss hinzufügen",
|
||||||
"AddMoviesMonitored": "Filme beobachtet hinzufügen",
|
|
||||||
"HelpText": "Intervall in Minuten. Zum deaktivieren auf 0 setzen ( Dies wird das automatische Release erfassen deaktivieren )",
|
|
||||||
"RequiredHelpText": "Diese {0} Bedingungen müsen zutreffen damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer.",
|
"RequiredHelpText": "Diese {0} Bedingungen müsen zutreffen damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer.",
|
||||||
"AllowHardcodedSubsHelpText": "Filme mit hartcodierten Untertiteln werden auch automatisch heruntergeladen",
|
"AllowHardcodedSubsHelpText": "Filme mit hartcodierten Untertiteln werden auch automatisch heruntergeladen",
|
||||||
"ICalHttpUrlHelpText": "Füge diese URL in deinen Client ein oder klicke auf abonnieren wenn dein Browser Webcal untertützt",
|
"ICalHttpUrlHelpText": "Füge diese URL in deinen Client ein oder klicke auf abonnieren wenn dein Browser Webcal untertützt",
|
||||||
@@ -823,8 +821,6 @@
|
|||||||
"ListSyncLevelHelpTextWarning": "Filmdateien werden dauerhaft gelöcht, dies kann deine ganze Mediathek leeren wenn deine Listen leer sind",
|
"ListSyncLevelHelpTextWarning": "Filmdateien werden dauerhaft gelöcht, dies kann deine ganze Mediathek leeren wenn deine Listen leer sind",
|
||||||
"ConsideredAvailable": "Verfügbarkeit angenommen",
|
"ConsideredAvailable": "Verfügbarkeit angenommen",
|
||||||
"Announced": "Angekündigt",
|
"Announced": "Angekündigt",
|
||||||
"Yes": "Ja",
|
|
||||||
"No": "Nein",
|
|
||||||
"MappedDrivesRunningAsService": "Zugeordnete Netzlaufwerke sind nicht verfügbar, wenn Radarr als Windows-Dienst ausgeführt wird. Bitte lesen Sie die FAQ für weitere Informationen",
|
"MappedDrivesRunningAsService": "Zugeordnete Netzlaufwerke sind nicht verfügbar, wenn Radarr als Windows-Dienst ausgeführt wird. Bitte lesen Sie die FAQ für weitere Informationen",
|
||||||
"CouldNotConnectSignalR": "Es konnte keine Verbindung zu SignalR hergestellt werden, die Benutzeroberfläche wird nicht aktualisiert",
|
"CouldNotConnectSignalR": "Es konnte keine Verbindung zu SignalR hergestellt werden, die Benutzeroberfläche wird nicht aktualisiert",
|
||||||
"ChmodGroupHelpTextWarning": "Dies funktioniert nur, wenn der Benutzer, der Radarr ausführt, der Eigentümer der Datei ist. Es ist besser, sicherzustellen, dass der Download-Client die gleiche Gruppe wie Radarr verwendet.",
|
"ChmodGroupHelpTextWarning": "Dies funktioniert nur, wenn der Benutzer, der Radarr ausführt, der Eigentümer der Datei ist. Es ist besser, sicherzustellen, dass der Download-Client die gleiche Gruppe wie Radarr verwendet.",
|
||||||
@@ -1115,5 +1111,10 @@
|
|||||||
"Waiting": "warten",
|
"Waiting": "warten",
|
||||||
"OriginalTitle": "Originaler Titel",
|
"OriginalTitle": "Originaler Titel",
|
||||||
"OriginalLanguage": "Originale Sprache",
|
"OriginalLanguage": "Originale Sprache",
|
||||||
"Database": "Datenbank"
|
"Database": "Datenbank",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "Alle Filme sind wegen dem Filter ausgeblendet.",
|
||||||
|
"Collections": "Sammlung",
|
||||||
|
"MonitorMovies": "Film beobachten",
|
||||||
|
"NoCollections": "Keine Filme gefunden. Zum Starten solltest du einen Film hinzufügen oder vorhandene Importieren.",
|
||||||
|
"RssSyncHelpText": "Intervall in Minuten. Zum deaktivieren auf 0 setzen ( Dies wird das automatische Release erfassen deaktivieren )"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,7 +115,6 @@
|
|||||||
"ForMoreInformationOnTheIndividualDownloadClients": "Για περισσότερες πληροφορίες σχετικά με τους μεμονωμένους πελάτες λήψης, κάντε κλικ στα κουμπιά πληροφοριών.",
|
"ForMoreInformationOnTheIndividualDownloadClients": "Για περισσότερες πληροφορίες σχετικά με τους μεμονωμένους πελάτες λήψης, κάντε κλικ στα κουμπιά πληροφοριών.",
|
||||||
"GrabReleaseMessageText": "Ο Radarr δεν μπόρεσε να προσδιορίσει ποια ταινία ήταν αυτή η κυκλοφορία. Το Radarr ενδέχεται να μην μπορεί να εισαγάγει αυτόματα αυτήν την κυκλοφορία. Θέλετε να τραβήξετε το \"{0}\";",
|
"GrabReleaseMessageText": "Ο Radarr δεν μπόρεσε να προσδιορίσει ποια ταινία ήταν αυτή η κυκλοφορία. Το Radarr ενδέχεται να μην μπορεί να εισαγάγει αυτόματα αυτήν την κυκλοφορία. Θέλετε να τραβήξετε το \"{0}\";",
|
||||||
"HardlinkCopyFiles": "Hardlink / Αντιγραφή αρχείων",
|
"HardlinkCopyFiles": "Hardlink / Αντιγραφή αρχείων",
|
||||||
"HelpText": "Διάστημα σε λεπτά. Ρυθμίστε στο μηδέν για απενεργοποίηση (αυτό θα σταματήσει όλες τις αυτόματες αρπάξεις απελευθέρωσης)",
|
|
||||||
"ImportRootPath": "Τοποθετήστε το Radarr στο φάκελο που περιέχει όλες τις ταινίες σας και όχι μια συγκεκριμένη ταινία. π.χ. {0} και όχι {1}. Επιπλέον, κάθε ταινία πρέπει να βρίσκεται στον δικό της φάκελο στον φάκελο root / library.",
|
"ImportRootPath": "Τοποθετήστε το Radarr στο φάκελο που περιέχει όλες τις ταινίες σας και όχι μια συγκεκριμένη ταινία. π.χ. {0} και όχι {1}. Επιπλέον, κάθε ταινία πρέπει να βρίσκεται στον δικό της φάκελο στον φάκελο root / library.",
|
||||||
"InCinemasDate": "Στους κινηματογράφους Ημερομηνία",
|
"InCinemasDate": "Στους κινηματογράφους Ημερομηνία",
|
||||||
"IncludeRadarrRecommendations": "Συμπεριλάβετε τις προτάσεις Radarr",
|
"IncludeRadarrRecommendations": "Συμπεριλάβετε τις προτάσεις Radarr",
|
||||||
@@ -416,7 +415,6 @@
|
|||||||
"MustNotContain": "Δεν πρέπει να περιέχει",
|
"MustNotContain": "Δεν πρέπει να περιέχει",
|
||||||
"NamingSettings": "Ρυθμίσεις ονομάτων",
|
"NamingSettings": "Ρυθμίσεις ονομάτων",
|
||||||
"NetCore": ".NET Core",
|
"NetCore": ".NET Core",
|
||||||
"No": "Οχι",
|
|
||||||
"NoBackupsAreAvailable": "Δεν υπάρχουν διαθέσιμα αντίγραφα ασφαλείας",
|
"NoBackupsAreAvailable": "Δεν υπάρχουν διαθέσιμα αντίγραφα ασφαλείας",
|
||||||
"NoChange": "Καμία αλλαγή",
|
"NoChange": "Καμία αλλαγή",
|
||||||
"NoHistory": "Χωρίς ιστορία",
|
"NoHistory": "Χωρίς ιστορία",
|
||||||
@@ -425,7 +423,6 @@
|
|||||||
"OAuthPopupMessage": "Τα αναδυόμενα παράθυρα αποκλείονται από το πρόγραμμα περιήγησής σας",
|
"OAuthPopupMessage": "Τα αναδυόμενα παράθυρα αποκλείονται από το πρόγραμμα περιήγησής σας",
|
||||||
"Ok": "Εντάξει",
|
"Ok": "Εντάξει",
|
||||||
"AddListExclusion": "Προσθήκη εξαίρεσης λίστας",
|
"AddListExclusion": "Προσθήκη εξαίρεσης λίστας",
|
||||||
"AddMoviesMonitored": "Προσθήκη ταινιών που παρακολουθούνται",
|
|
||||||
"AgeWhenGrabbed": "Ηλικία (όταν αρπαχτεί)",
|
"AgeWhenGrabbed": "Ηλικία (όταν αρπαχτεί)",
|
||||||
"OrganizeAndRename": "Οργάνωση & Μετονομασία",
|
"OrganizeAndRename": "Οργάνωση & Μετονομασία",
|
||||||
"AllowHardcodedSubs": "Να επιτρέπονται οι συνδρομητές με κωδικοποίηση",
|
"AllowHardcodedSubs": "Να επιτρέπονται οι συνδρομητές με κωδικοποίηση",
|
||||||
@@ -1016,7 +1013,6 @@
|
|||||||
"Wiki": "Wiki",
|
"Wiki": "Wiki",
|
||||||
"WouldYouLikeToRestoreBackup": "Θέλετε να επαναφέρετε το αντίγραφο ασφαλείας {0};",
|
"WouldYouLikeToRestoreBackup": "Θέλετε να επαναφέρετε το αντίγραφο ασφαλείας {0};",
|
||||||
"Year": "Ετος",
|
"Year": "Ετος",
|
||||||
"Yes": "Ναί",
|
|
||||||
"YesCancel": "Ναι, Ακύρωση",
|
"YesCancel": "Ναι, Ακύρωση",
|
||||||
"YesMoveFiles": "Ναι, Μετακινήστε τα αρχεία",
|
"YesMoveFiles": "Ναι, Μετακινήστε τα αρχεία",
|
||||||
"Yesterday": "Εχθές",
|
"Yesterday": "Εχθές",
|
||||||
@@ -1061,5 +1057,10 @@
|
|||||||
"SelectLanguages": "Επιλέξτε γλώσσα",
|
"SelectLanguages": "Επιλέξτε γλώσσα",
|
||||||
"List": "Τόπος αγώνων",
|
"List": "Τόπος αγώνων",
|
||||||
"Rating": "Ακροαματικότητα",
|
"Rating": "Ακροαματικότητα",
|
||||||
"Filters": "Φίλτρο"
|
"Filters": "Φίλτρο",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "Όλες οι ταινίες έχουν κρυφτεί λόγω εφαρμογής φίλτρου",
|
||||||
|
"Collections": "Συλλογή",
|
||||||
|
"MonitorMovies": "Παρακολούθηση ταινίας",
|
||||||
|
"NoCollections": "Δεν βρέθηκαν ταινίες, για να ξεκινήσετε θα θέλετε να προσθέσετε μια νέα ταινία ή να εισαγάγετε ορισμένες υπάρχουσες.",
|
||||||
|
"RssSyncHelpText": "Διάστημα σε λεπτά. Ρυθμίστε στο μηδέν για απενεργοποίηση (αυτό θα σταματήσει όλες τις αυτόματες αρπάξεις απελευθέρωσης)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,8 @@
|
|||||||
"AddingTag": "Adding tag",
|
"AddingTag": "Adding tag",
|
||||||
"AddList": "Add List",
|
"AddList": "Add List",
|
||||||
"AddListExclusion": "Add List Exclusion",
|
"AddListExclusion": "Add List Exclusion",
|
||||||
"AddMissingMovies": "Add Missing Movies",
|
|
||||||
"AddMovie": "Add Movie",
|
"AddMovie": "Add Movie",
|
||||||
"AddMovies": "Add Movies",
|
"AddMovies": "Add Movies",
|
||||||
"AddMoviesMonitored": "Add Movies Monitored",
|
|
||||||
"AddNew": "Add New",
|
"AddNew": "Add New",
|
||||||
"AddNewMessage": "It's easy to add a new movie, just start typing the name of the movie you want to add",
|
"AddNewMessage": "It's easy to add a new movie, just start typing the name of the movie you want to add",
|
||||||
"AddNewMovie": "Add New Movie",
|
"AddNewMovie": "Add New Movie",
|
||||||
@@ -125,6 +123,7 @@
|
|||||||
"ChmodGroupHelpText": "Group name or gid. Use gid for remote file systems.",
|
"ChmodGroupHelpText": "Group name or gid. Use gid for remote file systems.",
|
||||||
"ChmodGroupHelpTextWarning": "This only works if the user running Radarr is the owner of the file. It's better to ensure the download client uses the same group as Radarr.",
|
"ChmodGroupHelpTextWarning": "This only works if the user running Radarr is the owner of the file. It's better to ensure the download client uses the same group as Radarr.",
|
||||||
"ChooseAnotherFolder": "Choose Another Folder",
|
"ChooseAnotherFolder": "Choose Another Folder",
|
||||||
|
"ChooseImportMode": "Choose Import Mode",
|
||||||
"CleanLibraryLevel": "Clean Library Level",
|
"CleanLibraryLevel": "Clean Library Level",
|
||||||
"Clear": "Clear",
|
"Clear": "Clear",
|
||||||
"ClickToChangeLanguage": "Click to change language",
|
"ClickToChangeLanguage": "Click to change language",
|
||||||
@@ -139,6 +138,11 @@
|
|||||||
"Close": "Close",
|
"Close": "Close",
|
||||||
"CloseCurrentModal": "Close Current Modal",
|
"CloseCurrentModal": "Close Current Modal",
|
||||||
"Collection": "Collection",
|
"Collection": "Collection",
|
||||||
|
"CollectionOptions": "Collection Options",
|
||||||
|
"Collections": "Collections",
|
||||||
|
"CollectionShowDetailsHelpText": "Show collection status and properties",
|
||||||
|
"CollectionShowOverviewsHelpText": "Show collection overviews",
|
||||||
|
"CollectionShowPostersHelpText": "Show Collection item posters",
|
||||||
"CollectionsSelectedInterp": "{0} Collections(s) Selected",
|
"CollectionsSelectedInterp": "{0} Collections(s) Selected",
|
||||||
"ColonReplacement": "Colon Replacement",
|
"ColonReplacement": "Colon Replacement",
|
||||||
"ColonReplacementFormatHelpText": "Change how Radarr handles colon replacement",
|
"ColonReplacementFormatHelpText": "Change how Radarr handles colon replacement",
|
||||||
@@ -269,6 +273,7 @@
|
|||||||
"DownloadWarningCheckDownloadClientForMoreDetails": "Download warning: check download client for more details",
|
"DownloadWarningCheckDownloadClientForMoreDetails": "Download warning: check download client for more details",
|
||||||
"Duration": "Duration",
|
"Duration": "Duration",
|
||||||
"Edit": "Edit",
|
"Edit": "Edit",
|
||||||
|
"EditCollection": "Edit Collection",
|
||||||
"EditCustomFormat": "Edit Custom Format",
|
"EditCustomFormat": "Edit Custom Format",
|
||||||
"EditDelayProfile": "Edit Delay Profile",
|
"EditDelayProfile": "Edit Delay Profile",
|
||||||
"EditGroups": "Edit Groups",
|
"EditGroups": "Edit Groups",
|
||||||
@@ -367,7 +372,6 @@
|
|||||||
"HaveNotAddedMovies": "You haven't added any movies yet, do you want to import some or all of your movies first?",
|
"HaveNotAddedMovies": "You haven't added any movies yet, do you want to import some or all of your movies first?",
|
||||||
"Health": "Health",
|
"Health": "Health",
|
||||||
"HealthNoIssues": "No issues with your configuration",
|
"HealthNoIssues": "No issues with your configuration",
|
||||||
"HelpText": "Interval in minutes. Set to zero to disable (this will stop all automatic release grabbing)",
|
|
||||||
"HiddenClickToShow": "Hidden, click to show",
|
"HiddenClickToShow": "Hidden, click to show",
|
||||||
"HideAdvanced": "Hide Advanced",
|
"HideAdvanced": "Hide Advanced",
|
||||||
"History": "History",
|
"History": "History",
|
||||||
@@ -445,6 +449,8 @@
|
|||||||
"IndexerTagHelpText": "Only use this indexer for movies with at least one matching tag. Leave blank to use with all movies.",
|
"IndexerTagHelpText": "Only use this indexer for movies with at least one matching tag. Leave blank to use with all movies.",
|
||||||
"Info": "Info",
|
"Info": "Info",
|
||||||
"InstallLatest": "Install Latest",
|
"InstallLatest": "Install Latest",
|
||||||
|
"InstanceName": "Instance Name",
|
||||||
|
"InstanceNameHelpText": "Instance name in tab and for Syslog app name",
|
||||||
"InteractiveImport": "Interactive Import",
|
"InteractiveImport": "Interactive Import",
|
||||||
"InteractiveImportErrLanguage": "Language must be chosen for each selected file",
|
"InteractiveImportErrLanguage": "Language must be chosen for each selected file",
|
||||||
"InteractiveImportErrMovie": "Movie must be chosen for each selected file",
|
"InteractiveImportErrMovie": "Movie must be chosen for each selected file",
|
||||||
@@ -604,7 +610,6 @@
|
|||||||
"Never": "Never",
|
"Never": "Never",
|
||||||
"New": "New",
|
"New": "New",
|
||||||
"NextExecution": "Next Execution",
|
"NextExecution": "Next Execution",
|
||||||
"No": "No",
|
|
||||||
"NoAltTitle": "No alternative titles.",
|
"NoAltTitle": "No alternative titles.",
|
||||||
"NoBackupsAreAvailable": "No backups are available",
|
"NoBackupsAreAvailable": "No backups are available",
|
||||||
"NoChange": "No Change",
|
"NoChange": "No Change",
|
||||||
@@ -643,6 +648,8 @@
|
|||||||
"OnLatestVersion": "The latest version of Radarr is already installed",
|
"OnLatestVersion": "The latest version of Radarr is already installed",
|
||||||
"OnlyTorrent": "Only Torrent",
|
"OnlyTorrent": "Only Torrent",
|
||||||
"OnlyUsenet": "Only Usenet",
|
"OnlyUsenet": "Only Usenet",
|
||||||
|
"OnMovieAdded": "On Movie Added",
|
||||||
|
"OnMovieAddedHelpText": "On Movie Added",
|
||||||
"OnMovieDelete": "On Movie Delete",
|
"OnMovieDelete": "On Movie Delete",
|
||||||
"OnMovieDeleteHelpText": "On Movie Delete",
|
"OnMovieDeleteHelpText": "On Movie Delete",
|
||||||
"OnMovieFileDelete": "On Movie File Delete",
|
"OnMovieFileDelete": "On Movie File Delete",
|
||||||
@@ -762,6 +769,7 @@
|
|||||||
"RefreshCollections": "Refresh Collections",
|
"RefreshCollections": "Refresh Collections",
|
||||||
"RefreshInformationAndScanDisk": "Refresh information and scan disk",
|
"RefreshInformationAndScanDisk": "Refresh information and scan disk",
|
||||||
"RefreshLists": "Refresh Lists",
|
"RefreshLists": "Refresh Lists",
|
||||||
|
"RefreshMonitoredIntervalHelpText": "How often to refresh monitored downloads from download clients, minimum 1 minute",
|
||||||
"RefreshMovie": "Refresh movie",
|
"RefreshMovie": "Refresh movie",
|
||||||
"RegularExpressionsCanBeTested": "Regular expressions can be tested ",
|
"RegularExpressionsCanBeTested": "Regular expressions can be tested ",
|
||||||
"RejectionCount": "Rejection Count",
|
"RejectionCount": "Rejection Count",
|
||||||
@@ -854,6 +862,7 @@
|
|||||||
"RSS": "RSS",
|
"RSS": "RSS",
|
||||||
"RSSIsNotSupportedWithThisIndexer": "RSS is not supported with this indexer",
|
"RSSIsNotSupportedWithThisIndexer": "RSS is not supported with this indexer",
|
||||||
"RSSSync": "RSS Sync",
|
"RSSSync": "RSS Sync",
|
||||||
|
"RssSyncHelpText": "Interval in minutes. Set to zero to disable (this will stop all automatic release grabbing)",
|
||||||
"RSSSyncInterval": "RSS Sync Interval",
|
"RSSSyncInterval": "RSS Sync Interval",
|
||||||
"RSSSyncIntervalHelpTextWarning": "This will apply to all indexers, please follow the rules set forth by them",
|
"RSSSyncIntervalHelpTextWarning": "This will apply to all indexers, please follow the rules set forth by them",
|
||||||
"Runtime": "Runtime",
|
"Runtime": "Runtime",
|
||||||
@@ -864,6 +873,7 @@
|
|||||||
"Score": "Score",
|
"Score": "Score",
|
||||||
"Script": "Script",
|
"Script": "Script",
|
||||||
"ScriptPath": "Script Path",
|
"ScriptPath": "Script Path",
|
||||||
|
"ScrollMovies": "Scroll Movies",
|
||||||
"Search": "Search",
|
"Search": "Search",
|
||||||
"SearchAll": "Search All",
|
"SearchAll": "Search All",
|
||||||
"SearchCutoffUnmet": "Search Cutoff Unmet",
|
"SearchCutoffUnmet": "Search Cutoff Unmet",
|
||||||
@@ -928,6 +938,7 @@
|
|||||||
"ShownClickToHide": "Shown, click to hide",
|
"ShownClickToHide": "Shown, click to hide",
|
||||||
"ShowOverview": "Show Overview",
|
"ShowOverview": "Show Overview",
|
||||||
"ShowPath": "Show Path",
|
"ShowPath": "Show Path",
|
||||||
|
"ShowPosters": "Show Posters",
|
||||||
"ShowQualityProfile": "Show Quality Profile",
|
"ShowQualityProfile": "Show Quality Profile",
|
||||||
"ShowQualityProfileHelpText": "Show quality profile under poster",
|
"ShowQualityProfileHelpText": "Show quality profile under poster",
|
||||||
"ShowRatings": "Show Ratings",
|
"ShowRatings": "Show Ratings",
|
||||||
@@ -1127,7 +1138,6 @@
|
|||||||
"Wiki": "Wiki",
|
"Wiki": "Wiki",
|
||||||
"WouldYouLikeToRestoreBackup": "Would you like to restore the backup {0} ?",
|
"WouldYouLikeToRestoreBackup": "Would you like to restore the backup {0} ?",
|
||||||
"Year": "Year",
|
"Year": "Year",
|
||||||
"Yes": "Yes",
|
|
||||||
"YesCancel": "Yes, Cancel",
|
"YesCancel": "Yes, Cancel",
|
||||||
"YesMoveFiles": "Yes, Move the Files",
|
"YesMoveFiles": "Yes, Move the Files",
|
||||||
"Yesterday": "Yesterday",
|
"Yesterday": "Yesterday",
|
||||||
|
|||||||
@@ -396,7 +396,6 @@
|
|||||||
"AllowHardcodedSubs": "Permitir Hardcoded Subs",
|
"AllowHardcodedSubs": "Permitir Hardcoded Subs",
|
||||||
"AgeWhenGrabbed": "Edad (cuando capturada)",
|
"AgeWhenGrabbed": "Edad (cuando capturada)",
|
||||||
"AddImportExclusionHelpText": "Prevenir que la película sea añadida a Radarr mediante listas",
|
"AddImportExclusionHelpText": "Prevenir que la película sea añadida a Radarr mediante listas",
|
||||||
"AddMoviesMonitored": "Añadir Películas Monitoreadas",
|
|
||||||
"AddListExclusion": "Añadir Exclusión De Lista",
|
"AddListExclusion": "Añadir Exclusión De Lista",
|
||||||
"YesCancel": "Si, cancelar",
|
"YesCancel": "Si, cancelar",
|
||||||
"WhitelistedSubtitleTags": "Etiquetas de Subtítulos Permitidas",
|
"WhitelistedSubtitleTags": "Etiquetas de Subtítulos Permitidas",
|
||||||
@@ -596,7 +595,6 @@
|
|||||||
"ICalHttpUrlHelpText": "Copia esta URL a tu gestor(es) o haz click en subscribir si tu navegador soporta webcal",
|
"ICalHttpUrlHelpText": "Copia esta URL a tu gestor(es) o haz click en subscribir si tu navegador soporta webcal",
|
||||||
"ICalFeed": "iCal Feed",
|
"ICalFeed": "iCal Feed",
|
||||||
"Hostname": "Nombre del Host",
|
"Hostname": "Nombre del Host",
|
||||||
"HelpText": "Intervalo en minutos. Ajustar a cero para inhabilitar (esto dentendrá toda captura de estrenos automática)",
|
|
||||||
"EnableSSL": "Habilitar SSL",
|
"EnableSSL": "Habilitar SSL",
|
||||||
"EnableRSS": "Habilitar RSS",
|
"EnableRSS": "Habilitar RSS",
|
||||||
"EnableInteractiveSearch": "Habilitar Búsqueda Interactiva",
|
"EnableInteractiveSearch": "Habilitar Búsqueda Interactiva",
|
||||||
@@ -907,7 +905,6 @@
|
|||||||
"InCinemasMsg": "La película está en los cines",
|
"InCinemasMsg": "La película está en los cines",
|
||||||
"ListSyncLevelHelpTextWarning": "Los archivos de películas se eliminarán permanentemente, esto puede resultar en borrar su biblioteca si sus listas están vacías",
|
"ListSyncLevelHelpTextWarning": "Los archivos de películas se eliminarán permanentemente, esto puede resultar en borrar su biblioteca si sus listas están vacías",
|
||||||
"RSS": "RSS",
|
"RSS": "RSS",
|
||||||
"No": "No",
|
|
||||||
"EditDelayProfile": "Editar perfil de retraso",
|
"EditDelayProfile": "Editar perfil de retraso",
|
||||||
"Connection": "Conexiones",
|
"Connection": "Conexiones",
|
||||||
"ConsideredAvailable": "Considerado disponible",
|
"ConsideredAvailable": "Considerado disponible",
|
||||||
@@ -924,7 +921,7 @@
|
|||||||
"DeleteMovieFolderHelpText": "Eliminar la carpeta de películas y su contenido",
|
"DeleteMovieFolderHelpText": "Eliminar la carpeta de películas y su contenido",
|
||||||
"DeleteSelectedMovie": "Eliminar película (s) seleccionada (s)",
|
"DeleteSelectedMovie": "Eliminar película (s) seleccionada (s)",
|
||||||
"DeleteTheMovieFolder": "Se eliminará la carpeta de películas '{0}' y todo su contenido.",
|
"DeleteTheMovieFolder": "Se eliminará la carpeta de películas '{0}' y todo su contenido.",
|
||||||
"Discord": "Discordia",
|
"Discord": "Discord",
|
||||||
"Donations": "Donaciones",
|
"Donations": "Donaciones",
|
||||||
"DoneEditingGroups": "Terminado de editar grupos",
|
"DoneEditingGroups": "Terminado de editar grupos",
|
||||||
"DoNotPrefer": "No prefiero",
|
"DoNotPrefer": "No prefiero",
|
||||||
@@ -1026,7 +1023,6 @@
|
|||||||
"Weeks": "Semanas",
|
"Weeks": "Semanas",
|
||||||
"Wiki": "Wiki",
|
"Wiki": "Wiki",
|
||||||
"WouldYouLikeToRestoreBackup": "¿Le gustaría restaurar la copia de seguridad {0}?",
|
"WouldYouLikeToRestoreBackup": "¿Le gustaría restaurar la copia de seguridad {0}?",
|
||||||
"Yes": "si",
|
|
||||||
"YesMoveFiles": "Sí, mover los archivos",
|
"YesMoveFiles": "Sí, mover los archivos",
|
||||||
"Yesterday": "Ayer",
|
"Yesterday": "Ayer",
|
||||||
"MoveFolders2": "¿Le gustaría mover los archivos de película de '{0}' a '{1}'?",
|
"MoveFolders2": "¿Le gustaría mover los archivos de película de '{0}' a '{1}'?",
|
||||||
@@ -1114,5 +1110,10 @@
|
|||||||
"RemoveSelectedItems": "Eliminar los elementos seleccionados",
|
"RemoveSelectedItems": "Eliminar los elementos seleccionados",
|
||||||
"SelectReleaseGroup": "Seleccionar el grupo de lanzamiento",
|
"SelectReleaseGroup": "Seleccionar el grupo de lanzamiento",
|
||||||
"SetReleaseGroup": "Configurar el grupo de lanzamiento",
|
"SetReleaseGroup": "Configurar el grupo de lanzamiento",
|
||||||
"TaskUserAgentTooltip": "User-Agent proporcionado por la aplicación llamó a la API"
|
"TaskUserAgentTooltip": "User-Agent proporcionado por la aplicación llamó a la API",
|
||||||
|
"RssSyncHelpText": "Intervalo en minutos. Ajustar a cero para inhabilitar (esto dentendrá toda captura de estrenos automática)",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "Todas las películas están ocultas debido al filtro aplicado.",
|
||||||
|
"Collections": "Colección",
|
||||||
|
"MonitorMovies": "Monitorear Película",
|
||||||
|
"NoCollections": "No se encontraron películas, para comenzar, querrá agregar una nueva película o importar algunas existentes."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
"LinkHere": "tässä",
|
"LinkHere": "tässä",
|
||||||
"ListSyncLevelHelpText": "Kirjaston elokuvat poistetaan tai niiden valvonta lopetetaan, jollei niitä ole tuontilistallasi.",
|
"ListSyncLevelHelpText": "Kirjaston elokuvat poistetaan tai niiden valvonta lopetetaan, jollei niitä ole tuontilistallasi.",
|
||||||
"ManualImportSelectMovie": "Manuaalinen tuonti - Valitse elokuva",
|
"ManualImportSelectMovie": "Manuaalinen tuonti - Valitse elokuva",
|
||||||
"MappedDrivesRunningAsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä, kun niitä käytetään Windows-palveluna. Katso lisätietoja UKK: sta",
|
"MappedDrivesRunningAsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä, kun sovellus suoritetaan Windows-palveluna. Lisätietoja löydät UKK:stä.",
|
||||||
"MinimumAgeHelpText": "Vain Usenet: NZB: n vähimmäisikä minuutteina, ennen kuin heidät napataan. Käytä tätä antaaksesi uusille julkaisuille aikaa levittää usenet-palveluntarjoajallesi.",
|
"MinimumAgeHelpText": "Vain Usenet: NZB: n vähimmäisikä minuutteina, ennen kuin heidät napataan. Käytä tätä antaaksesi uusille julkaisuille aikaa levittää usenet-palveluntarjoajallesi.",
|
||||||
"MinimumFreeSpaceWhenImportingHelpText": "Estä tuonti, jos vapaan levytilan määrä sen jälkeen jää tässä määritetyn arvon alle.",
|
"MinimumFreeSpaceWhenImportingHelpText": "Estä tuonti, jos vapaan levytilan määrä sen jälkeen jää tässä määritetyn arvon alle.",
|
||||||
"MonitoredHelpText": "Elokuvaa etsitään ja se ladataan, jos se on saatavilla.",
|
"MonitoredHelpText": "Elokuvaa etsitään ja se ladataan, jos se on saatavilla.",
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
"MultiLanguage": "Monikielinen",
|
"MultiLanguage": "Monikielinen",
|
||||||
"OrganizeModalNamingPattern": "Nimimalli:",
|
"OrganizeModalNamingPattern": "Nimimalli:",
|
||||||
"PosterOptions": "Julistevaihtoehdot",
|
"PosterOptions": "Julistevaihtoehdot",
|
||||||
"PreviewRenameHelpText": "Vinkki: Jos haluat esikatsella uudelleennimeä ..., valitse Peruuta, napsauta mitä tahansa elokuvan otsikkoa ja käytä",
|
"PreviewRenameHelpText": "Vihje: Esikatsellaksesi uudelleennimeämistä, valitse 'Peruuta' ja paina jonkin elokuvan otsikkoa ja käytä",
|
||||||
"ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen '{0}' IP-osoitteen selvitys epäonnistui.",
|
"ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen '{0}' IP-osoitteen selvitys epäonnistui.",
|
||||||
"ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
|
"ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
|
||||||
"QualityOrLangCutoffHasNotBeenMet": "Laadun tai kielen raja-arvoa ei ole saavutettu",
|
"QualityOrLangCutoffHasNotBeenMet": "Laadun tai kielen raja-arvoa ei ole saavutettu",
|
||||||
@@ -87,12 +87,12 @@
|
|||||||
"AddNew": "Lisää uusi",
|
"AddNew": "Lisää uusi",
|
||||||
"AudioInfo": "Äänitiedot",
|
"AudioInfo": "Äänitiedot",
|
||||||
"BeforeUpdate": "Ennen päivitystä",
|
"BeforeUpdate": "Ennen päivitystä",
|
||||||
"DownloadPropersAndRepacksHelpText2": "Käytä 'Älä suosi' -valintaa lajitellaksesi proper- ja repack-julkaisut mukautetun muodon pisteytytyksen perusteella.",
|
"DownloadPropersAndRepacksHelpText2": "Käytä 'Älä suosi' -valintaa suosiaksesi mukautettujen muotojen pisteytystä Proper- ja Repack-merkintöjä enemmän.",
|
||||||
"Day": "Päivä",
|
"Day": "Päivä",
|
||||||
"DBMigration": "Tietokannan siirto",
|
"DBMigration": "Tietokannan siirto",
|
||||||
"ApiKey": "API-avain",
|
"ApiKey": "API-avain",
|
||||||
"AcceptConfirmationModal": "Hyväksy vahvistus",
|
"AcceptConfirmationModal": "Hyväksy vahvistus",
|
||||||
"ApplyTagsHelpTexts1": "Tunnisteisiin kohdistettavat toimenpiteet:",
|
"ApplyTagsHelpTexts1": "Miten tunnisteita sovelletaan valittuihin elokuviin",
|
||||||
"ApplyTagsHelpTexts2": "– 'Lisää' syötetyt tunnisteet aiempiin tunnisteisiin",
|
"ApplyTagsHelpTexts2": "– 'Lisää' syötetyt tunnisteet aiempiin tunnisteisiin",
|
||||||
"ApplyTagsHelpTexts3": "– 'Poista' ainoastaan syötetyt tunnisteet",
|
"ApplyTagsHelpTexts3": "– 'Poista' ainoastaan syötetyt tunnisteet",
|
||||||
"AvailabilityDelay": "Saatavuusviive",
|
"AvailabilityDelay": "Saatavuusviive",
|
||||||
@@ -210,7 +210,7 @@
|
|||||||
"EnableInteractiveSearchHelpText": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.",
|
"EnableInteractiveSearchHelpText": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.",
|
||||||
"EnableSslHelpText": " Käyttöönotto edellyttää uudelleenkäynnistystä järjestelmänvalvojan oikeuksilla.",
|
"EnableSslHelpText": " Käyttöönotto edellyttää uudelleenkäynnistystä järjestelmänvalvojan oikeuksilla.",
|
||||||
"Medium": "Keskitaso",
|
"Medium": "Keskitaso",
|
||||||
"MinFormatScoreHelpText": "Mukautetun muodon vähimmäispisteet voidaan ladata",
|
"MinFormatScoreHelpText": "Mukautetun muodon vähimmäispisteytys, jonka perusteella ladataan.",
|
||||||
"MinimumAge": "Vähimmäisikä",
|
"MinimumAge": "Vähimmäisikä",
|
||||||
"MinimumFreeSpace": "Vapaan tallennustilan vähimmäismäärä",
|
"MinimumFreeSpace": "Vapaan tallennustilan vähimmäismäärä",
|
||||||
"MinimumLimits": "Vähimmäismäärät",
|
"MinimumLimits": "Vähimmäismäärät",
|
||||||
@@ -226,7 +226,7 @@
|
|||||||
"NoLinks": "Ei linkkejä",
|
"NoLinks": "Ei linkkejä",
|
||||||
"NoMinimumForAnyRuntime": "Ei toistoajan vähimmäiskestoa",
|
"NoMinimumForAnyRuntime": "Ei toistoajan vähimmäiskestoa",
|
||||||
"NoMoveFilesSelf": " Ei, siirrän tiedostot itse",
|
"NoMoveFilesSelf": " Ei, siirrän tiedostot itse",
|
||||||
"NoMoviesExist": "Elokuvia ei löytynyt. Aloittaaksesi sinun kannattaa lisätä uusi elokuva tai tuoda joitain olemassa olevia.",
|
"NoMoviesExist": "Elokuvia ei löytynyt. Aloita lisäämällä uusi elokuva tai tuo joitakin olemassa olevia.",
|
||||||
"NoResultsFound": "Ei tuloksia",
|
"NoResultsFound": "Ei tuloksia",
|
||||||
"BranchUpdate": "Sovelluksen versiopäivityksiin käytettävä kehityshaara.",
|
"BranchUpdate": "Sovelluksen versiopäivityksiin käytettävä kehityshaara.",
|
||||||
"BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.",
|
"BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.",
|
||||||
@@ -269,7 +269,7 @@
|
|||||||
"Size": "Koko",
|
"Size": "Koko",
|
||||||
"SuggestTranslationChange": "Ehdota käännösmuutosta",
|
"SuggestTranslationChange": "Ehdota käännösmuutosta",
|
||||||
"Queued": "Jonossa",
|
"Queued": "Jonossa",
|
||||||
"TMDb": "TMDb",
|
"TMDb": "TMDB",
|
||||||
"UnableToLoadAltTitle": "Vaihtoehtoisten nimikkeiden lataus epäonnistui.",
|
"UnableToLoadAltTitle": "Vaihtoehtoisten nimikkeiden lataus epäonnistui.",
|
||||||
"Released": "Julkaistu",
|
"Released": "Julkaistu",
|
||||||
"ReleasedMsg": "Elokuva julkaistaan",
|
"ReleasedMsg": "Elokuva julkaistaan",
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"DetailedProgressBarHelpText": "Näytä teksti edistymispalkissa.",
|
"DetailedProgressBarHelpText": "Näytä teksti edistymispalkissa.",
|
||||||
"Failed": "Epäonnistui",
|
"Failed": "Epäonnistui",
|
||||||
"InCinemas": "Teatterijulkaisu",
|
"InCinemas": "Teatterijulkaisu",
|
||||||
"IncludeCustomFormatWhenRenaming": "Uudelleen nimeäminen",
|
"IncludeCustomFormatWhenRenaming": "Sisällytä mukautetut muodot uudelleennimetessä",
|
||||||
"IndexerFlags": "Tietolähteen liput",
|
"IndexerFlags": "Tietolähteen liput",
|
||||||
"IndexerLongTermStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}",
|
"IndexerLongTermStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}",
|
||||||
"IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi",
|
"IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi",
|
||||||
@@ -329,7 +329,6 @@
|
|||||||
"Updates": "Päivitykset",
|
"Updates": "Päivitykset",
|
||||||
"AddListExclusion": "Lisää tuontilistojen poikkeussääntö",
|
"AddListExclusion": "Lisää tuontilistojen poikkeussääntö",
|
||||||
"AddMovies": "Lisää elokuvia",
|
"AddMovies": "Lisää elokuvia",
|
||||||
"AddMoviesMonitored": "Lisää elokuvat valvottuina",
|
|
||||||
"ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu",
|
"ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu",
|
||||||
"CreateEmptyMovieFoldersHelpText": "Luo puuttuvat elokuvakansiot levyn tarkistuksen yhteydessä.",
|
"CreateEmptyMovieFoldersHelpText": "Luo puuttuvat elokuvakansiot levyn tarkistuksen yhteydessä.",
|
||||||
"DeleteDownloadClient": "Poista lataustyökalu",
|
"DeleteDownloadClient": "Poista lataustyökalu",
|
||||||
@@ -372,7 +371,6 @@
|
|||||||
"PendingChangesMessage": "On tallentamattomia muutoksia. Haluatko varmasti poistua sivulta?",
|
"PendingChangesMessage": "On tallentamattomia muutoksia. Haluatko varmasti poistua sivulta?",
|
||||||
"PendingChangesStayReview": "Älä poistu ja tarkista muutokset",
|
"PendingChangesStayReview": "Älä poistu ja tarkista muutokset",
|
||||||
"NetCore": ".NET",
|
"NetCore": ".NET",
|
||||||
"No": "Ei",
|
|
||||||
"NoBackupsAreAvailable": "Varmuuskopioita ei ole saatavilla",
|
"NoBackupsAreAvailable": "Varmuuskopioita ei ole saatavilla",
|
||||||
"NoChange": "Ei muutosta",
|
"NoChange": "Ei muutosta",
|
||||||
"NoHistory": "Ei historiaa.",
|
"NoHistory": "Ei historiaa.",
|
||||||
@@ -385,7 +383,7 @@
|
|||||||
"Ok": "Ok",
|
"Ok": "Ok",
|
||||||
"OrganizeAndRename": "Järjestä ja nimeä uudelleen",
|
"OrganizeAndRename": "Järjestä ja nimeä uudelleen",
|
||||||
"OrganizeModalAllPathsRelative": "Kaikki polut ovat suhteessa:",
|
"OrganizeModalAllPathsRelative": "Kaikki polut ovat suhteessa:",
|
||||||
"OrganizeModalDisabled": "Nimeäminen uudelleen on poistettu käytöstä, mitään ei voi nimetä uudelleen",
|
"OrganizeModalDisabled": "Uudelleennimeäminen on poistettu käytöstä, eikä uudelleennimettävää ole",
|
||||||
"Events": "Tapahtumat",
|
"Events": "Tapahtumat",
|
||||||
"IncludeCustomFormatWhenRenamingHelpText": "Mahdollista tämän muodon käyttö {Custom Formats} -nimeämissäännön kanssa.",
|
"IncludeCustomFormatWhenRenamingHelpText": "Mahdollista tämän muodon käyttö {Custom Formats} -nimeämissäännön kanssa.",
|
||||||
"Overview": "Yleiskatsaus",
|
"Overview": "Yleiskatsaus",
|
||||||
@@ -421,7 +419,7 @@
|
|||||||
"RecycleBinCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan roskakorista pysyvästi automaattisesti.",
|
"RecycleBinCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan roskakorista pysyvästi automaattisesti.",
|
||||||
"RecycleBinHelpText": "Pysyvän poiston sijaan elokuvatiedostot siirretään tähän kansioon.",
|
"RecycleBinHelpText": "Pysyvän poiston sijaan elokuvatiedostot siirretään tähän kansioon.",
|
||||||
"RefreshAndScan": "Päivitä ja tarkista",
|
"RefreshAndScan": "Päivitä ja tarkista",
|
||||||
"RequiredHelpText": "Tämän {0} ehdon on vastattava muokattua muotoa. Muuten yksi {1} ottelu riittää.",
|
"RequiredHelpText": "Ehdon '{0}' on vastattava mukautettua muotoa sen soveltamiseksi. Muutoin yksi '{1}' vastaavuus on riittävä.",
|
||||||
"RequiredRestrictionPlaceHolder": "Lisää rajoitus",
|
"RequiredRestrictionPlaceHolder": "Lisää rajoitus",
|
||||||
"AppDataLocationHealthCheckMessage": "Päivitystä ei sallita, jotta AppData-kansion poisto päivityksen yhteydessä voidaan estää.",
|
"AppDataLocationHealthCheckMessage": "Päivitystä ei sallita, jotta AppData-kansion poisto päivityksen yhteydessä voidaan estää.",
|
||||||
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
|
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
|
||||||
@@ -484,7 +482,7 @@
|
|||||||
"ConsideredAvailable": "Tulkitaan olevan saatavilla",
|
"ConsideredAvailable": "Tulkitaan olevan saatavilla",
|
||||||
"CopyUsingHardlinksHelpText": "Käytä hardlink-kytköksiä, kun kopioit tiedostoja torrenteista, joita jaetaan vielä.",
|
"CopyUsingHardlinksHelpText": "Käytä hardlink-kytköksiä, kun kopioit tiedostoja torrenteista, joita jaetaan vielä.",
|
||||||
"Local": "Paikalliset",
|
"Local": "Paikalliset",
|
||||||
"CouldNotFindResults": "Haku '{0}' ei tuottanut yhtään tuloksia.",
|
"CouldNotFindResults": "Haku '{0}' ei tuottanut tuloksia.",
|
||||||
"CreateEmptyMovieFolders": "Luo tyhjät kansiot",
|
"CreateEmptyMovieFolders": "Luo tyhjät kansiot",
|
||||||
"CreateGroup": "Luo ryhmä",
|
"CreateGroup": "Luo ryhmä",
|
||||||
"Crew": "Ryhmä",
|
"Crew": "Ryhmä",
|
||||||
@@ -495,12 +493,12 @@
|
|||||||
"CustomFormatHelpText": "Radarr pisteyttää jokaisen julkaisun käyttäen pisteiden summaa täsmääville mukautetuille muodoille. Jos uusi julkaisu parantaisi pisteitä samalla tai paremmalla laadulla, Radarr sieppaa sen.",
|
"CustomFormatHelpText": "Radarr pisteyttää jokaisen julkaisun käyttäen pisteiden summaa täsmääville mukautetuille muodoille. Jos uusi julkaisu parantaisi pisteitä samalla tai paremmalla laadulla, Radarr sieppaa sen.",
|
||||||
"CustomFormatJSON": "Mukautettu muoto JSON",
|
"CustomFormatJSON": "Mukautettu muoto JSON",
|
||||||
"CustomFormats": "Mukautetut muodot",
|
"CustomFormats": "Mukautetut muodot",
|
||||||
"CustomFormatScore": "Mukautetun muodon pisteet",
|
"CustomFormatScore": "Mukautetun muodon pisteytys",
|
||||||
"CustomFormatsSettings": "Mukautettujen muotojen asetukset",
|
"CustomFormatsSettings": "Mukautettujen muotojen asetukset",
|
||||||
"CustomFormatsSettingsSummary": "Mukautetut muodot ja niiden asetukset.",
|
"CustomFormatsSettingsSummary": "Mukautetut muodot ja niiden asetukset.",
|
||||||
"CustomFormatUnknownConditionOption": "Tuntematon vaihtoehto '{0}' ehdolle '{1}'",
|
"CustomFormatUnknownConditionOption": "Tuntematon valinta '{0}' ehdolle '{1}'",
|
||||||
"Cutoff": "Katkaisu",
|
"Cutoff": "Katkaisu",
|
||||||
"CutoffFormatScoreHelpText": "Kun tämä mukautetun muodon pisteytys saavutetaan, Radarr ei enää lataa elokuvia.",
|
"CutoffFormatScoreHelpText": "Kun tämä mukautetun muodon pisteytys saavutetaan, ei elokuvia enää ladata.",
|
||||||
"CutoffUnmet": "Katkaisutasoa ei saavutettu",
|
"CutoffUnmet": "Katkaisutasoa ei saavutettu",
|
||||||
"Days": "Päivää",
|
"Days": "Päivää",
|
||||||
"Debug": "Virheenkorjaus",
|
"Debug": "Virheenkorjaus",
|
||||||
@@ -562,7 +560,7 @@
|
|||||||
"Downloading": "Ladataan",
|
"Downloading": "Ladataan",
|
||||||
"DownloadPropersAndRepacks": "Proper- ja repack-julkaisut",
|
"DownloadPropersAndRepacks": "Proper- ja repack-julkaisut",
|
||||||
"DownloadPropersAndRepacksHelpText1": "Määrittää päivitetäänkö tiedostot automaattisesti proper- ja repack-julkaisuihin (kunnollinen/uudelleenpaketoitu).",
|
"DownloadPropersAndRepacksHelpText1": "Määrittää päivitetäänkö tiedostot automaattisesti proper- ja repack-julkaisuihin (kunnollinen/uudelleenpaketoitu).",
|
||||||
"DownloadPropersAndRepacksHelpTextWarning": "Käytä mukautettuja muotoja automaattisiin päivityksiin potkureille / uudelleenpakkauksille",
|
"DownloadPropersAndRepacksHelpTextWarning": "Käytä mukautettuja muotoja automaattisiin Proper/Repack-päivityksiin",
|
||||||
"DownloadWarning": "Latausvaroitus: {0}",
|
"DownloadWarning": "Latausvaroitus: {0}",
|
||||||
"DownloadWarningCheckDownloadClientForMoreDetails": "Latausvaroitus: Katso tarkempia tietoja lataustyökalusta",
|
"DownloadWarningCheckDownloadClientForMoreDetails": "Latausvaroitus: Katso tarkempia tietoja lataustyökalusta",
|
||||||
"Edition": "Painos",
|
"Edition": "Painos",
|
||||||
@@ -600,7 +598,7 @@
|
|||||||
"FailedLoadingSearchResults": "Hakutulosten lataus epäonnistui. Yritä uudelleen.",
|
"FailedLoadingSearchResults": "Hakutulosten lataus epäonnistui. Yritä uudelleen.",
|
||||||
"FailedToLoadMovieFromAPI": "Elokuvan lataus API:n kautta epäonnistui",
|
"FailedToLoadMovieFromAPI": "Elokuvan lataus API:n kautta epäonnistui",
|
||||||
"FeatureRequests": "Kehitysehdotukset",
|
"FeatureRequests": "Kehitysehdotukset",
|
||||||
"FileDateHelpText": "Tiedoston päiväyksen muutos tuonnin ja uudellentarkistuksen yhteydessä.",
|
"FileDateHelpText": "Muuta tiedoston päiväys tuonnin ja uudelleentarkistuksen yhteydessä.",
|
||||||
"FileManagement": "Tiedostojen hallinta",
|
"FileManagement": "Tiedostojen hallinta",
|
||||||
"Filename": "Tiedostonimi",
|
"Filename": "Tiedostonimi",
|
||||||
"FileNames": "Tiedostonimet",
|
"FileNames": "Tiedostonimet",
|
||||||
@@ -631,7 +629,6 @@
|
|||||||
"Group": "Ryhmä",
|
"Group": "Ryhmä",
|
||||||
"Health": "Kunto",
|
"Health": "Kunto",
|
||||||
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia.",
|
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia.",
|
||||||
"HelpText": "Aikaväli minuutteina. Poista käytöstä asettamalla arvoksi '0' (tämä lopettaa julkaisujen automaattisen sieppauksen).",
|
|
||||||
"HiddenClickToShow": "Piilotettu, näytä painalla",
|
"HiddenClickToShow": "Piilotettu, näytä painalla",
|
||||||
"History": "Historia",
|
"History": "Historia",
|
||||||
"Host": "Osoite",
|
"Host": "Osoite",
|
||||||
@@ -786,8 +783,8 @@
|
|||||||
"RemoveSelected": "Poista valitut",
|
"RemoveSelected": "Poista valitut",
|
||||||
"RemovingTag": "Tunniste poistetaan",
|
"RemovingTag": "Tunniste poistetaan",
|
||||||
"Renamed": "Nimetty uudelleen",
|
"Renamed": "Nimetty uudelleen",
|
||||||
"RenameFiles": "Nimeä uudelleen",
|
"RenameFiles": "Uudelleennimeä tiedostot",
|
||||||
"RenameMovies": "Nimeä elokuvat uudelleen",
|
"RenameMovies": "Uudelleennimeä elokuvat",
|
||||||
"RenameMoviesHelpText": "Jos uudelleennimeäminen ei ole käytössä, käytetään olemassa olevaa tiedostonimeä.",
|
"RenameMoviesHelpText": "Jos uudelleennimeäminen ei ole käytössä, käytetään olemassa olevaa tiedostonimeä.",
|
||||||
"Reorder": "Järjestä uudelleen",
|
"Reorder": "Järjestä uudelleen",
|
||||||
"Replace": "Korvata",
|
"Replace": "Korvata",
|
||||||
@@ -796,8 +793,8 @@
|
|||||||
"ReplaceWithSpaceDashSpace": "Korvus: välilyönti-väliviiva-välilyönti",
|
"ReplaceWithSpaceDashSpace": "Korvus: välilyönti-väliviiva-välilyönti",
|
||||||
"Required": "Vaaditaan",
|
"Required": "Vaaditaan",
|
||||||
"RequiredRestrictionHelpText": "Julkaisun tulee sisältää ainakin yksi näistä termeistä (kirjainkokoa ei huomioida).",
|
"RequiredRestrictionHelpText": "Julkaisun tulee sisältää ainakin yksi näistä termeistä (kirjainkokoa ei huomioida).",
|
||||||
"RescanAfterRefreshHelpText": "Tarkista elokuvakansion sisältö uudelleen elokuvan päivityksen jälkeen.",
|
"RescanAfterRefreshHelpText": "Tutki elokuvakansio uudelleen elokuvan päivityksen jälkeen.",
|
||||||
"RescanAfterRefreshHelpTextWarning": "Radarr ei tunnista tiedostomuutoksia automaattisesti, jollei asetuksena ole 'Aina'.",
|
"RescanAfterRefreshHelpTextWarning": "Tiedostomuutoksia ei tunnisteta automaattisesti, jollei asetuksena ole 'Aina'.",
|
||||||
"RescanMovieFolderAfterRefresh": "Elokuvakansion uudelleentarkistus",
|
"RescanMovieFolderAfterRefresh": "Elokuvakansion uudelleentarkistus",
|
||||||
"ResetAPIKey": "Uudista API-avain",
|
"ResetAPIKey": "Uudista API-avain",
|
||||||
"Restart": "Käynnistä uudelleen",
|
"Restart": "Käynnistä uudelleen",
|
||||||
@@ -829,7 +826,7 @@
|
|||||||
"SearchMissing": "Haku puuttuu",
|
"SearchMissing": "Haku puuttuu",
|
||||||
"SearchMovie": "Etsi elokuvaa",
|
"SearchMovie": "Etsi elokuvaa",
|
||||||
"SearchOnAdd": "Etsi lisättäessä",
|
"SearchOnAdd": "Etsi lisättäessä",
|
||||||
"SearchOnAddHelpText": "Elokuvia etsitään tältä tuostilistalta, kun ne lisätään Radarriin.",
|
"SearchOnAddHelpText": "Etsi tuostilistan elokuvia, kun ne lisätään kirjastoon.",
|
||||||
"SearchSelected": "Haku valittu",
|
"SearchSelected": "Haku valittu",
|
||||||
"Seconds": "Sekuntia",
|
"Seconds": "Sekuntia",
|
||||||
"Security": "Suojaus",
|
"Security": "Suojaus",
|
||||||
@@ -856,7 +853,7 @@
|
|||||||
"SettingsTimeFormat": "Kellonajan esitystapa",
|
"SettingsTimeFormat": "Kellonajan esitystapa",
|
||||||
"SettingsWeekColumnHeader": "Viikkosarakkeen otsikko",
|
"SettingsWeekColumnHeader": "Viikkosarakkeen otsikko",
|
||||||
"SettingsWeekColumnHeaderHelpText": "Näkyy jokaisen sarakkeen yläpuolella käytettäessä viikkonäkymää.",
|
"SettingsWeekColumnHeaderHelpText": "Näkyy jokaisen sarakkeen yläpuolella käytettäessä viikkonäkymää.",
|
||||||
"ShouldMonitorHelpText": "Tältä tuontilistalta lisätyt elokuvat lisätään ja niitä valvotaan.",
|
"ShouldMonitorHelpText": "Lisää listan elokuvat valvottuina.",
|
||||||
"ShowAdvanced": "Näytä edistyneet",
|
"ShowAdvanced": "Näytä edistyneet",
|
||||||
"ShowAsAllDayEvents": "Näytä koko päivän tapahtumina",
|
"ShowAsAllDayEvents": "Näytä koko päivän tapahtumina",
|
||||||
"ShowCutoffUnmetIconHelpText": "Näytä kuvake elokuville, joiden tiedostot eivät vastaa vielä määritettyä katkaisutasoa.",
|
"ShowCutoffUnmetIconHelpText": "Näytä kuvake elokuville, joiden tiedostot eivät vastaa vielä määritettyä katkaisutasoa.",
|
||||||
@@ -881,7 +878,7 @@
|
|||||||
"Shutdown": "Sammuta",
|
"Shutdown": "Sammuta",
|
||||||
"SizeOnDisk": "Koko levyllä",
|
"SizeOnDisk": "Koko levyllä",
|
||||||
"SkipFreeSpaceCheck": "Ohita vapaan levytilan tarkistus",
|
"SkipFreeSpaceCheck": "Ohita vapaan levytilan tarkistus",
|
||||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Käytä, kun vaapaata tilaa ei tunnisteta elokuviesi pääkansiosta",
|
"SkipFreeSpaceCheckWhenImportingHelpText": "Käytä, kun vapaata tallennustilaa ei tunnisteta elokuvien juurikansiosta.",
|
||||||
"Small": "Pieni",
|
"Small": "Pieni",
|
||||||
"Socks4": "Sukat 4",
|
"Socks4": "Sukat 4",
|
||||||
"Socks5": "Sukat5 (tuki TOR)",
|
"Socks5": "Sukat5 (tuki TOR)",
|
||||||
@@ -948,7 +945,7 @@
|
|||||||
"UnableToAddANewRemotePathMappingPleaseTryAgain": "Etäsijainnin kartoituksen lisäys epäonnistui. Yritä uudelleen.",
|
"UnableToAddANewRemotePathMappingPleaseTryAgain": "Etäsijainnin kartoituksen lisäys epäonnistui. Yritä uudelleen.",
|
||||||
"UnableToImportCheckLogs": "Ladattu - Tuonti epäonnistui: tarkasta lokitiedot",
|
"UnableToImportCheckLogs": "Ladattu - Tuonti epäonnistui: tarkasta lokitiedot",
|
||||||
"UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui.",
|
"UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui.",
|
||||||
"UnableToLoadCustomFormats": "Muokattujen muotojen lataus epäonnistui.",
|
"UnableToLoadCustomFormats": "Muokattuja muotoja ei voitu ladata.",
|
||||||
"UnableToLoadDelayProfiles": "Viiveprofiilien lataus epäonnistui.",
|
"UnableToLoadDelayProfiles": "Viiveprofiilien lataus epäonnistui.",
|
||||||
"Unlimited": "Rajoittamaton",
|
"Unlimited": "Rajoittamaton",
|
||||||
"UnableToLoadDownloadClientOptions": "Lataustyökalun asetuksien lataus epäonnistui.",
|
"UnableToLoadDownloadClientOptions": "Lataustyökalun asetuksien lataus epäonnistui.",
|
||||||
@@ -956,7 +953,7 @@
|
|||||||
"UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.",
|
"UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.",
|
||||||
"UnableToLoadHistory": "Historian lataus epäonnistui.",
|
"UnableToLoadHistory": "Historian lataus epäonnistui.",
|
||||||
"UnableToLoadIndexerOptions": "Tietolähteiden asetuksien lataus epäonnistui.",
|
"UnableToLoadIndexerOptions": "Tietolähteiden asetuksien lataus epäonnistui.",
|
||||||
"UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui.",
|
"UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui",
|
||||||
"UnableToLoadLanguages": "Kielien lataus epäonnistui.",
|
"UnableToLoadLanguages": "Kielien lataus epäonnistui.",
|
||||||
"UnableToLoadListExclusions": "Tuontilistojen poikkeussääntöjen lataus epäonnistui.",
|
"UnableToLoadListExclusions": "Tuontilistojen poikkeussääntöjen lataus epäonnistui.",
|
||||||
"UnableToLoadListOptions": "Tuontilistojen asetuksien lataus epäonnistui.",
|
"UnableToLoadListOptions": "Tuontilistojen asetuksien lataus epäonnistui.",
|
||||||
@@ -989,7 +986,7 @@
|
|||||||
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit edelleen asentaa ne myös lähteestä System:Updates.",
|
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit edelleen asentaa ne myös lähteestä System:Updates.",
|
||||||
"UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.",
|
"UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.",
|
||||||
"UpdateMechanismHelpText": "Käytä Radarrin sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.",
|
"UpdateMechanismHelpText": "Käytä Radarrin sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.",
|
||||||
"UpdateSelected": "Päivitä valittu",
|
"UpdateSelected": "Päivitä valitut",
|
||||||
"UpgradeUntilCustomFormatScore": "Päivitä mukautetun muodon pistetytykseen saakka",
|
"UpgradeUntilCustomFormatScore": "Päivitä mukautetun muodon pistetytykseen saakka",
|
||||||
"UpgradeUntilQuality": "Päivitä laatuun asti",
|
"UpgradeUntilQuality": "Päivitä laatuun asti",
|
||||||
"UpgradeUntilThisQualityIsMetOrExceeded": "Päivitä, kunnes tämä laatu saavutetaan tai ylitetään",
|
"UpgradeUntilThisQualityIsMetOrExceeded": "Päivitä, kunnes tämä laatu saavutetaan tai ylitetään",
|
||||||
@@ -1016,7 +1013,6 @@
|
|||||||
"Wiki": "Wiki",
|
"Wiki": "Wiki",
|
||||||
"WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion {0}?",
|
"WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion {0}?",
|
||||||
"Year": "Vuosi",
|
"Year": "Vuosi",
|
||||||
"Yes": "Kyllä",
|
|
||||||
"YesCancel": "Kyllä, peruuta",
|
"YesCancel": "Kyllä, peruuta",
|
||||||
"YesMoveFiles": "Kyllä, siirrä tiedostot",
|
"YesMoveFiles": "Kyllä, siirrä tiedostot",
|
||||||
"Yesterday": "Eilen",
|
"Yesterday": "Eilen",
|
||||||
@@ -1074,7 +1070,7 @@
|
|||||||
"RemotePathMappingCheckFileRemoved": "Tiedosto '{0}' poistettiin kesken käsittelyn.",
|
"RemotePathMappingCheckFileRemoved": "Tiedosto '{0}' poistettiin kesken käsittelyn.",
|
||||||
"RemotePathMappingCheckFilesLocalWrongOSPath": "Paikallinen lataustyökalu '{0}' ilmoitti tiedostosijainniksi '{1}', mutta se ei ole kelvollinen '{2}' -sijainti. Tarkista lataustyökalusi asetukset.",
|
"RemotePathMappingCheckFilesLocalWrongOSPath": "Paikallinen lataustyökalu '{0}' ilmoitti tiedostosijainniksi '{1}', mutta se ei ole kelvollinen '{2}' -sijainti. Tarkista lataustyökalusi asetukset.",
|
||||||
"RemotePathMappingCheckFolderPermissions": "Radarr näkee, muttei voi käyttää latauskansiota '{0}'. Todennäköinen syy on sijainnin käyttöoikeusvirhe.",
|
"RemotePathMappingCheckFolderPermissions": "Radarr näkee, muttei voi käyttää latauskansiota '{0}'. Todennäköinen syy on sijainnin käyttöoikeusvirhe.",
|
||||||
"RemotePathMappingCheckGenericPermissions": "Lataustyökalu '{0}' sijoittaa lataukset kansioon '{1}', mutta Radarr ei näe sitä. Saata joutua muokkaamaan kansion käyttöoikeuksia.",
|
"RemotePathMappingCheckGenericPermissions": "Lataustyökalu '{0}' sijoittaa lataukset kansioon '{1}', mutta Radarr ei näe sitä. Saatat joutua muokkaamaan kansion käyttöoikeuksia.",
|
||||||
"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.",
|
"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.",
|
||||||
"RemotePathMappingCheckFilesBadDockerPath": "Käytät Dockeria ja lataustyökalu '{0}' ilmoitti latauskohteeksi '{1}', mutta se ei ole kelvollinen '{2}' -sijainti. Tarkista etäsijaintiesi kartoitukset ja lataustyökalun asetukset.",
|
"RemotePathMappingCheckFilesBadDockerPath": "Käytät Dockeria ja lataustyökalu '{0}' ilmoitti latauskohteeksi '{1}', mutta se ei ole kelvollinen '{2}' -sijainti. Tarkista etäsijaintiesi kartoitukset ja lataustyökalun asetukset.",
|
||||||
"RemotePathMappingCheckRemoteDownloadClient": "Etälataustyökalu '{0}' ilmoitti tiedostosijainniksi '{1}', mutta kansiota ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kartoitus.",
|
"RemotePathMappingCheckRemoteDownloadClient": "Etälataustyökalu '{0}' ilmoitti tiedostosijainniksi '{1}', mutta kansiota ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kartoitus.",
|
||||||
@@ -1115,5 +1111,28 @@
|
|||||||
"Waiting": "Odottaa",
|
"Waiting": "Odottaa",
|
||||||
"OriginalTitle": "Alkuperäinen nimi",
|
"OriginalTitle": "Alkuperäinen nimi",
|
||||||
"OriginalLanguage": "Alkuperäinen kieli",
|
"OriginalLanguage": "Alkuperäinen kieli",
|
||||||
"Database": "Tietokanta"
|
"Database": "Tietokanta",
|
||||||
|
"RefreshMonitoredIntervalHelpText": "Miten usein valvottujen latausten tiedot päivitetään lataustyökaluilta (vähimmäisaika on 1 minuutti).",
|
||||||
|
"RssSyncHelpText": "Aikaväli minuutteina. Arvo nolla kytkee toiminnon pois käytöstä ja lopettaen samalla automaattisen julkaisujen kaappauksen täysin.",
|
||||||
|
"InstanceName": "Instanssin nimi",
|
||||||
|
"InstanceNameHelpText": "Instanssin nimi välilehdellä ja sovelluksen Syslog-nimeksi",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "Käytössä oleva suodatin on piilottanut kaikki kokoelmat.",
|
||||||
|
"Collections": "Kokoelmat",
|
||||||
|
"MonitorMovies": "Valvo elokuvia",
|
||||||
|
"NoCollections": "Kokoelmia ei löytynyt. Aloita lisäämällä uusi elokuva tai tuo joitakin olemassa olevia.",
|
||||||
|
"EditCollection": "Muokkaa kokoelmaa",
|
||||||
|
"SearchOnAddCollectionHelpText": "Etsi kokoelman elokuvia, kun ne lisätään kirjastoon.",
|
||||||
|
"ChooseImportMode": "Valitse tuontitila",
|
||||||
|
"CollectionsSelectedInterp": "{0} kokoelmaa valittu",
|
||||||
|
"MonitorCollection": "Valvo kokoelmaa",
|
||||||
|
"MonitoredCollectionHelpText": "Valvonta lisää kokoelman elokuvat automaattisesti kirjastoon.",
|
||||||
|
"MovieAndCollection": "Elokuva ja kokoelma",
|
||||||
|
"MovieCollectionMissingRoot": "Elokuvakokoelman juurikansio puuttuu: {0}",
|
||||||
|
"MovieCollectionMultipleMissingRoots": "Useita elokuvakokoelmien juurikansioita puuttuu: {0}",
|
||||||
|
"MovieOnly": "Vain elokuva",
|
||||||
|
"RefreshCollections": "Päivitä kokoelmat",
|
||||||
|
"ScrollMovies": "Vieritä elokuvia",
|
||||||
|
"ShowCollectionDetails": "Näytä kokoelman tila",
|
||||||
|
"ShowOverview": "Näytä yleiskatsaus",
|
||||||
|
"UnableToLoadCollections": "Kokoelmia ei voitu ladata"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"IndexerStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs",
|
"IndexerStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs",
|
||||||
"IndexerSearchCheckNoInteractiveMessage": "Aucun indexeur disponible avec la recherche interactive activée, Radarr ne fournira aucun résultat de recherche interactif",
|
"IndexerSearchCheckNoInteractiveMessage": "Aucun indexeur disponible avec la recherche interactive activée, Radarr ne fournira aucun résultat de recherche interactive",
|
||||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Tous les indexeurs compatibles avec la recherche sont temporairement indisponibles en raison d'erreurs d'indexation récentes",
|
"IndexerSearchCheckNoAvailableIndexersMessage": "Tous les indexeurs compatibles avec la recherche sont temporairement indisponibles en raison d'erreurs d'indexation récentes",
|
||||||
"IndexerSearchCheckNoAutomaticMessage": "Aucun indexeur disponible avec la recherche automatique activée, Radarr ne fournira aucun résultat de recherche automatique",
|
"IndexerSearchCheckNoAutomaticMessage": "Aucun indexeur disponible avec la recherche automatique activée, Radarr ne fournira aucun résultat de recherche automatique",
|
||||||
"Indexers": "Indexeurs",
|
"Indexers": "Indexeurs",
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
"Edit": "Éditer",
|
"Edit": "Éditer",
|
||||||
"Downloaded": "Téléchargé",
|
"Downloaded": "Téléchargé",
|
||||||
"DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs",
|
"DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs",
|
||||||
"DownloadClients": "Clients Télécharg.",
|
"DownloadClients": "Clients de téléchargement",
|
||||||
"DownloadClientCheckNoneAvailableMessage": "Aucun client de téléchargement n'est disponible",
|
"DownloadClientCheckNoneAvailableMessage": "Aucun client de téléchargement n'est disponible",
|
||||||
"Dates": "Dates",
|
"Dates": "Dates",
|
||||||
"Date": "Date",
|
"Date": "Date",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"Delete": "Supprimer",
|
"Delete": "Supprimer",
|
||||||
"DelayProfiles": "Profils de retard",
|
"DelayProfiles": "Profils de retard",
|
||||||
"Day": "Jour",
|
"Day": "Jour",
|
||||||
"CustomFormats": "Formats Persos",
|
"CustomFormats": "Formats personnalisés",
|
||||||
"CustomFilters": "Filtres personnalisés",
|
"CustomFilters": "Filtres personnalisés",
|
||||||
"Crew": "Équipe",
|
"Crew": "Équipe",
|
||||||
"Connections": "Connexions",
|
"Connections": "Connexions",
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
"Calendar": "Calendrier",
|
"Calendar": "Calendrier",
|
||||||
"BackupNow": "Sauvegarder maintenant",
|
"BackupNow": "Sauvegarder maintenant",
|
||||||
"Backup": "Sauvegarde",
|
"Backup": "Sauvegarde",
|
||||||
"AppDataLocationHealthCheckMessage": "Mettre à jour ne sera pas possible pour éviter la suppression AppData lors de la mise à jour",
|
"AppDataLocationHealthCheckMessage": "Mettre à jour ne sera pas possible afin d'éviter de supprimer le dossier AppData lors de la mise à jour",
|
||||||
"Analytics": "Analytique",
|
"Analytics": "Analytique",
|
||||||
"All": "Tout",
|
"All": "Tout",
|
||||||
"AddNewTmdbIdMessage": "Vous pouvez également effectuer une recherche à l'aide de l'identifiant TMDb d'un film. exemple. tmdb:71663",
|
"AddNewTmdbIdMessage": "Vous pouvez également effectuer une recherche à l'aide de l'identifiant TMDb d'un film. exemple. tmdb:71663",
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
"Activity": "Activité",
|
"Activity": "Activité",
|
||||||
"About": "À propos",
|
"About": "À propos",
|
||||||
"CustomFormatsSettingsSummary": "Paramètres et Formats personnalisés",
|
"CustomFormatsSettingsSummary": "Paramètres et Formats personnalisés",
|
||||||
"IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs: {0}",
|
"IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}",
|
||||||
"DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}",
|
"DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}",
|
||||||
"SetTags": "Définir Tags",
|
"SetTags": "Définir Tags",
|
||||||
"ReleaseTitle": "Titre de la version",
|
"ReleaseTitle": "Titre de la version",
|
||||||
@@ -292,7 +292,7 @@
|
|||||||
"RecentFolders": "Dossiers récents",
|
"RecentFolders": "Dossiers récents",
|
||||||
"QuickImport": "Déplacer automatiquement",
|
"QuickImport": "Déplacer automatiquement",
|
||||||
"PosterSize": "Taille des posters",
|
"PosterSize": "Taille des posters",
|
||||||
"Posters": "Posters",
|
"Posters": "Affiches",
|
||||||
"PosterOptions": "Options des posters",
|
"PosterOptions": "Options des posters",
|
||||||
"PendingChangesStayReview": "Rester et vérifier les changements",
|
"PendingChangesStayReview": "Rester et vérifier les changements",
|
||||||
"PendingChangesMessage": "Vous avez effectué des changements non sauvegardés, souhaitez vous quitter cette page ?",
|
"PendingChangesMessage": "Vous avez effectué des changements non sauvegardés, souhaitez vous quitter cette page ?",
|
||||||
@@ -322,7 +322,7 @@
|
|||||||
"CertificateValidation": "Validation du certificat",
|
"CertificateValidation": "Validation du certificat",
|
||||||
"BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales",
|
"BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales",
|
||||||
"Branch": "Branche",
|
"Branch": "Branche",
|
||||||
"BindAddressHelpText": "Adresse IP4 valide ou '*' pour toutes les interfaces",
|
"BindAddressHelpText": "Adresse IPv4 valide ou '*' pour toutes les interfaces",
|
||||||
"BindAddress": "Adresse d'attache",
|
"BindAddress": "Adresse d'attache",
|
||||||
"Backups": "Sauvegardes",
|
"Backups": "Sauvegardes",
|
||||||
"BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de conservation seront automatiquement effacées",
|
"BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de conservation seront automatiquement effacées",
|
||||||
@@ -347,7 +347,6 @@
|
|||||||
"AllowHardcodedSubsHelpText": "Les sous-titres incrustés détectés seront automatiquement téléchargés",
|
"AllowHardcodedSubsHelpText": "Les sous-titres incrustés détectés seront automatiquement téléchargés",
|
||||||
"AllowHardcodedSubs": "Autoriser les sous-titres incrustés",
|
"AllowHardcodedSubs": "Autoriser les sous-titres incrustés",
|
||||||
"AgeWhenGrabbed": "Age (au moment du téléchargement)",
|
"AgeWhenGrabbed": "Age (au moment du téléchargement)",
|
||||||
"AddMoviesMonitored": "Ajouter des films en mode surveillé",
|
|
||||||
"AddListExclusion": "Ajouter une exclusion de liste",
|
"AddListExclusion": "Ajouter une exclusion de liste",
|
||||||
"IgnoreDeletedMovies": "Annuler la surveillance des films supprimés",
|
"IgnoreDeletedMovies": "Annuler la surveillance des films supprimés",
|
||||||
"IgnoredAddresses": "Adresses ignorées",
|
"IgnoredAddresses": "Adresses ignorées",
|
||||||
@@ -355,7 +354,6 @@
|
|||||||
"ICalHttpUrlHelpText": "Copiez cette URL dans votre client ou cliquez pour souscrire si votre navigateur est compatible avec webcal",
|
"ICalHttpUrlHelpText": "Copiez cette URL dans votre client ou cliquez pour souscrire si votre navigateur est compatible avec webcal",
|
||||||
"ICalFeed": "Flux iCal",
|
"ICalFeed": "Flux iCal",
|
||||||
"Hostname": "Nom d'hôte",
|
"Hostname": "Nom d'hôte",
|
||||||
"HelpText": "Intervalle en minutes. Mettre à zéro pour désactiver (cela arrêtera tous les téléchargements automatiques)",
|
|
||||||
"Group": "Groupe",
|
"Group": "Groupe",
|
||||||
"GrabRelease": "Télécharger la version",
|
"GrabRelease": "Télécharger la version",
|
||||||
"GrabID": "ID du grab",
|
"GrabID": "ID du grab",
|
||||||
@@ -385,7 +383,7 @@
|
|||||||
"Enable": "Activer",
|
"Enable": "Activer",
|
||||||
"EditPerson": "Éditer la personne",
|
"EditPerson": "Éditer la personne",
|
||||||
"EditMovie": "Éditer le film",
|
"EditMovie": "Éditer le film",
|
||||||
"Edition": "Edition",
|
"Edition": "Édition",
|
||||||
"DownloadWarningCheckDownloadClientForMoreDetails": "Avertissement téléchargement : voir le client de téléchargement pour plus de détails",
|
"DownloadWarningCheckDownloadClientForMoreDetails": "Avertissement téléchargement : voir le client de téléchargement pour plus de détails",
|
||||||
"DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails",
|
"DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails",
|
||||||
"DownloadClientSettings": "Réglages Clients de téléchargement",
|
"DownloadClientSettings": "Réglages Clients de téléchargement",
|
||||||
@@ -455,7 +453,7 @@
|
|||||||
"CopyToClipboard": "Copier dans le presse-papier",
|
"CopyToClipboard": "Copier dans le presse-papier",
|
||||||
"GoToInterp": "Aller à {0}",
|
"GoToInterp": "Aller à {0}",
|
||||||
"ForMoreInformationOnTheIndividualImportListsClinkOnTheInfoButtons": "Pour plus d'informations sur les listes d'importation individuelles, cliquez sur les boutons d'information.",
|
"ForMoreInformationOnTheIndividualImportListsClinkOnTheInfoButtons": "Pour plus d'informations sur les listes d'importation individuelles, cliquez sur les boutons d'information.",
|
||||||
"ForMoreInformationOnTheIndividualDownloadClients": "Pour plus d'informations sur les clients de téléchargement individuels, cliquez sur les boutons d'information.",
|
"ForMoreInformationOnTheIndividualDownloadClients": "Pour plus d'informations sur chaque client de téléchargement, cliquez sur les boutons plus d'information.",
|
||||||
"FilterPlaceHolder": "Chercher les films",
|
"FilterPlaceHolder": "Chercher les films",
|
||||||
"FailedLoadingSearchResults": "Échec du chargement des résultats de la recherche, veuillez réessayer.",
|
"FailedLoadingSearchResults": "Échec du chargement des résultats de la recherche, veuillez réessayer.",
|
||||||
"Excluded": "Exclu",
|
"Excluded": "Exclu",
|
||||||
@@ -573,7 +571,7 @@
|
|||||||
"ProxyBypassFilterHelpText": "Utiliser ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines",
|
"ProxyBypassFilterHelpText": "Utiliser ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines",
|
||||||
"OnGrabHelpText": "À la Récupération",
|
"OnGrabHelpText": "À la Récupération",
|
||||||
"NegateHelpText": "Si coché, le format personnalisé ne s'appliquera pas si cette condition {0} correspond.",
|
"NegateHelpText": "Si coché, le format personnalisé ne s'appliquera pas si cette condition {0} correspond.",
|
||||||
"LastDuration": "dernière Durée",
|
"LastDuration": "Dernière durée",
|
||||||
"IncludeCustomFormatWhenRenamingHelpText": "Inclus dans {Custom Formats} renommer le format",
|
"IncludeCustomFormatWhenRenamingHelpText": "Inclus dans {Custom Formats} renommer le format",
|
||||||
"GrabReleaseMessageText": "Radarr n'a pas été en mesure de déterminer à quel film cette version était destinée. Radarr peut être incapable d'importer automatiquement cette version. Voulez-vous récupérer '{0}' ?",
|
"GrabReleaseMessageText": "Radarr n'a pas été en mesure de déterminer à quel film cette version était destinée. Radarr peut être incapable d'importer automatiquement cette version. Voulez-vous récupérer '{0}' ?",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Liste séparée par des virgules des fichiers supplémentaires à importer (.nfo sera importé en tant que .nfo-orig)",
|
"ExtraFileExtensionsHelpTexts1": "Liste séparée par des virgules des fichiers supplémentaires à importer (.nfo sera importé en tant que .nfo-orig)",
|
||||||
@@ -586,7 +584,7 @@
|
|||||||
"UpgradeUntilThisQualityIsMetOrExceeded": "Mettre à niveau jusqu'à ce que cette qualité soit atteinte ou dépassée",
|
"UpgradeUntilThisQualityIsMetOrExceeded": "Mettre à niveau jusqu'à ce que cette qualité soit atteinte ou dépassée",
|
||||||
"UpgradeAllowedHelpText": "Ne sera pas mis à jour si la qualité est désactivée",
|
"UpgradeAllowedHelpText": "Ne sera pas mis à jour si la qualité est désactivée",
|
||||||
"UpdateScriptPathHelpText": "Chemin vers un script personnalisé qui prend un package de mise à jour extraite et gère le reste du processus de mise à jour",
|
"UpdateScriptPathHelpText": "Chemin vers un script personnalisé qui prend un package de mise à jour extraite et gère le reste du processus de mise à jour",
|
||||||
"UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré dans Radarr ou un script",
|
"UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de Radarr ou un script",
|
||||||
"UpdateAutomaticallyHelpText": "Télécharger et installer automatiquement les mises à jour. Vous pourrez toujours installer à partir de System : Updates",
|
"UpdateAutomaticallyHelpText": "Télécharger et installer automatiquement les mises à jour. Vous pourrez toujours installer à partir de System : Updates",
|
||||||
"Unreleased": "Indisponible",
|
"Unreleased": "Indisponible",
|
||||||
"UnmonitoredHelpText": "Inclure les films non surveillés dans le flux iCal",
|
"UnmonitoredHelpText": "Inclure les films non surveillés dans le flux iCal",
|
||||||
@@ -828,7 +826,7 @@
|
|||||||
"EditQualityProfile": "Modifier les profils",
|
"EditQualityProfile": "Modifier les profils",
|
||||||
"ErrorRestoringBackup": "Erreur lors de la restauration de la sauvegarde",
|
"ErrorRestoringBackup": "Erreur lors de la restauration de la sauvegarde",
|
||||||
"ExternalUpdater": "Radarr est configuré pour utiliser un système de mise à jour ad-hoc",
|
"ExternalUpdater": "Radarr est configuré pour utiliser un système de mise à jour ad-hoc",
|
||||||
"FileWasDeletedByViaUI": "Le fichier à été supprimé via l'interface",
|
"FileWasDeletedByViaUI": "Le fichier a été supprimé via l'interface",
|
||||||
"Announced": "Annoncé",
|
"Announced": "Annoncé",
|
||||||
"ChmodFolder": "chmod Dossier",
|
"ChmodFolder": "chmod Dossier",
|
||||||
"ChmodFolderHelpText": "Nombre, appliqué durant l'import/renommage vers les dossiers et fichiers multimédias (sans exécuter les bits)",
|
"ChmodFolderHelpText": "Nombre, appliqué durant l'import/renommage vers les dossiers et fichiers multimédias (sans exécuter les bits)",
|
||||||
@@ -848,7 +846,7 @@
|
|||||||
"AllResultsHiddenFilter": "Tous les résultats ont été dissimulés par le filtre actuellement appliqué",
|
"AllResultsHiddenFilter": "Tous les résultats ont été dissimulés par le filtre actuellement appliqué",
|
||||||
"Always": "Toujours",
|
"Always": "Toujours",
|
||||||
"AptUpdater": "Utiliser apt pour installer la mise à jour",
|
"AptUpdater": "Utiliser apt pour installer la mise à jour",
|
||||||
"AreYouSureYouWantToRemoveSelectedItemsFromQueue": "Êtes-vous sûr de vouloir désinstaller {0} objet{1} de la file d'attente ?",
|
"AreYouSureYouWantToRemoveSelectedItemsFromQueue": "Êtes-vous sûr de vouloir supprimer {0} objet(s) de la file d'attente ?",
|
||||||
"AuthBasic": "Authentification de base (popup)",
|
"AuthBasic": "Authentification de base (popup)",
|
||||||
"AuthForm": "Authentification par formulaire (page de connexion)",
|
"AuthForm": "Authentification par formulaire (page de connexion)",
|
||||||
"AreYouSureYouWantToDeleteFormat": "Êtes-vous sûr de vouloir supprimer le tag {0} ?",
|
"AreYouSureYouWantToDeleteFormat": "Êtes-vous sûr de vouloir supprimer le tag {0} ?",
|
||||||
@@ -894,7 +892,7 @@
|
|||||||
"HomePage": "Page d'accueil",
|
"HomePage": "Page d'accueil",
|
||||||
"HttpHttps": "HTTP(S)",
|
"HttpHttps": "HTTP(S)",
|
||||||
"ImportLibrary": "Import bibliothèque",
|
"ImportLibrary": "Import bibliothèque",
|
||||||
"MissingFromDisk": "Radarr n'a pas pu trouver le fichier sur le disque, il a donc été supprimé",
|
"MissingFromDisk": "Radarr n'a pas pu trouver le fichier sur le disque, il a donc été supprimé dans la base de donnée",
|
||||||
"MovieIsRecommend": "Le film est recommandé en fonction de l'ajout récent",
|
"MovieIsRecommend": "Le film est recommandé en fonction de l'ajout récent",
|
||||||
"NoAltTitle": "Pas de titres alternatifs.",
|
"NoAltTitle": "Pas de titres alternatifs.",
|
||||||
"NoLinks": "Aucun liens",
|
"NoLinks": "Aucun liens",
|
||||||
@@ -912,7 +910,7 @@
|
|||||||
"InteractiveImportErrQuality": "La qualité doit être choisie pour chaque fichier sélectionné",
|
"InteractiveImportErrQuality": "La qualité doit être choisie pour chaque fichier sélectionné",
|
||||||
"LowerCase": "Minuscules",
|
"LowerCase": "Minuscules",
|
||||||
"ManualImportSelectMovie": "Importation manuelle - Sélectionnez un film",
|
"ManualImportSelectMovie": "Importation manuelle - Sélectionnez un film",
|
||||||
"MappedDrivesRunningAsService": "Les lecteurs réseau mappés ne sont pas disponibles lorsqu'ils sont exécutés en tant que service Windows. Veuillez consulter la FAQ pour plus d'informations",
|
"MappedDrivesRunningAsService": "Les lecteurs réseau mappés ne sont pas disponibles en fonctionnement en tant que service Windows. Veuillez consulter la FAQ pour plus d'informations",
|
||||||
"RequiredRestrictionHelpText": "La version doit contenir au moins un de ces termes (insensible à la casse)",
|
"RequiredRestrictionHelpText": "La version doit contenir au moins un de ces termes (insensible à la casse)",
|
||||||
"InvalidFormat": "Format invalide",
|
"InvalidFormat": "Format invalide",
|
||||||
"LastExecution": "Dernière exécution",
|
"LastExecution": "Dernière exécution",
|
||||||
@@ -944,7 +942,6 @@
|
|||||||
"ImportNotForDownloads": "Ne pas utiliser pour importer des téléchargements à partir de votre client de téléchargement, cela concerne uniquement les bibliothèques organisées existantes, pas les fichiers non triés.",
|
"ImportNotForDownloads": "Ne pas utiliser pour importer des téléchargements à partir de votre client de téléchargement, cela concerne uniquement les bibliothèques organisées existantes, pas les fichiers non triés.",
|
||||||
"PreferUsenet": "Préférez Usenet",
|
"PreferUsenet": "Préférez Usenet",
|
||||||
"ReplaceWithDash": "Remplacer par Dash",
|
"ReplaceWithDash": "Remplacer par Dash",
|
||||||
"No": "Non",
|
|
||||||
"InCinemasDate": "Dans les cinémas Date",
|
"InCinemasDate": "Dans les cinémas Date",
|
||||||
"InstallLatest": "Installer le dernier",
|
"InstallLatest": "Installer le dernier",
|
||||||
"KeepAndUnmonitorMovie": "Conserver et annuler la surveillance du film",
|
"KeepAndUnmonitorMovie": "Conserver et annuler la surveillance du film",
|
||||||
@@ -994,7 +991,7 @@
|
|||||||
"SearchCutoffUnmet": "Limite de recherche non satisfaite",
|
"SearchCutoffUnmet": "Limite de recherche non satisfaite",
|
||||||
"SearchMissing": "Recherche manquante",
|
"SearchMissing": "Recherche manquante",
|
||||||
"Seconds": "Secondes",
|
"Seconds": "Secondes",
|
||||||
"SelectDotDot": "'Sélectionner...",
|
"SelectDotDot": "Sélectionner...",
|
||||||
"SelectLanguage": "Choisir la langue",
|
"SelectLanguage": "Choisir la langue",
|
||||||
"SelectMovie": "Sélectionnez un film",
|
"SelectMovie": "Sélectionnez un film",
|
||||||
"SelectQuality": "Sélectionnez la qualité",
|
"SelectQuality": "Sélectionnez la qualité",
|
||||||
@@ -1005,7 +1002,7 @@
|
|||||||
"Sunday": "dimanche",
|
"Sunday": "dimanche",
|
||||||
"TagDetails": "Détails du tag - {0}",
|
"TagDetails": "Détails du tag - {0}",
|
||||||
"TheLogLevelDefault": "Le niveau de journalisation est par défaut «Info» et peut être modifié dans",
|
"TheLogLevelDefault": "Le niveau de journalisation est par défaut «Info» et peut être modifié dans",
|
||||||
"ThisCannotBeCancelled": "Cela ne peut pas être annulé une fois démarré sans redémarrer Radarr.",
|
"ThisCannotBeCancelled": "Cela ne peut pas être annulé une fois démarré sans désactiver tous vos indexeurs.",
|
||||||
"TorrentDelayTime": "Retard du torrent : {0}",
|
"TorrentDelayTime": "Retard du torrent : {0}",
|
||||||
"TorrentsDisabled": "Torrents désactivés",
|
"TorrentsDisabled": "Torrents désactivés",
|
||||||
"Trace": "Trace",
|
"Trace": "Trace",
|
||||||
@@ -1027,7 +1024,6 @@
|
|||||||
"Weeks": "Semaines",
|
"Weeks": "Semaines",
|
||||||
"Wiki": "Wiki",
|
"Wiki": "Wiki",
|
||||||
"WouldYouLikeToRestoreBackup": "Souhaitez-vous restaurer la sauvegarde {0} ?",
|
"WouldYouLikeToRestoreBackup": "Souhaitez-vous restaurer la sauvegarde {0} ?",
|
||||||
"Yes": "Oui",
|
|
||||||
"YesMoveFiles": "Oui, déplacez les fichiers",
|
"YesMoveFiles": "Oui, déplacez les fichiers",
|
||||||
"MoveFolders2": "Souhaitez-vous déplacer les fichiers vidéo de «{0}» vers «{1}» ?",
|
"MoveFolders2": "Souhaitez-vous déplacer les fichiers vidéo de «{0}» vers «{1}» ?",
|
||||||
"SqliteVersionCheckUpgradeRequiredMessage": "La version {0} de SQLite actuellement installée n'est plus prise en charge. Veuillez mettre à niveau SQLite vers au moins la version {1}.",
|
"SqliteVersionCheckUpgradeRequiredMessage": "La version {0} de SQLite actuellement installée n'est plus prise en charge. Veuillez mettre à niveau SQLite vers au moins la version {1}.",
|
||||||
@@ -1048,7 +1044,7 @@
|
|||||||
"DownloadClientCheckDownloadingToRoot": "Le client de téléchargement {0} place les téléchargements dans le dossier racine {1}. Vous ne devez pas télécharger dans un dossier racine.",
|
"DownloadClientCheckDownloadingToRoot": "Le client de téléchargement {0} place les téléchargements dans le dossier racine {1}. Vous ne devez pas télécharger dans un dossier racine.",
|
||||||
"DeleteFileLabel": "Supprimer {0} fichiers",
|
"DeleteFileLabel": "Supprimer {0} fichiers",
|
||||||
"NotificationTriggersHelpText": "Sélectionnez les événements qui doivent déclencher cette notification",
|
"NotificationTriggersHelpText": "Sélectionnez les événements qui doivent déclencher cette notification",
|
||||||
"From": "De",
|
"From": "de",
|
||||||
"UpdateAvailable": "Une nouvelle mise à jour est disponible",
|
"UpdateAvailable": "Une nouvelle mise à jour est disponible",
|
||||||
"RemotePathMappingCheckImportFailed": "Radarr a échoué en important un Film. Vérifier vos logs pour plus de détails.",
|
"RemotePathMappingCheckImportFailed": "Radarr a échoué en important un Film. Vérifier vos logs pour plus de détails.",
|
||||||
"RemotePathMappingCheckDownloadPermissions": "Radarr peut voir mais ne peut accéder au film téléchargé {0}. Il s'agit probablement d'une erreur de permissions.",
|
"RemotePathMappingCheckDownloadPermissions": "Radarr peut voir mais ne peut accéder au film téléchargé {0}. Il s'agit probablement d'une erreur de permissions.",
|
||||||
@@ -1074,22 +1070,22 @@
|
|||||||
"RemotePathMappingCheckFilesGenericPermissions": "Le client de téléchargement {0} met les téléchargements dans {1} mais Radarr ne peut voir ce répertoire. Il est possible que vous ayez besoin d'ajuster les permissions de ce dossier.",
|
"RemotePathMappingCheckFilesGenericPermissions": "Le client de téléchargement {0} met les téléchargements dans {1} mais Radarr ne peut voir ce répertoire. Il est possible que vous ayez besoin d'ajuster les permissions de ce dossier.",
|
||||||
"RemotePathMappingCheckFilesLocalWrongOSPath": "Le client de téléchargement {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.",
|
"RemotePathMappingCheckFilesLocalWrongOSPath": "Le client de téléchargement {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.",
|
||||||
"BypassDelayIfHighestQualityHelpText": "Outrepasser le délai quand la version a la plus haute qualité activée dans le profil de qualité avec le protocole préféré",
|
"BypassDelayIfHighestQualityHelpText": "Outrepasser le délai quand la version a la plus haute qualité activée dans le profil de qualité avec le protocole préféré",
|
||||||
"ClickToChangeReleaseGroup": "Cliquez pour changer de release group",
|
"ClickToChangeReleaseGroup": "Cliquer pour changer le groupe de publication",
|
||||||
"AnnouncedMsg": "Le film est annoncé",
|
"AnnouncedMsg": "Le film est annoncé",
|
||||||
"Filters": "Filtres",
|
"Filters": "Filtres",
|
||||||
"IndexerDownloadClientHelpText": "Précisez quel client de téléchargement est utilisé pour cet indexer",
|
"IndexerDownloadClientHelpText": "Spécifiez quel client de téléchargement est utilisé pour cet indexeur",
|
||||||
"TmdbRating": "Note TMDb",
|
"TmdbRating": "Note TMDb",
|
||||||
"IndexerTagHelpText": "Utiliser seulement cet indexeur pour les films avec au moins un tag correspondant. Laissez vide pour l'utiliser avec tous les films.",
|
"IndexerTagHelpText": "Utiliser seulement cet indexeur pour les films avec au moins un tag correspondant. Laissez vide pour l'utiliser avec tous les films.",
|
||||||
"IndexerJackettAll": "Les indexeurs utilisant le endpoint 'all' de Jackett: {0}",
|
"IndexerJackettAll": "Indexeurs utilisant le endpoint non supporté 'all' de Jackett : {0}",
|
||||||
"ManualImportSetReleaseGroup": "Import manuel - Spécifier le groupe de Release",
|
"ManualImportSetReleaseGroup": "Import manuel - Spécifier le groupe de Release",
|
||||||
"TmdbVotes": "Votes TMDb",
|
"TmdbVotes": "Votes TMDb",
|
||||||
"ImdbRating": "Note IMDb",
|
"ImdbRating": "Note IMDb",
|
||||||
"ImdbVotes": "Votes IMDb",
|
"ImdbVotes": "Votes IMDb",
|
||||||
"LocalPath": "Chemin local",
|
"LocalPath": "Chemin local",
|
||||||
"DiscordUrlInSlackNotification": "Vous avez une configuration de notification Discord en tant que notification Slack. Configurez cela comme une notification Discord pour une meilleure fonctionnalité. Les notifications affectées sont: {0}",
|
"DiscordUrlInSlackNotification": "Vous avez une configuration de notification Discord en tant que notification Slack. Configurez cela comme une notification Discord pour un meilleur fonctionnement. Les notifications affectées sont : {0}",
|
||||||
"RemotePathMappingCheckDockerFolderMissing": "Vous utilisez docker; {0} enregistre les téléchargements dans {1} mais ce dossier n'est pas présent dans ce conteneur. Vérifiez vos paramètres de dossier distant et les paramètres de votre conteneur docker.",
|
"RemotePathMappingCheckDockerFolderMissing": "Vous utilisez docker ; {0} enregistre les téléchargements dans {1} mais ce dossier n'est pas présent dans ce conteneur. Vérifiez vos paramètres de dossier distant et les paramètres de votre conteneur docker.",
|
||||||
"RemotePathMappingCheckRemoteDownloadClient": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
|
"RemotePathMappingCheckRemoteDownloadClient": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
|
||||||
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker; {0} enregistre les téléchargements dans {1} mais ce n'est pas un dossier valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
|
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
|
||||||
"RemotePathMappingCheckFilesWrongOSPath": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.",
|
"RemotePathMappingCheckFilesWrongOSPath": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.",
|
||||||
"RemotePathMappingCheckLocalFolderMissing": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
|
"RemotePathMappingCheckLocalFolderMissing": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
|
||||||
"OnApplicationUpdate": "Lors de la mise à jour de l'app",
|
"OnApplicationUpdate": "Lors de la mise à jour de l'app",
|
||||||
@@ -1102,9 +1098,26 @@
|
|||||||
"OriginalLanguage": "Langue d'origine",
|
"OriginalLanguage": "Langue d'origine",
|
||||||
"Rating": "Note",
|
"Rating": "Note",
|
||||||
"RemotePath": "Dossier distant",
|
"RemotePath": "Dossier distant",
|
||||||
"RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker; {0} signifie les téléchargement dans {1} mais ce n'est pas un dossier valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
|
"RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker ; {0} signifie les téléchargement dans {1} mais ce n'est pas un dossier valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
|
||||||
"RemotePathMappingCheckWrongOSPath": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin {2} est invalide. Vérifiez vos paramètres de chemins distants et les paramètres de votre client de téléchargement.",
|
"RemotePathMappingCheckWrongOSPath": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin {2} est invalide. Vérifiez vos paramètres de chemins distants et les paramètres de votre client de téléchargement.",
|
||||||
"RemoveCompleted": "Supprimer les complétés",
|
"RemoveCompleted": "Supprimer les complétés",
|
||||||
"Database": "Base de données",
|
"Database": "Base de données",
|
||||||
"SelectLanguages": "Choisir la langue"
|
"SelectLanguages": "Choisir la/les langue(s)",
|
||||||
|
"RemoveDownloadsAlert": "Les paramètres de suppression ont été déplacés dans les réglages de chaque client de téléchargement dans le tableau ci-dessus.",
|
||||||
|
"SizeLimit": "Limite de taille",
|
||||||
|
"Started": "Démarré",
|
||||||
|
"Waiting": "En attente",
|
||||||
|
"RemoveFailed": "Echec de la suppression",
|
||||||
|
"RemoveSelectedItem": "Supprimer l'élément sélectionné",
|
||||||
|
"RemoveSelectedItems": "Supprimer les éléments sélectionnés",
|
||||||
|
"SelectReleaseGroup": "Sélectionner le groupe de publication",
|
||||||
|
"SetReleaseGroup": "Régler le groupe de publication",
|
||||||
|
"RefreshMonitoredIntervalHelpText": "Intervalle en minutes entre chaque vérification des téléchargements, minimum 1 minute",
|
||||||
|
"AllCollectionsHiddenDueToFilter": "Tous les films sont masqués en raison du filtre appliqué.",
|
||||||
|
"Collections": "Collection",
|
||||||
|
"MonitorMovies": "Surveiller le film",
|
||||||
|
"NoCollections": "Aucun film trouvé, pour commencer, vous voudrez ajouter un nouveau film ou importer des films existants.",
|
||||||
|
"RssSyncHelpText": "Intervalle en minutes. Mettre à zéro pour désactiver (cela arrêtera tous les téléchargements automatiques)",
|
||||||
|
"CollectionsSelectedInterp": "{0} Collections(s) Sélectionnée(s)",
|
||||||
|
"ChooseImportMode": "Mode d'importation"
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user