diff --git a/.gitignore b/.gitignore
index c7d4bfd32..4ed66c56c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -134,6 +134,12 @@ bin
obj
output/*
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+**/Properties/launchSettings.json
+
# Packages
Radarr_*/
Radarr_*.zip
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 44b7a099a..5c20c2aef 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -69,17 +69,21 @@ stages:
artifact: '$(osName)Backend'
displayName: Publish Backend
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- - publish: '$(testsFolder)/net462/win-x64/publish'
- artifact: WindowsTests
- displayName: Publish Test Package
+ - publish: '$(testsFolder)/netcoreapp3.0/win-x64/publish'
+ artifact: WindowsCoreTests
+ displayName: Publish Windows Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net462/linux-x64/publish'
artifact: LinuxTests
- displayName: Publish Test Package
+ displayName: Publish Linux Mono Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- - publish: '$(testsFolder)/net462/osx-x64/publish'
- artifact: MacTests
- displayName: Publish Test Package
+ - publish: '$(testsFolder)/netcoreapp3.0/linux-x64/publish'
+ artifact: LinuxCoreTests
+ displayName: Publish Linux Test Package
+ condition: and(succeeded(), eq(variables['osName'], 'Windows'))
+ - publish: '$(testsFolder)/netcoreapp3.0/osx-x64/publish'
+ artifact: MacCoreTests
+ displayName: Publish MacOS Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Build_Frontend
@@ -145,9 +149,9 @@ stages:
- bash: ./build.sh --packages
displayName: Create Packages
- bash: |
- setup/inno/ISCC.exe setup/radarr.iss //DFramework=net462
- cp setup/output/Radarr.*windows.net462.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-installer.exe
- displayName: Create .NET 462 Windows installer
+ setup/inno/ISCC.exe setup/radarr.iss //DFramework=netcoreapp3.0
+ cp setup/output/Radarr.*windows.netcoreapp3.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x64-installer.exe
+ displayName: Create .NET Core Windows installer
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'WindowsInstaller'
displayName: Publish Installer
@@ -183,35 +187,59 @@ stages:
find . -name "Radarr.Update" -exec chmod a+x {} \;
displayName: Set executable bits
- task: ArchiveFiles@2
- displayName: Create Windows zip
+ displayName: Create Windows Core zip
inputs:
- archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows.zip'
+ archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
- rootFolderOrFile: $(artifactsFolder)/windows/net462
+ rootFolderOrFile: $(artifactsFolder)/windows/netcoreapp3.0
- task: ArchiveFiles@2
- displayName: Create MacOS app
+ displayName: Create MacOS Core app
inputs:
- archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app.zip'
+ archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
- rootFolderOrFile: $(artifactsFolder)/macos-app/net462
+ rootFolderOrFile: $(artifactsFolder)/macos-app/netcoreapp3.0
- task: ArchiveFiles@2
- displayName: Create MacOS tar
+ displayName: Create MacOS Core tar
inputs:
- archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx.tar.gz'
+ archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-core-x64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
- rootFolderOrFile: $(artifactsFolder)/macos/net462
+ rootFolderOrFile: $(artifactsFolder)/macos/netcoreapp3.0
- task: ArchiveFiles@2
- displayName: Create Linux tar
+ displayName: Create Linux Mono tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/net462
+ - task: ArchiveFiles@2
+ displayName: Create Linux Core tar
+ inputs:
+ archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-x64.tar.gz'
+ archiveType: 'tar'
+ tarCompression: 'gz'
+ includeRootFolder: false
+ rootFolderOrFile: $(artifactsFolder)/linux-x64/netcoreapp3.0
+ - task: ArchiveFiles@2
+ displayName: Create ARM32 Linux Core tar
+ inputs:
+ archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm.tar.gz'
+ archiveType: 'tar'
+ tarCompression: 'gz'
+ includeRootFolder: false
+ rootFolderOrFile: $(artifactsFolder)/linux-arm/netcoreapp3.0
+ - task: ArchiveFiles@2
+ displayName: Create ARM64 Linux Core tar
+ inputs:
+ archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm64.tar.gz'
+ archiveType: 'tar'
+ tarCompression: 'gz'
+ includeRootFolder: false
+ rootFolderOrFile: $(artifactsFolder)/linux-arm64/netcoreapp3.0
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages'
displayName: Publish Packages
@@ -238,23 +266,35 @@ stages:
displayName: Unit Native
strategy:
matrix:
- Mac:
+ MacCore:
osName: 'Mac'
+ testName: 'MacCore'
imageName: 'macos-10.13'
- Windows:
+ WindowsCore:
osName: 'Windows'
+ testName: 'WindowsCore'
imageName: 'windows-2019'
+ LinuxCore:
+ osName: 'Linux'
+ testName: 'LinuxCore'
+ imageName: 'ubuntu-16.04'
+ pattern: 'Radarr.**.linux-core-x64.tar.gz'
pool:
vmImage: $(imageName)
steps:
- checkout: none
+ - task: UseDotNet@2
+ displayName: 'Install .net core 3.0'
+ inputs:
+ version: $(dotnetVersion)
+ condition: ne(variables['osName'], 'Windows')
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
- artifactName: '$(osName)Tests'
+ artifactName: '$(testName)Tests'
targetPath: $(testsFolder)
- bash: |
wget https://mediaarea.net/repo/deb/repo-mediaarea_1.0-9_all.deb
@@ -266,6 +306,11 @@ stages:
- powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
+ - bash: |
+ wget https://github.com/acoustid/chromaprint/releases/download/v1.4.3/chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz
+ sudo tar xf chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz --strip-components=1 --directory /usr/bin
+ displayName: Install fpcalc
+ condition: and(succeeded(), eq(variables['osName'], 'Linux'))
- bash: |
SYMLINK=5_18_1
MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK
@@ -289,7 +334,7 @@ stages:
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
- testRunTitle: '$(osName) Unit Tests'
+ testRunTitle: '$(testName) Unit Tests'
failTaskOnFailedTests: true
- job: Unit_Docker
@@ -334,6 +379,11 @@ stages:
steps:
- bash: mono --version
displayName: Check Mono version
+ - task: UseDotNet@2
+ displayName: 'Install .net core 3.0'
+ inputs:
+ version: $(dotnetVersion)
+ condition: ne(variables['osName'], 'Windows')
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
@@ -364,14 +414,21 @@ stages:
displayName: Integration Native
strategy:
matrix:
- Mac:
+ MacCore:
osName: 'Mac'
+ testName: 'MacCore'
imageName: 'macos-10.13'
- pattern: 'Radarr.**.osx.tar.gz'
- Windows:
+ pattern: 'Radarr.**.osx-core-x64.tar.gz'
+ WindowsCore:
osName: 'Windows'
+ testName: 'WindowsCore'
imageName: 'windows-2019'
- pattern: 'Radarr.**.windows.zip'
+ pattern: 'Radarr.**.windows-core-x64.zip'
+ LinuxCore:
+ osName: 'Linux'
+ testName: 'LinuxCore'
+ imageName: 'ubuntu-16.04'
+ pattern: 'Radarr.**.linux-core-x64.tar.gz'
pool:
vmImage: $(imageName)
@@ -385,12 +442,17 @@ stages:
echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH"
displayName: Set Mono Version
condition: and(succeeded(), eq(variables['osName'], 'Mac'))
+ - task: UseDotNet@2
+ displayName: 'Install .net core 3.0'
+ inputs:
+ version: $(dotnetVersion)
+ condition: ne(variables['osName'], 'Windows')
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
- artifactName: '$(osName)Tests'
+ artifactName: '$(testName)Tests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
@@ -418,7 +480,7 @@ stages:
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
- testRunTitle: '$(osName) Integration Tests'
+ testRunTitle: '$(testName) Integration Tests'
failTaskOnFailedTests: true
displayName: Publish Test Results
@@ -467,12 +529,17 @@ stages:
steps:
- bash: mono --version
displayName: Check Mono version
+ - task: UseDotNet@2
+ displayName: 'Install .net core 3.0'
+ inputs:
+ version: $(dotnetVersion)
+ condition: ne(variables['osName'], 'Windows')
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
- artifactName: 'LinuxTests'
+ artifactName: LinuxTests
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
@@ -516,29 +583,34 @@ stages:
Linux:
osName: 'Linux'
imageName: 'ubuntu-16.04'
- pattern: 'Radarr.**.linux.tar.gz'
+ pattern: 'Radarr.**.linux-core-x64.tar.gz'
failBuild: true
Mac:
osName: 'Mac'
imageName: 'macos-10.13' # Fails due to firefox not being installed on image
- pattern: 'Radarr.**.osx.tar.gz'
+ pattern: 'Radarr.**.osx-core-x64.tar.gz'
failBuild: false
Windows:
osName: 'Windows'
imageName: 'windows-2019'
- pattern: 'Radarr.**.windows.zip'
+ pattern: 'Radarr.**.windows-core-x64.zip'
failBuild: true
pool:
vmImage: $(imageName)
steps:
+ - task: UseDotNet@2
+ displayName: 'Install .net core 3.0'
+ inputs:
+ version: $(dotnetVersion)
+ condition: ne(variables['osName'], 'Windows')
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
- artifactName: '$(osName)Tests'
+ artifactName: '$(osName)CoreTests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
diff --git a/build.sh b/build.sh
index c6d6b3496..beab028b9 100755
--- a/build.sh
+++ b/build.sh
@@ -5,8 +5,6 @@ outputFolder='_output'
testPackageFolder='_tests'
artifactsFolder="_artifacts";
-nuget='tools/nuget/nuget.exe';
-
ProgressStart()
{
echo "Start '$1'"
@@ -131,6 +129,10 @@ PackageLinux()
echo "Adding Radarr.Mono to UpdatePackage"
cp $folder/Radarr.Mono.* $folder/Radarr.Update
+ if [ "$framework" = "netcoreapp3.0" ]; then
+ cp $folder/Mono.Posix.NETStandard.* $folder/Radarr.Update
+ cp $folder/libMonoPosixHelper.* $folder/Radarr.Update
+ fi
ProgressEnd "Creating $runtime Package for $framework"
}
@@ -159,6 +161,10 @@ PackageMacOS()
echo "Adding Radarr.Mono to UpdatePackage"
cp $folder/Radarr.Mono.* $folder/Radarr.Update
+ if [ "$framework" = "netcoreapp3.0" ]; then
+ cp $folder/Mono.Posix.NETStandard.* $folder/Radarr.Update
+ cp $folder/libMonoPosixHelper.* $folder/Radarr.Update
+ fi
ProgressEnd 'Creating MacOS Package'
}
@@ -189,26 +195,17 @@ PackageTests()
{
ProgressStart 'Creating Test Package'
- cp test.sh $testPackageFolder/net462/win-x64/publish
cp test.sh $testPackageFolder/net462/linux-x64/publish
- cp test.sh $testPackageFolder/net462/osx-x64/publish
+ cp test.sh $testPackageFolder/netcoreapp3.0/win-x64/publish
+ cp test.sh $testPackageFolder/netcoreapp3.0/linux-x64/publish
+ cp test.sh $testPackageFolder/netcoreapp3.0/osx-x64/publish
- if [ $os = "windows" ] ; then
- $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/win-x64/publish
- $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/linux-x64/publish
- $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/osx-x64/publish
- else
- mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/win-x64/publish
- mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/linux-x64/publish
- mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/osx-x64/publish
- fi
-
rm -f $testPackageFolder/*.log.config
# geckodriver.exe isn't copied by dotnet publish
curl -Lo gecko.zip "https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-win64.zip"
unzip -o gecko.zip
- cp geckodriver.exe $testPackageFolder/net462/win-x64/publish
+ cp geckodriver.exe $testPackageFolder/netcoreapp3.0/win-x64/publish
CleanFolder $testPackageFolder
@@ -227,6 +224,8 @@ PackageWindows()
echo "Removing Radarr.Mono"
rm -f $folder/Radarr.Mono.*
+ rm -f $folder/Mono.Posix.NETStandard.*
+ rm -f $folder/libMonoPosixHelper.*
echo "Adding Radarr.Windows to UpdatePackage"
cp $folder/Radarr.Windows.* $folder/Radarr.Update
@@ -318,8 +317,11 @@ fi
if [ "$PACKAGES" = "YES" ];
then
UpdateVersionNumber
- PackageWindows "net462"
+ PackageWindows "netcoreapp3.0"
PackageLinux "net462" "linux-x64"
- PackageMacOS "net462"
- PackageMacOSApp "net462"
+ PackageLinux "netcoreapp3.0" "linux-x64"
+ PackageLinux "netcoreapp3.0" "linux-arm64"
+ PackageLinux "netcoreapp3.0" "linux-arm"
+ PackageMacOS "netcoreapp3.0"
+ PackageMacOSApp "netcoreapp3.0"
fi
diff --git a/frontend/src/Components/SignalRConnector.js b/frontend/src/Components/SignalRConnector.js
index 2b05253e1..ee862f5c0 100644
--- a/frontend/src/Components/SignalRConnector.js
+++ b/frontend/src/Components/SignalRConnector.js
@@ -54,6 +54,37 @@ const mapDispatchToProps = {
dispatchFetchTagDetails: fetchTagDetails
};
+function Logger(minimumLogLevel) {
+ this.minimumLogLevel = minimumLogLevel;
+}
+
+Logger.prototype.cleanse = function(message) {
+ const apikey = new RegExp(`access_token=${window.Radarr.apiKey}`, 'g');
+ return message.replace(apikey, 'access_token=(removed)');
+};
+
+Logger.prototype.log = function(logLevel, message) {
+ // see https://github.com/aspnet/AspNetCore/blob/21c9e2cc954c10719878839cd3f766aca5f57b34/src/SignalR/clients/ts/signalr/src/Utils.ts#L147
+ if (logLevel >= this.minimumLogLevel) {
+ switch (logLevel) {
+ case signalR.LogLevel.Critical:
+ case signalR.LogLevel.Error:
+ console.error(`[signalR] ${signalR.LogLevel[logLevel]}: ${this.cleanse(message)}`);
+ break;
+ case signalR.LogLevel.Warning:
+ console.warn(`[signalR] ${signalR.LogLevel[logLevel]}: ${this.cleanse(message)}`);
+ break;
+ case signalR.LogLevel.Information:
+ console.info(`[signalR] ${signalR.LogLevel[logLevel]}: ${this.cleanse(message)}`);
+ break;
+ default:
+ // console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug
+ console.log(`[signalR] ${signalR.LogLevel[logLevel]}: ${this.cleanse(message)}`);
+ break;
+ }
+ }
+};
+
class SignalRConnector extends Component {
//
@@ -71,6 +102,7 @@ class SignalRConnector extends Component {
const url = `${window.Radarr.urlBase}/signalr/messages`;
this.connection = new signalR.HubConnectionBuilder()
+ .configureLogging(new Logger(signalR.LogLevel.Information))
.withUrl(`${url}?access_token=${window.Radarr.apiKey}`)
.withAutomaticReconnect({
nextRetryDelayInMilliseconds: (retryContext) => {
diff --git a/frontend/src/Settings/General/GeneralSettings.js b/frontend/src/Settings/General/GeneralSettings.js
index c6fc895e1..e286c2806 100644
--- a/frontend/src/Settings/General/GeneralSettings.js
+++ b/frontend/src/Settings/General/GeneralSettings.js
@@ -97,7 +97,6 @@ class GeneralSettings extends Component {
settings,
hasSettings,
isResettingApiKey,
- isMono,
isWindows,
isWindowsService,
mode,
@@ -162,7 +161,7 @@ class GeneralSettings extends Component {
@@ -203,7 +202,6 @@ GeneralSettings.propTypes = {
settings: PropTypes.object.isRequired,
isResettingApiKey: PropTypes.bool.isRequired,
hasSettings: PropTypes.bool.isRequired,
- isMono: PropTypes.bool.isRequired,
isWindows: PropTypes.bool.isRequired,
isWindowsService: PropTypes.bool.isRequired,
mode: PropTypes.string.isRequired,
diff --git a/frontend/src/Settings/General/GeneralSettingsConnector.js b/frontend/src/Settings/General/GeneralSettingsConnector.js
index bd27c26e3..66d80439f 100644
--- a/frontend/src/Settings/General/GeneralSettingsConnector.js
+++ b/frontend/src/Settings/General/GeneralSettingsConnector.js
@@ -24,7 +24,6 @@ function createMapStateToProps() {
return {
advancedSettings,
isResettingApiKey,
- isMono: systemStatus.isMono,
isWindows: systemStatus.isWindows,
isWindowsService: systemStatus.isWindows && systemStatus.mode === 'service',
mode: systemStatus.mode,
diff --git a/frontend/src/Settings/General/HostSettings.js b/frontend/src/Settings/General/HostSettings.js
index ac435cd1a..8f2e95e81 100644
--- a/frontend/src/Settings/General/HostSettings.js
+++ b/frontend/src/Settings/General/HostSettings.js
@@ -88,7 +88,7 @@ function HostSettings(props) {
{
- enableSsl.value &&
+ enableSsl.value ?
-
+ :
+ null
}
{
- enableSsl.value &&
+ enableSsl.value ?
-
+ :
+ null
}
{
- enableSsl.value &&
+ enableSsl.value ?
-
+ :
+ null
}
{
diff --git a/frontend/src/Settings/General/UpdateSettings.js b/frontend/src/Settings/General/UpdateSettings.js
index 4a7b02d85..ea5af62f2 100644
--- a/frontend/src/Settings/General/UpdateSettings.js
+++ b/frontend/src/Settings/General/UpdateSettings.js
@@ -10,7 +10,7 @@ function UpdateSettings(props) {
const {
advancedSettings,
settings,
- isMono,
+ isWindows,
onInputChange
} = props;
@@ -49,7 +49,7 @@ function UpdateSettings(props) {
{
- isMono &&
+ !isWindows &&
{
- isMono &&
+ !isWindows &&
{
- advancedSettings && isMono &&
+ advancedSettings && !isWindows &&